hallo zusammen, ich habe ein Problem mit angehängtem Programm. Es läuft auf einem Attiny13 und mit Optimierung -OS. Grundsätzlich soll das Programm auf einen Tastendruck (PCINT4) warten und dann eine Reihe von Lichteffekten durchführen. Anschliessend soll der uC wieder schlafen gehen und mit PCINT4 wieder aufwachen. Nun läuft das Programm beim ersten Durchgang wie gewollt, erst bei Tastendruck ab. Jedoch läuft die Schlaufe dann endlos ab und der uC geht nicht mehr schlafen. Ich finde nicht heraus wieso. Sieht jemand meinen Denkfehler?
ee schrieb: > Ich finde nicht heraus wieso. Sieht jemand meinen Denkfehler? > PORTB=(1<<PB3); Da und noch an mehreren weiteren Stellen, wird der Pullup für den Taster abgeschaltet, womit der Pin dann offen in der Luft hängt, munter vor sich hin floated und immer wieder den PCINT auslöst. Noch ein kleiner Tip zur Initialisierung des PCINT: Damit nicht schon durch das Einschalten des Pullups der 1. PCINT-Interrupt ausgelöst wird:
1 | PORTB|=(1<<PB4); |
2 | GIMSK|=(1<<PCIE); |
3 | PCMSK|=(1<<PCINT4); |
4 | GIFR |= (1 << PCIF); //löscht das Interrupt-Flag |
5 | sei(); |
Ist hier nicht relevant, kann einen aber an anderer Stelle in den Wahnsinn treiben. mfg. PS: Grundsätzlich ist dein Programm, milde ausgedrückt, stark verbesserungsfähig: Keine Tastenentprellung, Delays zur Programmsteuerung.
Ja klar, auf den PULL-UP habe ich mich gar nicht geachtet. Zur Verbesserung: erstens muss mein Programm weder genau noch zeiteffizient sein. Zweitens braucht es ja gar keine Tastenentprellung, die Laufzeit einer Schlaufe ist genügend lang. Natürlich ist das ganze nicht sehr ästhetisch, aber es musste halt schnell gehen. Danke für deine rasche Antwort
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.