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

 
 
 
Reply to this topicStart new topic
> Странности с таймером при переводе программы с классики на мегу
AvrLamer
сообщение Jul 23 2007, 16:21
Сообщение #1





Группа: Новичок
Сообщений: 1
Регистрация: 23-07-07
Пользователь №: 29 318



Написал такую программу на ICC:

#include <io8515v.h>
#include <macros.h>

#pragma interrupt_handler Timer:4 Timer:5

static volatile unsigned long currentTimerTick;


static void Timer(void)
{
currentTimerTick++;
}


void InitTimer(void)
{
TCCR1B = 0x00; // Stop Timer1
TCNT1H = 0x00; // Clear Timer1
TCNT1L = 0x00;

OCR1AH = 0x01; // Set Compare A to 391
OCR1AL = 0x87; // ((4MHz/1024)/391) = 100ms timer

TIMSK = 0x40; // Compare A Interrupt enable

TCCR1B = 0x0D; // Start Timer1 with clk/1024

SREG |= 0x80;
}


currentTimerTick увеличивает своё значение каждые 1/10 сек. С её помошью я (этого кода здесь нет) каждые 3 сек включаю светодиод, потом через 3 сек выключаю, и так по кругу. Так вот интерестно что на классике AT90S8515 это 3 сек, а при прошивке программы в ATMEGA8515 в режиме совместимости с классикой 3 секунды превращаются в почти 12 сек. Тоесть каждых 12 сек светодиод вкл. откл. В обоих случаях используется один и тот же кварц на 4 Мгц. В чём может быть причина такого странного поведения? Ведь программа одна и та же.
Go to the top of the page
 
+Quote Post
WHALE
сообщение Jul 23 2007, 17:38
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768



Цитата(AvrLamer @ Jul 23 2007, 20:21) *
Так вот интерестно что на классике AT90S8515 это 3 сек, а при прошивке программы в ATMEGA8515 в режиме совместимости с классикой 3 секунды превращаются в почти 12 сек. Тоесть каждых 12 сек светодиод вкл. откл. В обоих случаях используется один и тот же кварц на 4 Мгц. В чём может быть причина такого странного поведения? Ведь программа одна и та же.

Во фьюзах-небось стоят по дефолту-а это внутренний RC-генератор 1Мгц.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
smd_mounter
сообщение Jul 23 2007, 17:52
Сообщение #3





Группа: Новичок
Сообщений: 10
Регистрация: 24-03-07
Пользователь №: 26 482



Судя по даташиту, в режиме совместимости регистры и расположение битов становятся такими же, как в классике. Т.е. TCCR1B = 0x0D - таймер1 работает в режиме normal. Но тогда странно, что 3 сек. превратились в 12, а не в 16. С другой стороны, может таймер работает как надо, а проц с какого-то перепугу от внутренней 1МГц? Это легко проверить каким-нибудь _delay_ms, отключив прерывания.
Go to the top of the page
 
+Quote Post
Evgeniyk
сообщение Jul 23 2007, 19:56
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 5-04-06
Пользователь №: 15 836



А как ты это проверишь delay_ms??? Он и при 1 мгц и при 4 все равно отсчитает тебе зедержку в n миллисекунд)
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 23 2007, 21:21
Сообщение #5


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Evgeniyk @ Jul 23 2007, 22:56) *
А как ты это проверишь delay_ms??? Он и при 1 мгц и при 4 все равно отсчитает тебе зедержку в n миллисекунд)

Он считает задержку опираясь на константу Fosc определенную в опциях проекта. Если константа = 4Mhz, а чип реально работает на 1Mhz то с помощью delay_ms сразу станет видно что что-то не то.
Go to the top of the page
 
+Quote Post
smd_mounter
сообщение Jul 24 2007, 06:37
Сообщение #6





Группа: Новичок
Сообщений: 10
Регистрация: 24-03-07
Пользователь №: 26 482



_delay_ms(n) отсчитывает задержку в n*Fosc/1000 тактов.
Go to the top of the page
 
+Quote Post

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

 


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


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