Hallo möchte mit einem Schlüsselschalter die Alarmanlage scharf schalten. Zur Kontrolle bei Scharfschaltung soll die rote LED für 500ms kurz aufblinken. Wenn die Anlage unscharf geschlatet wird soll die grüne LED für 500ms kurz aufblinken. Der Eingang PINB.0 soll also ständig überacht werden im welchen Zustand der Schalter sich gerade befindet. Grundsätzlich sollen die LED`s immer aus sein. Nur bei der Zustandsänderung an PINB.0 soll halt kurz die Info über die 500ms Impulsansteuerung der LED kommen. Habe schon was probiert, leider bekomme ich es so nicht ans laufen. Mit einer Do Loop Schleife blinken beide LED. Wie könnte man das sonst unter Bascom programmieren? $regfile = "attiny13.dat" $crystal = 1200000 $swstack = 10 $hwstack = 22 Config Pinb.0 = Input Config Portb.1 = Output Config Portb.2 = Output Schalter Alias Pinb.0 Led Gruen Alias Portb.1 Led Rot Alias Portb.2 Debounce Schalter , 0 , Umschalten1 , Sub Debounce Schalter , 1 , Umschalten2 , Sub End Umschalten1: Led Gruen = 0 Waitms 500 Led Gruen = 1 Umschalten2: Led Rot = 0 Waitms 500 Led Rot = 1 Return
Kommentiere mal dein Code. Somit fast Du deine Gedankengänge erst mal zusammen. Dabei wird dir unter anderem auffallen das du PINB.0 nirgends überprüfst. Was nicht der einzige Fehler ist. Also mal schön Kommentare hinter deine Zeilen. So hilfst Du dir selber ein Schritt weiter zu kommen und hier werden deine Irrwege der Gedanken weiter berichtet.
$regfile = "attiny13.dat" $crystal = 1200000 $swstack = 10 $hwstack = 22 Config Pinb.0 = Input `PinB.0 als Eingang Config Portb.1 = Output `B.1 als Ausgang LED 1 Config Portb.2 = Output `B.2 als Ausgang LED 2 Schalter Alias Pinb.0 `Pinb.0 namentlich als "Schalter" Led Gruen Alias Portb.1 `PortB.1 namentlich als LED Gruen Led Rot Alias Portb.2 `PortB.2 namentlich LED rot Do `Schleife starten Debounce Schalter , 0 , Umschalten1 , Sub `Überwachung PinB.0 wenn low `Unterprogramm starten `Sub starten Debounce Schalter , 1 , Umschalten2 , Sub `Überwachung PinB.0 wenn high `Unterprogramm straten `Sub starten Loop `Überwachung wiederholen End `Programmende Umschalten1: `Unterprogramm Anfang Led Gruen = 0 `LED Grün EIN Waitms 500 `warte 500ms Led Gruen = 1 `LED Grün aus Return `zurück nach Debounce Umschalten2: `Unterprogramm Anfang Led Rot = 0 `LED Rot EIN Waitms 500 `warte 500ms Led Rot = 1 `LED Rot aus Return `zurück nach Debounce Glaube das Problem liegt darin, dass durch die Do Loop Schleife ständig der Eingang abgefragt wird und immer wieder die LED`s Ein bzw Aus Schalten. Ich denke man müßte einen Parameter haben der gesetzt wird und vergleicht ob sich der Zustand am Input verändert hat. Nur wenn das der Fall ist wird die sub ausgeführt. LED Ein, LED aus,....warten auf Zustandsänderung an Pin B.0. Nur wie? Declare? Call? Timer? Watchdog? Das Programm muß ja augenschienlich wirklich nicht viel tun. Nur den Eingang überwachen. So passiert ja auch ständig etwas. Bei Sub werden ja angesprochen, weil ja beide auf die Zustandsänderung reagieren. Wenn die Anlage Scharf ist, hat ja vorher die Rote LED einmal kurz aufgeleuchtet. Wenn nun der Eingang den Zustand ändert kann oder darf nur die grüne LED kurz aufleuchten. Obwohl die Sub für die Rote LED sich ja auch angesprochen fühlt. Nur wie macht man sowas?
Und was hällst du davon selber den PIN zu überwachen. Schau mal für was Debounce vorgesehen ist (Entprellung).
Denk mal darüber nach
1 | Debounce Schalter , 1 , Umschalten2 , Sub `Überwachung PinB.0 wenn high |
2 | `Unterprogramm straten |
3 | `Sub starten |
Wenn der Schlüssel rumgedreht wird, dann ist der Pin auf 1. Stundenlang wenn es sein muss. Und jedesmal kommst du an dieser Stelle drauf, dass der Pin auf 1 ist und daher wird auch jedesmal in die Sub Umschalten2 gesprungen. Denn .... "Überwachung PinB.0 wenn high" genau das willst du eben nicht! Du willt nicht in die Sub springen, wenn der Pin high ist. Du willst in die Sub springen wenn der Pin von low auf high wechselt. Und nur dann. Das ist aber etwas ganz anderes! Danach kann der Pin wieder stundenlag auf high sein, das interessiert dich nicht weiter.
Debounce ist also ein Befehl zum entprellen des Eingangs (25ms) Ich muß also mit Anweisungen wie "Zustand" 1 oder 0 und dann mit Case1: oder Case0: arbeiten. Habe ich recht? Wie könnte der Ablauf denn aussehen, ansatzweise. Dim Zustand as Bit Zustand = 1 ... LED gruen = 1 Waitms 500 LED gruen = 0 Return ...
Habe nun eine Programmierung erstellt. Was könnte man daran noch vereinfachen? Sieht mir alles noch ein wenig aufwändig aus für so wenig Funktion. Problem ist noch, wenn beim Start (Betriebsspannung anlegen)die Alarmanlage unscharf ist leuchtet die gruene LED erst, nachdem einmal scharf geschaltet wurde. Wünsche schönes Restwochenende $regfile = "attiny2313.dat" $crystal = 8000000 $swstack = 10 $hwstack = 22 Config Portb.0 = Input Pinb.0 = 0 Schalter Alias Pinb.0 Config Portb.1 = Output Led Gruen Alias Portb.1 Config Portb.2 = Output Led Rot Alias Portb.2 Dim Schalter As Bit Dim Zustand As Bit Led Gruen = 1 Led Rot = 1 Do If Schalter = 1 Then Debounce Schalter , 1 , Schalter_routine1 , Sub Select Case Zustand Case 1: If Schalter = 1 Then Zustand = 1 Led Rot = 1 End If Case 0: If Schalter = 1 Then Zustand = 1 Led Rot = 0 Wait 1 Led Rot = 1 End If End Select End If If Schalter = 0 Then Debounce Schalter , 0 , Schalter_routine2 , Sub Select Case Zustand Case 1: If Schalter = 0 Then Zustand = 0 Led Gruen = 0 Wait 1 Led Gruen = 1 End If Case 0: If Schalter = 0 Then Zustand = 0 Led Gruen = 1 End If End Select End If Loop End Schalter_routine1: Schalter = 1 Schalter_routine2: Schalter = 0 Return
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.