Forum: Mikrocontroller und Digitale Elektronik bitte kleines beispiel zu pin change-interrupt


von leuchte (Gast)


Lesenswert?

ich möchte meinen tiny13 schlafen lassen, bis eine von zwei tasten
gedrückt wird.
1
PORTB = 1<<PB2 | 1<<PB5;   // write 1 to inputs to enable internal
2
pull-up resistors
3
DDRB = 1<<PB0 ;    // data direction register
4
  
5
GIMSK = 1<<PCIE;
6
PCMSK = 1<<PB2 | 1<<PB5;

übersehe ich etwas? es tut sich nämlich nix, er wacht nicht auf.

von leuchte (Gast)


Lesenswert?

ok, ich hatte den falschen ISR(vector), muss dann heißen
1
ISR(PCINT0_vect)
2
{
3
    
4
}

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?

von Ludwig W. (lordludwig)


Lesenswert?

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!!!

von leuchte (Gast)


Lesenswert?

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

von Ludwig W. (lordludwig)


Lesenswert?

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)

von Magnus Müller (Gast)


Lesenswert?

>> 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

von Peter D. (peda)


Lesenswert?

@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

von leuchte (Gast)


Lesenswert?

ja nu,

aber was ist mit den störungen?

von Simon K. (simon) Benutzerseite


Lesenswert?

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.

von leuchte (Gast)


Lesenswert?

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!?

von Simon K. (simon) Benutzerseite


Lesenswert?

Den internen hat er vermutlich aber auch nicht eingeschaltet. Also
garkeinen Pullup.

von leuchte (Gast)


Lesenswert?

DDRB = 1<<PB0 ;    // data direction register
PORTB = 1<<PB2 | 1<<PB5;   // write 1 to inputs to enable internal
pull-up resistors

kein unterschied! :-(

von leuchte (Gast)


Lesenswert?

ausserdem sag ich ja, ich kann den high-pegel am eingang messen. die
reihenfolge ist doch für den pull-up egal..

von leuchte (Gast)


Lesenswert?

ich glaube der isp hat gestört .. oops!

von leuchte (Gast)


Lesenswert?

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?

von leuchte (Gast)


Lesenswert?


von Peter D. (peda)


Lesenswert?

"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

von Ludwig W. (lordludwig)


Lesenswert?

dann tuts mir leid...

habe echt gedacht das das register gelöscht wird aber was kommt schon
beim denken raus...

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.