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
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