PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Timer des Atmega32



Alexj96
01.04.2013, 17:55
Hallo zusammen,

ich möchte mit einem Microcontroller (Atmega 32) eine IR-Led mit 36kHz anzusteuern. Dazu wollte ich einen Timer verwenden. Der Atmega 32 läuft mit dem internen 8Mhz Quarz.
Timer0 ist ein 8 Bit Timer, zählt also von 0-255, und verzweigt beim Überlauf in das Unterprogramm. Bei einem Prescaler von 1 wird das Unterprogramm also 31 250 mal pro Sekunde aufgerufen. Damit das Unterprogramm mit 72 000 Hz aufgerufen wird, muss der Timer also schon bei 145 starten. (8 000 000/ 111 = 72 072 256-111= 145) Im Unterprogramm wird dann der Zustand des Ausgangs zwischen low und high geändert und die Led sollte mit 36khz blinken.
Stimmt das soweit oder habe ich schon hier ein Verständnisproblem?
In Bascom habe ich das angefügte Programm geschrieben, allerdings messe ich jetzt mit einem Multimeter zwischen dem Pin D.5 und Masse des Atmega eine Frequenz von 23,4 khz. Wo liegt hierbei das Problem ? Oder hat mein Multimeter einfach eine "Macke" ?
An einem Atmega 8 habe ich das gleiche Problem, dieser läuft mit einem externen 8Mhz Quarz.

$regfile = "m32def.dat"
$crystal = 8000000
$framesize = 32
$swstack = 32
$hwstack = 32

Config Portd.5 = Output

Config Timer0 = Timer , Prescale = 1
Enable Timer0
On Timer0 Isr_von_timer0 '
Enable Interrupts
Timer0 = 145

Do
'....Hauptprogramm
Loop
End

Isr_von_timer0:
Timer0 = 145
Toggle Portd.5

Return

Ich hoffe ihr könnt mir weiterhelfen.
Im Voraus schon mal danke für eure Mühe:)
Alexj96

for_ro
01.04.2013, 20:38
Hallo Alexj96,
eine solch hohe Frequenz wirst du mit einer 8MHz Taktfrequenz nicht per Interrupt schaffen.
Dazu dauert die Register Speicherung und das Zurückladen viel zu lange.
Es wäre auch sowieso nicht der richtige Ansatz um eine IR LED anzusteuern. Du musst ja auch noch Zeit haben, aufgrund der Daten den Timer an und auszuschalten.
Dafür ist der CTC Modus besser geeignet:
Config Portb.3 = Output
Config Timer0 = Timer , Prescale = 1 , Clear_timer = 1 , Compare = Toggle
Ocr0 = 110

oder für PortD.5 mit Timer1:
Config PortD.5= Output
Config Timer1 = Timer , Prescale = 1 , Clear_timer = 1 , Compare A = Toggle
Ocr1a = 110

Beides ergibt recht genau 36KHz. Du erzeugst damit die Frequenz komplett in Hardware, also ohne eine Zeile Code zu verbrauchen. Jetzt kannst du dich darum kümmern, per Software den Timer ein und auszuschalten.

Alexj96
01.04.2013, 22:13
Vielen Dank for_ro, du hast mir sehr weitergeholfen, ich werde es morgen ausprobieren (:
Jetzt habe ich auch den Artikel im RN-Wissen gefunden (:

PS: Allerdings möchte ich die Led erst einmal nicht benutzen um Daten zu senden, sondern um einen "Leitstrahl" aufzubauen, mit dem ein Roboter seinen Weg zur Ladestation finden soll.