Gast
#351091
ich möchte meinen tiny13 schlafen lassen, bis eine von zwei tasten gedrückt wird.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
übersehe ich etwas? es tut sich nämlich nix, er wacht nicht auf.
|
Anzeige
|
bitte kleines beispiel zu pin change-interrupt
Gast
#351091
ich möchte meinen tiny13 schlafen lassen, bis eine von zwei tasten gedrückt wird.
übersehe ich etwas? es tut sich nämlich nix, er wacht nicht auf.
Gast
#351092
ok, ich hatte den falschen ISR(vector), muss dann heißen
jetzt geht's, muß aber noch entprellt werden. ich habe so kohlegummitaster, die reagieren auch, wenn sie gar nicht gedrückt werden. direkt an masse - gibt's da abhilfe? ich kenne mich mit C ned aus, würde aber auf jeden fall zuerst das datenrichtungregister (nette wortschöpfung) beschreiben und dann die pullups einschalten!!!
Gast
#351094
wieso? so wie ich es mache gibt es meines wissens nach keinen unerwünschten high-impuls auf den ausgängen.. wenn ich mit dem oszi am pin von meinem taster messe, gibt es pratisch keine fehler mehr. bringt dann ein zusätzlicher / externer pull-up evtl. den gewünschten entstörenden effekt? oder soll ich auf's entprellen vertrauen? erfahrungen zum pcint werden gerne gelesen, ich mache das zum ersten mal. auch beim tiny13 ist der analog-comparator standardmäßig angeschaltet, kann also auf den entprechenden pins den PCINt oder andere funktionen verhindern.. mfg der pullup wird nur eingeschaltet wenn das datenrichtungsregister bereits auf eingang steht. wenn es noch auf ausgang steht wird der pin ganz kurz auf hi und dann auf eingang geschaltet. beim schalten auf eingang werden alle pullups wieder ausgeschaltet!!!(das PORTB register gelöscht)
Gast
#351096
>> beim schalten auf eingang werden alle pullups wieder >> ausgeschaltet!!!(das PORTB register gelöscht) Bei allem Respekt... aber das wage ich nun doch arg anzuzweifeln. Gruß, Magnetus @Ludwig "beim schalten auf eingang werden alle pullups wieder ausgeschaltet!!!(das PORTB register gelöscht)" was soll denn der Unsinn. Wenn ich auf DDRB schreibe, dann bleibt PORTB natürlich unverändert. Peter
Gast
#351098
ja nu, aber was ist mit den störungen? Du hast sicher keinen Pullup dran (Wie oben schon angeleitet). Daher liegt der Interrupt bei offenem Taster auf keinem definierten Pegel und er empfängt dann den Moskau Landfunk. @Ludwig: Also dein beschriebens Verhalten konnte ich auch noch nciht feststellen. PORTB.0 = 1 DDRB.0 = 1 gibt zB ein High an PB0. Wenn man nun DDRB.0 löscht, dann habe ich ein Eingang mit Pullup.
Gast
#351100
dran nicht, aber drin! und das bestätigt der high-pegel. siehe http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Ausg.C3.A4nge : Falls der Anfangszustand von Ausgängen kritisch ist, muss die Reihenfolge beachtet werden, mit der die Datenrichtung (DDRx) eingestellt und der Ausgabewert (PORTx) gesetzt wird. Für Ausgangspins, die mit Angangswert "high" initialisiert werden, zuerst die Bits im PORTx-Register setzen und anschliessend die Datenrichtung auf Ausgang stellen. Daraus ergibt sich die Abfolge Eingang -> setze PORTx: interner Pull-Up aktiv -> setze DDRx: Ausgang "high". Bei der Reihenfolge erst DDRx and PORTx, kann es zu einem kurzen "low-Puls" kommen, der auch exterene Pull-Up-Widerstände "überstimmt". Die (ungünstige) Abfolge: Eingang -> setze DDRx: Ausgang (auf "low", da PORTx nach Reset 0) -> setze PORTx: Ausgang auf high. Vergleiche dazu auch das Datenblatt Abschnitt Configuring the Pin. da steht nämlich auch nichts von einer reihenfolge: The DDxn bit in the DDRx Register selects the direction of this pin. If DDxn is written logic one, Pxn is configured as an output pin. If DDxn is written logic zero, Pxn is config- ured as an input pin. If PORTxn is written logic one when the pin is configured as an input pin, the pull-up resistor is activated. To switch the pull-up resistor off, PORTxn has to be written logic zero or the pin has to be configured as an output pin. The port pins are tri-stated when reset condition becomes active, even if no clocks are running. If PORTxn is written logic one when the pin is configured as an output pin, the port pin is driven high (one). If PORTxn is written logic zero when the pin is configured as an out- put pin, the port pin is driven low (zero). ich dachte, das wäre ein alter hut!? Den internen hat er vermutlich aber auch nicht eingeschaltet. Also garkeinen Pullup.
Gast
#351102
DDRB = 1<<PB0 ; // data direction register PORTB = 1<<PB2 | 1<<PB5; // write 1 to inputs to enable internal pull-up resistors kein unterschied! :-(
Gast
#351103
ausserdem sag ich ja, ich kann den high-pegel am eingang messen. die reihenfolge ist doch für den pull-up egal..
Gast
#351104
ich glaube der isp hat gestört .. oops!
Gast
#351105
so pin 1 löst keinen interrupt aus, weil er der reset pin ist. was passiert, wenn ich die entsprechende fuse setze/lösche, um den als gpio benutzen zu können?
Gast
#351106
alles klar. nix mehr isp: http://www.mikrocontroller.net/articles/AVR_Fuses "aber was ist mit den störungen?" Nimm den Pin-Change nur zum Aufwachen und mache dann das Entprellen wie üblich im Timerinterrupt. Und wenn z.B. nach 10 Timerinterrupts nichts gedrückt erkannt wurde, geht man eben wieder schlafen. Peter dann tuts mir leid... habe echt gedacht das das register gelöscht wird aber was kommt schon beim denken raus... Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|