Forum: Mikrocontroller und Digitale Elektronik Problem mit Touch Sensor Programm


von Andi (Gast)


Lesenswert?

Hallo,

bin noch blutiger Anfänger im Bereich Mikrocontroller Technik, will nun 
aber für ein kleines Schulprojekt einen Touch Taster einbauen. Bin auf 
die Projektseite von Martin Junghans gestoßen

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

und das hat mir dann recht gut gefallen, hab den Code von seiner seite 
jetzt einmal in AVR studio kopiert, bekomme aber ziehmlich viele 
Fehlermeldungen :(
Bräuchte theoretisch auch nur ein Touch Schalter welcher einfach einen 
Ausgang anschalten soll.

Bei dem Programm seh ich leider gar nicht durch weil keine Ports sondern 
x und y verwendet werden, kann mir einer von euch helfen das zu 
verstehen?
Gerade so ewtas wie ATOMIC_BLOCK und so weiter übersteigt halt meinen 
Horizont.

Hier mal der Code:
#include <avr/io.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)
{

return 0;
}

Danke schon mal im vorraus.

von Martin J. (bluematrix) Benutzerseite


Lesenswert?

hallo andi,
hilfe und mehr Informationen findest du:

da: Beitrag "qtouch - sekt oder selters"
und
da: Beitrag "kapazitiver Touch Sensor - Slider - Wheel"

von Andi (Gast)


Lesenswert?

Hallo Martin,

erstmal vielen dank für die schnelle Antwort
Die beiden Beiträge kenne ich schon, das Prinzip ist mir eigentlich auch 
klar, ich denke mein Hauptproblem ist das ich nicht genügend Ahnung von 
der Programmierung habe. Hab mir dein Quellcode mal angesehen also den 
kompletten, aber bei Sachen wie "ATOMIC_BLOCK(ATOMIC_FORCEON)" steig ich 
aus. Die Anleitung auf deiner Homepage über die Funktionsweise klingt 
sehr logisch, ist es auch einfacher zu realisieren also ohne diese 
ATOMIC_BLOCK(ATOMIC_FORCEON)?
Im Grunde genommen könnte ich doch auch:

1: PB1 und PC1 wie folgt als Ausgänge auf Low definieren:

PORTB &= ~(1<<PB1);
PORTC &= ~(1<<PC1);

und dann einfach nen delay machen mit 500ms

2: Eine Schleife machen und PB1 auf High setzen und PC1 auf Eingang 
setzen:
while(){
PORTB |= (1<<PB1);
DDRC  &= ~(1<<DDC1);
nen delay machen mit 500ms
3:Jetzt PC1 als Ausgang mit 0V und PB1 als Eingang
PORTC &= ~(1<<PC1);
DDRB  &= ~(1<<DDB1);
4: Jetzt kommt mein Hauptproblem:

Wie kann ich prüfen ob die Spannung an Cs ausreicht? Und was muß in die 
Schleife rein um wieder aus dieser raus zu kommen?

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
Noch kein Account? Hier anmelden.