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

 
 
> Таймер на 4 сек, нужен исходник
coolibin
сообщение Mar 28 2008, 07:56
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



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


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
lolful
сообщение Mar 28 2008, 10:21
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 106
Регистрация: 27-11-07
Из: Пермь
Пользователь №: 32 732



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кГц, опять же, в даташите все ясно написано

Сообщение отредактировал lolful - Mar 28 2008, 10:23
Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 28 2008, 10:42
Сообщение #3


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Поправлю немного, вы забыли счётчик обнулить после достижения 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) для удобства пользования.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
megachip
сообщение Mar 28 2008, 10:53
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 29
Регистрация: 13-06-05
Пользователь №: 5 967



И единичку наверно надо добавить.
while(1);
Go to the top of the page
 
+Quote Post
coolibin
сообщение Mar 28 2008, 11:34
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



Ну а на асме как сделать?


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 28 2008, 12:28
Сообщение #6


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



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

Я ж вам написал практически всю программу, см. пост #5


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
coolibin
сообщение Mar 28 2008, 13:45
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



Всё равно не пойму, если биты CS00 = 1, CS01 = 0, CS02 = 1 регистра TCCR0, т. е. без делителя, то на какой частоте работает таймер?


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 28 2008, 14:05
Сообщение #8


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



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

Это не без делителя, а с делителем на 1024. Вы ж говорили вроде, что "теоретических сведений вам хватает". Т.е. тактовая частота проца делится на 1024, затем подаётся на вход таймера0. Поскольку таймер0 восьмибитный, то переполнение таймера0 будет наступать каждый 256-й импульс, т.е. частота прерываний будет Fclk/(1024*256).


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
coolibin
сообщение Mar 28 2008, 15:14
Сообщение #9


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



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

изивиняйте, я ошибся CS00 = 1, CS01 = 0, CS02 = 0. Это всё я уже понял, меня интересует чему равно Fclk?


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
Alex_Pol
сообщение Mar 28 2008, 15:27
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 192
Регистрация: 23-03-05
Из: Украина. Днепропетровск
Пользователь №: 3 626



Цитата(coolibin @ Mar 28 2008, 17:14) *
изивиняйте, я ошибся CS00 = 1, CS01 = 0, CS02 = 0. Это всё я уже понял, меня интересует чему равно Fclk?
Это тактовая частота. Вы издеваетесь? 07.gif
Go to the top of the page
 
+Quote Post
coolibin
сообщение Mar 28 2008, 17:30
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228



Цитата(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.
...

Вот я с дуру и подумал, что таймер может работать от внутренних часов. Теперь всё прояснилось, спасибо.


--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
Go to the top of the page
 
+Quote Post
Alex_Pol
сообщение Mar 28 2008, 18:51
Сообщение #12


Частый гость
**

Группа: Свой
Сообщений: 192
Регистрация: 23-03-05
Из: Украина. Днепропетровск
Пользователь №: 3 626



Цитата(coolibin @ Mar 28 2008, 19:30) *
Вот я с дуру и подумал, что таймер может работать от внутренних часов. Теперь всё прояснилось, спасибо.
lol.gif В данном случае слово "clock" переводится не как "часы", а как "тактовые импульсы". "Вам нужен новый гуртовщик мыши."
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- coolibin   Таймер на 4 сек   Mar 28 2008, 07:56
- - SasaVitebsk   Это для начинающих. 1) Пишется прерывание от тай...   Mar 28 2008, 08:27
|- - coolibin   Цитата(SasaVitebsk @ Mar 28 2008, 10:27) ...   Mar 28 2008, 09:41
|- - MicronSys   Цитата(coolibin @ Mar 28 2008, 15:34) Ну ...   Mar 28 2008, 12:00
|- - Дон Амброзио   Цитата(coolibin @ Mar 28 2008, 21:30) Вот...   Mar 30 2008, 16:23
- - Миха12345   ;8000000/256/256 = 122,0703125 .cseg .org 0 rjmp...   Mar 28 2008, 12:13
- - TomaT   Плохо учили матчасть! Нету в Меге никаких ...   Mar 28 2008, 18:32
- - akl   "Нужен исходник на асме таймера срабатывающег...   Mar 29 2008, 05:34


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 05:02
Рейтинг@Mail.ru


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