-
töne hören
hallo, bin gerade bei einem projekt um mit dem asuro "töne zu hören" und auszuwerten. und zwar soll eine zusatzplatine den ton aufnehmen und über 6 bandpassfilter verwerten. Über LEDs soll angezeigt werden welcher bandpassfilter aktiv ist. Dann soll über eine IR Diode ein befehl gesendet werden. und zwar fall 1, fall 2, fall 3, fall 4.
fall 1 soll sein wenn bandpass 2 aktiv ist...und fall 4 soll sein wenn bandpass 5 aktiv ist. leider habe ich hier sehr viele errors und weiß nicht warum. vielleicht kann mir jemand helfen.komm nämlich gar nicht weiter.
Code:
#include "myasuro.h"
#include "asuro.h"
#include "inttypes.h"
/* Teil 1. Bandpassfilter*/
void bpfilter(int_8 *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*/
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*/
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
}
if i=2; /* Schleife 2 mit den Werten fü Bandpass 2*/
{
a2=1
a3=2
GAIN_FRAC=3
}
if i=3; /* Schleife 3 mit den Werten für Bandpass 3*/
{
a2=3
a3=2
GAIN_FRAC=1
}
if i=4; /* Schleife 4 mit den Werten für Bandpass 4*/
{
a2=4
a3=2
GAIN_FRAC=3
}
if i=5; /* Schleife 5 mit den Werten für Bandpass 5*/
{
a2=1
a3=1
GAIN_FRAC=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*/
}
printf(output[n]); /* Ergebnis soll am Bildschirm angeszeigt werden*/
}
/* Teil 2. LEDs ANSTEUERN und Befehl erstellen*/
/* Teil 3. Versenden des Befehls über IR-DIODE*/
habe aber ganze 17 errors drinne:
../ZUSATZ155.c:3:1: warning: "/*" within comment
../ZUSATZ155.c:4:1: warning: "/*" within comment
../ZUSATZ155.c:5:1: warning: "/*" within comment
../ZUSATZ155.c:6:1: warning: "/*" within comment
../ZUSATZ155.c:14: error: expected ')' before '*' token
../ZUSATZ155.c:20: warning: built-in function 'y0' declared as non-function
../ZUSATZ155.c:20: warning: built-in function 'y1' declared as non-function
../ZUSATZ155.c:24: warning: data definition has no type or storage class
../ZUSATZ155.c:24: warning: type defaults to 'int' in declaration of 'x1'
../ZUSATZ155.c:24: error: conflicting types for 'x1'
../ZUSATZ155.c:19: error: previous declaration of 'x1' was here
../ZUSATZ155.c:25: warning: data definition has no type or storage class
../ZUSATZ155.c:25: warning: type defaults to 'int' in declaration of 'x2'
../ZUSATZ155.c:25: error: conflicting types for 'x2'
../ZUSATZ155.c:19: error: previous declaration of 'x2' was here
../ZUSATZ155.c:26: warning: data definition has no type or storage class
../ZUSATZ155.c:26: warning: type defaults to 'int' in declaration of 'y0'
../ZUSATZ155.c:26: error: conflicting types for 'y0'
../ZUSATZ155.c:20: error: previous declaration of 'y0' was here
../ZUSATZ155.c:27: warning: data definition has no type or storage class
../ZUSATZ155.c:27: warning: type defaults to 'int' in declaration of 'y1'
../ZUSATZ155.c:27: error: conflicting types for 'y1'
../ZUSATZ155.c:20: error: previous declaration of 'y1' was here
../ZUSATZ155.c:28: warning: data definition has no type or storage class
../ZUSATZ155.c:28: warning: type defaults to 'int' in declaration of 'y2'
../ZUSATZ155.c:28: error: conflicting types for 'y2'
../ZUSATZ155.c:20: error: previous declaration of 'y2' was here
../ZUSATZ155.c:29: warning: data definition has no type or storage class
../ZUSATZ155.c:29: warning: type defaults to 'int' in declaration of 'x0'
../ZUSATZ155.c:29: error: conflicting types for 'x0'
../ZUSATZ155.c:19: error: previous declaration of 'x0' was here
../ZUSATZ155.c:30: warning: data definition has no type or storage class
../ZUSATZ155.c:30: warning: type defaults to 'int' in declaration of 'length'
../ZUSATZ155.c:32: error: expected identifier or '(' before 'for'
../ZUSATZ155.c:32: error: expected '=', ',', ';', 'asm' or '__attribute__' before '<' token
../ZUSATZ155.c:32: error: expected '=', ',', ';', 'asm' or '__attribute__' before '++' token
../ZUSATZ155.c:33: error: expected identifier or '(' before '{' token
das 2. programm soll dann das auf dem asuro sein. um jedem fall seine aufgabe zuzuteilen.könnte das so klappen??
Code:
#include <inttypes.h>
#include "asuro.h"
#define aus MotorDir(BREAK,BREAK)
uint8_t chgetchar()
void main()
{
while(1)
{
command = chgetchar();
switch(command)
{
fall '1':
{
MotorDir(FWD,FWD);
MotorSpeed(50,50);
Msleep(70);
}
break;
fall '2':
{
MotorDir(RWD,RWD);
MotorSpeed(50,50);
Msleep(70);
}
break;
fall '3':
{
MotorDir(FWD,FWD);
MotorSpeed(50,0);
Msleep(70);
}
break;
fall '4':
{
MotorDir(FWD,FWD);
MotorSpeed(0,50);
Msleep(70);
}
break;
default:
{
}break;
}
}
}
und um überhaupt meine zusatzplatine zu prüfen möchte ich ein programm schreiben, dass die 8 LEDS leuchten wenn irgendein signal kommt. aber hier weiß ich nicht ganz wie ich es machen soll... auch mit einem bandpass??
[/code]
-
Erstmal solltest du noch Klammern um den Rumpf der Funktion setzen, das halbiert schon mal die Anzahl der Fehler...
Dann solltest du dich noch mal über die korrekte Syntax von for-Schleifen und if-Abfragen und den Unterschied zwischen = und == schlaumachen.
Die ersten vier Warnungen scheinen aus einer der Header-Dateien zu stammen.
-
so habe jetzt mal was geändert.
Code:
#include "myasuro.h"
#include "asuro.h"
#include "inttypes.h"
/* Teil 1. Bandpassfilter*/
{
void bpfilter(int_8 *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*/
uint16_t length; /* length als 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*/
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;
}
if (i=2) /* Schleife 2 mit den Werten fü Bandpass 2*/
{
a2=1;
a3=2;
GAIN_FRAC=3;
}
if (i=3) /* Schleife 3 mit den Werten für Bandpass 3*/
{
a2=3;
a3=2;
GAIN_FRAC=1;
}
if (i=4) /* Schleife 4 mit den Werten für Bandpass 4*/
{
a2=4;
a3=2;
GAIN_FRAC=3;
}
if (i=5) /* Schleife 5 mit den Werten für Bandpass 5*/
{
a2=1;
a3=1;
GAIN_FRAC=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*/
}
printf(output[n]); /* Ergebnis soll am Bildschirm angeszeigt werden*/
}
/* Teil 2. LEDs ANSTEUERN und Befehl erstellen*/
/* Teil 3. Versenden des Befehls über IR-DIODE*/
}
habe leider noch 2 errors:
../ZUSATZ155.c:3:1: warning: "/*" within comment
../ZUSATZ155.c:4:1: warning: "/*" within comment
../ZUSATZ155.c:5:1: warning: "/*" within comment
../ZUSATZ155.c:6:1: warning: "/*" within comment
../ZUSATZ155.c:15: error: expected identifier or '(' before '{' token
../ZUSATZ155.c:70: error: stray '\264' in program
C:\..\asuro_libv271\lib\inc/asuro.h:449: warning: inline function 'MotorSpeed' declared but never defined
C:\asuro_libv271\lib\inc/asuro.h:441: warning: inline function 'MotorDir' declared but never defined
C:\asuro_libv271\lib\inc/asuro.h:424: warning: inline function 'FrontLED' declared but never defined
C:\asuro_libv271\lib\inc/asuro.h:418: warning: inline function 'StatusLED' declared but never defined
make: *** [ZUSATZ155.o] Error 1
Build failed with 2 errors and 8 warnings...
was sagst du zu den 2 anderen programmen? und hast du ein typ für teil 2 und 3 vom ersten programm??[/code]
-
Die geschweifte Klammer gehört HINTER dem Kopf der Funktion.
Statt #include "inttypes.h" muss es #include <inttypes.h> heißen, weil diese Datei im include-Verzeichnis des Compilers und nicht im lokalen Verzeichnis liegt.
Dann gibt es neue Fehler:
t.c:20: error: 'length' redeclared as different kind of symbol
t.c:10: error: previous definition of 'length' was here
>> Es gibt diese Variable zweimal: einmal als Pointer-Parameter, und einmal lokal.
t.c:65: error: stray '\264' in program
>>Schau genau hin, dann findest du das störende Zeichen.
t.c:71: warning: assignment makes integer from pointer without a cast
t.c:81: warning: incompatible implicit declaration of built-in function 'printf'
t.c:81: warning: passing argument 1 of 'printf' makes pointer from integer without a cast
>>Kommt von der doppelten Deklaration von lenght
Und den Unterschied zwischen = und == kennst du immer noch nicht!
-
so also
Code:
#include <inttypes.h>
/* Teil 1. Bandpassfilter*/
void bpfilter(int_8 *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*/
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*/
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;
}
if (i==2) /* Schleife 2 mit den Werten fü Bandpass 2*/
{
a2=1;
a3=2;
GAIN_FRAC=3;
}
if (i==3) /* Schleife 3 mit den Werten für Bandpass 3*/
{
a2=3;
a3=2;
GAIN_FRAC=1;
}
if (i==4) /* Schleife 4 mit den Werten für Bandpass 4*/
{
a2=4;
a3=2;
GAIN_FRAC=3;
}
if (i==5) /* Schleife 5 mit den Werten für Bandpass 5*/
{
a2=1;
a3=1;
GAIN_FRAC=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*/
}
printf(output[n]); /* Ergebnis soll am Bildschirm angeszeigt werden*/
}
/* Teil 2. LEDs ANSTEUERN und Befehl erstellen*/
/* Teil 3. Versenden des Befehls über IR-DIODE*/
}
hab jetzt keine warnings und "nur"noch 1 error drin.
../ZUSATZ155.c:16: error: expected ')' before '*' token
make: *** [ZUSATZ155.o] Error 1
Build failed with 1 errors and 0 warnings...
aber den verstehe ich nicht???
ich hab kurz eine verständnis frage. durch die gleichung wird ja der ausgangswert berechnet. und das mit allen verschiedenen koeffizienten. aber muss denn nicht y0 wieder auf 0 gesetzt werden nach der berechnung mit i=1? das man mit i=2 wieder von vorne anfangen kann?
und dann zu teil 2. es sollen ja LEDs angesteuert werden. LED1 soll leuchten wenn Bandpass 1 (also i=1) aktiv ist, also wenn die eingehende frequenz dem des bandpasses gleich ist. wie würdest du denn dann das im 2. teil machen? irgendwie so vielleicht:
if x0=y0 von i=1 dann LED 1 leuchtet
if x0=y0 von i=2 dann LED 2 leuchtet
??
beim 3. teil. ich möchte dass bandpass 2 aktiv fall 1 ist, bandpass 3 aktiv fall 2, bandpass 4 aktiv fall 3, bandpass 5 aktiv fall 4.
über die IR Diode soll dann z.b. "fall 1" gesendet werden. wie kann man das machen?
im programm des ASUROs wird das dann erkannt und einer bewegung zugeordnet:
Code:
#include <inttypes.h>
#include "asuro.h"
#define aus MotorDir(BREAK,BREAK)
uint8_t chgetchar()
void main()
{
while(1)
{
command = chgetchar();
switch(command)
{
fall '1':
{
MotorDir(FWD,FWD);
MotorSpeed(50,50);
Msleep(70);
}
break;
fall '2':
{
MotorDir(RWD,RWD);
MotorSpeed(50,50);
Msleep(70);
}
break;
fall '3':
{
MotorDir(FWD,FWD);
MotorSpeed(50,0);
Msleep(70);
}
break;
fall '4':
{
MotorDir(FWD,FWD);
MotorSpeed(0,50);
Msleep(70);
}
break;
default:
{
}break;
}
}
}
ich hoffe habe das mit == und = jetzt richtig gemacht, habs nämlich nachgeschlagen...
-
Ersetz mal den int_8 durch int8_t. Dann bist du alle Syntaxfehler los. Die logischen Fehler schlagen sich nun in den Warnungen nieder. Alle siehst du nur, wenn du mit -Wall kompilierst.
t.c:26: warning: assignment makes pointer from integer without a cast
>>lenght ist nen pointer und kein int!
t.c:28: warning: statement with no effect
t.c:67: warning: statement with no effect
>>Hier war das = schon richtig! Du solltest dein Nachschlagewerk wechseln. Eigentlich ist das ganz einfach: = ist für ne Wertzuweisung, == für einen Vergleich.
t.c:67: warning: comparison between pointer and integer
>>lenght ist nen pointer und kein int!
t.c:69: warning: assignment makes integer from pointer without a cast
>>lenght ist nen pointer und kein int!
t.c:79: warning: implicit declaration of function 'printf'
t.c:79: warning: incompatible implicit declaration of built-in function 'printf'
t.c:79: warning: passing argument 1 of 'printf' makes pointer from integer without a cast
>>printf wird anders aufgerufen!
-
Code:
#include <inttypes.h>
/* Teil 1. Bandpassfilter*/
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*/
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*/
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;
}
if (i==2) /* Schleife 2 mit den Werten für Bandpass 2*/
{
a2=1;
a3=2;
GAIN_FRAC=3;
}
if (i==3) /* Schleife 3 mit den Werten für Bandpass 3*/
{
a2=3;
a3=2;
GAIN_FRAC=1;
}
if (i==4) /* Schleife 4 mit den Werten für Bandpass 4*/
{
a2=4;
a3=2;
GAIN_FRAC=3;
}
if (i==5) /* Schleife 5 mit den Werten für Bandpass 5*/
{
a2=1;
a3=1;
GAIN_FRAC=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*/
}
}
/* Teil 2. LEDs ANSTEUERN und Befehl erstellen*/
/* Teil 3. Versenden des Befehls über IR-DIODE*/
}
ok habe jetzt nur noch die fehler und errors:
../ZUSATZ155.c: In function 'bpfilter':
../ZUSATZ155.c:34: warning: assignment makes pointer from integer without a cast
../ZUSATZ155.c:75: warning: comparison between pointer and integer
../ZUSATZ155.c:77: warning: assignment makes integer from pointer without a cast
../ZUSATZ155.c:21: warning: 'GAIN_FRAC' may be used uninitialized in this function
../ZUSATZ155.c:20: warning: 'a3' may be used uninitialized in this function
../ZUSATZ155.c:19: warning: 'a2' may be used uninitialized in this function
c:/winavr-20080610/bin/../lib/gcc/avr/4.3.0/../../../../avr/lib/avr4/crtm8.o:(.init9+0x0): undefined reference to `main'
make: *** [ZUSATZ155.elf] Error 1
Build failed with 1 errors and 6 warnings...
das mit dem error und das mit length kapier ich nicht ganz??
-
Code:
#include <inttypes.h>
#include "asuro.h"
#define aus MotorDir(BREAK,BREAK)
uint8_t chgetchar()
void main()
{
while(1)
{
command = chgetchar();
switch(command)
{
fall '1':
{
MotorDir(FWD,FWD);
MotorSpeed(50,50);
Msleep(70);
}
break;
fall '2':
{
MotorDir(RWD,RWD);
MotorSpeed(50,50);
Msleep(70);
}
break;
fall '3':
{
MotorDir(FWD,FWD);
MotorSpeed(50,0);
Msleep(70);
}
break;
fall '4':
{
MotorDir(FWD,FWD);
MotorSpeed(0,50);
Msleep(70);
}
break;
default:
{
}break;
}
}
}
habe gerade noch am 2. programm mich versucht, aber bekomme auch hier warnings und errors.
../ASUROPlatine.c: In function 'chgetchar':
../ASUROPlatine.c:8: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
../ASUROPlatine.c:55: error: expected '{' at end of input
../ASUROPlatine.c:55: warning: no return statement in function returning non-void
Build failed with 2 errors and 5 warnings...
kannst du mir auch hier vielleicht helfen?? (ich bin leider noch anfänger beim programmieren)
-
nochmal zum 1. programm. kannst du mir da kurz einen tipp für den 2. teil geben, wie ich das machen könnte? und beim 3. teil stehe ich auch voll auf dem schlauch weil ich was mit ir diode noch nie programmier habe und somit auch keinen befehl dafür kenne ](*,)
-
Du übergibst der Funktion den Pointer "length", der auf einen uint16_t zeigt. In der Funktion greifst du aber so auf length zu, als wäre es ein uint16_t und kein Zeiger darauf.
Wenn du die Variable ansprechen willst, auf die der Zeiger p zeigt, musst du *p schreiben.
Also bei dir z.B. *length=100; um den Wert der Variable, auf die lenght zeigt, auf 100 zu setzen. Ist dir wirklich klar, was ein Zeiger ist?