Hallo ...
Also mein Programm läuft dank des Forums super und ich lerne dank euch
dazu ... also nun bin ich da angekommen, dass ich drei Taster an meinen
ATMega16 anschließen möchte ... also ich weiß, dass es einem High -
Aktiv und einmal Low - Aktiv gibt ... mir egal, was ich verwende ... bin
da net festgelegt ... ich bin ebenfalls mit dem Einstellen der Richtung
des Ports vertraut ... sprich ... DDR = 0xff; oder DDR = 0x00; ...
Nun kann man ja mit Pin auf den Port zugreifen ... möchte aber nur
einzellne Pins abfragen, so dass ich mehrere Taster an einen Port hängen
kann ...
Zum Beispiel an PortA ...
Taster 1 an Pin PA0
Taster 2 an Pin PA1
Taster 3 an Pin PA2
... mein Ziel ist es per If - Abfrage bzw. swich - Abfrage zu schauen
welcher Taster gedrückt ist und dem entsprechend eine Aktion ausführen
...
Also beispielsweise:
Wenn Taster 1 = "High", dann zähle eine Variable um den Wert '1' hoch,
sonst machte nichts ...
if (... Was schreibe ich nun hier genau rein ... );
{
Zaehler = Zaehler + 1;
}
else
{
}
Die Taster möchte ich zudem entprellen ... Vielen Dank für die Hilfe ...
Gruß Timo
Zunächst mal: Schalte den Taster low aktiv, das ist einfacher. Der Taster schaltet also nach Masse durch. Dadurch brauchst du am Port nur den Pull Up Widerstand aktivieren und hast dadurch immer einen definierten Pegel: Taster nicht gedrückt -> 1 Taster gedrückt -> 0 Den Pullupwiderstand an einem Pin schaltet man ein, indem der Port auf Eingang geschaltet wird (das ist er nach einem Reset sowieso) und mit einer PORT Ausgabe das gewünschte Bit auf 1 gesetzt wird:
1 | int main() |
2 | {
|
3 | // Port B ist bereits auf Eingabe
|
4 | //
|
5 | // Jetzt noch an den Pins 0 und 1 den
|
6 | // Pullup Widerstand einschalten
|
7 | PORTB = ( 1 << PB0 ) | ( 1 << PB1 ); |
8 | }
|
Um einen Pin abzufragen, wird der komplette Port eingelesen.
Danach holt man sich mittels einer Maske die gewünschten
Bits heraus. Dazu braucht man eine Bitweise UND Verknüpfung:
UND
A B Ergebnis
------------------
0 0 0
0 1 0
1 0 0
1 1 1
Das Ergebnis einer Und Verknüpfung ist also immer dann 1
wenn sowohl A als auch B 1 waren. Interessanter ist aber
folgende Beobachtung:
In der 3. und 4. Zeile der UND Tabelle sieht man, dass
das Ergebnis den gleichen Pegel hat wie Eingang B. Das heist
aber auch ich kann mit A das Ergebnis steuern: Ist A 0
dann ist das Ergebnis auf jeden Fall 0. Ist A 1, dann ist
das Ergebnis identisch zum Zustand B.
Und das nutzen wir hier aus: Bei einer bitweisen UND
Verknüpfung kann ich mit einer Maske steuern, welche
Bits einer Zahl übrig bleiben sollen: Setze ich in der
Maske eine 0, dann wird im Ergebnis an genau dieser Stelle
ebenfalls eine 0 auftauchen. Setze ich in der Maske eine 1,
dann bleibt im Ergebnis das ursprüngliche Bit in der zu
untersuchenden Zahl erhalten.
Bsp: Angenommen vom Port wurde eingelesen: 0b10110100
Und ich interessiere mich für den Zustand vom Bit 3 (Achtung:
Wie üblich werden Bitpositionen bei 0 zu zählen angefangen).
Dann lautet meine Maske 0b00001000
Mache ich die bitweise UND Verknüpfung
0b10110100 (einfach untereinanderstehende
& 0b00001000 Bits UND verknüpfen)
----------
0b00000000
Im Ergebnis sind alle Stellen bis auf Bit 3 auf jeden Fall 0.
Da in der interessierenden Zahl an Bitposition 3 ebenfalls eine
0 war, ist auch im Ergebnis eine 0 und damit ist das Ergebnis
insgesamt 0.
Angenommen es interessiert der Zustand von Bit 2. Dann
lautet die Maske 0b00000100
0b10110100
& 0b00000100
----------
0b00000100
Wieder: Alles bis auf Bit 2 ist mit Sicherheit 0 (weil ja
in der Maske in dieser Stelle 0en sind). Die Und Verknüpfung
von Bit 2 der Zahl und Bit 2 der Maske ergibt aber eine 1 und
daher taucht diese 1 an dieser Stelle auch im Ergebnis wieder
auf -> Das Ergebnis ist insgesamt nicht 0.
Sagen wir, der Taster liegt auf Bitposition 6 am Port B.
Dann würde die Maske 0b01000000 lauten. Eine gleichwertige,
aber übersichtlichere Schreibweise dafür ist: 1 << 6 oder
aber, da wir vom Port B reden, 1 << PB6
if ( PINB & ( 1 << PB6 ) ) {
// Taster ist nicht gedrückt
}
oder aber, da ja meistens interessiert, ob ein Taster
gedrückt wurde:
if( (PINB & ( 1 << PB6 )) == 0 ) {
// Taster ist gedrückt
}
> Die Taster möchte ich zudem entprellen
Das ist dann wieder eine andere Geschichte. Da schaust du
dir am besten (nachdem du mit obigen experimentiert hast
und deine ersten Schritte mit Timern gemacht hast) das
hier mal an:
http://www.mikrocontroller.net/articles/Entprellung
Vielen dank ... dass hilft mir sehr weiter ... Noch eine ganz kurze Frage: Und zwar habe ich ja interne Pullup´s aktiviert ... bönötige ich nun die externen trotzdem, oder ersetzen die internen diese komplett? Mit freundlichen Grüßen Timo
Timo wrote: > Vielen dank ... dass hilft mir sehr weiter ... > Noch eine ganz kurze Frage: > > Und zwar habe ich ja interne Pullup´s aktiviert ... bönötige ich nun die > externen trotzdem, oder ersetzen die internen diese komplett? > Du brauchst keine externen mehr. Deswegen bevorzugt man ja meist low-active Taster: Ausser dem Taster ist keine weitere Hardeware mehr nötig.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.