|
Таймер на 4 сек, нужен исходник |
|
|
|
Mar 28 2008, 09:41
|
Местный
  
Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228

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

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) для удобства пользования.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Mar 28 2008, 10:53
|
Участник

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

|
И единичку наверно надо добавить. while(1);
|
|
|
|
|
Mar 28 2008, 12:13
|
Группа: Новичок
Сообщений: 4
Регистрация: 22-12-06
Пользователь №: 23 781

|
;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 ... ...
Сообщение отредактировал Миха12345 - Mar 28 2008, 12:33
|
|
|
|
|
Mar 28 2008, 14:05
|

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).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Mar 28 2008, 15:14
|
Местный
  
Группа: Участник
Сообщений: 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?
--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
|
|
|
|
|
Mar 28 2008, 17:30
|
Местный
  
Группа: Участник
Сообщений: 214
Регистрация: 19-07-07
Пользователь №: 29 228

|
Цитата(Alex_Pol @ Mar 28 2008, 17:27)  Это тактовая частота. Вы издеваетесь?  Я не в коем случае не над кем не издеваюсь! В даташите на ATmega8 есть раздел Timer/Counter Clock Sources, так вот там написано, цитирую: Цитата The Timer/Counter can be clocked by an internal or an external clock source. ... Вот я с дуру и подумал, что таймер может работать от внутренних часов. Теперь всё прояснилось, спасибо.
--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|