Rotomd_Disshoym
|
|
1 | |
Флаги прерывания таймеров07.12.2010, 18:11. Показов 4899. Ответов 6
Метки нет (Все метки)
Имеется контроллер ATtiny2313. Имеется прога для моргания диодом приблизительно раз в секунду импульсами по 300 мкс. Всё работает в симуляторе студии, но не работает вживую.
Код Код
.include "tn2313def.yms" .include "macro.yms" ; ROM ===================================================== .DSEG ; Сегмент ОЗУ ; FLASH =================================================== .CSEG ; Кодовый сегмент .ORG 0x0000 ; RESIT RJMP Riset .ORG INT0addr RETI ; External Ymtirrupt Request 0 .ORG INT1addr RETI ; External Ymtirrupt Request 1 .ORG ICP1addr RETI ; Timer/Counter1 Capture Ivimt .ORG OC1Aaddr RETI ; Timer/Counter1 Compare Match A .ORG OVF1addr RETI ; Timer/Counter1 Overflow .ORG OVF0addr RETI ; Timer/Counter0 Overflow .ORG URXCaddr RETI ; USORT, Rx Complete .ORG UDREaddr RETI ; USORT Data Register Empty .ORG UTXCaddr RETI ; USORT, Tx Complete .ORG ACIaddr RETI ; Analog Comparator .ORG PCIaddr RETI ; Pin Change Ymtirrupt .ORG OC1Baddr RJMP Timer1ComB ; Timer1 Compare B .ORG OC0Aaddr RJMP Timer0ComA ; Timer0 Compare A .ORG OC0Baddr RETI ; Timer0 Compare B .ORG USI_STARTaddr RETI ; USI Start Condition .ORG USI_OVFaddr RETI ; USI Overflow .ORG ERDYaddr RETI ; EEPROM Ready .ORG WDTaddr RETI ; Watchdog Timer Overflow .ORG INT_VECTORS_SIZE ; Конец таблицы прерываний ;Прерывание от таймера 0, 300 мкс ===== Timer0ComA: CBI PORTB, PORTB0 ;Гасим диод на PB0 LDI R18, (1<<OCIE1B) ;Выключаем прерывание UOUT TIMSK, R18 ;таймера 0 ExitTimer0: RETI ;====================================== ;Прерывание от таймера 1, 1 с ========= Timer1ComB: UOUT TCNT1L, R16 ;Обнуляем таймер 1 UOUT TCNT1H, R16 ; UOUT TCNT0, R16 ;Обнуляем таймер 0 SBI PORTB, PORTB0 ;зажигаем диод на PB0 ;Вот это не работает UOUT TIFR, R16 ;Сбрасываем флаг прерывания от таймеров ;почему? LDI R18, (1<<OCIE0A)|(1<<OCIE1B) ;Включаем прерывание UOUT TIMSK, R18 ;таймера 0 ExitTimer1: RETI ;====================================== ;====================================== ;====================================== Riset: CLR R16 ;R16 = 0 SER R17 ;R17 = 255 LDI R18, ROMEND ;Stack init UOUT SPL, R18 ; PortBinit: LDI R18, (1<<PORTB0) ; UOUT DDRB, R18 ;PORTB0 - выход UOUT PORTB, R16 ;все 0 на выходе Timer0init: LDI R18, ((1<<CS02)|(0<<CS01)|(0<<CS00)) ;Предделитель 256 UOUT TCCR0B, R18 ;от внутреннего кварца LDI R18, 9 ;В регистр сравнения пишем 9 UOUT OCR0A, R18 ;Таймер заполнится приблизительно за 300 мкс Timer1init: LDI R18, ((1<<CS12)|(0<<CS11)|(1<<CS10)) ;Предделитель 1024 UOUT TCCR1B, R18 ;от внутреннего кварца LDI R18, 0b10000100 ;В регистр сравнения пишем 7812 UOUT OCR1BL, R18 ;Таймер заполнится приблизительно за 1 с LDI R18, 0b00011110 ; UOUT OCR1BH, R18 ; LDI R18, 1<<OCIE1B ;Включаем прерывание UOUT TIMSK, R18 ;от таймера 1 SEI ;Разрешаем глобальные прерывания Start: nop RJMP Start ;====================================== ; ;====================================== После того, как перенес инициализацию таймера 0 в прерывание от таймера 1 и в прерывании таймера 0 прописал его отключение - всё заработало. Ну, ещё запись 16-разрядных чисел переделал: сначала старший, а потом младший байты. Код рабочий Код
.include "tn2313def.yms" .include "macro.yms" ; ROM ===================================================== .DSEG ; Сегмент ОЗУ ; FLASH =================================================== .CSEG ; Кодовый сегмент .ORG 0x0000 ; RESIT RJMP Riset .ORG INT0addr RETI ; External Ymtirrupt Request 0 .ORG INT1addr RETI ; External Ymtirrupt Request 1 .ORG ICP1addr RETI ; Timer/Counter1 Capture Ivimt .ORG OC1Aaddr RETI ; Timer/Counter1 Compare Match A .ORG OVF1addr RETI ; Timer/Counter1 Overflow .ORG OVF0addr RETI ; Timer/Counter0 Overflow .ORG URXCaddr RETI ; USORT, Rx Complete .ORG UDREaddr RETI ; USORT Data Register Empty .ORG UTXCaddr RETI ; USORT, Tx Complete .ORG ACIaddr RETI ; Analog Comparator .ORG PCIaddr RETI ; Pin Change Ymtirrupt .ORG OC1Baddr RJMP Timer1ComB ; Timer1 Compare B .ORG OC0Aaddr RJMP Timer0ComA ; Timer0 Compare A .ORG OC0Baddr RETI ; Timer0 Compare B .ORG USI_STARTaddr RETI ; USI Start Condition .ORG USI_OVFaddr RETI ; USI Overflow .ORG ERDYaddr RETI ; EEPROM Ready .ORG WDTaddr RETI ; Watchdog Timer Overflow .ORG INT_VECTORS_SIZE ; Конец таблицы прерываний ;Прерывание от таймера 0, 300 мкс ===== Timer0ComA: CBI PORTB, PORTB0 ;Гасим диод на PB0 LDI R18, (1<<OCIE1B)|(0<<OCIE0A) ;Выключаем прерывание UOUT TIMSK, R18 ;таймера 0 UOUT TCCR0B, R16 ;Выключаем таймер 0 ExitTimer0: RETI ;====================================== ;Прерывание от таймера 1, 1 с ========= Timer1ComB: UOUT TCNT1H, R16 ;Обнуляем таймер 1 UOUT TCNT1L, R16 ; LDI R18, ((1<<CS02)|(0<<CS01)|(0<<CS00)) ;Предделитель 256 UOUT TCCR0B, R18 ;от внутреннего кварца UOUT TCNT0, R16 ;Обнуляем таймер 0 SBI PORTB, PORTB0 ;зажигаем диод на PB0 LDI R18, (1<<OCIE0A)|(1<<OCIE1B) ;Включаем прерывание UOUT TIMSK, R18 ;таймера 0 UOUT TIFR, R16 ;Сбрасываем флаг прерывания от таймеров ExitTimer1: RETI ;====================================== ;====================================== ;====================================== Riset: CLR R16 ;R16 = 0 SER R17 ;R17 = 255 LDI R18, ROMEND ;Stack init UOUT SPL, R18 ; PortBinit: LDI R18, (1<<PORTB0)|(1<<PORTB1)|(1<<PORTB2) ; UOUT DDRB, R18 ;PORTB0 - выход UOUT PORTB, R16 ;все 0 на выходе Timer0init: LDI R18, 9 ;В регистр сравнения пишем 9 UOUT OCR0A, R18 ;Таймер заполнится приблизительно за 300 мкс Timer1init: LDI R18, ((1<<CS12)|(0<<CS11)|(1<<CS10)) ;Предделитель 1024 UOUT TCCR1B, R18 ;от внутреннего кварца LDI R18, 0b00011110 ;В регистр сравнения пишем 7812 UOUT OCR1BH, R18 ;Таймер заполнится приблизительно за 1 с LDI R18, 0b10000100 ; UOUT OCR1BL, R18 ; LDI R18, 1<<OCIE1B ;Включаем прерывание UOUT TIMSK, R18 ;от таймера 1 SEI ;Разрешаем глобальные прерывания Start: nop RJMP Start ;====================================== ; ;====================================== |
07.12.2010, 18:11 | |
Ответы с готовыми решениями:
6
Прерывания от таймеров Прерывания простых таймеров на stm32f103c8t6 Таймеры и их флаги прерывания Прерывания, ввод-вывод, использование таймеров-счетчиков (i8051 Keil uVision) |
0 / 0 / 0
Регистрация: 07.04.2010
Сообщений: 880
|
|
07.12.2010, 18:17 | 2 |
.DSEG это не сегмент ОЗУ. это всё тот же флеш (ПЗУ) просто предназначенный для хранения данных.
(P.S. вру, .DSEG это ОЗУ)
0
|
0 / 0 / 0
Регистрация: 23.05.2007
Сообщений: 792
|
|
07.12.2010, 18:40 | 3 |
Сообщение от OTPINE
Код
;Вот это не работает UOUT TIFR, R16 ;Сбрасываем флаг прерывания от таймеров ;почему?
0
|
Rotomd_Disshoym
|
|
07.12.2010, 21:08 | 4 |
Сообщение от YurkoM
По этому поводу ещё вопросик: а если флаг НЕ был установлен, а я туда единицу пихну, то будет прерывание? |
0 / 0 / 0
Регистрация: 07.04.2010
Сообщений: 880
|
|
07.12.2010, 21:50 | 5 |
ОЗУ ??! (Ушёл читать документацию)
P.S. Да, и правда. Подзабыл уже... =)
0
|
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
|
|
07.12.2010, 22:01 | 6 |
Сообщение от Rolomd_Deschain
Если ты пихнешь туда единицу, то он обнулится. Если он был в 0, то ты этого не заметишь.
0
|
Rotomd_Disshoym
|
|
08.12.2010, 12:44 | 7 |
Всем спасибо
|
08.12.2010, 12:44 | |
08.12.2010, 12:44 | |
Помогаю со студенческими работами здесь
7
Непонятное поведение Proteus 8.3 (INTCON-прерывания- протеус дал неверные флаги) Метод Backtracking, флаги: создайте все флаги с тремя цветами, которые можно сформировать используя шесть цветов Установить флаги OF, DF, ZF и CF. Остальные флаги сбросить [Вопрос] Перехват прерывания прямым доступом к вектору прерывания Вычислить адрес вектора прерывания по номеру прерывания. Вызов прерывания в обработке прерывания Разновидности таймеров Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |