Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
Rotomd_Disshoym
0 / 0 / 0
Регистрация: 15.11.2010
Сообщений: 9
1

Флаги прерывания таймеров

07.12.2010, 18:11. Просмотров 3926. Ответов 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

;======================================         ;
;======================================
Косяк тут в том, что после сброса флага прерывания 300 мкс таймера (timer 0 sompare A) контроллер всё равно уходит на его обработку. И в итоге в порт идут импульсы по 2 мкс. В эмуляторе студии всё работает.
После того, как перенес инициализацию таймера 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

;======================================         ;
;======================================
Вопрос: почему он уходит на прерывание при сброшенных флагах?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2010, 18:11
Ответы с готовыми решениями:

Прерывания от таймеров
Изучаю реализацию прерываний от таймеров в Атмега168. Возникла непонятка с (якобы автоматической)...

Прерывания, ввод-вывод, использование таймеров-счетчиков (i8051 Keil uVision)
При переключении T1 из 1 в 0 выдать в P1.4 временной сигнал «1»-2мс, «0»-3мс, «1»-6мс, а при...

Непонятное поведение Proteus 8.3 (INTCON-прерывания- протеус дал неверные флаги)
Всем привет. В общем ситуация следующая: ;------ настройка прерываний ...

Вызов прерывания в обработке прерывания
В программе,нажатие кнопки вызывает прерывание,в котором оно обрабатывается.Попутно в обработке...

Затупил с парой таймеров
Уже пару дней не получается решить простую задачу на меге8: первый таймер в режиме СТС ставит вывод...

6
OTPYMI
0 / 0 / 0
Регистрация: 07.04.2010
Сообщений: 880
07.12.2010, 18:17 2
.DSEG это не сегмент ОЗУ. это всё тот же флеш (ПЗУ) просто предназначенный для хранения данных.
(P.S. вру, .DSEG это ОЗУ)
0
Yurkom
0 / 0 / 0
Регистрация: 23.05.2007
Сообщений: 792
07.12.2010, 18:40 3
Цитата Сообщение от OTPINE
.DSEG это не сегмент ОЗУ. это всё тот же флеш (ПЗУ) просто предназначенный для хранения данных.
Неправда ваша. Это именно ОЗУ, а не флеш.

Код
                                       ;Вот это не работает
UOUT   TIFR, R16               ;Сбрасываем флаг прерывания от таймеров
;почему?
Rolomd_Deschain, флаги обнуляются записью в них единицы (вот такой вот изврат).
0
Rotomd_Disshoym
0 / 0 / 0
Регистрация: 15.11.2010
Сообщений: 9
07.12.2010, 21:08 4
Цитата Сообщение от YurkoM
Rolomd_Deschain, флаги обнуляются записью в них единицы (вот такой вот изврат).
Спасибо.
По этому поводу ещё вопросик: а если флаг НЕ был установлен, а я туда единицу пихну, то будет прерывание?
0
OTPYMI
0 / 0 / 0
Регистрация: 07.04.2010
Сообщений: 880
07.12.2010, 21:50 5
ОЗУ ??! (Ушёл читать документацию)

P.S. Да, и правда. Подзабыл уже... =)
0
xroymom
0 / 0 / 0
Регистрация: 24.01.2010
Сообщений: 727
07.12.2010, 22:01 6
Цитата Сообщение от Rolomd_Deschain
По этому поводу ещё вопросик: а если флаг НЕ был установлен, а я туда единицу пихну, то будет прерывание?
флаги обнуляются записью в них единицы
Если ты пихнешь туда единицу, то он обнулится. Если он был в 0, то ты этого не заметишь.
0
Rotomd_Disshoym
0 / 0 / 0
Регистрация: 15.11.2010
Сообщений: 9
08.12.2010, 12:44 7
Всем спасибо
0
08.12.2010, 12:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.12.2010, 12:44

Расчет таймеров Atmega8
Не понимаю в чем проблема, настроил два 8 битных таймера по одинаковому, но первый работает намного...

Работа таймеров Attiny85
Приветствую всех, люди, помогите пожалуйста настроить таймеры Attiny85, сначала разобрался и...

Настройка таймеров на 32-й меге
Вечер добрый! Столкнулся с проблемой в таймерах, не до конца понимаю как их заставить работать не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru