Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Таймер1 на atmega8
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Aleck
Вводная: Тахометр для стенда, есть atmega8, 16mhz необходимо подсчитывать импульсы и каждые 0,5 сек отправлять в порт UART, посылка происходит по прерыванию таймера1, но он не выходит из прерывания не пойму в чем дело:

; программа для ATMEGA8 16MHz 01,03,2006
; датчик оборотов (holl) + порт 232
.include "m8def.inc"
.include "macros.inc"
.equ dholl = PD7

.cseg ;
.org 0 ;коды программы
rjmp reset; инициализация
nop; rjmp INT_int0 ; внешнее прерывание 0
nop; rjmp INT_int1 ; внешнее прерывание 1
nop; rjmp INT_t2c ; совпадение т/с Т2
nop; rjmp INT_t2o ; переполнение т/с Т2
nop; rjmp INT_t1cpt ; захват т/с Т1
nop; rjmp INT_t1cmpA ; совпадение A т/с Т1
rjmp INT_t1cmpB ; совпадение B т/с Т1
nop; rjmp INT_t1o ; переполнение т/с Т1
nop; rjmp INT_t0o ; переполнение т/с Т0
nop; rjmp INT_SPI ; передача по SPI завершена
nop; rjmp INT_USART_RX ; прием завершен
nop; rjmp INT_USART_UDRE; регистр данных пуст
nop; rjmp INT_USART_TX ; передача завершена
nop; rjmp INT_ADC ; преобразование АЦП завершена
nop; rjmp INT_EE_RDY ; EEPROM готово
nop; rjmp INT_ANA_COMP ; аналоговый компаратор
nop; rjmp INT_TWI ; прерывание от модуля TWI
nop; rjmp INT_SPM_RDY ; Готовность SPM

;-----инициализация----
RESET:
cli ; Запретить прерывания
ldi r16,$7E ; 0111 1110
out DDRD,r16
clr r16
out DDRB,r16
out DDRC,r16
out PORTB,r16
out PORTC,r16
;----UART---------------------------------
UARTINIT
;----Timer1-------------------------------
T1_ustavka
T1_start
T1_Int_Init
sei ; Разрешить прерывания

;----- главный цикл
main:
sbis PIND,dholl
rjmp endc ;возврат к main
sbrc r19,7 ;r19 старое значение
rjmp endc ;возврат к main
inc r18 ; r18=r18+1 счетчик с накоплением
endc:
in r19,PIND
rjmp main ;возврат к main
;-----------------------------------------------------
INT_t1cmpB:
out udr,r18
clr r18
reti


; Макроопределения для ATMEGA

.macro UARTINIT; инициализация скорости обмена и разрешение прерываний по приходу данных
;---------------------------------------------------------------------------------
ldi r16,0b00011000 ; RXCIE TXCIE UDRIE RXEN TXEN CHR9 RXB8 TXB8
out UCSRB, r16 ; 0 0 0 1 1 0 0 0
; режим 8 бит причем 9-й - TXB8 - используется как расширенный стоп-бит
ldi r16,$33 ; скорость порта 16000000/16*51+1=19200 для 16МГц кварца
out UBRRL,r16
.endm

.macro T1_Int_Init ;разрешение прерывания от таймеров 1
ldi r16,(1<<OCIE1B)
out TIMSK,r16
.endm

.macro T1_ustavka ;сравнение
ldi r16,high(7812)
out OCR1BH,r16
ldi r16,low(7812)
out OCR1BL,r16
.endm

.macro T1_start
ldi r16,$5 ;clk/1024
out TCCR1B,r16
.endm

помогите плз...
defunct
Ну во-первых. В обработчиках прерывания, нужно заботиться о сохранении регистра флагов SREG самостоятельно. Первая ошибка у Вас здесь:

Код
.def TMPSREG = R2;

INT_t1cmpB:
   in TMPSREG, SREG
   out udr,r18
   clr r18
   out SREG, TMPSREG
   reti


Вторая просто классическая ошибка, связана с тем, что при работе с прерываниями и функциями обязательно необходимо инициализировать стек, а вот прерывания запрещать при старте программы как раз совсем не обязательно, т.к. флаг i и так сброшен:

Код
.def AL = r24;
...
RESET:
   ldi  AL, High( RAMEND )
   out SPH, AL
   ldi  AL, Low( RAMEND )
   out SPL, AL
...



возможно есть и еще ошибки..
Aleck
Все работает ! спасибо бАААльшое smile.gif а то неделю сидел тупил что же неработает sad.gif
Aleck
А еще вопрос как вывести в порт 2 байта, TCNTH(L) счетчика 1, выводит 1 байт а 2 нет


in r19,TCNT1H
out udr,r19
wait:
sbis UCSRA, UDRE
rjmp Wait ; ждем освобождения буфера
in r19,TCNT1L
out udr,r19
WHALE
В даташите-же все есть
in r18,sreg
cli
in r16,tcnt1h
in r17,tcnt1l
out sreg,r18
Т.е для чтения счетчика на лету надо добиться атомарности операции чтения
Laksus
Цитата
WHALE Дата Сегодня, 20:11
В даташите-же все есть
in r18,sreg
cli
in r16,tcnt1h
in r17,tcnt1l
out sreg,r18
Т.е для чтения счетчика на лету надо добиться атомарности операции чтения


____________
Небольшое, но важное уточнение!
цитата из www.atmel.com/... .../doc2486.pdf (ATmega8)
Цитата
To do a 16-bit write, the High byte must be written before the Low byte. For a 16-bit
read, the Low byte must be read before the High byte.
...
Assembly Code Example(1)
...
Код
; Set TCNT1 to 0x01FF
    ldi r17,0x01
    ldi r16,0xFF
    out TCNT1H,r17
    out TCNT1L,r16
    
; Read TCNT1 into r17:r16
    in r16,TCNT1L
    in r17,TCNT1H

...

То есть, при чтении 16-разрядного регистра таймера необходимо читать
сначала младший байт, а затем старший.
А при записи - наоборот.

Смотри в даташите раздел "Accessing 16-Bit Registers".
(Или, если проблемы с англицким, в книге:
Евстифеев А.В.
"Микроконтроллеры AVR семейств Tiny и Mega фирмы ATMEL")

Александр
2006 03 24
WHALE
Извиняюсь за неточность,писал по памяти,Laksus абсолютно прав-
читается вначале младший байт.
defunct
Цитата
То есть, при чтении 16-разрядного регистра таймера необходимо читать
сначала младший байт, а затем старший.
А при записи - наоборот.


Добавлю почему именно так.
Процессор 8-ми разрядный и может за один такт прочитать только один байт. Таймер же - независимое устройство и за один такт может изменить значение двух байт из которого состоит слово счетчика TCNTX.. Для того чтобы значение счетчика TCNTX было прочитано/записано достоверно, требуется читать/записывать оба байта за один такт. Atmel решает эту проблему с помощью дополнительного буферного регистра, который находится между регистром старшего байта (TCNTXH) и шиной данных. Запись в этот буферный регистр из регистра TCNTXH происходит одновременно с чтением младшего байта (TCNTXL), запись из буферного регистра в TCNTXH происходит одновременно с записью младшего байта (TCNTXL). Таким образом операции записи и чтения 16-ти разрядного регистра TCNT - будут атомарными (запись 2х байт в таймер и чтение 2х байт из таймера происходит одновременно). Почему именно старший байт имеет доп. буфер? - потому что Atmel так решил.

То же правило (порядок считывания и записи) касается всех двухбайтных регистров - SP, TCNTX, OCRXA, OCRXB, ADC и т.п.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.