-         

Ergebnis 1 bis 10 von 10

Thema: Taster - Abfrage in C

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    02.01.2009
    Beiträge
    28

    Taster - Abfrage in C

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    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
    http://www.roboternetz.de/wissen/ind...oprogramm_in_C
    sind es analoge werte und bei dem Taster-Abrage in C http://www.roboternetz.de/wissen/ind...a8_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

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    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.

    Code:
    //####### 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
    Ciao sagt der JoeamBerg

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von Hubert.G
    Registriert seit
    14.10.2006
    Ort
    Pasching OÖ
    Beiträge
    6.183
    Dieser Artikel ist recht interessant www.mikrocontroller.net/articles/Entprellung
    Grüsse Hubert
    ____________

    Meine Projekte findet ihr auf schorsch.at

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    02.01.2009
    Beiträge
    28
    Danke! die URL ist sehr Hilfreich für mich!

    Grüsse

  5. #5
    Erfahrener Benutzer Begeisterter Techniker Avatar von PCMan
    Registriert seit
    05.08.2006
    Ort
    Munich
    Beiträge
    311
    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

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    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.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    14.09.2007
    Ort
    Na Zuhause!
    Alter
    23
    Beiträge
    99
    Es gibt auch Controller mit Pin-change interrupt. Dann brauchst du den interrupt-pin und die dioden nicht mehr.
    Nur tote Fische schwimmen immer mit dem Strom!

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    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.
    Ciao sagt der JoeamBerg

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    08.07.2004
    Ort
    Südhessen
    Beiträge
    1.312
    Zitat Zitat von oberallgeier
    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!

  10. #10
    Erfahrener Benutzer Begeisterter Techniker Avatar von PCMan
    Registriert seit
    05.08.2006
    Ort
    Munich
    Beiträge
    311
    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.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken skizze_113.jpg  

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •