Hallo zusammen,
ich bin mal wieder etwas ratlos.
Für die, die den bisherigen Thread nicht gelesen haben, noch mal kurz was mein Ziel ist:
Ein Atmega8 soll über einen Mosfet ein Magnetventil schalten, dieses wird erstmal nur durch eine Led simuliert.
An den Interrupt-Eingängen sind zwei Hallsensoren angeschlossen. Diese zählen die Variablen „Klemmer“ und „Korb“.
Außerdem gibt es zwei Eingänge: der Eingang "Messen" soll die Led auf Wunsch ausschalten, der Eingang "Var_reset" die Variablen bei Bedarf auf Null zurücksetzen.
Die Led soll leuchten, wenn "Messen" high ist, bis Korb = Klemmer ist.
Auf einem Display werden die Werte der Variablen angezeigt.
Folgende Probleme treten auf:
1. der Klemmer läßt sich nur hochzählen, wenn der Wert des Korbs höher als der des Klemmers ist. In der Anwendung muss aber der Klemmer erst gezählt werden, danach der Korb.
2. erreicht der Wert des Klemmers den des Korbs, werden beide Werte Null.
3. die Led leuchtet nicht wie sie soll dauerhaft, sondern geht nur kurz an, wenn der Klemmer ein Signal hatte.
Hat jemand eine Idee?
Hier der Code:
Code:
'------------------------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 1000000
$hwstack = 100
'--------- Ein- und Ausgaenge ------------------------------------------
Config Pind.5 = Input
Messen Alias Pind.5 'Eingang um den Messvorgang zu starten
Config Pind.6 = Input
Var_reset Alias Pind.6 'Eingang um die Variablen vor jeder Messung auf Null zu stellen
Config Portb.4 = Output
Led Alias Portb.4 'Led und Magnetventil
'--------- Variablen ---------------------------------------------------
Dim Klemmer As Byte 'Klemmer
Dim Korb As Byte 'Korb
Klemmer = 0 'Startwerte
Korb = 0
'--------- LCD --------------------------------------------------------
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcdbus = 4
'-------- Interrupts --------------------------------------------------
Config Int0 = Falling 'Interrupts reagieren auf fallende Flanke
Config Int1 = Falling
Enable Interrupts
Enable Int0 'Interrupts einschalten
Enable Int1
On Int0 Isr_von_int0
On Int1 Isr_von_int1
'-------- LCD-Starttext ------------------------------------------------
Waitms 20
Locate 1 , 1
Lcd "Klemmer:"
Locate 2 , 10
Lcd Klemmer ; " "
Locate 2 , 1
Lcd "Korb:"
Locate 2 , 10
Lcd Korb ; " "
'-------- Hauptprogramm -----------------------------------------------
Main:
Do
If Var_reset = 1 Then 'setzt Variablen auf Null
Korb = 0
Klemmer = 0
Locate 1 , 10
Lcd Klemmer ; " "
Locate 2 , 10
Lcd Korb ; " "
End If
If Messen= 1 And Korb < Klemmer Then 'schaltet Led
Led = 1
Else
Led = 0
End If
Loop
'--------- Interrupt-Routinen --------------------------------------------
Isr_von_int0:
Waitms 2 'Routine 2ms warten lassen
Incr Klemmer 'Var Klemmer um eins erhöhen
Locate 1 , 10 'Variable auf LCD aktualisieren
Lcd Klemmer ; " "
Return
Isr_von_int1:
Waitms 2 'Routine 2ms warten lassen
Incr Korb 'Var Korb um eins erhöhen
Locate 2 , 10 'Variable auf LCD aktualisieren
Lcd Korb ; " "
Return
Prellen ist bei den Sensoren erfreulicherweise überhaupt kein Problem. Es wird jedes Ereignis sauber erkannt und gezählt.
Vielen Dank in Voraus,
Johannes
Lesezeichen