-         

Ergebnis 1 bis 6 von 6

Thema: RN-Control Taster abfragen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    24.09.2006
    Beiträge
    84

    RN-Control Taster abfragen

    Anzeige

    Hallo,
    ich halte hier gerade mein erstes Controllerboard in der Hand und habe schon ein paar Schwierigkeiten ..
    LED´s ansteuern und Motor steuern klappt schon, allerdings komme ich nicht mit den 5 verbauten Tastern zurecht.
    Ich weiß, dass die analog auf A7 zu finden sind. Allerdings habe ich keine Ahnung, wie ich nun feststelle, welcher Taster gedrückt wurde. Je nach Tasterdruck möchte ich eine andere LED ansteuern, dass bekomme ich ja dann selber hin ..
    Kann jemand bitte einen Beispielcode zu dem ADC und den Tasten posten? Alles, was ich bis jetzt zusammengekratzt habe, hat nicht so funktioniert, wie ich wollte ..
    [php:1:628026f8b3]// AVR-Includes
    #include <avr/io.h>
    // Funktionen

    unsigned int Tastenabfrage (void)
    {
    unsigned char i;
    unsigned char Tasternr = 0;
    unsigned int Tasteradc = 0;
    PORTA |= (1<<PA7); /* internen Pull-Up an PA7 aktivieren */

    ADCSRA = (1<<ADEN) | (1<<ADPS2)| (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler hier: 128



    ADMUX = (0<<MUX4) |(0<<MUX3) |(1<<MUX2) | (1<<MUX1) | (1<<MUX0);

    ADMUX &= (0<<ADLAR); // Standard Ausrichtung
    ADMUX &= (0<<REFS1) & (0<<REFS0); // Referenzspannung an AREF nutzen

    ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
    while ( ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten


    for (i=0;i<4;i++)
    {
    ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
    while ( ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten
    Tasteradc += ADCW; // Wandlungsergebnisse aufaddieren

    }
    ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
    Tasteradc /= 4; // Summe durch vier teilen = arithm. Mittelwert

    return Tasteradc;
    }



    int main (void)
    {
    char c;
    unsigned int taste = 0;
    DDRA = 0x00;
    DDRC = 0xff;
    PORTC = 0xff;

    while (1)
    {

    while (taste == 0)
    {
    taste = Tastenabfrage();
    }

    if ((taste > 350)&&(taste<375))
    {
    PORTC &= ~(1 << 7);
    taste = 0;
    }

    else if ((taste > 374)&&(taste<400))
    {
    PORTC &= ~(1 << 6);
    taste = 0;
    }

    else if ((taste > 399)&&(taste<425))
    {
    PORTC &= ~(1 << 5);
    taste = 0;
    }

    else if ((taste > 424)&&(taste<450))
    {
    PORTC &= ~(1 << 4);
    taste = 0;
    }

    else if ((taste > 449)&&(taste<475))
    {
    PORTC &= ~(1 << 3);
    taste = 0;
    }

    else if ((taste > 474)&&(taste<500))
    {
    PORTC &= ~(1 << 4);
    taste = 0;
    }

    else if ((taste > 499)&&(taste<525))
    {
    PORTC &= ~(1 << 5);
    taste = 0;
    }

    else if ((taste > 524)&&(taste<550))
    {
    PORTC &= ~(1 << 6);
    taste = 0;
    }

    else if ((taste > 3000)&&(taste<4000))
    {
    PORTC &= ~(1 << 7);
    taste = 0;
    }

    else if ((taste > 4000)&&(taste<5000))
    {
    PORTC &= ~(1 << 6);
    taste = 0;
    }

    else if ((taste > 500)&&(taste<1000))
    {
    PORTC &= ~(1 << 5);
    taste = 0;
    }

    else
    {
    PORTC = 0xff;
    taste = 0;
    }

    }
    }
    [/php:1:628026f8b3]

    Das habe ich mir bis jetzt zusammenkopiert .. bei Tastern 4 und 5 wird ein Motor angesteuert, bei den restlichen passiert nichts .. was mache ich falsch?

    Grüße und vielen Dank schonmal
    CsT

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    16.12.2006
    Beiträge
    205
    Hallo

    ich weiß jetzt nicht, wie deine Taster angeschlossen sind, bzw. wie du das mit dem ADC machst. Aber in deinen if Anweisungen löschst du ja immer Bits. Ist das beabsichtigt oder willst du nicht eigentlich Bits setzen (|= (1<<n) ), weil du ja LED anschalten willst.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    12.01.2007
    Beiträge
    93
    kleiner tip: mach statt den vielen else if halt ein switch ist übersichtlicher.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    24.09.2006
    Beiträge
    84
    Hallo,
    erstmal danke für eure Antworten ..
    @robo junior
    Ich hab LED´s die im low-Zustand leuchten, also muss ich doch die Bits löschen, oder?

    @bL1nK
    switch funktioniert hier nicht, da es Bereiche sind, die ich Abfrage und nicht nur ein einzelner Wert.

    @all
    Habe auf der CD noch ein kleines C-Programm gefunden, komischerweise mit der Endung .bas ?!?
    Jedenfalls wird da die Tasterabfrage geklärt, ich teste das dann gleich morgen mal. Wenn das auch nicht klappt meld ich mich nochmal.
    Achja, falls hier jemand ist, der die CD´s zusammenstellt .. im Programm fehlt folgende Zeile:
    #define ADHSM 4
    Und
    zaehler = SYSCLK / 5000;
    kann durch
    zaehler = F_CPU / 5000;
    ersetzt werden .. dadurch entfällt oben ein define

    Grüße CsT .. und nochmals besten Dank für eure Antworten

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    08.04.2006
    Beiträge
    23
    Hi,
    wenn Du das Board von robotik Hardware bzogen hast war da 'ne CD dabei. Scha mal unter x:\Anleitungen_Projekte und Boards\rn-control\c_beispiel , da gib es eine Datei die fälschlich tastenled.bas heisst (ist aber C). Da ist dein Szenario implementiert.

    Ansosten steht hier noch ganz viel:
    http://www.roboternetz.de/wissen/ind...r-Abfrage_in_C

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    24.09.2006
    Beiträge
    84
    Hi,
    wie ich ja oben schon geschrieben habe, habe ich dieses Programm auch noch gefunden. Mit dem Wiki habe ich mich ebenfalls beschäftigt, aber da gehts ja um digitale Eingangswerte.
    Hab das Beispiel von der CD noch ein bisschen umgeändert, jetzt funktioniert auch die Erkennung, ob eine Taste lang gedrückt wurde oder nur kurz. Falls es jemand haben will, einfach per PN / Mail (tf11@gmx.de) melden.

    Grüße CsT und vielen Dank nochmal für deine Antwort!

Berechtigungen

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