www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Auf Taster an PortB reagieren


Autor: Markus Re. (gironymo)
Datum:

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

Autor: Klaus Bröntgen (Gast)
Datum:

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

Autor: Markus Re. (gironymo)
Datum:

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

Autor: peter dannegger (Gast)
Datum:

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

Autor: Markus Re. (gironymo)
Datum:

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

Autor: Markus Re. (gironymo)
Datum:

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

Autor: Klaus Bröntgen (Gast)
Datum:

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

Autor: Klaus Bröntgen (Gast)
Datum:

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

Autor: Markus Re. (gironymo)
Datum:

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

Autor: Markus Re. (gironymo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dank, werd ich gleich mal probieren

Autor: Markus Re. (gironymo)
Datum:

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

Autor: klaus bröntgen (Gast)
Datum:

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

Autor: Markus Re. (gironymo)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn ich abfrage

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Gironymo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann ich auf einen Ausgang des uC direkt eine LED anhängen?


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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Gironymo (Gast)
Datum:

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

Autor: Rahul (Gast)
Datum:

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

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.