AvrLamer
Jul 23 2007, 16:21
Написал такую программу на 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 Мгц. В чём может быть причина такого странного поведения? Ведь программа одна и та же.
Цитата(AvrLamer @ Jul 23 2007, 20:21)

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

А как ты это проверишь delay_ms??? Он и при 1 мгц и при 4 все равно отсчитает тебе зедержку в n миллисекунд)
Он считает задержку опираясь на константу Fosc определенную в опциях проекта. Если константа = 4Mhz, а чип реально работает на 1Mhz то с помощью delay_ms сразу станет видно что что-то не то.
smd_mounter
Jul 24 2007, 06:37
_delay_ms(n) отсчитывает задержку в n*Fosc/1000 тактов.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.