Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Прерывание от таймера
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
egorman44
Здравствуйте дорогие форумчане. Разбираюсь с мк Atmel. Хотел выработать прерывание при достижении счетчиком какого либо числа. В регисры OCR1B(H/L) записал число до которого надобно считать, но не досчитав до заданного числа, флаги регистра TIFR1 : OCF1A, OCF1B, OCF1C получают значения логической единицы. После того как я инициализировал маску и разрешил прерывание программа уходит на вектор прерываний. необходимо ли сбрасывать флаги прерываний от МК или косяк в инициализации таймера/счетчика.


CODE
.include "m640def.inc" ;
.list ;
.def temp=R17 ;
.def rab=R18 ;

.equ kdel=30 ;

;------- reservation of call

.dseg ;
.org 0x200 ;

buf: .byte 1 ;

;------- begining of program code

.cseg ;
.org 0 ;

;------- redefining of interrupt vector

start:


jmp init; Reset Handler
nop ;
reti ; IRQ0 Handler
nop ;
reti ; IRQ1 Handler
nop ;
reti ; IRQ2 Handler
nop ;
reti ; IRQ3 Handler
nop ;
reti ; IRQ4 Handler
nop ;
reti ; IRQ5 Handler
nop ;
reti ; IRQ6 Handler
nop ;
reti ; IRQ7 Handler
nop ;
reti ; PCINT0 Handler
nop ;
reti ; PCINT1 Handler
nop ;
reti ; PCINT2 Handler
nop ;
reti ; Watchdog Timeout Handler
nop ;
reti ; Timer2 CompareA Handler
nop ;
reti ; Timer2 CompareB Handler
nop ;
reti ; Timer2 Overflow Handler
nop ;
reti ; Timer1 Capture Handler
nop ;
reti ; Timer1 CompareA Handler
nop ;
jmp prtim ; Timer1 CompareB Handler
nop ;
reti ; Timer1 CompareC Handler
nop ;
reti ; Timer1 Overflow Handler
nop ;
reti ; Timer0 CompareA Handler
nop ;
reti ; Timer0 CompareB Handler
nop ;
reti ; Timer0 Overflow Handler
nop ;
reti ; SPI Transfer Complete Handler
nop ;
reti ; USART0 RX Complete Handler
nop ;
reti ; USART0,UDR Empty Handler
nop ;
reti ; USART0 TX Complete Handler
nop ;
reti ; Analog Comparator Handler
nop ;
reti ; ADC Conversion Complete Handl
nop ;
reti ; EEPROM Ready Handler
nop ;
reti ; Timer3 Capture Handler
nop ;
reti ; Timer3 CompareA Handler
nop ;
reti ; Timer3 CompareB Handler
nop ;
reti ; Timer3 CompareC Handler
nop ;
reti ; Timer3 Overflow Handler
nop ;
reti ; USART1 RX Complete Handler
nop ;
reti ; USART1,UDR Empty Handler
nop ;
reti ; USART1 TX Complete Handler
nop ;
reti ; 2-wire Serial Handler
nop ;
reti ; SPM Ready Handler
nop ;
reti ; Timer4 Capture Handler
nop ;
reti ; Timer4 CompareA Handler
nop ;
reti ; Timer4 CompareB Handler
nop ;
reti ; Timer4 CompareC Handler
nop ;
reti ; Timer4 Overflow Handler
nop ;
reti ; Timer5 Capture Handler
nop ;
reti ; Timer5 CompareA Handler
nop ;
reti ; Timer5 CompareB Handler
nop ;
reti ; Timer5 CompareC Handler
nop ;
reti ; Timer5 Overflow Handler
nop ;
reti ; USART2 RX Complete Handler
nop ;
reti ; USART2,UDR Empty Handler
nop ;
reti ; USART2 TX Complete Handler
nop ;
reti ; USART3 RX Complete Handler
nop ;
reti ; USART3,UDR Empty Handler
nop ;
reti ; USART3 TX Complete Handler
nop ;


int_ret: reti

;------ initialization module
init:

ldi r16, high(RAMEND) ;
out SPH,r16 ; Set Stack Pointer to top of RAM
ldi r16, low(RAMEND) ;
out SPL,r16 ;





;------ I/O ports initialization


ldi temp,0xFF ;
sts DDRL,temp ;

;------ Timer 1 initialization

ldi temp,0x01 ;
sts TCCR1B,temp ;
ldi temp,high(kdel);
sts OCR1BH,temp ;
ldi temp,low(kdel);
sts OCR1BL,temp ;

;------ define interrupt mask

ldi temp,0x04 ;
sts TIMSK1,temp ;

;------ comparator initialization

ldi temp,0x80 ;
out ACSR,temp ;
sei ;

;------ begining of main function

main:
ldi rab,0x80 ;
ldi temp,0xFF ;
sts buf,rab ;
eor temp,rab ;
sts PORTL,temp ;

m1: rjmp m1 ;

;------ interrupt subprogram

prtim: push temp ;
push rab ;

lds rab,buf ;

;------ left shift

p1:
lsr rab ;
brcc p3 ;
ldi rab,0x80 ;

p3:
ldi temp,0xFF ;
eor temp,rab ;
sts PORTL,temp ;

sts buf,rab ;

pop rab ;
pop temp ;

reti ;
demiurg_spb
Цитата(egorman44 @ Sep 30 2013, 13:19) *
Скачайте AVR-Studio и пошагайте по своей программе в эмуляторе.
Думаю, что это будет для вас полезно.
egorman44
Цитата(egorman44 @ Sep 30 2013, 13:19) *
Скачайте AVR-Studio и пошагайте по своей программе в эмуляторе.
Думаю, что это будет для вас полезно.

ага спасибо) а вы как думаете откуда я состояние флага узнал в голове что ль просимулировал?

demiurg_spb
Цитата(egorman44 @ Sep 30 2013, 16:47) *
ага спасибо) а вы как думаете откуда я состояние флага узнал в голове что ль просимулировал?
Думал, что в железе запустили и применили способ отладки типа светодиод)
ILYAUL
SREG?
Палыч
Цитата(egorman44 @ Sep 30 2013, 13:19) *
... или косяк в инициализации таймера/счетчика.
Код
    ;------ Timer 1 initialization

        ldi        temp,0x01;
        sts        TCCR1B,temp;
        ldi        temp,high(kdel);
        sts        OCR1BH,temp;
        ldi        temp,low(kdel);
        sts        OCR1BL,temp;

Таймер следует запускать после того, как будут установлены все его регистры. В Вашем же случае: совпадение наступило раньше, чем Вы успели изменить OCR1B.
egorman44
Большое спасибо товарищи! Все вроде бы работает)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.