Servus,
TCCR1A/B sind die Steuerregister des Timers, die all die vielen
Funktionen ein- und ausschalten und konfigureren, da kommen wir gleich
dazu.
TCNT1H:L ist der eigentliche 16bit-Zählerinhalt, der je nach
Konfiguration hochzählt.
OCR1AH:L und OCR1BH:L sind Register, die zwei 16-bit-"Output
Compare"-Werte fassen.
Ich würd's so machen: Timer1 mit geeigneter Frequenz von Null
hochzählen lassen. Dazu wird die Systemfrequenz durch den Prescaler
heruntergeteilt. Bei einem bestimmten Wert (der als Output Compare-Wert
in OCR1AH:L geschrieben wird), wird ein Ouput Compare-Interrupt
ausgelöst und der Zähler automatisch (!) auf Null zurückgesetzt. Dann
zählt er wieder bis zum OCR1A-Wert und interruptet erneut und so fort.
Im Interrupt machst Du Deine Uhr-Inkrementiererei.
Also etwas konkreter (kein Datenblatt zur Hand, also mußt Du alle Bits
selber noch zusammensetzen :-) :
Timer 1 Prescaler auf 1024 setzen -> ergibt eine Zählfrequenz von 8
MHz/1024 = 7,8125 kHz. Du willst 100 Hz Interrupt-Frequenz -> alle 78
Zähltakte (7812.5/100=78) muß der Zähler einen OC-Interrupt auslösen
und zurückgestellt werden.
Also:
TCCR1A/B so einstellen: Prescaler=1024 (glaube Bits 0-2 in TCCR1A),
Modus=Output Compare mit CTC (Clear counter on match, das setzt Dir das
Zählerregister wieder auf Null, sobald der OCR1-Wert erreicht wurde -
automatisch, das ist der Modus 4, ist über die Bits WGMxx verstreut)
OCR1AL auf 78 setzen, OCR1AH auf 0 setzen.
TCNT1L und TCNT1H auf 0 setzen (Startwert ist null).
Das Verfahren hat den Vorteil, daß das Zählerladen einmal am Anfang
geschieht und Du nix mehr damit zu tun hast. Deine Registerbelegung aus
dem Posting geht über folgenden Weg:
TCCR1A definiert einen Prescaler von 8 (auswendig - stimmt vielleicht
nicht!) -> Zählfrequenz 8 MHz/8 = 1 MHz. D.h. jeder Zählertick dauert 1
us. Zähler wird mit $1AA=426 vorgeladen und erreicht nach
65536-426=65119 Takten seinen Max-Wert. Dann löst er den
Overflow-Interrupt aus, was somit alle 65 ms erfolgt. Da der TImer nun
den Wert 0 hat, muß er erneut mit dem Startwert vorgeladen werden
(warum in Deinem C-Programm dann nicht wieder $1CC sondern was größeres
steht?? muß das gleiche sein, sonst ist (nur der erste) Interrupt zu
spät dran).
Bei allen Verfahren muß man aber bedenken, daß der Systemtakt (die 8
MHz) sehr genau sein muß, sonst hast Du eine Pfusch-Uhr! D.h. die
Systemfrquenz darf nicht vom on-Chip-Oszillator kommen, sondern von
einem Quarz. Alternativ kann der 8535 einen Uhrquarz an TOSC1/2
betreiben. Dann hast Du am Timer2 eine Frequenz von genau 32,768 kHz
liegen, die Du eben anders herunterteilen mußt (analog, aber andere
Werte).
Grüße Ingo