Hallo
Ich versuche nun schon seit längerer Zeit einen kapazitiven Touchsensor
mit einem Atmega8 zu bauen.
Ich habe auch schon sämtliche Beiträge durchforstet und bin nicht
dahintergekommen wieso es bei mir nicht funtkioniert.
Mein Aufbau ist folgendermaßen:
An PC3 ist ein Widerstand und die Touchelektrode (ca 15x15mm große
Verzinnte Fläche) in Reihe geschaltet.
Zwischen PC3 und PC2 ist ein Keramikkondensator mit 22nF.
An PB1 ist eine LED.
Mein Problem ist, dass die LED bereits nach einem Durchlauf leuchtet
(auch Testweise bei 10uF Elko, müsste länger dauern beim Laden als ein
Schleifendurchlauf). Vllt findet jemand einen Fehler im Code:
1 | int main(void)
|
2 | {
|
3 | DDRB |= (1<<PB1);
|
4 | DDRC |= ((1<<PC2) | (1<<PC3));
|
5 | PORTC &= ~((1<<PC2) | (1<<PC3));
|
6 | PORTB &= ~(1<<PB1);
|
7 | uint16_t Zaehler;
|
8 | while(1)
|
9 | {
|
10 | //Zähler zurück
|
11 | Zaehler = 0;
|
12 | //Entladen
|
13 | DDRC |= ((1<<PC2) | (1<<PC3));
|
14 | PORTC &= ~((1<<PC2) | (1<<PC3));
|
15 |
|
16 | //Schleife
|
17 | do
|
18 | {
|
19 | //Touch Elektrode Laden
|
20 | DDRC |= (1<<PC3); //PC3 als Ausgang
|
21 | DDRC &= ~(1<<PC2); //PC2 als Eingang
|
22 | PORTC &= ~(1<<PC2); //Pullup aus
|
23 | PORTC |= (1<<PC3); //PC3 auf high
|
24 | _delay_us(10); //warten
|
25 | //Ladungen verteilen
|
26 | DDRC &= ~(1<<PC3); //PC3 als Eingang
|
27 | PORTC &= ~(1<<PC3); //Pullup aus
|
28 | DDRC |= (1<<PC2); //PC2 als Ausgang
|
29 | PORTC &= ~(1<<PC2); //PC2 auf low
|
30 | _delay_us(10); //warten
|
31 | //Zähler
|
32 | Zaehler++;
|
33 | } while (PORTC & (1<<PC3)); //Abfrage ob PC3 bereits high ist
|
34 |
|
35 | if (Zaehler < 2)
|
36 | {
|
37 | PORTB ^= (1<<PB1);
|
38 | }
|
39 | }
|
40 | }
|