Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Таймер на 4 сек
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
coolibin
Нужен исходник на асме таймера срабатывающего каждые 4 сек(не обязательно, но желательно большой промежуток времени) на ATmega8. Даташит читал и понял что не хватает хорошего примера.
SasaVitebsk
Это для начинающих. smile.gif

1) Пишется прерывание от таймера на максимальную кратную величину. Например на 0.01 сек.
2) В самом прерывании заводится переменная, которая инкрементируется или наоборот.
3) При достижении этой переменной нужного значения (в данном случае 400) выполняются необходимые действия.
coolibin
Цитата(SasaVitebsk @ Mar 28 2008, 10:27) *
Это для начинающих. smile.gif

1) Пишется прерывание от таймера на максимальную кратную величину. Например на 0.01 сек.
2) В самом прерывании заводится переменная, которая инкрементируется или наоборот.
3) При достижении этой переменной нужного значения (в данном случае 400) выполняются необходимые действия.

Спасибо большое, но с этим я уже знаком. Мне нужен исходник работы с таймером, пусть на любой промежуток времени. Теоретических сведений мне хватает


Самое главное чуть не забыл, какая частота внутренних часов?
lolful
void timer1_init(void){
//устанока таймера, не помню как делать - в даташите все написано
}

#pragma interrupt_handler timer1_ovf_isr:14
void timer1_ovf_isr(void)
{
counter++;
if (counter >= 400) doSomeThing();
}

void main(void){
timer1_init();
}

PS вектор прерывания переполнения таймера от 168 меги, писалось под icc avr

PPS по-моему частота внутреннего кварца 128кГц, опять же, в даташите все ясно написано
=GM=
Поправлю немного, вы забыли счётчик обнулить после достижения 400, ну и главный цикл в основной программе не помешает.
Код
void timer1_ovf_isr(void)
{
   counter++;
   if (counter >= 400)
  {
    counter=0;  
    doSomeThing();
  }
}
void main(void)
{
timer1_init();
asm("sei");
while(1);
}

Другой подход: что если подать на вход таймера1 частоту Fclk/1024, тогда для 16МГц клока переполнение наступит как раз через 4с, первое прерывание даст то, что надо, не надо будет ничего считать.

Фрагмент подпрограммы обработки прерываний переполнения таймера1 на ассемблере в предположении, что счётчик переполнений находится в (r25,r24). Счётчик работает на вычитание.
Код
   subi   r24,1
   sbci   r25,0
   brne   no4sec
   ldi    r24,low(400)
   ldi    r25,high(400)
   rcall  dosomething
no4sec:
   reti

Само собой разумеется, что статус-регистр и все модифицируемые регистры надо сохранять при входе в прерывание и затем восстанавливать при выходе.

Поправил while(1) для удобства пользования.
megachip
И единичку наверно надо добавить.
while(1);
coolibin
Ну а на асме как сделать?
MicronSys
Цитата(coolibin @ Mar 28 2008, 15:34) *
Ну а на асме как сделать?


На ASM -e на дворе 21 век а вы все топором спички делаете a14.gif
Миха12345
;8000000/256/256 = 122,0703125

.cseg
.org 0
rjmp start
.org OVF0addr ; Timer/Counter0 Overflow
rjmp qqq

init:
ldi temp,(1<<SE) ;разрешение уснуть
out mcucr,temp
sei
ldi temp,(1<<TOIE0)
out timsk,temp
ldi temp,0b00000100 ;ck/8
out tccr0,temp

start:
ldi temp2, 3
qq2: ldi temp, 121
qq1: sleep
dec temp
brne qq1
dec temp2
brne qq2
- тут действие -
...

qqq:
reti
...
...
=GM=
Цитата(coolibin @ Mar 28 2008, 11:34) *
Ну а на асме как сделать?

Я ж вам написал практически всю программу, см. пост #5
coolibin
Всё равно не пойму, если биты CS00 = 1, CS01 = 0, CS02 = 1 регистра TCCR0, т. е. без делителя, то на какой частоте работает таймер?
=GM=
Цитата(coolibin @ Mar 28 2008, 13:45) *
Всё равно не пойму, если биты CS00 = 1, CS01 = 0, CS02 = 1 регистра TCCR0, т. е. без делителя, то на какой частоте работает таймер?

Это не без делителя, а с делителем на 1024. Вы ж говорили вроде, что "теоретических сведений вам хватает". Т.е. тактовая частота проца делится на 1024, затем подаётся на вход таймера0. Поскольку таймер0 восьмибитный, то переполнение таймера0 будет наступать каждый 256-й импульс, т.е. частота прерываний будет Fclk/(1024*256).
coolibin
Цитата(=GM= @ Mar 28 2008, 16:05) *
Это не без делителя, а с делителем на 1024. Вы ж говорили вроде, что "теоретических сведений вам хватает". Т.е. тактовая частота проца делится на 1024, затем подаётся на вход таймера0. Поскольку таймер0 восьмибитный, то переполнение таймера0 будет наступать каждый 256-й импульс, т.е. частота прерываний будет Fclk/(1024*256).

изивиняйте, я ошибся CS00 = 1, CS01 = 0, CS02 = 0. Это всё я уже понял, меня интересует чему равно Fclk?
Alex_Pol
Цитата(coolibin @ Mar 28 2008, 17:14) *
изивиняйте, я ошибся CS00 = 1, CS01 = 0, CS02 = 0. Это всё я уже понял, меня интересует чему равно Fclk?
Это тактовая частота. Вы издеваетесь? 07.gif
coolibin
Цитата(Alex_Pol @ Mar 28 2008, 17:27) *
Это тактовая частота. Вы издеваетесь? 07.gif

Я не в коем случае не над кем не издеваюсь! В даташите на ATmega8 есть раздел Timer/Counter Clock
Sources, так вот там написано, цитирую:
Цитата
The Timer/Counter can be clocked by an internal or an external clock source.
...

Вот я с дуру и подумал, что таймер может работать от внутренних часов. Теперь всё прояснилось, спасибо.
TomaT
Плохо учили матчасть! Нету в Меге никаких "внутренних часов" (асинхронный таймер пока опустим, тут не до него). Internal clock, -- это частота ядра, external clock, -- это сигнал заведенный снаружи, через соответствующую ногу. Можете на нее хоть 50Гц подать с трансформатора из розетки smile.gif, таймер будет "щелкать" с частотой сети. И не забываем про прескалер.
Alex_Pol
Цитата(coolibin @ Mar 28 2008, 19:30) *
Вот я с дуру и подумал, что таймер может работать от внутренних часов. Теперь всё прояснилось, спасибо.
lol.gif В данном случае слово "clock" переводится не как "часы", а как "тактовые импульсы". "Вам нужен новый гуртовщик мыши."
akl
"Нужен исходник на асме таймера срабатывающего каждые 4 сек..."

Посмотрите ниже "...AVR-Измерение рабочей частоты микроконтроллера-#12..". Там можно пересчитать для значения 4 секунды.
Дон Амброзио
Цитата(coolibin @ Mar 28 2008, 21:30) *
Вот я с дуру и подумал, что таймер может работать от внутренних часов.

А что такое "внутренние часы"?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.