PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RN-Control Timer



botneuling
30.12.2011, 18:52
Hallo Forummitglieder,

Ich benutze das RN-Control Board. Ich habe im RN-Wissen nach Bascom + Timer gesucht aber dort wird ein anderes Microcontrollerboard benutzt. Das Board in der Anleitung hat $crystal = 8000000 und das RN-Control BOard $ = 16000000. Hier ist die Anleitung :

http://www.rn-wissen.de/index.php/Bascom_und_Timer

Kampi
30.12.2011, 19:40
Die Angabe $crystal hat nur was für die Bascom-Internen Berechnungen wie die Baudrate und die Zeiten für den Wait Befehl zu tun. Mit dem Timer an sich hat das nichts zu tun.

Und ja in der Anleitung wird ein Mega8 verwendet. Aber du kannst die Grundeinstellungen des Mega8 aus der Anleitung auch Problemlos für dein Mega32 aus dem RN-Control verwenden, da der Timer für alle AVRs in Bascom gleich eingestellt wird. Du musst nur gucken welcher Timer in welchem Mikrocontroller vorhanden ist (du kannst z.B. keinen Timer2 in einem Mikrocontroller aktivieren der nur Timer0 und Timer1 hat. Aber da wird dir Bascom dann eine Fehlermeldung ausgeben falls du es doch machst).

botneuling
30.12.2011, 23:24
Hättest du vielleicht eine Idee wo ich nachgucken könnte welche Timer es im RN-Control gibt und ab welcher zahl sie in das ISR wechseln.

Danke im voraus

Kampi
31.12.2011, 00:10
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/prod_documents/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:



$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 :)

botneuling
02.01.2012, 20:15
Vielen Dank