also habe das programm jetzt mal umgeschrieben:
Code:
#include <inttypes.h>
#include "asuro.h"
void bpfilter(int8_t *input,int8_t *output, uint16_t *length, int32_t koeff)
{
int32_t a2; /* a2 als Integervariable festlegen*/
int32_t a3; /* a3 als Integervariable festlegen*/
int32_t GAIN_FRAC; /* GAIN_FRAC als Integervariable festlegen*/
int32_t x0,x1,x2; /* x0,x1,x2 als Integervariable festlegen*/
int32_t y0,y1,y2; /* y0,y1,y2 Integervariable festlegen*/
uint16_t n; /* n Integervariable festlegen*/
uint16_t i; /* i als Integervariable festlegen*/
int z; /* z als Variable einführen*/
z=0.8; /* Wert für z festlegen*/
x1=0; /* Wert für x1 festlegen*/
x2=0; /* Wert für x2 festlegen*/
y0=0; /* Wert für y0 festlegen*/
y1=0; /* Wert für y1 festlegen*/
y2=0; /* Wert für y2 festlegen*/
x0=1; /* Wert für x0 festlegen*/
length=100; /* Wert für length festlegen = Wert der Signallänge*/
for (i=1;i<7;i++) /* Schleife zählt bis 6 hoch, um die Werte mit jedem Bandpass zu filtern*/
{
if (i==1) /* Schleife 1 mit den Werten für Bandpass 1*/
{
a2=2;
a3=3;
GAIN_FRAC=4;
for (n=0;n<length;n++) /* Schleife bis n alle Eingangswerte verarbeitet hat (length legt die Anzahl der Eingangswerte fest)*/
{
x0=input; /* x0 als Eingang festlegen*/
y0=x0-x2-((a2*y1)>>16)-((a3*y2)>>16); /* Gleichung um y0 zu berechnen*/
x2=x1;
x1=x0;
y2=y1;
y1=y0;
output[n]=((y0*GAIN_FRAC)>>16); /* Gleichung um Ausgang zu berechnen*/
DDRB|=(1<<PB1); /*Setze PB_1 auf output*/
PORTB|=(1<<PB1); /*Setze PB_1 auf 1 --> KontrollLED leuchtet*/
Sleep(100);
PORTB&=~(1<<PB1); /*Setze PB_1 auf 0 --> KontrollLED geht aus*/
if (output[n]==x0)
{
DDRC|=(1<<PC1); /*Setze PC_1 auf output*/
PORTC|=(1<<PC1); /*Setze PC_1 auf 1 --> LED 1 leuchtet*/
Sleep(100);
PORTC&=~(1<<PC1); /*Setze PC_1 auf 0 --> LED 1 geht aus*/
}
}
x1=x2=0; /*Alle Variablen auf alten Stand setzen*/
y0=y1=y2=0;
x0=1;
}
if (i==2) /* Schleife 2 mit den Werten für Bandpass 2*/
{
a2=1;
a3=2;
GAIN_FRAC=3;
for (n=0;n<length;n++) /* Schleife bis n alle Eingangswerte verarbeitet hat (length legt die Anzahl der Eingangswerte fest)*/
{
x0=input; /* x0 als Eingang festlegen*/
y0=x0-x2-((a2*y1)>>16)-((a3*y2)>>16); /* Gleichung um y0 zu berechnen*/
x2=x1;
x1=x0;
y2=y1;
y1=y0;
output[n]=((y0*GAIN_FRAC)>>16); /* Gleichung um Ausgang zu berechnen*/
DDRB|=(1<<PB1); /*Setze PB_1 auf output*/
PORTB|=(1<<PB1); /*Setze PB_1 auf 1 --> KontrollLED leuchtet*/
Sleep(100);
PORTB&=~(1<<PB1); /*Setze PB_1 auf 0 --> KontrollLED geht aus*/
if (output[n]>(x0*z))
{
DDRC|=(1<<PC4); /*Setze PC_4 auf output*/
PORTC|=(1<<PC4); /*Setze PC_4 auf 1 --> LED 2 leuchtet*/
Sleep(100);
PORTC&=~(1<<PC4); /*Setze PC_4 auf 0 --> LED 2 geht aus*/
SerWrite("fall 1"); /*Über IR-Diode Fall1 senden*/
Msleep(100);
}
}
x1=x2=0; /*Alle Variablen auf alten Stand setzen*/
y0=y1=y2=0;
x0=1;
}
if (i==3) /* Schleife 3 mit den Werten für Bandpass 3*/
{
a2=3;
a3=2;
GAIN_FRAC=1;
for (n=0;n<length;n++) /* Schleife bis n alle Eingangswerte verarbeitet hat (length legt die Anzahl der Eingangswerte fest)*/
{
x0=input; /* x0 als Eingang festlegen*/
y0=x0-x2-((a2*y1)>>16)-((a3*y2)>>16); /* Gleichung um y0 zu berechnen*/
x2=x1;
x1=x0;
y2=y1;
y1=y0;
output[n]=((y0*GAIN_FRAC)>>16); /* Gleichung um Ausgang zu berechnen*/
DDRB|=(1<<PB1); /*Setze PB_1 auf output*/
PORTB|=(1<<PB1); /*Setze PB_1 auf 1 --> KontrollLED leuchtet*/
Sleep(100);
PORTB&=~(1<<PB1); /*Setze PB_1 auf 0 --> KontrollLED geht aus*/
if (output[n]>(x0*z))
{
DDRC|=(1<<PC3); /*Setze PC_3 auf output*/
PORTC|=(1<<PC3); /*Setze PC_3 auf 1 --> LED 3 leuchtet*/
Sleep(100);
PORTC&=~(1<<PC3); /*Setze PC_3 auf 0 --> LED 3 geht aus*/
SerWrite("fall 2"); /*Über IR-Diode Fall2 senden*/
Msleep(100);
}
}
x1=x2=0; /*Alle Variablen auf alten Stand setzen*/
y0=y1=y2=0;
x0=1;
}
if (i==4) /* Schleife 4 mit den Werten für Bandpass 4*/
{
a2=4;
a3=2;
GAIN_FRAC=3;
for (n=0;n<length;n++) /* Schleife bis n alle Eingangswerte verarbeitet hat (length legt die Anzahl der Eingangswerte fest)*/
{
x0=input; /* x0 als Eingang festlegen*/
y0=x0-x2-((a2*y1)>>16)-((a3*y2)>>16); /* Gleichung um y0 zu berechnen*/
x2=x1;
x1=x0;
y2=y1;
y1=y0;
output[n]=((y0*GAIN_FRAC)>>16); /* Gleichung um Ausgang zu berechnen*/
DDRB|=(1<<PB1); /*Setze PB_1 auf output*/
PORTB|=(1<<PB1); /*Setze PB_1 auf 1 --> KontrollLED leuchtet*/
Sleep(100);
PORTB&=~(1<<PB1); /*Setze PB_1 auf 0 --> KontrollLED geht aus*/
if (output[n]>(x0*z))
{
DDRB|=(1<<PB5); /*Setze PB_5 auf output*/
PORTB|=(1<<PB5); /*Setze PB_5 auf 1 --> LED 4 leuchtet*/
Sleep(100);
PORTB&=~(1<<PB5); /*Setze PB_5 auf 0 --> LED 4 geht aus*/
SerWrite("fall 3"); /*Über IR-Diode Fall3 senden*/
Msleep(100);
}
}
x1=x2=0; /*Alle Variablen auf alten Stand setzen*/
y0=y1=y2=0;
x0=1;
}
if (i==5) /* Schleife 5 mit den Werten für Bandpass 5*/
{
a2=1;
a3=1;
GAIN_FRAC=1;
for (n=0;n<length;n++) /* Schleife bis n alle Eingangswerte verarbeitet hat (length legt die Anzahl der Eingangswerte fest)*/
{
x0=input; /* x0 als Eingang festlegen*/
y0=x0-x2-((a2*y1)>>16)-((a3*y2)>>16); /* Gleichung um y0 zu berechnen*/
x2=x1;
x1=x0;
y2=y1;
y1=y0;
output[n]=((y0*GAIN_FRAC)>>16); /* Gleichung um Ausgang zu berechnen*/
DDRB|=(1<<PB1); /*Setze PB_1 auf output*/
PORTB|=(1<<PB1); /*Setze PB_1 auf 1 --> KontrollLED leuchtet*/
Sleep(100);
PORTB&=~(1<<PB1); /*Setze PB_1 auf 0 --> KontrollLED geht aus*/
if (output[n]>(x0*z))
{
DDRB|=(1<<PB4); /*Setze PB_4 auf output*/
PORTB|=(1<<PB4); /*Setze PB_4 auf 1 --> LED 5 leuchtet*/
Sleep(100);
PORTB&=~(1<<PB4); /*Setze PB_4 auf 0 --> LED 5 geht aus*/
SerWrite("fall 4"); /*Über IR-Diode Fall4 senden*/
Msleep(100);
}
}
x1=x2=0; /*Alle Variablen auf alten Stand setzen*/
y0=y1=y2=0;
x0=1;
}
if (i==6) /* Schleife 6 mit den Werten für Bandpass 6*/
{
a2=2;
a3=4;
GAIN_FRAC=3;
for (n=0;n<length;n++) /* Schleife bis n alle Eingangswerte verarbeitet hat (length legt die Anzahl der Eingangswerte fest)*/
{
x0=input; /* x0 als Eingang festlegen*/
y0=x0-x2-((a2*y1)>>16)-((a3*y2)>>16); /* Gleichung um y0 zu berechnen*/
x2=x1;
x1=x0;
y2=y1;
y1=y0;
output[n]=((y0*GAIN_FRAC)>>16); /* Gleichung um Ausgang zu berechnen*/
DDRB|=(1<<PB1); /*Setze PB_1 auf output*/
PORTB|=(1<<PB1); /*Setze PB_1 auf 1 --> KontrollLED leuchtet*/
Sleep(100);
PORTB&=~(1<<PB1); /*Setze PB_1 auf 0 --> KontrollLED geht aus*/
if (output[n]>(x0*z))
{
DDRB|=(1<<PB0); /*Setze PB_0 auf output*/
PORTB|=(1<<PB0); /*Setze PB_0 auf 1 --> LED 6 leuchtet*/
Sleep(100);
PORTB&=~(1<<PB0); /*Setze PB_0 auf 0 --> LED 6 geht aus*/
}
}
x1=x2=0; /*Alle Variablen auf alten Stand setzen*/
y0=y1=y2=0;
x0=1;
}
}
}
und habe die errors:
../ZUSATZ1552.c:223: error: too few arguments to function 'SerWrite'
und das 4 mal. kann kurz mir jemand das erklären was da alles rein muss?
und mein 2. programm:
Code:
#include <inttypes.h>
#include "asuro.h"
#define aus MotorDir(BREAK,BREAK)
void main()
{
char daten;
Init();
while(1)
{
SerRead(&daten,1,0); /*Daten einlesen*/
if (daten == 'fall1') /*Falls 1. Fall*/
{
MotorDir(FWD,FWD); /*Gerade aus fahren*/
MotorSpeed(50,50);
Msleep(100);
}
break;
if (daten == 'fall2') /*Falls 2. Fall*/
{
MotorDir(RWD,RWD); /*Rückwärtsfahren*/
MotorSpeed(50,50);
Msleep(100);
}
break;
if (daten == 'fall3') /*Falls 3. Fall*/
{
MotorDir(FWD,FWD); /*Links fahren*/
MotorSpeed(50,0);
Msleep(100);
}
break;
if (daten == 'fall4') /*Falls 4. Fall*/
{
MotorDir(FWD,FWD); /*Rechts fahren*/
MotorSpeed(0,50);
Msleep(70);
}
break;
}
}
hier habe ich keinen fehler mehr
und dann habe ich noch ein ersatzprogramm, falls das 1. nicht mehr läuft.
und zwar gehts hier nur drum, zu analysieren ob überhaupt ein signal eingeht:
Code:
#include <inttypes.h>
#include "asuro.h"
void bpfilter(int8_t *input,int8_t *output, uint16_t *length, int32_t koeff)
{
int32_t a2; /* a2 als Integervariable festlegen*/
int32_t a3; /* a3 als Integervariable festlegen*/
int32_t GAIN_FRAC; /* GAIN_FRAC als Integervariable festlegen*/
int32_t x0,x1,x2; /* x0,x1,x2 als Integervariable festlegen*/
int32_t y0,y1,y2; /* y0,y1,y2 Integervariable festlegen*/
uint16_t n; /* n Integervariable festlegen*/
x1=0; /* Wert für x1 festlegen*/
x2=0; /* Wert für x2 festlegen*/
y0=0; /* Wert für y0 festlegen*/
y1=0; /* Wert für y1 festlegen*/
y2=0; /* Wert für y2 festlegen*/
x0=1; /* Wert für x0 festlegen*/
length=100; /* Wert für length festlegen = Wert der Signallänge*/
a2=3;
a3=2;
GAIN_FRAC=1;
for (n=0;n<length;n++)
{
x0=input; /* x0 als Eingang festlegen*/
y0=x0-x2-((a2*y1)>>16)-((a3*y2)>>16); /* Gleichung um y0 zu berechnen*/
x2=x1;
x1=x0;
y2=y1;
y1=y0;
output[n]=((y0*GAIN_FRAC)>>16); /* Gleichung um Ausgang zu berechnen*/
if (output[n]>0) /* wenn ein Signal erkannt wird, ist output[n] immer größer 0*/
{
DDRB|=(1<<PB1); /*Setze PB_1 auf output*/
PORTB|=(1<<PB1); /*Setze PB_1 auf 1 --> KontrollLED leuchtet*/
Sleep(100);
PORTB&=~(1<<PB1);
}
}
}
hier habe ich leider noch einen error:
c:/winavr-20080610/bin/../lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/crtm8.o.init9+0x0): undefined reference to `main'
könnt ihr mir noch helfen, wie ich das verbessern kann???
ach ja die koeffizienten a2, a3 usw. sind einfach irgendwelche werte und nicht die berechneten...
Lesezeichen