PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kapazitiver Näherungssensor wo liegt mein Fehler?



deko
29.01.2011, 20:40
Hallo,
ich hoffe ihr könnt mir mal Helfen bin schon ewig bei der Fehlersuche und sehe Grad gar nichts mehr.

Ich versuche gerade das von folgender Webseite neu zu schreiben (als Übung für mich)

http://www.zabex.de/site/schaltungstechnik.html#kanmi2

Ich habe C1 mit 100nF gewählt und zwischen PB1 (bei mir PA1) und C1 einen 150Ohm Widerstand gepackt.

Ich ich nun mein Programm ablaufen lasse Meint der das C1 bereits nach einen Durchlauf High Pegel auf PA0 liefert...

Das ein Tischbein aus Weißblech einen so Großen Kondensator darstellt wage ich gerade zu bezweifeln.

Wo liegt also mein Fehler im Quellcode?

test.c:


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

//screen /dev/ttyUSB0 9600 8N1

int main(void)
{
unsigned int n;
unsigned char str_fromint[7];

uart_init();

uart_puts("Hallo ich bin ein Kapazitiver Näherungssensor\r\n\r\n");

while (1){
n=0;

//Entleere Kondensator
DDRA |= (1<<PA0) | (1<<PA1); //PA0 und PA1 als Ausgang
PORTA = 0x00; //Alles aus
waitms(1); //Warten

while(1) {
DDRA &= ~(1<<PA1); //PA1 als Eingang
setportaoff(1); //PA1 kein Pullup
setportaon(0); //PA0 auf 5v
waitms(1);

DDRA |= (1<<PA1); //PA1 Auf Ausgang
setportaoff(1); //PA1 auf GND
DDRA &= ~(1<<PA0); //PA0 als Eingang
waitms(1);

if (PINA & (1<<PA0)) { //ist PA0 High?
itoa( n, str_fromint, 10 ); // Wandelt n in einen String um, 10 steht fuer Dezimalsystem
uart_puts(str_fromint); //Auf UART Ausgeben
uart_puts("\r\n"); //Newline ;)
break;
}
DDRA &= ~(1<<PA0) | ~(1<<PA1); //PA0 und PA1 als Eingang
n++; //Schleifendurchläufe Zählen
}
}
return 0;

}

/*### waitms - Programm pausieren lassen ###*/

/*Die Funktion lässt circa so viele Millisekunden verstreichen, wie angegeben werden.
Angepasst auf das RN-Control 1.4 mit 16 MHz-Quarz!
Vorsicht, Wert ist nur experimentell angenähert, nicht exakt berechnet!*/

void waitms(uint16_t ms)
{
for(; ms>0; ms--)
{
uint16_t __c = 4000;
__asm__ volatile (
"1: sbiw %0,1" "\n\t"
"brne 1b"
: "=w" (__c)
: "0" (__c)
);
}
}

test.h


/*### Ports setzen ###*/

//Ports auf HIGH setzen
static inline void setportaon(const uint8_t n)
{PORTA |= (1<<n);} //set PORTA.n high

static inline void setportbon(const uint8_t n)
{PORTB |= (1<<n);} //set PORTB.n high

static inline void setportcon(const uint8_t n)
{PORTC |= (1<<n);} //set PORTC.n high

static inline void setportdon(const uint8_t n)
{PORTD |= (1<<n);} //set PORTD.n high



//Ports auf LOW setzen
static inline void setportaoff(const uint8_t n)
{PORTA &= ~(1<<n);} //set PORTA.n low

static inline void setportboff(const uint8_t n)
{PORTB &= ~(1<<n);} //set PORTB.n low

static inline void setportcoff(const uint8_t n)
{PORTC &= ~(1<<n);} //set PORTC.n low

static inline void setportdoff(const uint8_t n)
{PORTD &= ~(1<<n);} //set PORTD.n low



int main(void);
void waitms(uint16_t ms);


ich danke euch

Richard
29.01.2011, 22:14
Wie weit bist DU dabei weg? Du, Dein Körper in der Nähe kann schon ausreichen.

Gruß Richard

deko
29.01.2011, 23:24
mehrere Meter oder einige cm immer Kommt 1 Raus... auch wenn ich die verbindung zum Blech trenne also C2 entferne habe ich den wert 1...

trenne ich einen der beiden pins vom Kondensator C2 erhalte ich den Wert 0...

Wie kommt es dazu?

muss ich irgendwann interne pullups aktivieren?

Irgentwas läuft da total schief...

sternst
30.01.2011, 00:35
DDRA &= ~(1<<PA0) | ~(1<<PA1); //PA0 und PA1 als Eingang Das ist äquivalent zu "DDRA &= 0xff;", verändert also den Zustand des Ports gar nicht.
Die Zeile scheint mir aber eh völlig überflüssig zu sein, denn PA0 ist zu diesem Zeitpunkt bereits ein Eingang, und PA1 wird es kurz darauf am Anfang der Schleife. Also stört es wohl auch nicht, dass diese Zeile rein gar nichts macht.

Dein Problem dürfte sein, dass nach dem Umschalten von PA0 auf Eingang dessen PullUp eingeschaltet ist, und somit in der Wartezeit bis zum Auswerten des Eingangs fleißig den Kondensator auflädt.

deko
30.01.2011, 11:45
ja ich danke dir der Pullup war schuld jetzt haut es hin