Also auf dem RN-Control selber befindet sich kein Timer. Der Timer ist in dem Mikrocontroller der sich auf dem RN-Control befindet. Auf dem RN-Control befindet sich ein Mega32 und laut Datenblatt von Atmel:
http://www.atmel.com/dyn/resources/p...ts/doc2503.pdf
Besitzt dieser Mikrocontroller drei Timer (Timer0-Timer2).
In diesem Datenblatt wird auch erklärt wie der Timer funktioniert, aber um dies zu verstehen brauchst du ein paar Kenntnisse über den inneren Aufbau eines Controllers
Im Grunde funktioniert ein Timer so:
Du hast eine Taktquelle(diese kann je nach Einstellung des Timers ein externer Takt sein wie ein Quarz o.ä. oder ein Impuls von einem Taster z.B.).
Dieser Timer kann entweder 8-Bit oder 16-Bit sein (bei einem Mega32 ist der Timer0 und der Timer2 8-Bit groß und der Timer1 16-Bit). Je nachdem wie groß der Timer ist kann er unterschiedlich weit zählen. Bei 8-Bit kann er bis 255 zählen und bei 16-Bit bis 65535. Den Takt vom Taktgeber z.B. vom Quarz kann man durch einen Vorteiler, dem sogenannten Prescaler, teilen lassen. Ein 16MHz Takt wird bei einem Prescalter von 16 z.B. auf 1MHz runtergeteilt. Anschließend zählt der Zähler bei jeder steigenden oder fallenden Flanke, je nach Einstellung, um 1 hoch. Das heißt ein Zähler der mit 16MHz betrieben wird und einen Vorteiler von 16 besitzt zählt in 1 Sekunde bis 1 Million (1MHz = 1 Million Hertz). Bei jedem Überlauf eines Timers, also wenn der Zähler wieder auf 0 wechselt, weil er bis zu seinem maximum gezählt hat, wird ein Timerinterrupt-Bit gesetzt und der Mikrocontroller springt in eine so genannte "Timer Interrupt Service Routine" kurz Timer ISR. Ein 8-Bit Timer springt also in eine ISR wenn er von 255 auf 0 springt.
Wenn du jetzt z.B. jede Sekunde eine LED blinken lassen willst sieht dein Code so aus:
Code:
$regfile = "m32def.dat"
$crystal = 8000000
Config Portd = Output
Config Timer1 = Timer , Prescale = 256
Enable Timer1
On Timer1 Isr_von_timer1
Enable Interrupts
Timer1 = 34285
Do
'....Hauptprogramm
Loop
End
Isr_von_timer1:
Timer1 = 34285
Toggle Portd.0
Return
Die Berechnung des Timers erfolgt so:
Der Takt am Controller beträgt 8MHz (bedingt durch das Quarz NICHT durch $crystal = 8000000). Das heißt das Quarz schwingt 8000000x in der Sekunde. Der Prescaler von 256 teilt den Takt dann durch 256 auf 31250 runter. Das heißt in 1 Sekunde zählt der Timer bis 31250. Da du aber den Timer1, also einen 16-Bit Timer, benutzt und dieser eigentlich bis 65535 zählt bevor er in eine ISR springt musst du den Timer mit einem Wert vorladen.
Dieser berechnet sich ganz einfach aus dem Maximalen Timerwert - Timerwert den du durch das runterteilen errechnet hast.
Das wäre folgende Rechnung:
65535 - 31250 = 34285
Das vorladen machst du dann mit:
Timer1 = 34285
Die Timer-ISR kennzeichnest du dann mit:
Isr_von_timer1:
Und diesen Namen legst du mit:
On Timer1 Isr_von_timer1: fest. Statt Isr_von_timer1 kannst du natürlich jeden anderen Namen nehmen den du willst.
Da du das RN-Control benutzt und an dem Mega32 ein 16MHz Quarz sitzt musst du die Werte natürlich anpassen um auf 1 Sekunde zu kommen, weil der Controller ein bischen schneller arbeitet als in dem Beispiel.
Hoffe deine Fragen zum Timer wurden jetzt ausreichend beantwortet falls nicht einfach melden.
Gute Nacht
Lesezeichen