PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kapazitiver sensor



Sp666dy
09.07.2012, 18:06
Guten Tag,

also ich habe bis jetzt den Kapazitäten Sensor immer aus Hardware (http://www.modding-faq.de/Forum/index.php?topic=20032.0) gemacht, da ich jetzt ein bisschen platz sparen wollte,
wollte ich nur zwei PORT's vom micro benutzen oder wenn es mir einer erklärt aus ein Port HIER (http://elm-chan.org/works/capsens/report_e.html).

Jetzt habe ich im netz ein code Schnipsel gefunden, der aber nur bei Berührung funktionier und auch nicht die Näherung
sonder ehrlich 1 oder 0 ist.




#defineF_CPU9600000


#include<avr/io.h>
#include<util/delay.h>
#include<stdint.h>


intmain(void)
{
uint16_ti,d;


DDRB|=(1<<PB1);


while(1)
{
d = 1;


for(i=1;i<1500;i++)
{
DDRB&=~(1<<PB3);// B3 hochohmig
PORTB|=(1<<PB4);// B4 high
DDRB|=(1<<PB4);// B4 niederohmig


if(!(PINB&(1<<PB3)))
break;


DDRB&=~(1<<PB4);// B4 hochohmig
PORTB&=~(1<<PB4);// ohne Pullup
DDRB|=(1<<PB3);// B3 high


d++;
}


PORTB&=~(1<<PB3);
PORTB&=~(1<<PB4);
DDRB|=(1<<PB3);
DDRB|=(1<<PB4);


if (d < 50)
PORTB|=(1<<PB1);
else
PORTB&=~(1<<PB1);


_delay_ms(50);
}
}




Hab mehret Kondensatoren benutzt aber bei 2.2 nf klappt es am besten, mit der Einschränkung das es nur bei Berührung geht.

Hat jemand eine Idee wieso? oder hat jemand ein anderen Code? Oder weiß jemand wie und ob das Projekt
mit dem einen Port klappt, denn im Video sieht es recht zuverlässig aus.

Gruß David

Sp666dy
10.07.2012, 15:02
Ich hab es noch mal versucht in dem ich noch einen schritt zurück gegenagen bin.

Leider komm ich nicht aus der for schleife raus, wo ist mein Fehler?
Ich benutze zum versuchen den Rn-control und habe einen Kondensator 3,3 nf auf PA7 und GND.



#define F_CPU 9600000 // 9.6 MHz

#include <avr/io.h>
#include <util/delay.h>
#include <stdint.h>

int main(void)
{
uint16_t i;
DDRC=0xff;
PORTC = 0xff;


while (1)
{
DDRA=(1<<PA7);//entladen
PORTA=(0<<PA7);

_delay_us(100);//warten



DDRA=(0<<PA7);//aufladen
PORTA=(1<<PA7);

for (i = 0;PINA & (1 << PA7) ; i++)
{
//Zählt die Schleifen bis PA7 aufgeladen ist.

}

PORTC = 0xff;

}
}

HeXPloreR
10.07.2012, 20:02
Hallo,

na vielleicht bringe ich Dich wenigstens auf Ideen zur Fehlersuche.
Ich denke da ist ein dicker Hund drin und ich frage mich was das nun mit dem Kapazitiven Sensor zu tun hat?

Wenn die for-Schleife nicht verlassen werden kann, stimmt anscheinend etwas nicht mit der Abbruchbedingung.
Woher weißt du das Du in der Schleife hängst?

Und dann noch...

Wie hoch zählt deine for-Schleife - Ist "i" dafür sicher groß genug?(Überlauf)

Was macht "PortC = 0xff" nach der for-Schleife? Das stand schon mal irgendwo...falls an dem Port LED hängen, passiert da noch etwas mit wenn er angeht und dann wieder an geht - falls mal dieser Programmteil erreicht wird?

Gab es eine Compilerwarnung zum "return 0;"?

Kann ein Kondensator aufladen der zwischen PB7 und GND geschaltet ist und PB7 auf Eingang geschaltet wird?
Müßte deine Entladung und Aufladung nicht andersherum sein? Bei DDRA = 1 wird geladen, bei 0 entladen?
Da könnte es schon passiert sein das die Bedingung in die du danach eintrittst nie erfüllt wird und er zählt sich tot.

Hast Du dir die Beschreibung von deinem Link durchgelesen? Da steht nichts von einem Kondensator der geladen wird?


Also wenn ich da eine größeres Verständnissproblem habe und ich hier auch nur Müll schreibe, dann klärt mich bitte jemand auf. Am besten direkt hier ;)


mfg