Forum: Mikrocontroller und Digitale Elektronik Auf Taster an PortB reagieren


von Markus R. (gironymo)


Lesenswert?

Hallo Leute, ich bin leider ein kompletter Neuling was uCs angeht und
wahrscheinlich ist diese Frage auch schon mal wo beantwortet, aber
leider bin ich nicht fündig geworden.

Für euch dürfte das kein Problem sein, aber ich meinen ATMega128 erst
seit Montag ... naja, ich arbeite derzei noch mit den
Beispielprogrammen.

Also, hier mein Problem.

Ich hab an PortB ein paar Taster angeschlossen (4 Stk.) und ich möchte
jetzt auf das Drücken einer Taste reagieren. Ich arbeite mit Bascom.
Muss ich da einen Interrupt verwenden? Wenn ja, wie kann ich einem
Interrupt sagen, dass er für PortB zuständig ist?

Also, besten Dank schon mal im vorraus.

von Klaus Bröntgen (Gast)


Lesenswert?

du must deinen port als eingang konfigurieren ($FF ins DDRB schreiben)
und auslesen (wert von PINB holen). wie das geht, steht oben links im
avr-tutorial. das ist zwar für assembler, zeigt aber die notwendigen
schritte. bascom kann ich nicht. wenn du das ganze noch verbessern
willst, such mal nach dem stichwort "tasten entprellen". ohne diese
maßnahme wirst du bald keinen spaß an deinen tests haben (programm
reagiert komisch bzw. unerwartet auf eingaben).

mit interrupts ist das ganze zu overdosed. ich kenne jetzt den mega128
nicht, aber auf welche eingänge er mit einem interrupt reagiert, steht
im datenblatt und ist nicht veränderbar. es wären (vermutlich) auch
nicht 4 Eingänge möglich (meist nur zwei).

von Markus R. (gironymo)


Lesenswert?

Danke für Deine schnelle Antwort.
Das mit dem Entprellen ist mir schon klar, aber das ist ja eher eine
Elektronische Geschichte ...

Das heißt also, ich kann nur auf die beiden Eingänge mit einem
Interrupt reagieren? Was ist aber, wenn ich sagen wir mal auf 4 Tasten
mit einem Interrupt reagieren möchte? Geht das dann garnicht?

von peter dannegger (Gast)


Lesenswert?

"Das mit dem Entprellen ist mir schon klar, aber das ist ja eher eine
Elektronische Geschichte ..."

Warum Elektronik bemühen, wenns die Software so nebenbei machen kann ?

Entprellen und Flankenerkennung von bis zu 8 Tasten so nebenbei mit im
Timerinterrupt ist einfacher, als jede Taste extra, lohnt sich sogar
bei nur einer Taste.

Siehe "Tasten entprellen - Bulletproof"


Peter

von Markus R. (gironymo)


Lesenswert?

Klingt interessant, aber so weit bin ich noch nicht, dass ich mit Timern
umgehen könnt ;o) zuerst mal zu den Taster

von Markus R. (gironymo)


Lesenswert?

Ok, ich hab das jetzt mal so gemacht, aber irgendwie funktioniert das
nicht:

Config Portb = Input

Do
  If Portb > 0 then
    GoSub Irgendwas
  End If
Loop

Kann mir wer sagen, was ich da falsch gemacht hab?

von Klaus Bröntgen (Gast)


Lesenswert?

>Das heißt also, ich kann nur auf die beiden Eingänge mit einem
Interrupt reagieren? Was ist aber, wenn ich sagen wir mal auf 4 Tasten
mit einem Interrupt reagieren möchte? Geht das dann garnicht?

so in etwa. zumindest nicht so, daß jede taste ihren eigenen interrupt
bekommt. geht ja auch nicht, daß jeder der wichstigste sein will.....
du kannst natürlich die tasten parallel zu ihren port-eingängen mit
einem 4fach-oder verknüpfen und dessen ausgang auf den interrupt
eingang legen. dann wird bei jeder taste (der gleiche) interrupt
ausgelöst und du mußt dann noch in der isr rausfinden, welche taste es
denn war. wird aber schwierig, da du nicht garantieren kannst, das zu
diesem zeitpunkt der tastenzustand noch der gleiche ist.
an die dannegger-tasten-entprellung mußte dich wagen, es hilft nichts.
die ist auch noch richtig gut....

>aber so weit bin ich noch nicht, dass ich mit Timern umgehen könnt

soweit war ich auchmal (also ich verstehe deine aussage und habe sie
selbst mal so getroffen), aber glaube mir, timer tun keinem weh, sind
eigentlich leicht zu bedienen und bieten eine fülle von
möglichkeiten...

von Klaus Bröntgen (Gast)


Lesenswert?

keine ahnung, wie bascom geht, aber das hier:

If Portb > 0 then

ist wohl dein problem. du mußt den port einlesen (siehe mein erstes
post), also eher:

If pinb > 0 then

oder so ähnlich.

von Markus R. (gironymo)


Lesenswert?

So in der Richtung hab ich schon gedacht, was das mit den Interrupts her
kenne (ist vielleicht doch noch was von der Digitaltechnik in der
Berufschule hängen geblieben?)

Ja, das mit den Timern ist wichtig, keine Frage, aber ich möchte doch
nur, dass er irgendwas macht, wenn ich auf diese Taste drücke ... Aja,
die Taster sind bereits entprellt (Mechanisch)

von Markus R. (gironymo)


Lesenswert?

Dank, werd ich gleich mal probieren

von Markus R. (gironymo)


Lesenswert?

Ok, das hab ich jetzt probiert, aber irgendwie macht der sowieso was er
will ...

also, das sieht jetzt so aus:

Config Porta = Input

Do
  If Pina > 0 Then
    Gosub Irgendwas
  End If
Loop

Jetzt springt er immer wieder in die Rutine "irgendwas" obwohl kein
Taster gedrückt ist ... obwohl nicht mal ein Taster an Porta drann ist
...

von klaus bröntgen (Gast)


Lesenswert?

das liegt daran, daß die internen pullups für ein high an jedem port
sorgen. taster werden normalerweise als low-aktiv geschaltet, also:
taster nicht gedrückt->high-pegel am port
taster gedrückt -> low-pegel am port

entweder invertierst du vor der auswertung den registerinhalt von pina
oder fragst halt ab, ob der inhalt kleiner FF (anstelle von größer als
0) ist.

von Markus R. (gironymo)


Lesenswert?

wenn ich abfrage

If Pinb < 255 passiert das selbe in grün ...

von Karl H. (kbuchegg)


Lesenswert?

Dann gib doch mal den Inhalt von Pina an einem
anderen Port aus und sieh nach, was dann eigentlich
dein Atmel so fuer Portwerte sieht.
Dann vergleichst Du mit dem was Deiner Meinung nach
am Port anliegen muesste, testest vielleicht mal
einen Taster (der muesste sich dann in der Ausgabe
wiederspiegeln) und dann sieht man weiter wo sich
deine Vorstellung von der Realitaet unterscheidet und
ergruendet warum das so ist.

Ja so ist das Leben als Programmierer. Zwischen Theorie
und Praxis ist oftmals ein grosser Unterschied. Da brauchts
oft ein bischen Kreativitaet um dem auf die Schliche zu kommen.

von Gironymo (Gast)


Lesenswert?

Kann ich auf einen Ausgang des uC direkt eine LED anhängen?


uC -------|R(470)|------>|------ Masse
                       LED

von Karl H. (kbuchegg)


Lesenswert?

Kannst Du.
Aber anders rum

  uC --- | R | ----  |< -----  Vcc

Der Grund ist einfach: Die AVR koennen mehr Strom
senken als sie liefern koennen. Wenn da von Vcc
ein Strom in den Pin hineinläuft, dann ist das
besser als wenn der AVR den Strom liefern muss.

Nachteil: Die LED leuchtet wenn der Pin auf 0
ist und umgekehrt.

von Gironymo (Gast)


Lesenswert?

Danke für die Antwort.
Im Prinzip ist mir das ja egal, ob die Led leuchtet wenn ich 0 auf dem
Pin habe oder nicht. Ist ja nur eine Frage der Software ;o)

von Rahul (Gast)


Lesenswert?

Wieso willst du dann eine LED an deinen Pin anschliessen, wenn es dir
sowieso egal ist, ob sie leuchtet oder nicht? ;)

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.