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:
test.hCode:#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) ); } }
ich danke euchCode:/*### 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);







Zitieren

Lesezeichen