Nastavení přerušení Atmega8 v jazyce C
Napsal: 22 úno 2012, 23:54
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;
}
...
}
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;
}
...
}