Die Reed-Sensoren an Interrupt Eingänge und dementsprechend Variablen hochzählen.
Moin Moin,
mir fehlt auch nach mehreren Stunden suchen und googeln noch der richtige Denkansatz.
Hilft mir ein Profi auf die Sprünge?
Ich möchte mit Bascom einen Atmega 8 programmieren.
An zwei Eingängen ist je ein Reed-Sensor angeschlossen.
Es gibt noch einen IO-Eingang und einen IO-Ausgang.
Das Programm soll die Anzahl der Magnete, die am Sensor 1 vorbeikommen zählen (etwa 60 Stück pro Sekunde, insgesamt pro Zählvorgang 70 Stück).
Als nächstes wird ein Pin auf eins gesetzt, worauf auch der Ausgang auf eins gesetzt werden soll.
Nun flitzen an Sensor 2 ebenfalls Magnete vorbei (auch ca. 60/sec).
Auch diese sollen gezählt werden. Wenn die an Sensor 1 gezählte Zahl an Sensor 2 erreicht ist, soll der Ausgang wieder auf 0 gesetzt werden.
War das verständlich?
Viele Grüße,
Johannes
Die Reed-Sensoren an Interrupt Eingänge und dementsprechend Variablen hochzählen.
Du musst nur aufpassen dass diese Reedrelais nicht prellen. Sonst hast du zuviele Impulse. Besser wäre es, wenn du statt den Reedrelais einen Hallschalter nimmst. Diese brauchen keine Entprellung. Solltest du die Reedrelais trotzdem nehmen willst bzw musst würde ich das Signal entprellen.
Rest so wie schon geschrieben wurde.
MfG Hannes
Hallo,
danke für die Antworten. Mal sehen, vielleicht funktionierts auch mit einem Hallschalter. Um das Entprellen würde ich mich ja gerne drücken...
Könnte das hier funktionieren?
Über Verbesserungsvorschöäge freue ich mich,Code:$regfile = "m8def.dat" $crystal = 1000000 Config Pinb.1 = Input Sensor1 Alias Pina.1 Config Pinb.2 = Input Sensor2 Alias Pina.2 Config Pinb.3 = Input Eingang Alias Portb.3 Config Portb.4 = Output Ausgang Alias Portb.4 Dim A As Byte Dim B As Byte A = 0 B = 0 Do If Sensor1 = 1 And Eingang = 0 Then A = A + 1 End If Loop Until Eingang = 1 If Eingang = 1 Then B = B + 1 End If If B = A Then Ausgang = 0 End If End
Johannes
So auf keinen Fall.
So wird er A mehrfach hochzählen, während ein Magnet vorbeifährt. Und das hat mit entprellen noch garnichts zu tun.
Schau dir mal Interrupts an!
Das Entprellen kann man auch durch einen 100n Kerko, parallel zum Schalter, verhindern (tum Teil). Per Software lässt sich das aber auch leicht verhindern.
Hui, das geht hier ja fix mit euren Antworten! Danke dafür!
Hier ein neuer Versuch, diesmal mit Interrupts.
Habe ich das so richtig verstanden?
Am Ende erwartet Bascom laut Syntaxprüfung einen Loop. Warum?Code:$regfile = "m8def.dat" $crystal = 1000000 Config Pinb.3 = Input Eingang Alias Portb.3 Config Portb.4 = Output Ausgang Alias Portb.4 Dim A As Byte Dim B As Byte A = 0 'beim Start ist A=0 und B=0 B = 0 Config Int0 = Rising 'Interrupts reagieren auf steigende Flanke Config Int1 = Rising Enable Interrupts Enable Int0 'Interrupts einschalten Enable Int1 On Int0 Isr_von_int0 On Int1 Isr_von_int1 Do If Eingang = 1 Then 'Wenn Eingang=1, dann Ausgang=1 Ausgang = 1 End If If A = B Then 'Wenn A=B, dann Ausgang=0 Ausgang = 0 End If Loop Isr_von_int0: 'Zähle A hoch Do A = A + 1 Return Isr_von_int1: B = B + 1 'Zähle B hoch Return
Grüße,
Johannes
Loop brauch irgendeine Bedingung.
Ups stimmt, da hätte ich auch selbst drauf kommen können. Bin noch blutiger Anfänger...
Softwareseitig lässt sich der Eingang auch mit dem Befehl "debounce" entprellen.
Einen REED-Kontakt würd ich aber bei bis zu 60Hz nicht nehmen. Da wär ein Hallsensor wesentlich besser und prellfreier.
Isr_von_int0: 'Zähle A hoch
'A = A + 1 <- geht wesentlich einfacher
waitms 2 'Routine 2ms warten lassen
incr A 'Var A um eins erhöhen
Return
Lesezeichen