bitte kleines beispiel zu pin change-interrupt

Gast #351091
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.
Gast #351092
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?
Gast #351094
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
#351095
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)
Gast #351096
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
Persönliche Seite #351099
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.
Gast #351100
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!?

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