-
Interrupt auswertung
Hy,
ich hab mal wieder ein problem.
Und zwar ich versuche ich das Tachosingal eines Stink normalen Computer lüfters auszuwerten. Bloß irgendwie klappt das nicht wirklich. Mir fällt langsam nichts mehr ein woran es liegt. Das lüftersignal liegt an Pin4 (int0) an.
hier mal der Code:
Code:
$regfile = "M8def.dat"
$crystal = 8000000
Config Lcd = 20 * 4
Config Lcdbus = 4
Config Lcdpin = Pin
Dim Zehler As Long
On Int0 Int0_int
Config Timer1 = Timer , Prescale = 256
'Hier wird das Unterprogramm festgelegt, das
'in dem von ihnen eingestellten Intervall aufgerufen wird
On Timer1 Timer_irq
'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen
Const Timervorgabe = 34286
'Hier werden die Timer aktiviert
Enable Timer1
'Hier wird der Timer und der Teiler festgelegt
Enable Int0
Enable Interrupts
Start Timer1
Zehler = 0
Do
Int0_int:
Incr Zehler
Loop
'Dies ist der Programmteil, der in dem von ihnen gewählten
'Intervall aufgerufen wird
Timer_irq:
Timer1 = Timervorgabe
Cls
Lcd Zehler
Return
End
Die timer sequenz hab ich von dem Tool "rnAvr" hier von der seite. O:)
Als µM nehme ich denn Mega8.
Ich hab schon denn ganzen Tag gesucht und gegoogelt aber nicht so richtig was gefunden...
THX Cokie
Edit:
Achso das zählen scheint mit dem Simulator zu klappen, bloß das anzeigen der Zahl auf dem LCD funkt. nicht.
-
Also da ist noch etwas falsches gewurschtel im Code. Was sollen diese Zeilen denn?
Do
Int0_int:
Incr Zehler
Loop
Ein Interrupt in einer Do Loop Schleife. Das kann so nicht gehen.
Ändere das mal so das nach der Konfigurierung folgendes kommt:
do
loop
' und nu Interrupt Routine
Int0_int:
Incr Zehler
return
Und wozu brauchst du überhaupt einen Timer? Soll der dazu dienen das ab und zu das LCD aktuallisiert wird? Ja kann man so machen. Du kannst es aber auch einfach in der do loop Schleife tun.
Gruß Frank
-
jetzt wo du das mit dem Timer sagst, kling logisch... werd ich mal probieren :)
Und zu dem interrupt stimmt. Der Interrupt wird ja ausgelöst wenn ein signal ankommt. Ich meisel ein mist in den Code ](*,)
-
-
Also richtig funtk das auch nicht. Habs mit Do_loop schleife und dem timer probiert. in der do-loop für das LCD wird dann bloß immer 11111111111 angezeigt, und mit dem timer immer bloß 1 bzw. 0 is ja ein bisschen wenig an umdrehungen....
-
Und wie siehts aus, wenn Du in der Schleife einen Wartebefehl einfügst, der etwas kürzer ist, als der Timer ist?!? (so 75% der Zeit, in der der Timer den Interrupt auslöst/ musste ausprobieren) Das Display braucht doch seine Zeit um die Zeichen aufzubauen. Wenn während dem Zeichenaufbau der "alten" Informationen aber schon wieder was neues reinkommt, dann kann es durchaus sein, das es zu einem Datenüberlauf kommt und deshalb nur "11111111" zu sehen ist.
mfG aus P
der E-Fan
-
Mit dem Wait funkt. das nich weil da anscheind auch keinen Interupts reagieren. Aber mit dem Timer läufts jetzt einiger massen. hab bloß ein Return vergessen. Ich hab aber noch ein problem das das siganl nicht richtig sauber anscheinden kommt. Weil die werte zwischen 2000-8000 Pendeln... Ich denke doch wenn die drehe zahl gleich bleibt sollte doch auch das singnal gleich bleiben, oder sehe ich das falsch?!?.
-
Eigentlich hätte es mit Wait auch gehen müssen. Kannst ruhig mal größeres Wait "Wait 3" (3 Sekunden) oder so nehmen.
Du kannst mal einen fertigen Code wie du ihn nu hast posten, damit man weiter sehen kann.
Die Anzeige im Timer könnte eventuell zu lange dauern. Dadurch werden dann Interrupts vom Tachogenerator übersehen.
-
So ich hab hier nochmal denn Code:
Code:
$regfile = "M8def.dat"
$crystal = 8000000
Config Lcd = 20 * 4
Config Lcdbus = 4
Config Lcdpin = Pin
Dim Zehler As Long
On Int0 Int0_int
Config Timer1 = Timer , Prescale = 256
'Hier wird das Unterprogramm festgelegt, das
'in dem von ihnen eingestellten Intervall aufgerufen wird
On Timer1 Timer_irq
'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen
Const Timervorgabe = 34286
'Hier werden die Timer aktiviert
Enable Timer1
'Hier wird der Timer und der Teiler festgelegt
Enable Int0
Enable Interrupts
Start Timer1
Int0_int:
Incr Zehler
Return
'Dies ist der Programmteil, der in dem von ihnen gewählten
'Intervall aufgerufen wird
Timer_irq:
Timer1 = Timervorgabe
Cls
Lcd Zehler
Zehler = 0
Return
End
Das dumme is nur jetzt zeigt er wieder bloß 1 manchmal 2 an... Ich fühle mich von dem ding langsam aber sicher verschauckelt :-k [/quote]
-
Da haste wieder was falsch in den "Code gemeiselt", wie du es vorher so schön formuliert hast. Du vergisst jedesmal das das Hauptprogramm immer weiterläuft. Bei dir läuft es in die Interrupt Routine rein.
Du musst nach der Konfigurierung eine do:loop Schleife rein hängen.
Probier es mal so:
Code:
$regfile = "M8def.dat"
$crystal = 8000000
Config Lcd = 20 * 4
Config Lcdbus = 4
Config Lcdpin = Pin
Dim Zehler As Long
On Int0 Int0_int
Config Timer1 = Timer , Prescale = 256
On Timer1 Timer_irq
Const Timervorgabe = 34286
Enable Timer1
Enable Int0
Enable Interrupts
Start Timer1
do
loop
Int0_int:
Incr Zehler
Return
'Dies ist der Programmteil, der in dem von ihnen gewählten
'Intervall aufgerufen wird
Timer_irq:
Timer1 = Timervorgabe
Cls
Lcd Zehler
Zehler = 0
Return
End
Es kann aber sein das es immer noch nicht geht, weil der LCD Befehl eventuell zu lange braucht. Dann müsstest du in der Interrupt Routine das Ergebnis in einer Variablen ablegen und in der do:loop Schleife dann diese Variable ab und zu ausgeben (ein Wait 2 oder so dann nicht vergessen).
Viel Spaß