Hallo!
Mein C Code schaut so aus: ( Verwendet wird ein ATMega8L8 )
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
uint8_t foo;
SIGNAL (SIG_OUTPUT_COMPARE2A)
{
foo++;
if ( foo == 255 )
{PORTB--;foo=0;}
if ( PORTB == 0 )
PORTB = 0xff;
}
int main(void){
ASSR |= (1<<AS2);
TCCR2 |= (1<<CS22);
TIMSK |= (1<<OCIE2);
TIFR |= (1<<OCF2);
OCR2 = 230;
TCNT2 = 0x00;
DDRB=0xff;
PORTB=0xff;
foo=0;
sei();
}
An TOSC1/2 hängt ein 0,032768MhZ Uhrenquarz und CKLOPT Fuse ist
aktiviert. Bewirken soll der Code, dass von PORTB nach einer gewissen
Zeit immer 1 abgezogen wird. Das Uhrenquarz ist wie in Fig11 im atmega
8 Datenblatt angeschlossen. Als System Clock verwende ich den
Calibrated Internal RC Oscillator mit 4MhZ. Geb ich der Schaltung strom
funktioniert auch alles, aber es funktioniert auch, wenn das Uhrenquarz
nicht angeschlossen ist :-) . Deshalb denk ich, dass die Timer/Couter
Clock Source des Timer2 nicht das Uhrenquarz ist. Ich hab schon im
Datenblatt nachgeschaut ob ich irgendwelche Register falsch gesetzt
habe, habe aber nichts gefunden.
Danke im Voraus!
Ralf
Bei ATmega8 und "Uhrenquarz" auch das Errata am Ende des Datenblatts beachten. Weiterhin ist die Initialsierung nicht ganz ok. Ist im Datenblatt als "Checkliste" beschrieben. Vielleicht hilft der Code von http://www.siwawi.arubi.uni-kl.de/avr_projects/lcdclock/index.html etwas weiter, ist zwar fuer ATmega16 aber zeigt hoffentlich "die Idee". Martin
Danke erst mal für die schnelle Antwort! Ich geh mal deinen Code durch und versuch aus diesen schlau zu werden. Ralf
Ich hab anscheinend deinen Code richtig interpretiert. Es scheint jetzt richtig zu funktionieren. Ich hab mal den µc 10 Minuten mitgemessen und es gibt "keine" Abweichungen. Danke! Ralf
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.