PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : probleme bei der übertragung mit dem befehl "serwrite



roflomfg
16.05.2006, 22:09
Hallo allerseits
hab mich hier im forum ein bisschen umgeschaut un gemerkt, dass es hier ziemlich viele leute mit viel kompetenz gibt, weswegen ich mal diesen thema hier öffne, da ich ohne fremde hilfe anscheinend net weiter komme.
als erstes wollte ich mich jetzt der linienverfolgung witmen , das programiertechnische was dahinter steht sollte eigentlich auch net das problem sein - um allerdings venünftig rechnen zu können benötige ich die werte der transistoren. diese wollte ich über die anweisung serwrite mir im hyperterminal anzeigen lassen, allerdings erscheint bei mir selbst im einfachsten programm eine fehlermeldung
wäre gediegen wenn ihr mir weiterhelfen könntet

#include "asuro.h"

int main(void)
{
String hallo;
Init();
SerWrite(Hallo,5);
while(1);
return 0;
}


D:\ASURO_src\FirstTry>make all
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \
[ -s test.d ] || rm -f test.d
-------- begin --------
avr-gcc --version
avr-gcc (GCC) 3.3.1
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Size before:
test.elf :
section size addr
.text 1518 0
.data 0 8388704
.bss 1 8388704
.noinit 0 8388705
.eeprom 0 8454144
.stab 3132 0
.stabstr 1698 0
Total 6349


avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o
test.c: In function `main':
test.c:5: error: `String' undeclared (first use in this function)
test.c:5: error: (Each undeclared identifier is reported only once
test.c:5: error: for each function it appears in.)
test.c:5: error: parse error before "hallo"
test.c:8: error: `Hallo' undeclared (first use in this function)
make: *** [test.o] Error 1

> Process Exit Code: 2



schon ma im vorraus danke

izaseba
16.05.2006, 22:29
Hallo,


String hallo;


Das ist hier das Problem,
Ich gehe einfach davon aus das die Funktion Serwrite einen Zeiger auf ein uint8_t Array erwartet ....

mithin mußt Du das so schreiben:


uint8_t string[]="Hallo";
...
...
SerWrite(string,5);



Gruß Sebastian

roflomfg
17.05.2006, 14:49
hey
danke für die schnelle antwort - hat mir wirklich weitergehoflen - als mein lehrer den post gesehen hat is ihm aufgefallen dass er mir vergessen hatte zu sagen , dass in c++ keine klasse string gibt (hab vorher nur mit java gearbeitet)
hoffe dass ich so noch rechtzeitig mit meiner facharbeit fertig werde :D
ps: ich heiße auch sebastian :D

izaseba
17.05.2006, 17:37
Hallo Sebastian,
schön daß ich Dir helfen konnte. O:)
Ich glaub aber, daß Du da was verwechselst.
Wir sprechen hier von C ohne plus plus und da gibt es keine Klassen.
Hier (http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_cplusplus) kannst Du zum Thema avr und C++ mehr erfahren.
Wenn Du sonst noch fragen hast, her damit.

Gruß Sebastian

roflomfg
18.05.2006, 15:04
mh damit ich da jetzt echt nicht was verwechsle
also c++ is nicht objektorientiert un c folglich auch net
aber der asuro wird doch in c++ programmiert oder??? :wink:

izaseba
18.05.2006, 16:35
#-o halt, bevor ich gesteinigt werde 8-[

C -> nix OOP
c++ -> doch OOP

Asuro wird in der Regel in C programmiert, also nicht Obiektorientiert.
Es gibt auch Ansätze von C++ in avr-gcc (sehe mein Link von oben)
Man kann aber nicht alle Vorzüge von C++ ausspielen.

Ich hab es persönlich noch nicht probiert, gehöre eher zu der Generation, die mit ZX Spektrum und C64 aufgewachsen ist und tue mir da schwer mit
den ganzen Klassen usw.

Ich hoffe, daß es jetzt klar ist :-)

Gruß Sebastian

roflomfg
18.05.2006, 18:59
also ich hab mich mal jetzt ans programmieren gemacht aber irgend wie funktioniert das net so wie ich will - hier mein programmtext :


#include "asuro.h"

int main(void)
{



Init();

uint8_t string []= "linkertransistor";


while(1);
return 0;
}



Dazu hab ich folgende fehlermeldung erhalten :


D:\ASURO_src\FirstTry>make all
set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \
[ -s test.d ] || rm -f test.d
-------- begin --------
avr-gcc --version
avr-gcc (GCC) 3.3.1
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Size before:
test.elf :
section size addr
.text 1536 0
.data 0 8388704
.bss 1 8388704
.noinit 0 8388705
.eeprom 0 8454144
.stab 3240 0
.stabstr 1832 0
Total 6609


avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o
test.c: In function `main':
test.c:10: error: `uint8_t' undeclared (first use in this function)
test.c:10: error: (Each undeclared identifier is reported only once
test.c:10: error: for each function it appears in.)
test.c:10: error: parse error before "string"
make: *** [test.o] Error 1

> Process Exit Code: 2




Allerdings hab ich mich im netz schlau gemacht und solche "stringzeiger gefunden" - damit hats auch merh oder weniger geklappt siehe quelltext (zumindest mal kein fehler beim compilieren)


#include "asuro.h"

int main(void)
{
const char *linkertransistor;
const char *rechtertransistor;
unsigned int transistor[2];

Init();

LineData(transistor);
linkertransistor = "____"; //das war jeweils nur zum test, ob die funktion linedata() fuktioniert
rechtertransistor = "1152"; //das war jeweils nur zum test, ob die funktion linedata() fuktioniert

linkertransistor = transistor[0];
rechtertransistor = transistor[1];

SerWrite(linkertransistor,4);
SerWrite(rechtertransistor,4);

while(1);
return 0;
}



allerdings bekam ich merkwürdige ergebnisse wie beispielsweise
Ï oder Ï!™ëAÑ„

an was könnte das liegen?

mfg sebastian

izaseba
18.05.2006, 19:23
Hallo Sebastian,
so wie ich gerade sehe bist Du ziemlich am Anfang, was C bzw. avr-gcc Programmieren angeht.

dazu empfehle ich Dir diese (http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial) durchzuackern.

Und jetzt zu Deinen Problemen:
Compilerfehler:


test.c:10: error: `uint8_t' undeclared (first use in this function)


uint8_t ist kein Standardtyp von C dafür mußt Du inttypes.h includen(besser), oder unsigned char benutzen sehe Link von oben.

Und zu dem rest,such mal hier in Forum nach itoa oder Asuro und Odometrie auslesen,
das wurde schon 1000 mal diskutiert.
Gruß Sebastian

roflomfg
18.05.2006, 22:16
yopp ich glaub das siehst de ziemlich richtig (wie gesagt hab 1,5 jahre nur mit java programmiert) ok werd ich machen ich meld mich dann wieder - danke für den hinweis

izaseba
18.05.2006, 23:06
Hallo,
das soll ja nicht heißen daß ich Dir nicht helfen will !

Der Ansatz ist schonmal richtig, für die Funkton Linedata brauchst Du ein 2 Feldiges Feld


uint16_t transistoren[2];


Um die ADC Kanäle von den Transistoren auszulesen mußt Du das Feld, oder besser gesagt Zeiger darauf an die ReadLine Funktion übergeben


ReadLine(transistoren);


Jetzt hast Du in deinem Feld 2 Zahlen drin zwischen 0-1023, die darfst Du nicht direkt an die serielle Schnittstelle schicken, sonst kommt Käse raus, wie Du schon gesehen hast.
Dafür ist die Funktion itoa,
Beispiel:
In deinem Feld Transistoren hast Du 2 Zahlen, von mir aus 2x125
wenn Du sie an UART sendest, kommt ein ASCII zeichen von 125 raus, also ein "}"
Du mußt Deine Zahl 125 in 3 ASCII kodierte Zeichen umwandeln und das wäre dann 0x31 0x32 0x35, die darfst Du dann an UART schicken und im Terminal erscheint 125 :-)

Aber, Kopf hoch, Du bist nicht der erste, der darauf reinfällt, suche mal nach itoa, Du wirst Dich wundern ...

So, ich hoffe, meine Ausführungen waren didaktisch und fachlich richtig, und helfen Dir in irgendwelcher Weise.

Gruß Sebastian

P.S. Nochwas vergessen, itoa befindet sich in stdlib.h O:)

roflomfg
19.05.2006, 14:37
also erst ma ich finds echt klasse, dass du mir weiterhilfst - hätte sonst en dickes prob da der unterschied zwischen c auf einem microcontroller und java doch ein recht großer unterschied ist
so ich hab jetzt ma in die datei "stdlib.h" reingeschaut - bin mir allerdings net sicher, ob ich des verstanden hab, da ich nicht ganz verstehe was "/c" darstellen soll

sehe ich das richtig das itoa() folgende parameter hat:

itoa ("das zu verwandelnde intzeichen", "die variable in der das asci- zeichen gespeichert werden soll", "die basis [in meinem fall 10]")

ps: woher weis ich den generell welche datei welche funktionen enthält?
(wie zum beispiel das uint8_t in der datei "inttypes.h" - ok hier ist der name selbsterklärend aber bei itoa() ist das für mich nicht ersichtlich)

mfg sebastian

roflomfg
19.05.2006, 15:22
achja was ich noch vergessen hab - was bewirkt die funktion readline()
du meinst doch linedata() oder ??? :-s

mfg sebastian

izaseba
19.05.2006, 15:29
woher weis ich den generell welche datei welche funktionen enthält?
(wie zum beispiel das uint8_t in der datei "inttypes.h" - ok hier ist der name selbsterklärend aber bei itoa() ist das für mich nicht ersichtlich)

Indem man z.B. Bücher liest, wobei itoa kein ANSI-Standard ist es wird wohl
integer to aSCII heißen.
Wenn man mit avr-gcc arbeitet soll man auch manual dazu lesen Guckst Du (http://www.nongnu.org/avr-libc/user-manual/modules.html).
Das Tutorial auf mikrocontroller.net was ich Dir oben gepostet habe, ist auch eine gute Referenzseite.
Und die Dattenbläter zu dem µC sind auch ein muß, naja, wenn man die Funktionen von asuro.h benutzt, nicht so schnell, aber früher, oder später schon.



itoa ("das zu verwandelnde intzeichen", "die variable in der das asci- zeichen gespeichert werden soll", "die basis [in meinem fall 10]")

fast richtig, der zweite parameter muß aber ein Array sein bzw. zeiger darauf.

Beispiel:



uint16_t zahl = 1000;
uint8_t puffer[5];
itoa (zahl,puffer,10);


Danach hast Du in Deinem Array puffer[0] oder *puffer 0x31,
puffer[1] oder *puffer+1 0x30 usw.
Es ist wohl jetzt kein Problem das ganze an UART bzw serwrite zu schicken.
Bedenke nur, daß der puffer Anzahl der zu erwarteten Zahlen + 1 groß ist, weil itoa noch ein "\0" hinten dran hängt.


da ich nicht ganz verstehe was "/c" darstellen soll
???

Ich hoffe, daß es so alles stimmt :-)

Gruß Sebastian

roflomfg
19.05.2006, 18:56
hey also ich meinte net "/c", sondern "\c" - das wird in der datei stdlib.h verwendet
achja noch was ganz anderes. was bedeutet denn "Danach hast Du in Deinem Array puffer[0] oder *puffer 0x31, puffer[1] oder *puffer+1 0x30 usw. " - ohje ich muss ja echt schwer von begriff sein roflomfg

naja ich hab mich nochmal an einem programm versucht :




#include "asuro.h"
#include "inttypes.h"
#include "stdlib.h"

int main(void)
{

uint8_t transistorenstring[5];
uint16_t transistorenzahl[2];

Init();

FrontLED(ON);
LineData(transistorenzahl);

itoa(transistorenzahl[0],transistorenstring,10);


SerWrite("links:",6);
SerWrite(transistorenstring,4);


while(1);
return 0;
}



als ergebniss bekam ich "links:38(links:985links:38(links:38(links:54(links :54(links:38(¾inks:»8€(links:38(" also irgendwas scheint da nocht net zu stimmen

allerdings kam 38( bei messungen im dunklen heraus und 985 im hellen -spricht das system scheint schon zu funktionieren
allerdings ist es merkwürdig, dass zu oft die selben werte eingelsen werden

ich vermute ma das "(" dadurch entsteht, da der eingelsene wert eine stelle zu wenig hat


ps: zu der zeile "uint8_t transistorenstring[5];" // bedeutet diese 5, dass 5 bits verwendet werden oder dass 5 dieser strings mit dieser deklaration deklariert werden??

mfg sebastian

izaseba
19.05.2006, 20:18
ohje ich muss ja echt schwer von begriff sein

Naja das vielleicht nicht unbedingt, ich würd sagen, das ist alles Neuland für Dich.
C ist auch nicht unbedingt ganz einfach für Einsteiger, oder Umsteiger :wink:
Es wäre besser gewesen C von Grund auf zu erlernen, Du befindest Dich jetzt irgendwie in der Mitte...

Das sieht doch schon gut aus, Dein Programm...
Nur die Endlosschleife hätte ich nicht zum Schluß gesetzt, sondern nach FRONTLED(ON); etwa so


while(1){
Linedata.....
....
....
Serwrite....
}


Dann kriegst Du laufend die Werte angezeigt, klar ?

Dieses \c ist eine Escapesequenz nur \c fand ich in keiner Liste :-k
Ich denke es ist da um den Text irgendwie zu Formatieren, aber mit welchem Programm ?
Beachte es einfach nicht, vielleicht erklärt es uns jemand :-)


ich vermute ma das "(" dadurch entsteht, da der eingelsene wert eine stelle zu wenig hat

Damit liegst Du schonmal richtig, damit liest Du über die Werte hinaus...
Es liegt an der SerWrite Funktion, ich find sie Käse,mit der Länge, die man übergeben muß.

Abhilfe schaft hier wieder eine weitere Funktion (wer hätte es gedacht) und sie heißt auch ziemlich einfach strlen(zeiger auf Dein String), zu finden in string.h...

wenn Du jetzt also schreibst

SerWrite(puffer,strlen(puffer));

müßte es weg sein.
Besser wäre natürlich eine Serwrite Funktion, die ohne Länge auskommt, sondern das Ende der Zeichenkette an dem "\0" erkennt.
Wenn itoa schon mit Null terminiert, warum soll man es nicht nutzen.



zu der zeile "uint8_t transistorenstring[5];" // bedeutet diese 5, dass 5 bits verwendet werden oder dass 5 dieser strings mit dieser deklaration deklariert werden??

Weder,noch

Sagmal, Du hast Erfahrung mit Java, gibt es bei Java keine Arrays ?

Die Deklaration
uint8_t transistorenstring[5] heißt :
Lege ein Feld von 5 Elementen an und zwar vom Typ uint8_t (unsigned char) oder 0-255 also genau 1 Byte.

Das Feld sieht z.B so aus:
transistorenstring[0] = 1;
transistorenstring[1] = 2;
transistorenstring[2] = 3;
transistorenstring[3] = 4;
transistorenstring[4] = 5;

Beachte, daß alles um eine Stelle nach unten rutscht.
Wenn Du jetzt den Quatsch an eine Funktion übergibst, z.B. Serwrite
übergibst Du einen Zeiger darauf und zwar zeiger auf das Erste Element

Serwrite(transistor) könnte man auch schreiben
Serwrite(&transistor[0])
Die Funktion kann jetzt auf den Zeiger zugreifen und zwar mit dem sternchen womit man dann denn Inhalt des Speichers meint, worauf der Zeiger zeigt ( #-o ist das kompliziert zu erklären )

also etwa so:

b = *transistorenstring++;

Das ist jetzt aber Zeiger Arithmetik, kann man lieber in einem C-Buch nachlesen, bevor ich mir hier einen abbreche :-)

O weh, hab ich jetzt wieder ein Roman geschrieben
8-[

Gruß Sebastian

roflomfg
20.05.2006, 14:07
yo die idee das einlesen in die while schleife einzubinden is ne clever idee


zu der zeile "uint8_t transistorenstring[5];" // bedeutet diese 5, dass 5 bits verwendet werden oder dass 5 dieser strings mit dieser deklaration deklariert werden??

ähm ich hab mich da wohl ein bissel falsch ausgedrückt - klar gibt es in java arrays wollte eigentlich nur wissen ob dieses array jetzt ein array vom typ string oder char is aber das hat sich ja jetzt geklärt

wenn das mein lehrer liest steinigt er mich :wink:

ok ich glaub, dass müsste so hinhauen - wird nachher gleich ma getestet

hab mir jetzt auchn paar bücher zu c programmierung aus der unibibliothek karlsruhe geholt
so langsam steig ich hier durch :D

danke für die unterstützung

mfg sebastian

roflomfg
20.05.2006, 21:00
yopp hat funktioniert - ein dickes dankeschön

folgender quelltext is dabei rausgekommen


#include "asuro.h"
#include "inttypes.h"
#include "stdlib.h"
#include "string.h"

int main(void)
{
uint8_t transistorstringrechts[4];
uint8_t transistorstringlinks[4];
uint16_t transistorenzahl[2];

Init();

FrontLED(ON);

while(1)
{

LineData(transistorenzahl);

itoa(transistorenzahl[0],transistorstringlinks,10);
itoa(transistorenzahl[1],transistorstringrechts,10);

SerWrite("links:",6);

SerWrite(transistorstringlinks,strlen(transistorst ringlinks));

SerWrite("rechts:",7);

SerWrite(transistorstringrechts,strlen(transistors tringrechts));

}
return 0;
}

izaseba
20.05.2006, 21:46
Ist doch schön :-)
Es ist auch wirklich gut, daß Du Dir ein paar Bücher zu C besorgt hast, ohne das wird es nicht einfach sein...
Nur noch einen Kompiler um aufm PC zu üben, und in ein paar Tagen lachst Du über Deine Probleme von Heute bzw. gestern.

Gruß Sebastian

roflomfg
21.05.2006, 10:52
ja dann ^^ 8)
nochmals vielen dank