|
Atmega128 Timer2, Что-то не могу разобраться |
|
|
|
Feb 3 2013, 17:08
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 20-02-12
Пользователь №: 70 356

|
CODE .EQU COUNT_LED_OFF = 0xF0 .EQU COUNT_LED_ON = 0xF0
.org 0 jmp RESET .org OVF2addr jmp OVF2
.org 0x46 OVF2: push R16 push R30 push R31
; остановим таймер clr R16 out TCCR2,R16 sbi PORTA,2 ; фронт импульса на осциллограф ldi R16,COUNT_LED_ON out TCNT2,R16 ; запустим таймер ldi R16,0b00000101; частота 16 МГц/1024 = 15.625 кГц, период 64 мкс out TCCR2,R16 pop R31 pop R30 pop R16 cbi PORTA,2 reti RESET:
ldi r16,high(RAMEND) out SPH,r16 ldi r16,low(RAMEND) out SPL,r16
ldi R16,0xFF out DDRC,R16 ldi R16,0b00000111 out DDRA,R16
ldi R16,0b00000101; частота 16 МГц/1024 = 15.625 кГц, период 64 мкс out TCCR2,R16 in R16,TIFR andi R16,0b00111111 out TIFR,R16 in R16,TIMSK ori R16,0b01000000 out TIMSK,R16 andi R24,0b11111100 ldi R16,COUNT_LED_OFF out TCNT2,R16 sei
loop: rjmp loop Осцилом встал на bit 2 порта A. Проблема в том, что период между фронтами импульсов непостоянный - то 1 мс, то ~ 0.7 мс, т.е. прерывания по таймеру возникают с разным периодом. Никакие другие прерывания не разрешены. Где порыть?
Сообщение отредактировал IgorKossak - Feb 3 2013, 18:40
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Feb 4 2013, 01:38
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 20-02-12
Пользователь №: 70 356

|
Цитата(ILYAUL @ Feb 4 2013, 02:46)  И почитайте FREE TAIMER Ни FREE TAIMER, ни FREE TIMER в доке не нашел, о чем речь?
|
|
|
|
|
Feb 4 2013, 04:36
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 20-02-12
Пользователь №: 70 356

|
Цитата(RabidRabbit @ Feb 4 2013, 00:37)  Мож прескейлер надо сбрасывать? Prescaler может давать ошибку +- 64 мкс, а у меня разница в 0,3 мс...
|
|
|
|
|
Feb 4 2013, 05:14
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 20-02-12
Пользователь №: 70 356

|
Цитата(zombi @ Feb 4 2013, 02:01)  WDT ? Он выключен после RESET. Цитата(adc @ Feb 4 2013, 11:02)  Кроме этой задачи в программе ничего не делается? Нет, поубирал все, в первом посте полный код. Цитата(adc @ Feb 4 2013, 11:02)  Попробуйте не останавливать таймер, а просто переписывать TCNT2. Попробую.
|
|
|
|
|
Feb 4 2013, 07:28
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(alx71 @ Feb 4 2013, 10:38)  Ни FREE TAIMER, ни FREE TIMER в доке не нашел, о чем речь? Скорее всего речь про Clear Timer on Compare Match (CTC) Mode. Таймер досчитывает до числа, записанного в регистр OCRx и сбрасывается в ноль автоматически. Не требуется что-либо дополнительно писать в таймер в прерывании.
|
|
|
|
|
Feb 4 2013, 09:42
|

Профессионал
    
Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339

|
Цитата Попробуйте не останавливать таймер, а просто переписывать TCNT2 -1 такт ( задержка выполнения считывание -запись) = free timer Если у Вас одно значение то проще сделать Цитата Таймер досчитывает до числа, записанного в регистр OCRx и сбрасывается в ноль автоматически
--------------------
Закон Мерфи:
Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
|
|
|
|
|
Feb 4 2013, 09:57
|

Местный
  
Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836

|
Цитата -1 = free timer Ну что Вы все заладили? Ну есть режим CTC у таймера , как уже писал выше ув. ae_, причина то явно не ясна почему интервалы разные? Естественно в этой задаче CTC mode, наиболее удобное решение.
|
|
|
|
|
Feb 4 2013, 12:45
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
alx71, может M103C fuse забыли снять? Да, и вот этот код не_сбрасывает флаги OCF2 и TOF2 Код in R16,TIFR andi R16,0b00111111 out TIFR,R16 Их надо сбрасывать записью "1" Код ldi R16, 0b_1100_0000 out TIFR, R16
|
|
|
|
|
Feb 4 2013, 16:36
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 20-02-12
Пользователь №: 70 356

|
Цитата(zombi @ Feb 4 2013, 01:01)  WDT ? Действительно WDT.
|
|
|
|
|
Feb 4 2013, 23:02
|
Участник
  
Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695

|
Цитата(ILYAUL @ Feb 5 2013, 01:42)  А зачем , если у него работает аппаратный сброс Разумеется, флаги будут аппаратно сброшены при входе в прерывание. Я указал на ошибку не в качестве решения вопроса нестабильного периода прерываний, а с целью обратить внимание ТС и остальных, кто будет читать эту ветку, что флаги нужно сбрасывать записью "1", а не "0".
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|