Ich habe hier ein seltsames Problem mit einem kleinen Blinkprogramm (siehe Anhang). Die LED blinkt 3mal, dann setzt sie komischerweise für einen Takt aus und beginnt dann wieder 3mal und so fort. Ich sehe meinen Fehler nicht. Ratlos Erwin
Ich kenn mich mit Bascom nicht aus (kenne nur VB.NET und C), aber das
hier:
Do
If Umlauf = 0 Then
Umlauf = 250
Portd.6 = 1
End If
If Umlauf = 0 Then
Umlauf = 250
Portd.6 = 0
End If
Loop
mach keinen Sinn.
Es ist quasi Zufall in welche If-Anweisung er springt. (Jenachdem ob
Umlauf vor dem ersten oder zwischen dem ersten und dem zweiten If 0
wird.
Dim x as Short = 0
Do
If Umlauf = 0 Then
Umlauf = 250
If x = 0 Then
Portd.6 = 0
x = 1
Else
Portd.6 = 1
x = 0
End if
End If
Loop
@Peter Danke erst mal. Jetzt habe ich es auch gesehen. (Vor die Stirn schlag) Short gibt´s in Bascom nicht, kann ja Bit nehmen. Danke Erwin
Man liest ja immer wieder, dass ISRs möglichst kurz sein sollen (damit
andere Interrrupts auch mal drankommen) und man möglichst viel in der
main machen soll.
Aber ob es dabei auf 100ns ankommt? Ich würde in diesem Fall alles in
der ISR erledigen:
Ontimer0:
Timer0 = 6 'Timer sofort neu laden
Decr Umlauf
if Umlauf >=128 then Portd.6 = 1 'LED ausschalten
else Portd.6 = 0 'LED einschalten
Return
oder
Manchmal ist es hilfreich, sich in das Zahlensystem des µC
hineinzudenken. Für diesen ist die Zahl 250 krumm, lieber ist ihm 256.
Dadurch kannst Du Dir viele Abfragen sparen, da Bytes und Counter von
selbst auf 0 / 255 überlaufen.
Um das zu kompensieren und wieder auf für Menschen gerade (= übliche,
bequeme) Frequenzen kommt, verwendet man auch entsprechende Quarze
(z.B. 2^22 = 4,194304 MHz)
Ontimer0:
' Timer0 = 6 'Timer sofort neu laden
' Timer durchlaufen lassen
Decr Umlauf
if Umlauf = 128 then
Portd.6 = 1 'LED ausschalten
endif
if Umlauf = 0 then
Portd.6 = 0 'LED einschalten
endif
Return
Oder
Ontimer0:
' Timer0 = 6 'Timer sofort neu laden
' Timer durchlaufen lassen
Decr Umlauf
if Umlauf = 0 then 'ergibt halbe Blinkfrequenz
Portd.6 = NOT Portd.6 'LED togglen
' oder
Portd.6 = 1 - Portd.6 'LED togglen
' ich weiß nicht, wie der toggle-Befehl in Bas heißt
endif
Return
Außerdem: der Timer im CTC-Mode ist unabhängig von der
Interrupt-Response-Time (Laden des Timers mit 6 zu unbekannter Zeit -->
ungenaues Timing, Jittern).
@Profi Dieses Stückchen Programm ist nur der Teil eines großen. Ich habe nur zur Anschaulichkeit den Teil heraus"operiert". Blöderweise muß ich den Timer0 dafür nehmen, da Timer1 für etwas anderes gebraucht wird. Ich bin auch an den Quarz gebunden und muß solche Kunstgriffe machen, da ich einen Sekundenimpuls so nicht anders kriege. Irgendwann habe ich mal gelernt, daß man aus der Interruptroutine so schnell wie möglich wieder "verschwinden" soll, deshalb im Hauptprogramm der Spaß. Jetzt zeichne ich mir mal einen Ablaufplan für Deine Vorschläge. (Lach nicht; das mach ich bei fremdem Code immer so, um mich reinzudenken. Danke Dir Erwin
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.