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

Problémy s návrhem, konstrukcí, zapojením, realizací elektronických zařízení

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Robert
Příspěvky: 17
Registrován: 25 led 2005, 01:00
Bydliště: Zlín
Kontaktovat uživatele:

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

#1 Příspěvek 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;
}

...

}

Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 02:00

#2 Příspěvek 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.

Uživatelský avatar
Robert
Příspěvky: 17
Registrován: 25 led 2005, 01:00
Bydliště: Zlín
Kontaktovat uživatele:

#3 Příspěvek od Robert »

Na jaký režim bych ho měl nastavit?

Uživatelský avatar
Galileo
Příspěvky: 77
Registrován: 09 lis 2009, 01:00

#4 Příspěvek 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:

Uživatelský avatar
Robert
Příspěvky: 17
Registrován: 25 led 2005, 01:00
Bydliště: Zlín
Kontaktovat uživatele:

#5 Příspěvek od Robert »

Super diky moc

Odpovědět

Zpět na „Řešení problémů s různými konstrukcemi“