Forum: Mikrocontroller und Digitale Elektronik Relaiskartenschaltung - Fehler


von User (Gast)


Lesenswert?

Hallo,
ich hab mir eine Platine aufgebaut mit einem Atmega 8 und 3 
relaiskarten.
Ziel des ganzen ist es insgesamt 2 Endgeräte jeweils mit einem Taster 
an- und aus zu schalten. Die dritte Relaiskarte soll auf 
Tastenkombination reagieren.

Mir stellen sich aber bis jetzt 2 Probleme auf:
1. Tastenkombination
2. Entprellung

Ich habe das mit den an- und ausschalten per taster schon realisiert.

Ich programmieren anbei mit Bascom :-)

######################################
Hier mein momentaner Code:
######################################

$crystal = 1000000
$regfile = "m8def.dat"

Portd = &H0C                                                ' Pullup
Config Pind.0 = Input                                       ' Taster 1
Portd.0 = 1
Config Pind.1 = Input                                       ' Taster 2
Portd.1 = 1
Config Portc.0 = Output                                     ' 
Relaiskarte 1
Config Portc.1 = Output                                     ' 
Relaiskarte 2
Config Portc.2 = Output                                     ' 
Relaiskarte 3
Config Portc.3 = Output                                     ' Status-LED
Config Portc.4 = Output                                     ' 
Power.ON-LED
Config Debounce = 30
Dim I As Integer                                            ' Variable I
Dim P As Integer                                            ' Variable P
Dim X As Integer                                            ' Variable X
Dim Y As Integer                                            ' Variable Y

'_____________________________

Portc.4 = 1                                                 ' Power-LED 
-> ein
I = 0                                                       ' Variable I 
auf 0
P = 0                                                       ' Variable P 
auf 0
X = 0                                                       ' Variable X 
auf 0
Y = 0                                                       ' Variable Y 
auf 0

'_____________________________

Do
Portc.2 = 1                                                 ' 
Relaiskarte 3 -> ein

If Pind.0 = 0 Then                                  ' Taster 1
   Portc.0 = 1                                      ' Relaiskarte 1 -> 
ein
   Portc.3 = 1                                      ' Status-LED -> ein
   I = 1                                            ' Variable I auf 1
   If Pind.0 = 0 And I = 1 Then
      Portc.0 = 0                                   ' Relaiskarte 1 -> 
aus
      I = 0
      If I = 0 And P = 0 Then                       ' Status-LED erst 
aus
         Portc.3 = 0                                  wenn Relaisk 1+2 
aus
      End If                                        ' Variable I auf 0
   End If
End If

If Pind.1 = 0 Then                                  ' Taster 2
   Portc.1 = 1                                      ' Relaiskarte 2 -> 
ein
   Portc.3 = 1                                      ' Status-LED -> ein
   P = 1                                            ' Variable P auf 1
   If Pind.1 = 0 And P = 1 Then
      Portc.1 = 0                                   ' Relaiskarte 2 -> 
aus
      P = 0
      If I = 0 And P = 0 Then                       ' Status-LED erst 
aus
         Portc.3 = 0                                  wenn Relaisk 1+2 
aus
      End If                                        ' Variable P auf 0
   End If
End If

'____________________________
'Tastenkombination:

If Pind.0 = 0 Then                      ' Taster 1
   X = 1                                ' Variable X auf 1´
   Waitms 50                            ' Zeitabstand zwischen 
Tastendruck
      If Pind.0 = 0 Then                ' Taster 1
      Y = X + 1
         If Y = 2 Then
         Portc.2 = 0                    ' Relaiskarte 3 -> aus
         End If
      End If
End If


Loop

######################################
Die dritte Relaiskarte ist mit absicht permanent an und soll auf 
tastenkombi erst aus gehen ;-)
######################################

Des Weiteren reagieren die Taster trotz Debounce total schlecht und 
irgendwie kriege ich das nicht in den Griff dass sie sauber 
durchschalten..
Evtl. auch ein Programmierfehler (?)

(Taster: 
http://www.pollin.de/shop/dt/MzM0OTc1OTk-/Bauelemente_Bauteile/Mechanische_Bauelemente/Schalter_Taster/Drucktaster_PBS_28B.html)

von Werner S. (wernertrp)


Lesenswert?

Manche Taster haben 100ms Prellzeit.

von Frank S. (_frank_s_)


Lesenswert?

Hallo User,

du configurierst die Zeit für Debounce mit

Config Debounce = 30

verwendest im Quellcode den Debounce-Befehl nicht, sondern liest selbst 
die Ports. Das könnte aber der Debounce-Befehl für dich übernehmen( 
Siehe Hife zu BASCOM).

z.B.

   Debounce T_start_stop , 1 , Setstartstop , Sub

Als Hinweis :
a) Kommentare sind hilfreich, aber nicht immer nötig

Y = 0                       ' Variable Y auf 0

ist sebsterklärend

b) Verwende zur besseren Lesbarkeit für Portpins doch einfach den 
ALIAS-Befehl

z.B.
Config Pind.0 = Input                              ' Taster 1
Portd.0 = 1
T_start_stop Alias Pind.0


Gruss Frank

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.