roboforum.ru

Технический форум по робототехнике.

Таймер

Таймер

aliens » 06 фев 2005, 04:36

Расскажите как его включить, настроить, выключить. Спасибо

chief » 06 фев 2005, 13:11

В примере для 7-ми сегментных индикаторов как раз в рестарте помещен код пуска таймера 1 с предделителем 1024. А вообще
такие элементарные вещи нужно в доках читать на процессор,
да и в том же AVR Studio 4.0 с этим разобраться не сложно...
Одним словом дерзай, читай... Что не получится - обращайся.
Просто с такими вопросами на форум ходить не стоит...
PS Если нету доки, обращайся, вышлю, или например на
http://www.atmel.ru Удачи...

aliens » 06 фев 2005, 18:28

Доки все есть, но я туго английский понимаю (лсобенно технический)
Нужно именно про регистры управления им (что,куда)

chief » 06 фев 2005, 19:07

Для запуска таймера 0 служит регистр TCCR0. В зависимости от кода, который в него заносится зависит в каком режиме будет работать таймер.
0х01 - прямой счет
0х02 - предделитель на 8
0х03 - предделитель на 64
0х04 - предделитель на 256
0х05 - предделитель на 1024
0х06 - работа от внешнего входа по нарастающему фронту
0х07 - тоже по спадающему
результат счета находится в регистре TCNT0
TIFR - флаг переполнения
TIMSK - регистр разрешения на прерывание от таймера
Для того что бы написать программу прерывания необходимо программу оформить следующим образом:

код:

.include "2313def.inc"

.def tmp =r25

.org 00
rjmp reset
.org 06
; текст программы обработчика
reset:
  clr tmp ;очистка регистра
ldi tmp,0x02 ;установка значений битов регистра
out TIMSK,tmp ;установка битов в TIMSK
dec tmp
ldi tmp,0x01
out TCCR0,tmp ;запуск таймера
loop:
               rjmp loop                  ;пустой цикл

А для таймера 1 попробуй изучить документацию, это занимательно  :roll:

aliens » 06 фев 2005, 21:17

Спасибо!!! Очень помог!!

Похоже дежавю....

Mike_MA » 07 фев 2005, 18:08

Где то я уже на эти вопросы отвечал..... :shock:  8)  :wink:  :?:  :!:

aliens » 07 фев 2005, 20:34

Да, но так до практики и не дошли, а у меня фулкрум не работает :?

aliens » 09 фев 2005, 03:53

Вот таймером1 научился,yj возник вопрос по расчету времени
Надо частоту делить на делитель?
Допустим при 1 мГц и при делители 1024 получаетсяя 1000000/1024=976 Гц=0.001с
Так или нет?

Еще.
Прочитал в своей книжке, что 16разрядный таймер в меге8 может
работать как часы реального времени, так это? если да то подскажите
как настроить.

Mike_MA » 09 фев 2005, 12:56

aliens писал(а):Надо частоту делить на делитель?
Допустим при 1 мГц и при делители 1024 получаетсяя 1000000/1024=976 Гц=0.001с
Так или нет?

Это конечно так, но это не вся правда....То что ты имел в виду - это предделитель . То есть ты получил такт таймера равный 1 мсек.
После этого нужно разделить заданный тебе период импульса на этот такт и ты получишь значение регистра счётчика. Т.е если ты запишешь в регистр счётчика 0xFF и расчитанным выше делителем , то получите таймер с периодом в 1 мсек.

Короче последовательность следующая:
- выбираем предделитель (8, 64,1024) подсчитываем такт
- берем заданный период и делим на такт получаем число
-  а)выполняем операцию делитель= 0xFF- число
-  б) выполняем операцию делитель= 0xFFFF- число если счётчик двухбайтный

- после этого вставляем в программу как константу и каждый раз в обработчике загружаем в регистры
:wink:  :wink:

aliens писал(а):Еще.
Прочитал в своей книжке, что 16разрядный таймер в меге8 может
работать как часы реального времени, так это? если да то подскажите
как настроить.


Если конечно кварц у тебя будет 32 767 Гц :lol:  :lol:

chief » 10 фев 2005, 21:21

Для пояснения текущего вопроса привожу фрагмент статьи:

При подаче питания и выполнении условий сброса выполняется процедура сброса (Reset) для инициализации системных устройств. Все линии портов настраиваются на высокий уровень для выключения всех нагрузок. При этом порты настраиваются на выход записью числа 255 в регистры направления обеих портов. Направление порта В в дальнейшем кратковременно меняется для выполнения функции опроса клавиатуры. Для предделителя таймера выбирают коэффициент деления тактовой частоты 256, при этом, если таймер перезагружать кодом 176, период переполнения таймера и генерации прерываний равен 5 мс. Прерывание по переполнению таймера становится активным после разрешения глобальных прерываний (команда sei).

При использовании кварцевого резонатора 4.096 МГц длительность цикла инструкции равна 0.2441 мкс. С учетом этого, при записи числа n в регистр таймера 0 TCNT0 период его переполнения определяется по выражению:

(256-n)*256*02441, мкс

Таким образом запись числа 176 обеспечит период переполнения 5мс с высокой для счета реального времени точностью.
Мой код:

.include "2313def.inc"
rjmp    RESET           ;Reset Handle
       reti                    ;irq0
       reti                    ;irq1
       reti                    ;timer1
       reti                    ;timer1 comA
       reti        ;timer1 over
       rjmp OVER0           ;timer0 over
       reti                    ;spi
       reti                    ;uart
       reti                    ;uart
       reti                    ;uart
       reti                    ;anacomp
OVER0:

ldi tmp,177
out TCNT0,tmp
reti
reset:
clr tmp ;очистка регистра
ldi tmp,$6f ;установка значений битов регистра
out SPL,tmp ;установка начального адреса стека
clr tmp
sei
clr tmp
ldi tmp,0x02 ;установка значений битов регистра
out TIMSK,tmp ;установка битов в TIMSK
clr tmp
ldi tmp,0x04
out TCCR0,tmp ;запуск таймера
ldi tmp,177
out TCNT0,tmp
next:
rjmp next

Re: Таймер

D'Ark Trouyan » 13 мар 2008, 15:15

не пойму у AT90S2313 таймер по другому как-то запускается ??? Хочу сделать задержку с использованием таймера а не delay ... кварц 4 МГц.

Код: Выделить всёРазвернуть
#include <90s2313.h> 

void main (void)
{
TCCR0 = 0x05;
DDRB = 0xFF;

while (1)
{
               if(PORTB.3==0)
               {PORTB.3=1;} else
               PORTB.3=0;
               while (!(TIFR&0x01));
               TIFR = 0x01;
          };
}


Добавлено спустя 40 минут 37 секунд:
Таак проблема решена. Причина неполадки - расположение TOV0 в AT90S2313 не такое как у мег.
Код: Выделить всёРазвернуть
#include <90s2313.h> 

void main (void){
TCCR0 = 0x05;
DDRB = 0xFF;
TIFR=0b00000010;

while (1){
if(PORTB.3==0)
{PORTB.3=1;} else
PORTB.3=0;
while (!(TIFR&0b00000010));
TIFR=0b00000010;
          };
}

Re: Таймер

avr123.nm.ru » 13 мар 2008, 16:50

aliens писал(а):Расскажите как его включить, настроить, выключить.


Таймеры AVR удобно настраивать с помощью мастера компилятора ICC или CVAVR.
Вот примеры как это сделать : http://tinyurl.com/2egdph


Rambler\'s Top100 Mail.ru counter