PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LineData im Hyperterminal ausgeben



.patrick
04.10.2006, 15:42
Hallo!
Ich möchte die Daten der beiden Fototransistoren auf der Unterseite von ASURo im Hypertermianl programm auslesen. Allerdings kommen dort nur kryptographische Zeichen an. Habe gelesen, dass von den Fototransistoren 16Bit Werte zurückkommen und man diese erst mit der Funtion itoa() in ASCII umwandeln muss. Das habe ich versucht, jedoch ohne Erfolg. Es kommen immer noch kryptographische Zeichen an.
Hier mal mein Code:


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

int main(void)
{
//Speicherbereich für die Integer-Werte der Fototransistoren anlegen
unsigned int data[2];
unsigned char Wert;

//Microcontroller in Ausgangszustand
Init();
//FrontLED anschalten
FrontLED(ON);
//Werte der Fototransistoren einlesen
LineData(data);

//in ASCII umwandeln
itoa(data[1],Wert,10);
//Werte an Computer senden
SerWrite(Wert,4);//links(T9)

while(1);
return 0;
}


Vielen Dank für eure Hilfe!

mfg
.patrick

linux_80
04.10.2006, 19:52
Hallo,

in der neuen Asuro- Lib ist es so gelöst:


void PrintInt(int wert)
{
char text[16]=" ";
itoa(wert,text,10);
SerWrite(text,strlen(text));
}

also ein char-Array, nicht nur ein char.

zur Lib:
http://sourceforge.net/projects/asuro

.patrick
04.10.2006, 23:06
Danke linux_80 jetztz kommen vernünftige Zahlen an!

Hab noch eine Frage zur itoa()-Funktion.Und zwar verstehe ich den 3. Übergabeparameter der Funktino nicht. Wofür ist der? (im Beispiel ist er 10)

Danke!

linux_80
04.10.2006, 23:25
Hallo,

der 3. gibt das Zahlensystem an,
als für Leute mit 10 Finger eine 10 ;-)

man kann auch eine 2 um Binär zu haben, oder 16 für Hex, muss aber sagen das ich das noch garnicht so verwendet hab ausser als für Dezimal :-b

Robotik84
17.10.2006, 11:58
servus

hab mal ne frage: wenn i die neue lib einfüge und dann mit AVRStudio kompilieren will dann hängt sich mei pc auf.

warum ist das so? muss noch irgendwelche einstellungen vornehmen?

damaltor
18.10.2006, 10:06
Robotik84

bitte benutze die suchfunktion. wenn du wirklich nichts findest, was dir hilft, dann amch einen neuen thread auf. die frage gehört hier nicht her =) ich vermute mal dass du dann schneller ne antwort bekommst als wenn du deine frage in nem anderen thread versteckst.

ich würde an deiner stelle versuchen, die datei neu runterzuladen, evtl ist sie beschädigt.

MODS: verschieben?

mail_bernd
02.12.2006, 23:12
Hallo Patrik,

ich bin auch gerade dabei den asuro auszutesten und versuche verzweifelt den Wert der Fotosensoren mit serwrite auszugeben.
Ich habe die neue WINAVR und die neue LIB für itoa.
Der Comopiler spuckt aber immer noch Galle:

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

int main(void)
{
//Speicherbereich für die Integer-Werte der Fototransistoren anlegen
unsigned int data[2];
uint16_t data1 ;
Init();
FrontLED(ON);
char text[16]=" ";
while(1);{
data1= LineData(data); //Werte der Fototransistoren einlesen

itoa(data1,text,10); //in ASCII umwandeln

SerWrite(text,1); //links(T9) //Werte an Computer senden



}
return 0;
}

Compiler:
test.c: In function `main':
test.c:14: error: void value not ignored as it ought to be
make: *** [test.o] Error 1

Kannst du mir dein Programm zuschicken oder über das Board bereitstellen. Oder was muss ich ändern?

Gruß
Bernd

EDH
03.12.2006, 09:41
data1= LineData(data); //Werte der Fototransistoren einlesen

das ist das problem. LineData giebt nix zurück.

mail_bernd
03.12.2006, 13:17
Sorry, ich schon wieder

laut Beschreibung errechnet LineData(data) die Werte der Fototransistoren.
Die Werte (int 0 – 1023) stecken in data[0] und data[1] für linke und rechte Seite.

Wie kann ich denn diese Werte einer Variabelen übergeben, mit der ich dann weiter rechen und auch eine Ausgabe ansteuern kann???


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

int main(void)
{
unsigned int data[2];
uint16_t data1 ;
Init();
char text[16]=" ";
while(1);{
??? data1= LineData(data); //Werte der Fototransistoren einlesen

itoa(data1,text,10); //in ASCII umwandeln
SerWrite(text,1); //links(T9) //Werte an Computer senden

}
return 0; }

Gruß, Bernd
mit libv2.6.1, asuro.c mit itoa und ersten Geh-Versuchen

der_andi
03.12.2006, 14:54
mit "unsigned int data[2];" initialisierst du einen sogenannten array, das sind zwei von diesen unsigned-int-datentypen gleich hintereinander folgend.
Die kann man jetzt allle einzeln mit der zahl in den eckigen Klammern ansprechen.

In deinem Fall initialisierst du mit "unsigned int data[2]" also zwei stück unsigned int.
Da der Computer bei 0 zu zählen anfängt kannst du auf das erste int mit
"data[0]" zugreifen, auf das zweite mit
"data[1]"

Beispiel:


while(1)
{
unsigned int data[2]; //Initialisiert zwei Int-werte hintereinander
LineData(data); //Übergibt der Funktion den "data"-array, die schreibt
//dann in die zwei int-felder jeweils den linken und rechten Wert.
//Die eckigen Klammern brauchst du hier nicht

PrintInt(data[0]); //den wert von data[0] ausgeben, also von links
PrintInt(data[1]); //den Wert von data[1] ausgeben, also rechts
}

mail_bernd
03.12.2006, 20:27
Besten Dank für den Anschub.
Damit andere auch was davon haben, hier das fertige Programm.

/* Das Programm liest die Linien-Fototransistoren des Asuro aus und
und gibt die Werte über die serielle Schnittstelle an z.B. Hyperterminal aus.
Es werden ca. 2 Wertepaare pro Sekunde ausgegeben (bei 2400bit/s) .

Anforderungen: WinAVR aStudio4b460.exe und asuro_v261.zip (die beigefuegten asuro.c und asuro.h musst du in das Verzeichnis zum Quellcode kopieren.
Viel Spass
*/

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

int main(void)
{
Init();

while(1)
{
unsigned int data[2]; //Initialisiert zwei Int-werte hintereinander

LineData(data); //Übergibt der Funktion den "data"-array, die schreibt die beiden Werte rein
//data[0]=data[0]/10+100; // rechnen klappt auch

SerWrite("linker FotoSensor = ",21); //Text direkt senden
PrintInt(data[0]); //Zelleninhalt ausgeben
SerWrite("\r\n",1); //neue Zeile

SerWrite("rechter FotoSensor = ",21); //Text direkt senden
PrintInt(data[1]); //Zelleninhalt ausgeben
SerWrite("\r\n",1); //neue Zeile

SerWrite("\r\n",1); //neue Zeile
}
return 0;
}

damaltor
03.12.2006, 20:36
sehr gut. kleinere fehler:

was ist das?
//data[0]=data[0]/10+100; // rechnen klappt auch
da sind kommentarstriche vor. vergessen, wegzumachen?

das hier
unsigned int data[2]; //Initialisiert zwei Int-werte hintereinander
sollte nicht in der while-schleife stehen.

und das hier
#include "stdlib.h"
brauchst du nicht.

hier
SerWrite("\r\n",1); //neue Zeile
müssen 2 bytes übertragen werden. \n ist ein byte und \r ist eon byte. vielleicht klappts trotzdem, in hyperterminal aber würde wahrscheinlich eine recht seltsame, treppenförmige formatierung entstehen.

du solltest vielleicht programmcode mit den "code" button posten.

der_andi
03.12.2006, 21:11
das hier
unsigned int data[2]; //Initialisiert zwei Int-werte hintereinander
sollte nicht in der while-schleife stehen.

Mein Fehler, war zu faul ein komplettes Programm zu tippen und habs dann eben falsch vorgemacht und einfach mit in die Schleife gepackt.



#include "sdtlib.h"
braucht er deswegen nicht weil im Verzeichnis des Quellcodes keine derartige Datei existiert und weil ja diese Header-Datei ja schon in asuro.h deklariert wurde, nur um ne Erklärung zum Fehler dazuzugeben.

mail_bernd
03.12.2006, 21:22
Hallo,
hast ja recht ; verbessert.
SerWrite("\r",1); spuckte vorher auch nur ein Zeichen aus.
Sieht jetzt immer noch gleich aus (siehe unten).
Rechnen mit Zellen war nur als Beispiel gedacht, brauche ich auch noch später.
Danke Bernd


/* Das Programm liest die Linien-Fototransistoren des Asuro aus und
und gibt die Werte über die serielle Schnittstelle an z.B. Hyperterminal aus.
Es werden ca. 2 Wertepaare pro Sekunde ausgegeben (bei 2400bit/s) .
Anforderungen: WinAVR aStudio4b460.exe und asuro_v261.zip (die beigefuegten asuro.c und asuro.h musst du in das Verzeichnis zum Quellcode kopieren.

Output in Hyperterminal innerhalb ca. einer Sekunde:
linker FotoSensor = 101
rechter FotoSensor = 102

linker FotoSensor = 1
rechter FotoSensor = 1

linker FotoSensor = 0
rechter FotoSensor = 0

Viel Spass Bernd




*/
#include "asuro.h"

int main(void)
{
unsigned int data[2]; //Initialisiert zwei Int-werte hintereinander

Init();

while(1)
{

LineData(data); //uebergibt der Funktion den "data"-array, die schreibt die beiden Werte rein
//data[0]=data[0]/10+100; // wer moechte, rechnen klappt auch prima!!!

SerWrite("linker FotoSensor = ",21); //Text direkt senden
PrintInt(data[0]); //Zelleninhalt ausgeben
SerWrite("\r",1); //neue Zeile

SerWrite("rechter FotoSensor = ",21); //Text direkt senden
PrintInt(data[1]); //Zelleninhalt ausgeben
SerWrite("\r",1); //neue Zeile

SerWrite("\r",1); //neue Zeile
}
return 0;
}

damaltor
03.12.2006, 21:31
das hyperterminal das so akzeptiert wundert mich... bei mir geht es nicht auf win2000, scheint aber bei winxp zu funktionieren...

folgendes sollte da stehen, damit es wirklich überall geht:

SerWrite("\n\r",2);

\n --> springt in die nächste zeile
\r --> springt zurück zum beginn der zeile

der text "a\nb\nc\nd\ne", also immer abwechselnd ein buchstabe und ein \n, sieht unter win2k so aus:


a
b
c
d
e

der text "a\rb\rc\rd\re" sieht dagegen so aus:

e

weil der corsur immer wieder an den beginn der zeile springt und den vorigen buchstaben überschreibt.

deshalb solltest du unbedingt immer die bwiden bytes \n und \r übertragen.

mail_bernd
03.12.2006, 22:04
Hallo,
\r\n so hatte ich mir das zu Anfang auch gedacht! XP-Hyperterm. steht bei mir auf automatisch Term.-Erkennung?!

Als nächstes möchte ich ein LCD anschließen. Am besten Standard: HD 44780.
Möglichst einfach und Asuro ohne Umbau!
"Suche" sagt viele Probleme vorraus.
Naja, ich will es trotzdem!!!
Butterfly ist auch nicht schlecht, aber teuer und nur als Display!?

Gruß Bernd

damaltor
03.12.2006, 23:03
also ganz ohne umbau wirst du nicht hinkriegen... maximal auf einer erweiterungsplatine, die einen eigenen prozessor besitzt und ausschliesslich per infrarot mit dem asuro kommuniziert... aber ob da der nutzen für den aufwand entschädigt...

viel glück! das forum bietet viele infos dazu...