sleep, external interrupt

Gast #3159920
Lesenswert?

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?
Angehängte Dateien:
#3159993
Lesenswert?

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.
Gast #3160019
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren