PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Taster - Abfrage in C



Boozer99
18.01.2009, 14:12
Hallo,
ich würde gerne wissen ob ich die Taster bei meinem RN- Control immer analog abgreifen muss?
oder geht des auch wenn ich es über einen PORT mache, den ich nicht verwende, also nix angeschlossen ist?!
z.B. PORTB und bei Tastendruck die Pins dann auf "High" setze, um eine Funktion ablaufen zu lassen?
Weil bei dem "Demoprogramm in C" auf
https://www.roboternetz.de/wissen/index.php/RN-Control_Demoprogramm_in_C
sind es analoge werte und bei dem Taster-Abrage in C https://www.roboternetz.de/wissen/index.php/Taster-Abfrage_in_C#ATmega8_und_avr-gcc sind es Pin belegungen!
Ich würde nämlich gern TM_Long verwenden und ich hab kein plan wie ich es mit den analogen werten verwenden soll!

Hoffe ihr könnt mir helfen!
Grüsse Boozer :-s

oberallgeier
18.01.2009, 14:28
Hi Boozer99,

Hier ein Auszug aus meinem aktuellen Programm (m168 - aber es gilt natürlich auch für andere Controller). Meine Ports werden z.B. so initialisiert und danach wie vorgestellt abgefragt. Allerdings ist hier keine Tastenentprellung eingebaut ! ! ! Das könnte, je nach Anwendung, schief gehen.


//####### Grundlegende Initialisierungen der Hardware, Portdefinition -------------
//Pins/Ports als Ein- (0) oder Ausgänge (1) konfigurieren, Pull Ups (1) aktivieren
DDRB = 0b00100111; // siehe aktuell oben (oder fortschrittsbericht)
PORTB = 0b11011000; // und Port/Pull Ups (1) aktivieren

DDRC = 0b01110000; // PC3 ist ADC3, PC0 .. 6 , kein PC7-Pin bei m168
PORTC = 0b00000110; // Änderung für ADC: PC3 ist Eingang ##>> OHNE Pullup !!
...
...
if ( ! (PINB & (1 << PINB4)) ) // Taste abfragen auf PB4(MISO)
{ PORTC |= (1<<PC4); } // LED auf PC4 einschalten

Hubert.G
18.01.2009, 21:13
Dieser Artikel ist recht interessant www.mikrocontroller.net/articles/Entprellung

Boozer99
18.01.2009, 21:19
Danke! die URL ist sehr Hilfreich für mich!

Grüsse

PCMan
19.01.2009, 14:21
Hi,
also was das Thema Tastenentprellen angeht scheiden sich die Geister. Ich habe schon diverse Varianten ausprobiert eine "Tastatur" abzufragen:
1) Analog ADC: du verknüpfst über ein R2R Netzwerk die Taster untereinander, so dass bei jedem Druck eine spezifische Spannung am ADC anliegt. Um das ganze frei von äußeren Störungen zu bekommen habe ich tiefpassgefiltert. Dies bewirkte gleich eine Entprellung.
Vorteil: mehrere Tasten über einen Draht am AVR beschaltet
Nachteil: du musst dauernd den ADC abfragen und dann die richtige Spannung erraten lassen um einen Taster in einen definierten Bereich als "gedrückt" zu maskieren. Außerdem muss man je nach konfiguration recht lange drücken.
Anstelle des Tiefpasses kann man auch einfach den ADC in 1/50Hz abfragen (sollte Netzbrummen wegfiltern), das habe ich aber nie hinbekommen dass das schön sauber wird.

2) Direkte Abfrage über I/O Ports: jede Taste bekommt einen Draht an den AVR. Natürlich sollte man Pullup/Pulldown Widerstände nicht vergessen (ggf interne benutzen?). Über einen Timer oder einen verknüpften Interrupt (dazu braucht man mindestens einen Draht mehr) kann man dann den Status der Pins abfragen. Das Entprellen kann man softwareseitig lösen wie bei den obigen Links beschrieben. Ich persönlich halte davon aber auch nicht viel: viel rumgerechne rumgeschiebe und verprasselte Prozessorzeit. Großer Vorteil ist aber, dass es eben die billigste Variante ist Tasten zu betreiben. Weitere Variante ist alle Tasten wieder über einen Tiefpass zu entprellen; aber das musst du dann auch für jede Taste tun...

3) Direkt interrupt: du kannst auch wenn du zB nur 3 Tasten hast und eh noch Ports frei hast diese dann direkt an die Interrupt eingänge hängen. Entprellen könntest du softwareseitig oder auch mit dem Tiefpass.

4) I/O-Pins und 1x Interrupt: jede Taste bekommt einen IO-Pin (oder man assoziiert mehrere IO-Pins mit einer Taste (dadurch lassen sich wiederum Drähte sparen)). Über ein paar dioden kannst du dann einen Interrupt Pin durchschalten, wenn irgendeine Taste gedrückt wurde, in der entsprechenden ISR dann welche tasten gedrückt wurden (Mehrfachdrücken ist über eine kleine Bitmaske ebenfalls möglich). Entprellt wird das ganze über einen 22pF Kondensator, den du über den Taster legst. Auch wenn da jetzt die Leute sagen da gibts dann Spitzenströme durchs Prellen etc... die sind aber niemals so hoch dass dir das deine Taster zerhaut oder sonstwas. Ich habe diese Variante schon ein paar mal gut umgesetzt und noch nie probleme bekommen. Vorteil: Rechenpower kannst du dir für was anderes aufheben, wenig Code für die Abfrage, recht sicher. Nachteil: Beschaltungsaufwand (zusätzliche Kondensatoren + Dioden).

Hoffe einen kleinen Einblick gegeben zu haben, viele Grüße,
Simon

thewulf00
19.01.2009, 14:28
Gute Übersicht Simon!

Anmerkung: Nimm einen AtTiny2313, da kannste 9 Pins als Interrupteingänge schalten.
Und zur Variante 4 würd ich bitte gern eine Skizze sehen.

X-917
19.01.2009, 20:54
Es gibt auch Controller mit Pin-change interrupt. Dann brauchst du den interrupt-pin und die dioden nicht mehr.

oberallgeier
19.01.2009, 21:36
Hi Simon, hallo thewulf00,

beim mega168 kann man 24 Pins für pin change interrupt konfigurieren: "... The External Interrupts are triggered by the INT0 and INT1 pins or any of the PCINT23..0 pins..." - also jeden Pin, ausser Vcc, GND und ihre Verwandten.

thewulf00
20.01.2009, 07:30
beim mega168 kann man 24 Pins für pin change interrupt konfigurieren: "... The External Interrupts are triggered by the INT0 and INT1 pins or any of the PCINT23..0 pins..." - also jeden Pin, ausser Vcc, GND und ihre Verwandten.
Ah ok - eine logische Fortsetzung des Tinys. Vielen Dank!

PCMan
20.01.2009, 09:18
Hi,
habe ich die Skizze angehängt.
funktioniert wunderbar. Anfangs dachte ich ich müsste die Pins noch mit nem Transistor durchschalten, aber es geht auch sehr gut ohne.
Viele Grüße Simon

Edit:
Pin 1 und 2 sind Versorgung, Pin 3 ist der Interrupt ("OnKeyPressed"), die restlichen 4 Pins beschalten die Taster.