-         

Ergebnis 1 bis 5 von 5

Thema: Kapazitiver Näherungssensor wo liegt mein Fehler?

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    11.01.2011
    Beiträge
    192

    Kapazitiver Näherungssensor wo liegt mein Fehler?

    Anzeige

    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:

    Code:
    #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
    Code:
    /*### 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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.01.2006
    Beiträge
    4.556
    Wie weit bist DU dabei weg? Du, Dein Körper in der Nähe kann schon ausreichen.

    Gruß Richard

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    11.01.2011
    Beiträge
    192
    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...

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Code:
    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.
    MfG
    Stefan

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    11.01.2011
    Beiträge
    192
    ja ich danke dir der Pullup war schuld jetzt haut es hin

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •