0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
|
|
1 | |
Attiny85 какая-то лажа с прерываниями14.06.2013, 11:17. Показов 21716. Ответов 45
Метки нет (Все метки)
Написал программку на Tiny85, прогоняю ее в симуляторе, и при выходе из прерывания по reti симулятор перепрыгивает на метку Riset. таблица векторов вроде как по даташиту расписана, ничего криминального со стеком не делаю - что за хрень не пойму.
Вот код: Код
.include "tn85def.yms" .def temp = r18 .def flag = r19 .def counter1 = r20 .def counter2 = r21 .CSEG ;*********************** ; Объявление прерываний ;*********************** .ORG 0x0000 rjmp RESIT ; Riset Homdler .ORG 0x0001 rjmp EXT_INT0 ; IRQ0 Homdler .ORG 0x0002 reti ; rjmp PCINT0 .ORG 0x0003 rjmp TYM1_COMPA .ORG 0x0004 reti ; rjmp TYM1_OVF .ORG 0x0005 reti ; rjmp TIM0_OVF .ORG 0x0006 reti ; rjmp EE_RDY .ORG 0x0007 reti ; rjmp ANA_COMP .ORG 0x0008 rjmp ADC_ACP ; ADC Conversion Homdler .ORG 0x0009 reti ; rjmp TYM1_COMPB .ORG 0x000A reti ; rjmp TIM0_COMPA .ORG 0x000B reti ; rjmp TIM0_COMPB .ORG 0x000C reti ; rjmp WDT .ORG 0x000D reti ; rjmp USI_START .ORG 0x000E reti ; rjmp USI_OVF ;*********************** ; Обработчики прерываний ;*********************** EXT_INT0: ; Прерывание по сигналу INT0 push temp in temp, SREG push temp sbi PORTB, PB4 clr temp out TCNT1, temp in temp, TCCR1 sbr temp, (1<<CS13)|(0<<CS12)|(1<<CS11)|(0<<CS10) out TCCR1, temp ; Запуск таймера Т1 с делителем 512 (период счета 16 мс при частоте 8мГц) pop temp out SREG, temp pop temp reti ADC_ACP: ; Прерывание по сигналу готовноси результата АЦП push temp in temp, SREG push temp clr flag in temp, ADCH cpi temp, 200 brsh m1 cpi temp, 100 brsh m2 rjmp m3 m1: sbr flag, (1<<2) rjmp m3 m2: sbr flag, (1<<1) m3: sbr flag, (1<<0) pop temp out SREG, temp pop temp reti TYM1_COMPA: ; Прерывание по переполнению таймера Т1 push temp in temp, SREG push temp cbi PORTB, PB4 in temp, TCCR1 cbr temp, (1<<CS13)|(1<<CS12)|(1<<CS11)|(1<<CS10) out TCCR1, temp ; Останов таймера Т1 с делителем 8 clr temp out TCNT1, temp out TCCR0A, temp out TCCR0B, temp ; Остановить Т0 out TCNT0, temp cbr R22, (1<<0) pop temp out SREG, temp pop temp reti ;*********************** ; Начало программы инициализации ;*********************** RESIT: ldi temp, low(ROMEND) ; Инициализация стека out SPL, temp ldi temp, high(ROMEND) out SPH, temp ldi temp, (1<<PB1)|(1<<PB4) out DDRB, temp ; PB1 и PB4 как выходы, ldi temp, (1<<PB1) out PORTB, temp ; все порты в 0. Те котрорые на вход без подтягивающих резисторов ldi temp, (1<<ISC01)|(1<<ISC00) ; настройка прерывания INT0 по переднему фронту: биты ISC01 в 1 и ISC00 в 1 out MCUCR, temp in temp, GIMSK ; разрешение прерывания от INT0 мы в регистре gimsk меняем только один бит, а остальные остаются нетронутыми sbr temp, (1<<INT0) out GIMSK, temp ldi temp, 250 ; Инициализация таймера счетчика Т1 out OCR1A, temp ; Задаем сравниваемое значение 250 циклов, при совпадении устанавливается флаг прерывания out OCR1C, temp ; при совпадении счетный регистр TCNT1 сбрасывается в $00 ldi temp, (1<<OCIE1A) out TIMSK, temp ; Прерывание таймера Т1 по сравнению OCR1C, а Т0 запрещено ldi temp, (1<<CTC1) ; Режим СТС по совпадению с содержимым регистра OCR1C out TCCR1, temp ; Таймер также отключен от выводов МК (0<<COM1A1)|(0<<COM1A0) clr temp out GTCCR, temp out TCNT1, temp ; очистка счетного регистра таймера/счетчика Т1 ldi temp, (1<<ADIM)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ; Режим непрерывного преобразования с внешним источником опорного напряжения out ADCSRA, temp ; коэффициент деления частоты 64, т.е. тактовая частота АЦП 125 кГц. Это соответствует примерно 9600 выборок в секунду. или 192 выборки за период промышленной частоты ldi temp, (1<<REFS0)|(1<<ADLAR)|(1<<MUX1)|(1<<MUX0) ; Разрешение АЦП на PB3 со сдвигом результата в старший байт регистра данных out ADMUX, temp clr temp out ADCSRB, temp ldi temp, (1<<ADC3D) ; Отключаем цифровой буфер ADC3 out DIDR0, temp in temp, ADCSRA sbr temp, (1<<ADSC) out ADCSRA, temp ; Запускаем преобразование АЦП sei ; глобально разрешаю прерывания ;*********************** ; главная программа ;*********************** main: sbrs flag, 0 rjmp main sbrs flag, 2 rjmp m4 yms counter1 clr counter2 cpi counter1, 40 brsh xxx1 rjmp m6 xxx1: rcall OTKL rjmp m6 m4: clr counter1 sbrs flag, 1 rjmp m5 yms counter2 cpi counter2, 25 brsh xxx2 rjmp m6 xxx2: sbrs R22, 0 rcall OK rjmp m6 m5: clr counter2 rcall RETURN m6: clr flag rjmp main OTKL: clr temp out TCCR0A, temp out TCCR0B, temp out TCNT0, temp ; Останов таймера Т0 cbi PORTB, PB1 ret OK: clr temp ; Инициализация таймера счетчика Т0 out TCNT0, temp ; Очистка счетного регистра таймера/счетчика Т0 ldi temp, 125 ; Задаем сравниваемое значение out OCR0B, temp ldi temp, (1<<COM0B0)|(1<<WGM01) ; СТС, вывод COM0B меняется на противоположное значение out TCCR0A, temp ldi temp, (1<<CS01) ; Работает в режиме ШИМ 4 кГц out TCCR0B, temp ; Запуск sbr R22, (1<<0) ret RETURN: clr temp out TCCR0A, temp out TCCR0B, temp out TCNT0, temp ; Останов таймера Т0 sbi PORTB, PB1 ret
0
|
14.06.2013, 11:17 | |
Ответы с готовыми решениями:
45
Какая-то лажа с таймером Операционный усилитель, какая то лажа Народ! Какая то у меня не понятка с проектом 100 раз писал а сейчас лажа Лажа с адсенсом лажа Fermi |
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
|
|
15.06.2013, 18:50 | 21 |
Сообщение от OtyxPM
Кривой симулятор или кривая настройка проекта в симуляторе. У вас с ассемблером рамс? Инициализация стека написана правильно, по крайней мере, запись значения конца стека. Порядок же я обозначил. Стараюсь его всегда придерживаться. У ТС явно проблемы с симулятором.
0
|
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
|
|
16.06.2013, 12:24 | 22 |
Сообщение от hixir
Еще вопрос, как в симуляторе частоту выставить? P.S. Кстати, ранее не упоминал - версия студии 4.18
0
|
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
|
|
16.06.2013, 16:56 | 23 |
Еще одна проблемка обнаружилась. Не пойму, почему после запуска таймера T0 и после того как он досчитал до конца один раз - он сбрасывается и перестает считать, хотя его ничто не останавливает. По идее он же должен считать по кругу постоянно пока его не остановят!
0
|
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
|
|
16.06.2013, 17:21 | 24 |
Сообщение от wypuk
0
|
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
|
|
17.06.2013, 15:27 | 25 |
Так что, про таймер ни у кого никаких мыслей нет? Почему Т0 досчитав до конца сам останавливается и перестает работать? Хотя биты CSxx остаются включенными. Это все-таки симулятор глючит или что? Хотел на 6й версии попробовать запустить симуляцию - там она вообще какая-то глючная, совсем не пойму как ее заставить работать. (Может я просто не умею ее готовить?)
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
17.06.2013, 15:55 | 26 |
Сообщение от wypuk
Кроме Студии, есть ещё симуляторы для AVR - VMLAB, Proteus. Хотите - попробуйте в них.
0
|
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 82
|
|
17.06.2013, 16:16 | 27 |
А, что это за команда такая интересная, как же он будет работать.
sbr temp, (1<<CS13)|(0<<CS12)|(1<<CS11)|(0<<CS10) out TCCR1, temp ; Запуск таймера Т1 с делителем 512 (период счета 16 мс при частоте 8мГц) Похоже это Я тормознул с этой командой.
0
|
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
|
|
17.06.2013, 17:31 | 28 |
Сообщение от domis
Насчет VMLAB надо попробовать, надеюсь там несложно....
0
|
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 82
|
|
17.06.2013, 17:39 | 29 |
Режим СТС это сброс при совпадении TCNT0 с OCR0A, вот таймер Т0 и работает так как его запрограммировал тот кто писал программу, в регистре сравнения OCR0A записан 0х00, поэтому как только TCNT0 становится нулем происходит сброс по совпадению, и дальше нуля в TCNT0 и не считается.
Программу нужно внимательнее писать.
0
|
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
|
|
17.06.2013, 18:03 | 30 |
Сообщение от domis
0
|
0 / 0 / 0
Регистрация: 04.09.2012
Сообщений: 82
|
|
17.06.2013, 18:04 | 31 |
Он и не останавливается, он именно сбрасывается, поменяй OCR0B на OCR0A и будет тебе счастье. С OCR0B СТС не работает.
0
|
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 115
|
|
17.06.2013, 18:30 | 32 |
Сообщение от wypuk
wypuk, Вы вообще-то даташит читали?
0
|
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
|
|
17.06.2013, 18:55 | 33 |
Да, действительно, поменял OCR0A и все стало как надо. Я читал и даташит и евстифеева, просто мне почему-то казалось, что регистр OCR0A можно применять для вывода OC0A а регистр OCR0В для вывода OC0В... сейчас-то врубился))) хотя при совпадении с OCR0B вывод тоже меняет свое значение (я задал биты COM0B1 и COM0B0), но таймер не сбрасывается, а продолжает свой счет.
domis - спасибо!!! Открыл глаза)))
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
17.06.2013, 19:41 | 34 |
Сообщение от wypuk
Сообщение от wypuk
Есть две разные вещи, не путайте: 1) использование OCRnx регистров для функции Output Compare (с опциональной необязательной генерацией прерываний - отдельно для каждого канала) (с опциональным управлением OCnx выводами); 2) регулировка периода счёта таймеров при помощи OCRnA-регистров (только "A", а не с любой буквой) - таймер берёт из него своё TOP-значение. В рамках фичи (1) работают все возможные каналы (например, OC0A, OC0B, OC1A, OC1B, ...) и соответствующие регистры (соответственно, OCR0A, OCR0B, OCR1A, OCR1B, ...). В рамках фичи (2) могут использоваться только OCR-регистры с буквой A для задания TOP-значений соотвествующих таймеров.
0
|
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
|
|
17.06.2013, 20:26 | 35 |
Сообщение от OtyxPM
Есть две разные вещи, не путайте: 1) использование OCRnx регистров для функции Output Compare (с опциональной необязательной генерацией прерываний - отдельно для каждого канала) (с опциональным управлением OCnx выводами); 2) регулировка периода счёта таймеров при помощи OCRnA-регистров (только "A", а не с любой буквой) - таймер берёт из него своё TOP-значение. В рамках фичи (1) работают все возможные каналы (например, OC0A, OC0B, OC1A, OC1B, ...) и соответствующие регистры (соответственно, OCR0A, OCR0B, OCR1A, OCR1B, ...). В рамках фичи (2) могут использоваться только OCR-регистры с буквой A для задания TOP-значений соотвествующих таймеров. 1) Я так понимаю, чтобы мог работать и канал B, значение регистра OCRхA должно быть больше или = OCRхB? Ну а канал А если он не нужен можно совсем не использовать, собственно как у меня и сделано. 2) Вот на счет 2-го утверждения тогда вопрос. В том же тини25\45\85 у таймера Т1 есть 3й регистр сравнения OCR1C и как я понял, именно он задает ТОП таймера (по даташиту как-никак так). чтоже тогда остальные 2 регистра? 3) И раз я попал на профи по таймерам... в таймере Т1 регистра управления TCCR1 есть 2 бита: 7й бит "CTC1" и 6й бит "PWM1A" и еще 6й бит "PWM1B" регистра управления GTCCR. Так вот, раз пошла такая пьянка, растолкуй: если я выставлю эти биты одновременно, в каком режиме будет таймер работать - СТС или ШИМ? Мне довольно сложно представить такой комбинированный сигнал. В таймере Т0 все заведомо однозначно и определяется битами "WGM0х" - т.е. одна определенная комбинация битов - один режим. А с Т1 вот такое западло...
0
|
0 / 0 / 0
Регистрация: 14.04.2013
Сообщений: 115
|
|
17.06.2013, 20:45 | 36 |
Сообщение от wypuk
и кодить вообще не садитесь без даташита под рукой.
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
|
|
17.06.2013, 20:55 | 37 |
Сообщение от hixir
и кодить вообще не садитесь без даташита под рукой. Мне тоже трудно было понять режимы таймера. Тем более, кое-как переведя с английского (ну да, слабо у меня с английским, так ведь в этом я не одинок). Даже переведя не понял. Есть такая категория людей. Им нужно в доступной форме, подробно, доходчиво объяснить. Вот и у меня так. На форумы обращаюсь, когда другого выхода нет. И много участников в похожей ситуации. То что кодить, не прочитав даташита, понятно. Но если человек не понял, то и обращается на форуме, задает вопросы. Особо одаренные, которым хоть кол на голове теши, ничего понимают - отдельный разговор.
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
17.06.2013, 21:09 | 38 |
Сообщение от wypuk
Поскольку для задания TOP работает OCR1C, то остальные два регистра OC1A, OC1B такой функциональностью не обладают.
0
|
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,479
|
|
17.06.2013, 21:16 | 39 |
Сообщение от wypuk
0
|
0 / 0 / 0
Регистрация: 23.05.2010
Сообщений: 4
|
|
17.06.2013, 21:40 | 40 |
Сообщение от OtyxPM
А в режиме СТС? если OCRхA меньше, то до OCRхВ дело никогда не дойдет. Ведь сброс будет всегда! На третий вопрос можешь ответить?
Сообщение от wypuk
0
|
17.06.2013, 21:40 | |
17.06.2013, 21:40 | |
Помогаю со студенческими работами здесь
40
В чем лажа? Лажа с посещением некоторых сайтов В браузер выводится полная лажа! Лажа в PIVOT при сумировании Обновление драйверов + KDE = лажа =( Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |