von frischen am Freitag 12. September 2003, 18:36
Du wirst nicht herum kommen, den prescaler zu benuzuen.
Den stellst du erst einmal auf 1:512, damit deine 8MHz Quarzfrequenz auf 15625Hz heruntergeteilt wird.
Umstellen musst du im Timer nicht die Anfangszahl, sondern die Zahl, bei der der Interrupt ausgelöst wird und der Timer zurück gesetzt wird, also den Maximalwert des Timers oder auch Auflösung.
Den verändert man im OCR1A - Register, was für Output Compare Register 1 A steht.
Ich weiß jetzt nicht aus dem Kopf, ob alle AVRs überhaupt zwei Output-Compare-Units haben, denke aber schon.
Der ATmega8 hat sie auf jeden Fall, der AT90S8515 wahrscheinlich auch, ansonsten heißt das Register wohl einfach nur OCR1.
In diese Register (es sind zwei - eins fürs untere und eines fürs höhere Byte, wobei in jedem Falle das höhere Byte zuerst geschrieben werden muss!) lädst du also nun die Zahl 15624, also 00111101 00001000 oder auch 3D08.
Die Zahl muss um eins niedriger sein als die errechnete, da das Löschen des Timers, also das Zurücksetzen auf Null auch eine Timer-Clock dauert.
Der Timer-Mode sollte CTC sein, also Clear Timer on Compare, dann wird der Zähler automatisch zurückgesetzt, sobald ein Compare Match auftritt, also die Zahl 15624 erreicht wird und der Zähler beginnt von neuem.
Wenn du dann die entsprechenden Flaggen für ein Interrupt beim Compare Match hisst (OCF1A bzw. OCF1 und OCIE1A bzw. OCIE1), sowie das I-Bit im SREG gesetzt ist, bekommst du zuverlässig und quarzgenau jede Sekunde einen Output-Compare-Match-Interrupt.
Dass man für Interrupts nicht vergessen darf, den Stack-Pointer zu initalisieren, brauche ich dir wohl nicht extra zu sagen.
Ich hoffe, ich konnte dir weiterhelfen,
Mr Freshmaster