|
|
  |
Таймер1 на atmega8, хз |
|
|
|
Mar 18 2006, 20:18
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 24-06-05
Из: Новосибирск
Пользователь №: 6 296

|
Вводная: Тахометр для стенда, есть 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
помогите плз...
Сообщение отредактировал Aleck - Mar 18 2006, 20:21
|
|
|
|
|
Mar 18 2006, 20:52
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Ну во-первых. В обработчиках прерывания, нужно заботиться о сохранении регистра флагов 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 ... возможно есть и еще ошибки..
Сообщение отредактировал defunct - Mar 18 2006, 21:36
|
|
|
|
|
Mar 24 2006, 17:11
|
Участник

Группа: Участник
Сообщений: 15
Регистрация: 24-06-05
Из: Новосибирск
Пользователь №: 6 296

|
А еще вопрос как вывести в порт 2 байта, TCNTH(L) счетчика 1, выводит 1 байт а 2 нет
in r19,TCNT1H out udr,r19 wait: sbis UCSRA, UDRE rjmp Wait ; ждем освобождения буфера in r19,TCNT1L out udr,r19
|
|
|
|
|
Mar 24 2006, 20:28
|
Частый гость
 
Группа: Участник
Сообщений: 146
Регистрация: 16-05-05
Пользователь №: 5 069

|
Цитата 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
|
|
|
|
|
Mar 27 2006, 23:06
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

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