mikrocontroller.net

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


Autor: leuchte (Gast)
Datum:

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

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

Autor: leuchte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, ich hatte den falschen ISR(vector), muss dann heißen


ISR(PCINT0_vect)
{
    
}

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?

Autor: Ludwig Wagner (lordludwig)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: leuchte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ludwig Wagner (lordludwig)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: leuchte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja nu,

aber was ist mit den störungen?

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: leuchte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dran nicht, aber drin! und das bestätigt der high-pegel.

siehe
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...
:

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

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: leuchte (Gast)
Datum:

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

kein unterschied! :-(

Autor: leuchte (Gast)
Datum:

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

Autor: leuchte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich glaube der isp hat gestört .. oops!

Autor: leuchte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: leuchte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ludwig Wagner (lordludwig)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann tuts mir leid...

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.