|
Таймер на 4 сек, нужен исходник |
|
|
|
 |
Ответов
|
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, 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. ... Вот я с дуру и подумал, что таймер может работать от внутренних часов. Теперь всё прояснилось, спасибо.
--------------------
Нет повести печальнее на свете, чем повесть о хреновом интернете.
|
|
|
|
Сообщений в этой теме
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
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|