Forum: Mikrocontroller und Digitale Elektronik Bascom Taster funktioniert nicht


von PCK (Gast)


Lesenswert?

Hallo Zusammen,

ich bin ein wenig am verzweifeln. Seit mehreren Tagen laboriere ich 
schon daran rum, aber es will nicht so wie ich will:

Das Programm soll eine LED (Orange) nach 3 Sekunden Tastendruck 
einschalten, den Zustand halten (Taster losgelassen) und bei erneuter 
Betätigung (3 Sekunden) die LED Orange wieder ausschalten. Der Status 
soll über die beiden LED's Rot und Grün angezeigt werden.

Der Zustand wird im EEPROM gespeichert, so dass bei Stromausfall der 
Schalterzustand gespeichert wird (writeeeprom).

Damit das Programm sicher ist, habe ich die Zeitfunktion über einen 
Zähler gelöst. Mit Wait will ich nicht arbeiten, da das (3 Sekunden) 
schon überkritisch ist daher auch der Watchdog mit 16 ms.

Jetzt zu meinem Problem: Der Taster wird nicht erkannt: Ich kann darauf 
rumdrücken wie ich will, in der Realität geht es nicht (Simulation geht 
aber). Ich habe schon den Port b3 auf high und auf low gesetzt (Programm 
entsprechend geändert) er will einfach nicht. Auch das Pure Kabel auch 
ohne Vorwiderstand, bringt keinen Erfolg.

Da ich davon ausgehe, dass ich es Hardwareseitig richtig aufgebaut habe, 
kann es meines Erachtens nur ein Softwareproblem sein. Könnt Ihr da mal 
drübersehen und mir ggf einen Tipp geben? Vielen Dank!

Grüße Philipp

Hier der Code:

$crystal = 1000000                     '1 MHz Taktfrequenz, Intern
$regfile = "attiny26.dat "                       'Tiny26 Def - Datei

'Portdeklaration
Config Pinb.5 = Input                                 'Noch nicht 
benutzt
Config Pinb.4 = Output                                'Noch nicht 
benutzt
Config Pinb.3 = Input                                 'Taster
Config Pinb.2 = Output                                'LED Grün (ON)
Config Pinb.1 = Output                                'LED Rot (OFF)
Config Pinb.0 = Output                                'LED Gelb
Config Watchdog = 16                                  'Watchdog auf 16 
mS

Dim Z As Long

'Initialisierung Schalter logisch

Readeeprom Z , &H10

If Z = 1 Then                                   'War eingeschaltet?
   Portb.0 = 1
   Portb.1 = 0
   Portb.2 = 1
Else
   Portb.0 = 0                                  'War ausgeschaltet?
   Portb.1 = 1
   Portb.2 = 0
End If


'Hauptprogramm

Start Watchdog                                  'Watchdog eingeschaltet
Do
   If Portb.3 = 1 Then
      Z = Z + 1
      If Z > 40000 Then      'Zeit mit tiny26 bei 1 mhz
         If Portb.0 = 1 Then                                'Ausschalten
            Portb.0 = 0
            Portb.1 = 1
            Portb.2 = 0
            Z = 0
            Writeeeprom Z , &H10
         Else
            Portb.0 = 1                                     'Einschalten
            Portb.1 = 0
            Portb.2 = 1
            Z = 1
            Writeeeprom Z , &H10
         End If
         Z = 0
      End If
      Else
      Z = 0
   End If
Reset Watchdog
Loop

von Peter D. (peda)


Lesenswert?

PCK schrieb:
> Da ich davon ausgehe, dass ich es Hardwareseitig richtig aufgebaut habe,

Zeig trotzdem erstmal den Schaltplan.


Peter

von B-Bert (Gast)


Lesenswert?

Damit ein Signal/Pegel am Portpin erkannt werden kann (Taster gedrückt 
oder nicht), müssen definierte Zustände vorliegen.

Dazu benutzt man i.d.R. Pullup- oder Pulldown-Widerstände.

Pullups hat der AVR schon eingebaut, sie werden mit DDRx = 0 (Portx = 
Eingang) und dann(!) mit PORTx=255 aktiviert (in dieser Reihenfolge!).

Dann kann man den Schalter vom Pin gegen Masse schalten. Bei offenem 
Schalter liegen ca. 5V (+Ub) am Pin an (=HI). Wird der Schalter 
geschlossen, so wird der Pin nach Masse gezogen (=LO).
(Bei Verwendung von Pulldowns das ganze genau andersrum).

Man kann natürlich statt PORTx = 255 (also interne Pullups einschalten) 
auch einfach externe Widerstände verwenden.

(übrigens: der Port A wird mit PINA ausgelesen, var = PINA (!), nicht 
mit var = PORTA, dann bekäme man nur den Zustand der internen Pullups!, 
häufiger Fehler)

Hoffe, es hilft weiter und ich erzähle dir nichts Altbekanntes...

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.