Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Странности с таймером при переводе программы с классики на мегу
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
AvrLamer
Написал такую программу на 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 Мгц. В чём может быть причина такого странного поведения? Ведь программа одна и та же.
WHALE
Цитата(AvrLamer @ Jul 23 2007, 20:21) *
Так вот интерестно что на классике AT90S8515 это 3 сек, а при прошивке программы в ATMEGA8515 в режиме совместимости с классикой 3 секунды превращаются в почти 12 сек. Тоесть каждых 12 сек светодиод вкл. откл. В обоих случаях используется один и тот же кварц на 4 Мгц. В чём может быть причина такого странного поведения? Ведь программа одна и та же.

Во фьюзах-небось стоят по дефолту-а это внутренний RC-генератор 1Мгц.
smd_mounter
Судя по даташиту, в режиме совместимости регистры и расположение битов становятся такими же, как в классике. Т.е. TCCR1B = 0x0D - таймер1 работает в режиме normal. Но тогда странно, что 3 сек. превратились в 12, а не в 16. С другой стороны, может таймер работает как надо, а проц с какого-то перепугу от внутренней 1МГц? Это легко проверить каким-нибудь _delay_ms, отключив прерывания.
Evgeniyk
А как ты это проверишь delay_ms??? Он и при 1 мгц и при 4 все равно отсчитает тебе зедержку в n миллисекунд)
defunct
Цитата(Evgeniyk @ Jul 23 2007, 22:56) *
А как ты это проверишь delay_ms??? Он и при 1 мгц и при 4 все равно отсчитает тебе зедержку в n миллисекунд)

Он считает задержку опираясь на константу Fosc определенную в опциях проекта. Если константа = 4Mhz, а чип реально работает на 1Mhz то с помощью delay_ms сразу станет видно что что-то не то.
smd_mounter
_delay_ms(n) отсчитывает задержку в n*Fosc/1000 тактов.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.