Nastavení přerušení Atmega8 v jazyce C
Moderátor: Moderátoři
Nastavení přerušení Atmega8 v jazyce C
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;
}
...
}