- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 5 von 5

Thema: Probleme beim Touch Sensor Programm

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2009
    Ort
    Singen - Rostock
    Alter
    38
    Beiträge
    159

    Probleme beim Touch Sensor Programm

    Anzeige

    Praxistest und DIY Projekte
    Hallo,

    bin noch blutiger Anfänger im Bereich Mikrocontroller Technik will aber für ein Schulprojekt folgendes realisieren:
    Ein Touch Schalter soll eine LED zum leuchten bringen.

    Bin über die Seite von Martin Junghans gestolpert:

    http://www.jtronics.de/elektronik-av...touch-pad.html

    und hab mal versucht dies nachzubauen aber halt nur mit einem Taster und LED als Ausgang.
    Mein Programm oder besser das abgeänderte von Martin sieht nun wie folgt aus:

    #include <stdlib.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <util/delay.h>
    #include <util\atomic.h>


    #define SK_A0 (1<<5)
    #define SK_B0 (1<<4)
    #define SK_A1 (1<<2)
    #define SK_B1 (1<<3)
    #define SK_A2 (1<<0)
    #define SK_B2 (1<<1)
    #define SK_A012 (SK_A0 | SK_A1 | SK_A2)
    #define SK_B012 (SK_B0 | SK_B1 | SK_B2)
    #define MAX_CYCLE 2000

    uint16_t keys[3];

    void read_senskey( void )
    {
    uint16_t i = MAX_CYCLE;
    uint8_t a, b, x, y;

    ATOMIC_BLOCK(ATOMIC_FORCEON){
    a = DDRA & ~(SK_A012 | SK_B012);
    b = PORTA & ~(SK_A012 | SK_B012);
    y = SK_B012; // input mask
    do{
    DDRA = a; // tristate
    PORTA = b | SK_B012;
    DDRA = a | SK_B012; // Bx = strong high
    DDRA = a; // tristate
    PORTA = b;
    DDRA = a | SK_A012; // Ax = strong low
    if( --i == 0 ) // timeout
    break;
    x = y & PINA; // not immediately after DDRA
    if( x ){
    if( x & SK_B0 )
    keys[0] = i;
    if( x & SK_B1 )
    keys[1] = i;
    if( x & SK_B2 )
    keys[2] = i;
    }
    y ^= x; // clear processed input
    }while( y ); // all inputs done
    DDRA = a | SK_A012 | SK_B012; // discharge
    }
    }

    int main (void)

    {
    DDRA = 0xff;
    PORTA = 0x01;
    _delay_ms( 50000 );

    if ( PINA & (1<<PINA4) )

    {
    PORTA = 0x01;
    }
    }

    Leider funktioniert es nicht
    Kann mir jemand helfen?

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    32
    Beiträge
    1.192
    Hallo,

    Du musst deine Funktion (Methode) auch aufrufen, sonst tut sich da nichts.
    Außerdem musst du immer und immer wieder das Touchfeld abfragen und die Ergebnisse davon verwerten. Deswegen eine Endlosschleife mit while(1) einbauen!

    So ähnlich könnte das aussehen:
    Code:
    ...
    void read_senskey( void )
    {
     uint16_t i = MAX_CYCLE;
     uint8_t a, b, x, y;
    
     ATOMIC_BLOCK(ATOMIC_FORCEON){
     a = DDRA & ~(SK_A012 | SK_B012);
     b = PORTA & ~(SK_A012 | SK_B012);
     y = SK_B012; // input mask
     do
     {
      DDRA = a; // tristate
      PORTA = b | SK_B012;
      DDRA = a | SK_B012; // Bx = strong high
      DDRA = a; // tristate
      PORTA = b;
      DDRA = a | SK_A012; // Ax = strong low
      if( --i == 0 ) // timeout
        break;
      x = y & PINA; // not immediately after DDRA
      if( x )
      {
       if( x & SK_B0 )
         keys[0] = i;
       if( x & SK_B1 )
         keys[1] = i;
       if( x & SK_B2 )
         keys[2] = i;
      }
      y ^= x; // clear processed input
     }
     while( y ); // all inputs done
     DDRA = a | SK_A012 | SK_B012; // discharge
     }
    }
    
    int main (void)
    {
     DDRA = 0xff; //PORTA komplett Output
     PORTA = 0x01; //Damit ist PA4 auf +5Volt
    
     // _delay_ms( 50000 ); // wozu ??
    
     while(1)
     {
      read_senskey(); //obere Funktion wird aufgerufen, diese fragt ja die Touchfelder ab
    
      //jetzt die Ergebnisse der Touchabfrage (welche im Array keys[] gespeichert wurden) verwerten
      if( keys[0]>gibeineZahlein )
      {
       //LED an
       PORTA|=0x01;
      }
      else
      {
       //LED aus
       PORTA&=0xFE;
      }
     }
    
    }
    PS: Bitte nächstes mal Code-Tags beim eingeben verwenden, dann sieht dein Programm so wie das hier drüber aus^^

    Das Programm würde jetzt ein Touchfeld an PA4 / PA5 abfragen und damit eine LED an PA0 schalten.

    (bei der void stimmen irgendwie die geschweiften Klammern {} nicht ganz...? oder hab ich mich verzählt?)

    Hoffe, ich konnte dir weiterhelfen

    Gruß,
    Bernhard

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2009
    Ort
    Singen - Rostock
    Alter
    38
    Beiträge
    159
    Vielen Dank,

    du hast mir ja nicht zum ersten mal geholfen, das mit der ADC Wandlung funktioniert jetzt inzwischen übrigens wirklich supi, kann jetzt über 5 LEDS die Spannung 0-5V anzeigen, nichts bahnbrechendes, aber für mich doch ein kleines Wunder

    Werd das mit dem Touchfeld heute Abend gleich mal ausprobieren, bis dahin bin ich dir zu tiefstem Dank verpflichtet

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2009
    Ort
    Singen - Rostock
    Alter
    38
    Beiträge
    159
    Mal ne frage muß die Elektrode nur mit dem Widerstand oder auch noch mit GND oder so verbunden sein?
    Hab jetzt mal die Spannung an PA4 und PA5 überprüft:
    PA4 hat 1,7V und steigt an auf 1,72V wenn ich mit dem Finger in die nähe komme.
    PA5 hat 0,6V

    PA0 leuchtet dauerhaft aber nur sehr leicht wenn ich die kontakte vom Kondensator abziehe leuchtet sie stark.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    26.04.2009
    Ort
    Singen - Rostock
    Alter
    38
    Beiträge
    159
    Juhu es funktioniert, ich danke dir für die Hilfe

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad