реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Atmega128 Timer2, Что-то не могу разобраться
alx71
сообщение Feb 3 2013, 17:08
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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] - для короткого!!!
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Feb 3 2013, 18:37
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Мож прескейлер надо сбрасывать?
Go to the top of the page
 
+Quote Post
zombi
сообщение Feb 3 2013, 20:01
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106



WDT ?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Feb 3 2013, 20:46
Сообщение #4


Профессионал
*****

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



Код
    .org    0x46
    push    R16    push    R30    push    R31
pop        R31    pop        R30    pop        R16

Зачем это всё? И почитайте FREE TAIMER


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
alx71
сообщение Feb 4 2013, 01:38
Сообщение #5


Участник
*

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



Цитата(ILYAUL @ Feb 4 2013, 02:46) *
И почитайте FREE TAIMER

Ни FREE TAIMER, ни FREE TIMER в доке не нашел, о чем речь?


Go to the top of the page
 
+Quote Post
alx71
сообщение Feb 4 2013, 04:36
Сообщение #6


Участник
*

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



Цитата(RabidRabbit @ Feb 4 2013, 00:37) *
Мож прескейлер надо сбрасывать?

Prescaler может давать ошибку +- 64 мкс, а у меня разница в 0,3 мс...
Go to the top of the page
 
+Quote Post
adc
сообщение Feb 4 2013, 05:02
Сообщение #7


Местный
***

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



Кроме этой задачи в программе ничего не делается?
Попробуйте не останавливать таймер, а просто переписывать TCNT2.


--------------------
Умный программист пишет тупым кодом гениальные вещи, а не наоборот...
Go to the top of the page
 
+Quote Post
alx71
сообщение Feb 4 2013, 05:14
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 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.

Попробую.
Go to the top of the page
 
+Quote Post
ae_
сообщение Feb 4 2013, 07:28
Сообщение #9


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Цитата(alx71 @ Feb 4 2013, 10:38) *
Ни FREE TAIMER, ни FREE TIMER в доке не нашел, о чем речь?

Скорее всего речь про Clear Timer on Compare Match (CTC) Mode.
Таймер досчитывает до числа, записанного в регистр OCRx и сбрасывается в ноль автоматически. Не требуется что-либо дополнительно писать в таймер в прерывании.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Feb 4 2013, 09:42
Сообщение #10


Профессионал
*****

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



Цитата
Попробуйте не останавливать таймер, а просто переписывать TCNT2
-1 такт ( задержка выполнения считывание -запись) = free timer
Если у Вас одно значение то проще сделать
Цитата
Таймер досчитывает до числа, записанного в регистр OCRx и сбрасывается в ноль автоматически


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
adc
сообщение Feb 4 2013, 09:57
Сообщение #11


Местный
***

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



Цитата
-1 = free timer

Ну что Вы все заладили?
Ну есть режим CTC у таймера , как уже писал выше ув. ae_, причина то явно не ясна почему интервалы разные?
Естественно в этой задаче CTC mode, наиболее удобное решение.
Go to the top of the page
 
+Quote Post
ae_
сообщение Feb 4 2013, 12:45
Сообщение #12


Участник
***

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
alx71
сообщение Feb 4 2013, 16:36
Сообщение #13


Участник
*

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



Цитата(zombi @ Feb 4 2013, 01:01) *
WDT ?

Действительно WDT.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Feb 4 2013, 16:42
Сообщение #14


Профессионал
*****

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



Цитата(ae_ @ Feb 4 2013, 16:45) *
Да, и вот этот код не_сбрасывает флаги OCF2 и TOF2

А зачем , если у него работает аппаратный сброс


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
ae_
сообщение Feb 4 2013, 23:02
Сообщение #15


Участник
***

Группа: Свой
Сообщений: 462
Регистрация: 2-04-07
Из: Иркутск
Пользователь №: 26 695



Цитата(ILYAUL @ Feb 5 2013, 01:42) *
А зачем , если у него работает аппаратный сброс

Разумеется, флаги будут аппаратно сброшены при входе в прерывание.
Я указал на ошибку не в качестве решения вопроса нестабильного периода прерываний,
а с целью обратить внимание ТС и остальных, кто будет читать эту ветку, что флаги нужно сбрасывать записью "1", а не "0".
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 13th July 2025 - 08:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01845 секунд с 7
ELECTRONIX ©2004-2016