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.
hallo andi, hilfe und mehr Informationen findest du: da: Beitrag "qtouch - sekt oder selters" und da: Beitrag "kapazitiver Touch Sensor - Slider - Wheel"
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.