Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/25: Рейтинг темы: голосов - 25, средняя оценка - 4.88
Rotomd_Disshoym
1

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

07.12.2010, 18:11. Показов 4899. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Имеется контроллер 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

;======================================         ;
;======================================
Вопрос: почему он уходит на прерывание при сброшенных флагах?
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.12.2010, 18:11
Ответы с готовыми решениями:

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

Прерывания простых таймеров на stm32f103c8t6
Имеется такой код: void Init_Pin(void) { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); ...

Таймеры и их флаги прерывания
Расскажу здесь о проблеме с которой я столкнулся, когда стал изучать STM, и о ее решении. Возможно...

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

6
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
.DSEG это не сегмент ОЗУ. это всё тот же флеш (ПЗУ) просто предназначенный для хранения данных.
Неправда ваша. Это именно ОЗУ, а не флеш.

Код
                                       ;Вот это не работает
UOUT   TIFR, R16               ;Сбрасываем флаг прерывания от таймеров
;почему?
Rolomd_Deschain, флаги обнуляются записью в них единицы (вот такой вот изврат).
0
Rotomd_Disshoym
07.12.2010, 21:08 4
Цитата Сообщение от YurkoM
Rolomd_Deschain, флаги обнуляются записью в них единицы (вот такой вот изврат).
Спасибо.
По этому поводу ещё вопросик: а если флаг НЕ был установлен, а я туда единицу пихну, то будет прерывание?
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.12.2010, 12:44
Помогаю со студенческими работами здесь

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

Метод Backtracking, флаги: создайте все флаги с тремя цветами, которые можно сформировать используя шесть цветов
Флаги. Создайте все флаги с тремя цветами, которые можно сформировать используя шести цветов:...

Установить флаги OF, DF, ZF и CF. Остальные флаги сбросить
Прошу помочь со следующим заданием: Установить флаги OF, DF, ZF и CF. Остальные флаги сбросить....

[Вопрос] Перехват прерывания прямым доступом к вектору прерывания
Всех приветствую! В данный момент разбираюсь с обработкой аппаратного прерывания (прерывание...

Вычислить адрес вектора прерывания по номеру прерывания.
17. По заданному номеру прерывания (13 h) вычислите логические адреса хранения исходных адресов...

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

Разновидности таймеров
Какие еще существуют &quot;задержки времени&quot; помимо: import time time.sleep(1)


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru