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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Таймер на 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
SasaVitebsk
сообщение Mar 28 2008, 08:27
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Это для начинающих. smile.gif

1) Пишется прерывание от таймера на максимальную кратную величину. Например на 0.01 сек.
2) В самом прерывании заводится переменная, которая инкрементируется или наоборот.
3) При достижении этой переменной нужного значения (в данном случае 400) выполняются необходимые действия.
Go to the top of the page
 
+Quote Post
coolibin
сообщение Mar 28 2008, 09:41
Сообщение #3


Местный
***

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



Цитата(SasaVitebsk @ Mar 28 2008, 10:27) *
Это для начинающих. smile.gif

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

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


Самое главное чуть не забыл, какая частота внутренних часов?


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


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

Группа: Свой
Сообщений: 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
Сообщение #5


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
Сообщение #6


Участник
*

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



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


Местный
***

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



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


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


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

Группа: Участник
Сообщений: 106
Регистрация: 12-05-05
Пользователь №: 4 946



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


На ASM -e на дворе 21 век а вы все топором спички делаете a14.gif
Go to the top of the page
 
+Quote Post
Миха12345
сообщение Mar 28 2008, 12:13
Сообщение #9





Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 28 2008, 12:28
Сообщение #10


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
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 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
Сообщение #12


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
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 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
Сообщение #14


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

Группа: Свой
Сообщений: 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
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 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

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 01:43
Рейтинг@Mail.ru


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