Stránka 1 z 1

Nastavení přerušení Atmega8 v jazyce C

Napsal: 22 úno 2012, 23:54
od Robert
Zdravím kolegové, potřeboval bych drobnou konzultaci ohledně nastavení přerušení v Atmega8, jazyk C, s použitím externího krystalu 14.7456 MHz a přerušení by mělo nastat každých 100ms.

Někde jsem udělal chybu, ale netuším kde. Zařízení nefunguje přesně tak jak jsem očekával. Prosím zkuste hodin na mé řešení odborné oko, jestli náhodou neuvidíte kde mám chybu. Díky

Konstrukce:
=> Externí krystal 14.7456 MHz, jsem klasicky připojil na porty(XTAL1/PB6 a XTAL2/PB7) s keramickými kondenzátory 22pF

=> Pro přerušení používám Čítač s předěličkou 1024, hodnoty pro komparační registr jsem vypočítal takto:

14 745 600 / 1024 = 14 400 Hz (tj. 14 400 tiků za sekundu), tedy pokud chci přerušení po 100ms, tak za tuto dobu proběhne 1 440 tiků. Což číslo "1 440" v hexadecimální soustavě je "5A0", tuto hodnotu nastavím do porovnávacího registru OCR1A (tj. OCR1AH = 05, OCR1AL = a0).

=> Nastavení fuse bitů: pokud jsem pochopil správně tak podle datasheetu pro frekvenci 14.7456 MHz jsou hodnoty bitů následné
CKOPT = 0,
CKSEL0 = 1
CKSEL1 = 1
CKSEL2 = 1
CKSEL3 = 1
(pozn. programuji to v PonyProg => zaškrtlé je pouze tehdy když to má mít hodnotu 0)



Program:

#define F_CPU 14745600UL

int msec = 0;
int sec = 0;

int main(void)
{
PORTB = 0xFF;

OCR1AH = 05;
OCR1AL = a0;

TCCR1B = 0x05; //predelicka 1024

TIMSK|=(1<<OCIE1A);

sei();

while(1){}
}

ISR(TIMER1_COMPA_vect)
{
msec++;

if(msec == 10){
sec++;
msec = 0;
}

...

}

Napsal: 23 úno 2012, 00:06
od Andrea
Nějak ti tam chybí nastavení režimu toho čítače, takhle ti to bude přerušovat asi jednou za 4,5s.

Napsal: 23 úno 2012, 00:38
od Robert
Na jaký režim bych ho měl nastavit?

Napsal: 23 úno 2012, 07:23
od Galileo
Takhle ti to počítá až do přetečení timeru,
nastavit musíš režim porovnávání s hodnotou OCR1A

TCCR1B=0x0D

:idea:

Napsal: 23 úno 2012, 16:57
od Robert
Super diky moc