Forum: Mikrocontroller und Digitale Elektronik Anfänger Frage: Qtouch


von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

hab mich nun auch mal an deisem Thema versucht.
Mit Hilfe des Forum Beitrages:
Beitrag "qtouch - sekt oder selters"
hab ich folgendes geschrieben.
Leider bis jetzt mit mäsigen Erfolg.

Ich verwernde einen ATmega32 den PinD6 und PinD7, sowie einen 1k
Widerstand, und einen 33nF Kondensator.
Das Programm habe ich mit Hilfe von Codevision geschrieben.
Den Zähler "i" gebe ich über RS232 aus.
Die Schaltung wird über den ISP-USP-Programmer mit 5V versorgt.

Anbei findet ihr einige Bilder vom Aufbau, Schaltplan und den gesamten
Code.

Leider bekomme ich immer "0" als Rückmeldung.
Woran könnte denn der Fehler liegen?

Danke für die Infos.
mfg Stefan
1
      do
2
      {
3
            //  PD6-----1k----PAD
4
            //       |
5
            //      33nF
6
            //       |
7
            //  PD7--         
8
            
9
            //  1. definierten Zustand für die Kondensatoren herstellen. D.h. PB1 und
10
            //  PC1 als Ausgänge schalten und auf low ziehen um alles Cs zu entladen
11
            //  (genügend lange warten).
12
            
13
            
14
            DDRD |= (1<<PD6);       // PD6 als Ausgang schalten
15
            DDRD |= (1<<PD7);       // PD7 als Ausgang schalten  
16
            PORTD &= ~(1<<PD6);     // Ausgang PD6 auf LOW
17
            PORTD &= ~(1<<PD7);     // Ausgang PD7 auf LOW
18
            delay_us (5); 
19
            
20
            //  2. PB1 auf high und PC1 auf low schalten (aber immernoch als Eingänge)   
21
            
22
            DDRD &= ~(1<<PD6);      // PD6 als Eingang schalten   
23
            DDRD &= ~(1<<PD7);      // PD7 als Eingang schalten     
24
            
25
            PORTD |= (1<<PD6);      // Eingang PD6 mit Pull-UP, bzw. später Ausgang auf HIGH
26
            
27
            //  3. PB1 als Ausgang schalten und kurze Zeit (z.B. 5us) warten bis der
28
            //  unbekannte Touchkondensator geladen ist.   
29
            
30
            for(i=0; i<65535 && !(PORTD & (1<<PD6)); i++)
31
            {
32
                DDRD |= (1<<PD6);       // PD6 als Ausgang schalten, da "PORTD |= (1<<PD6)" Ausgang auf HIGH       
33
                delay_us (5);
34
            
35
                //  4. PB1 wieder als Eingang schalten und PC1 als Ausgang schalten. Damit
36
                //  liegt jetzt der "Sampling Kondensator Cs" quasi parallel zum
37
                //  Touchkondensator und es müssen sich die Ladungen so umverteilen, dass
38
                //  beide die gleiche Spannung haben (Parallelschaltung). D.h. es wird Cs
39
                //  leicht geladen, da dieser ja viel größer ist.
40
41
                DDRD &= ~(1<<PD6);      // PD6 als Eingang schalten, da "PORTD |= (1<<PD6)" Eingang mit Pull-UP
42
                DDRD |= (1<<PD7);       // PD7 als Ausgang schalten, da "PORTD &= ~(1<<PD7)" Ausgangn auf LOW
43
                delay_us (20);          // Warten weil das Umladen Zeit braucht ???
44
            
45
                DDRD &= ~(1<<PD7);      // PD7 als eingang schalten, da "PORTD &= ~(1<<PD7)" Eingang ohne Pull-UP   
46
            
47
                //  5. Überprüfe ob PB1 schon als high eingelesen wird. Wenn nicht, dann
48
                //  beginne wieder bei Punkt 3 und erhöhe einen Zähler. Wenn PB1 bereits
49
                //  high ist, dann ist der Zählerstand ein Maß für die Anzahl der
50
                //  Ladezyklen        
51
            
52
            }                                                               
53
            DDRD |= (1<<PD6);       // PD6 als Ausgang schalten
54
            DDRD |= (1<<PD7);       // PD7 als Ausgang schalten  
55
            PORTD = 0x00;      
56
            
57
            printf("\n\ri:0x%X",i); 
58
            delay_ms(1000);      
59
              
60
      }
61
      while(1);

von Michael (Gast)


Lesenswert?

Erste Maßnahme wäre mal ein Strombegrenzungswiderstand in Serie mit C17, 
damit sich die Ausgänge nicht jedes Mal beim Entladen so erschrecken.

mfg
Michael

von Stefan (Gast)


Lesenswert?

Davon habe ich nichts im urspünglichen Beitrag gelesen, werde ich aber 
gleich mal testen.

Welcher Widerstand wäre den hierfür zu verwenden, 1k?
1
//  PD6-----1k----PAD
2
//       |
3
//      33nF
4
//       |
5
//      1k
6
//       |
7
//  PD7--

Weiters ist mir folgendes aufgefallen:
Wenn ich meine Aufsteckplatine entferne, also Beschaltung des Sensors 
wird mit trotzdem für i "0" ausgegeben.

mfg
Stefan

von Michael (Gast)


Lesenswert?

Stefan schrieb:
> Welcher Widerstand wäre den hierfür zu verwenden, 1k?

Etwas kleiner darf er schon sein. Mit 220 Ω wäre man sicher unter dem 
Grenzwert.

von Stefan (Gast)


Lesenswert?

Ok hab nur 130 Ohm gefunden, leider hat sich am Ergebniss nicht 
geändert.
1
//  PD6-----1k----PAD
2
//       |
3
//      33nF
4
//       |
5
//      130Ohm
6
//       |
7
//  PD7--

von Stefan (Gast)


Lesenswert?

Hätte vielleicht noch wer einen Tipp wo der Fehler liegen könnte?

mfg
Stefan

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.