PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sobald Timer-Code eingebunden, wait ungenau



PcVirus
20.03.2007, 16:51
Hi,
ich will eine IR-Led auf ein 38Khz trägersignal bringen und benutze dazu den Timer0. Sobald ich den Code dafür einsetze, wird das "Wait 1" zu ca "Wait 3".
Ist der Timer-Code aber draußen, geht alles normal.


$regfile "m8def.dat"
$crystal = 3686400
$baud = 2400
Config Lcdpin = Pin , Db4 = Portd.7 , Db5 = Portb.0 , Db6 = Portb.5 , Db7 = Portb.4 , E = Portd.6 , Rs = Portd.5
Config Lcd = 16 * 2
Initlcd
Display On
Cursor Off
Cls
Locate 1 , 1
Lcd "Willkommen"
Locate 2 , 1
Lcd "AVR->IR->RCX"
Config Portd.4 = Output
Ir Alias Portd.4
Dim X As Word
Config Timer0 = Timer, Prescale = 1
'Hier wird das Unterprogramm festgelegt, das
'in dem von ihnen eingestellten Intervall aufgerufen wird
On Timer0 Timer_irq
'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen
Const Timervorgabe = 159
'Hier werden die Timer aktiviert
Enable Timer0
Enable Interrupts
Do
Locate 1 , 1
Lcd X
X = X + 1
Wait 1
Loop

Timer_irq:
Timer0 = Timervorgabe
Toggle Ir
Return


Sobald ich "enable interrupts" auskommentiere geht alles wieder aber mein timerinterrupt ja nicht.
Was kann ich dagegen tun?
MFG PcVirus

helimike0705
20.03.2007, 17:14
hallo, habe zwar mit timern noch nicht viel am hut ,aber sortiere mal
dein programm und setzte die einstellungen alle an den anfang.
habe es mal gemacht und steht im anhang,kann sein das der
controller damit durcheinander kommt und damit die lange wartezeit
entsteht,er muss am anfang alles setzt wie du möchtest und dann ist gut.
konnt es aber so nicht testen.

PcVirus
20.03.2007, 19:58
geht so auch nicht

Dirk
20.03.2007, 20:55
... benutze dazu den Timer0. Sobald ich den Code dafür einsetze, wird das "Wait 1" zu ca "Wait 3".

Das ist doch klar!
Wenn dein Interrupt Wait regelmäßig unterbricht, dauert Wait länger.

Gruß Dirk

PcVirus
20.03.2007, 21:00
hm..ok..ist zwar blöd dass dann nicht weiter gezählt wird und dann wenn wait vorbei ist das auch ausgeführt wird.

E-Fan
21.03.2007, 17:43
hmmm... nuja
vielleicht wärs schon mal von Vorteil wenn Du Deinen Code nen bissel übersichtlicher schreibst - also erst die def, dann die Arrays und danach die Konfigurationen sowie Initialisierungen und erst DANN den Code.
Im Moment ist es alles ziemlich durcheinander gewurschtelt und daher recht schwer lesbar.

Warum nutzt Du nicht die Hardware PWM des µC? Damit hast Du keinerlei Timingprobleme und der nun unnötige Interrupt unterbricht die recht langsame Datenübertragung zum LCD-Display nicht mehr.
Der Befehl Wait ist laut der Hilfedatei eh recht ungenau - wenn Du einen bestimmten Zeittakt einhalten willst würde ich an Deiner Stelle den zweiten Timer nutzen und in dessen Interruptroutine die Aktualisierung des Displays schreiben.
Waitus = 100000 sollte aber auch gehen und nicht allzu große Verzögerungen mit sich bringen.

PcVirus
21.03.2007, 20:38
Normalerweise mach ich das auch übersichtlicher, nur ich hatte bis jetzt noch nichts mit Timern gemacht und den Code wo rauskopiert.
Wie kann ich denn mit dem PWM ein 38Khz Signal machen?

E-Fan
23.03.2007, 13:19
Such mal im Datenblatt des µC unter den Timern nach dem CTC-Mode (Clear Timer on Compare Match) oder dem Fast-PWM-Mode.

Mit vier bis fünf Zeilen Code sollte alles erledigt sein (Timer konfigurieren, PWM-Mode einstellen und die Werte in die OCR reinschreiben.
In den Timer/Counter Controllregistern stehen alle nötigen Werte wie Prescale, Modus (PWM oder non-PWM), welche Art der PWM (normal, CTC, Fast PWM, Phase correct PWM) und welches der Output-Compare-Register genutzt werden soll.
Klingt kompliziert, ist aber ganz einfach weil man nur einzelne Bits setzen muss.
Das wären die nötigsten Eingaben die Du machen müsstest:

TCCR0A = &B........ 'hier steht meist drin welcher Mode genutzt werden soll
TCCR0B = &B........ 'und hier welches OCR-Ausgang und welcher Prescaler gebraucht wird
OCR0A = 127 'Schwellwerte fürs Tastverhältnis oder die Frequenz (im CTC-Mode)
OCR0B = 127