Forum: Mikrocontroller und Digitale Elektronik Attiny13 für Alarmzustandsüberwachung


von Fred vom J. (andreasluebbers)


Lesenswert?

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

von Adi (Gast)


Lesenswert?

Wie wäre es mit einem "Return" nach der ersten Sub?

von Heike L. (Gast)


Lesenswert?

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.

von Fred vom J. (andreasluebbers)


Lesenswert?

$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?

von Heike L. (Gast)


Lesenswert?

Und was hällst du davon selber den PIN zu überwachen. Schau mal für was 
Debounce vorgesehen ist (Entprellung).

von Karl H. (kbuchegg)


Lesenswert?

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.

von Fred vom J. (andreasluebbers)


Lesenswert?

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
...

von Fred vom J. (andreasluebbers)


Lesenswert?

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
Noch kein Account? Hier anmelden.