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
PCK schrieb: > Da ich davon ausgehe, dass ich es Hardwareseitig richtig aufgebaut habe, Zeig trotzdem erstmal den Schaltplan. Peter
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.