PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Liniensensor funktioniert nicht.



Hikh'var
28.09.2011, 16:16
Hallo,

ich habe meinen Asuro zusammen gelötet. War das erste Mal das ich was gelötet habe. Um den Asuro ein wenig zu "debuggen" habe ich mir ein Programm geschrieben. Das Problem ist nun, dass mir mein Programm "sagt" das der Linke Liniensensor (T10) immer 0-3 ist, T9 aber zwischen 800 und 30 schwankt je nach Beleuchtung. Nun habe ich schon die Widerstände kontrolliert und auch die Pins 25 und 26 nachgemessen. Da kommen bei beiden ähnliche Spannungswerte raus. Ich messe doch von GND(Pin 8) "zu" Pin 25/26 oder?

Die Frage ist nun was läuft schief? Programm falsch?, IC Kaputt? Vermessen?

Hier noch mein Programm, falls dieses Falsch ist:
Ich benutze die Original Asuro "Bibliothek".

Vielen Dank im Vorraus.

Higgi


#include "asuro.h"

char* to_Char(int number, int expected_size)
{
char buffer[expected_size];
int i;
for(i=expected_size-1;i>=0;i--)
{
buffer[i] = (number%10)+48;
number = number / 10;
}
return buffer;
}


void print_Data_To_IR(char* data)
{
SerWrite(to_Char(data[0],4),4);
SerWrite(";",1);
SerWrite(to_Char(data[1],4),4);
SerWrite("\r\n",4);
}


void debug_Odo(void)
{
int data[2];
OdometrieData(data);
print_Data_To_IR(data);


}


void debug_Line(void)
{
int data[2];
FrontLED(ON);
LineData(data);
print_Data_To_IR(data);
}


void debug_Switch(void)
{
unsigned char pressed_switch;
pressed_switch = PollSwitch();
SerWrite(to_Char(pressed_switch,2),2);
SerWrite(";",1);

}


int main(void)
{
Init();
//FrontLED(ON);
while(1){
//debug_Switch();
debug_Line();
int i;
for(i = 0;i<1000;i++)
{
Sleep(255);
}
}
return 0;
}

markusj
28.09.2011, 21:29
Dein to_Char ist murks. Du kannst keinen Zeiger auf eine lokale Variable zurückgeben, mit verlassen einer Funktion verlieren alle nichtstatischen lokalen Variablen mit sofortiger Wirkung ihre Gültigkeit.

Nimm doch einfach printf oder itoa für solche Zwecke, wenn du Fehler in deinem Debugging-Code nicht ausschließen kannst, wie willst du dann echte Fehler finden?

mfG
Markus

Hikh'var
29.09.2011, 16:37
Hallo,

Dass das mit dem Rückgabewert so in C nicht geht wusste ich nicht. Ich komme eher aus der Java Richtung und dort ist das der Weg wenn man will, das eine Funktion etwas zurückgibt.

Bei itoa habe ich nur Compilerfehler bekommen. Deswegen habe ich die to_Char Funktion überhaupt geschrieben. Könntest du mir sagen was ich für itoa einbinden muss?


mfg Christoph

markusj
29.09.2011, 19:03
Du kannst in C durchaus etwas so zurückgeben, aber nichts worauf ein Pointer zeigt. Deshalb hat Java keine Pointer sondern Referenzen, und in Java erzeugte Objekte liegen auf dem Heap und nicht auf dem Stack. Könntest du in Java einen Zeiger auf eine lokale Variable erzeugen, würde die genauso ungültig mit verlassen der Funktion.

itoa wird in stdlib.h deklariert. Details dazu gibt es in der Doku der avr-libc, entweder online (http://www.nongnu.org/avr-libc/user-manual/index.html) oder im Doku-Ordner deiner WinAVR-Installation, oder (unter Linux) in /usr/share/doc/avr-libc

Anwendungsbeispiel:



char buf[7]; // Vorzeichen + 5 Ziffern + \0 am Ende
itoa(-12345, buf, 10); // Schreibt die Zahl -12345 Dargestellt zur Basis 10 in das Array buf


mfG
Markus

Hikh'var
30.09.2011, 18:14
Hallo,

anscheinend war es echt ein Programmierfehler. Als ich nun itoa anstatt meiner to_Char verwendet habe, hatte ich richtige Werte in der Konsole. Ich verstehe nur nicht warum es bei den Odometriesensoren funktioniert hat. Naja vllt war es auch was anderes, da ich den IC einige mal gezogen und gesteckt hatte zwecks manuellem Messens.


Aber danke dir markusj.

mfg Christoph