PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Front LED tot?



gtacelt
20.01.2007, 21:05
Sers!
Zuerst mal mein Problem, ich glaube ich hab irgendwie meine Rote Front LED getötet. :/
Vor einiger Zeit hab ich mal ein Programm gesehen, das einen Int wert, in nen Char String umsetzt (nicht das PrintInt aus der neuen lib). Auf jedenfall, hat er für den einen Linienfolger klasse Werte zurück, der andre aber nichts.
Ich hab dann mal auf Verdacht einmal die beiden Transistoren (und vorsorglich die Leuchtdiode auch) nachgelötet.
Jetzt habe ich mir mal die neue lib geladen und folgenden Code geflasht:

#include "asuro.h"


int main(void)
{ int linedaten[2];



FrontLED(ON);
SerWrite("Los",3);
while(1)
{
SerWrite("\n",1);
LineData(linedaten);
PrintInt(linedaten[0]);
SerWrite(" ",1);
PrintInt(linedaten[1]);
}

return 0;
}
Soweit, so gut. Aber leider schreibt mir mein Asuro nur am Anfang "Los" und ist dann still. :/
Außerdem glimmt die FrontLed nur noch. Also ein schwaches Leuchten.
Ich habe mal Probeweise ne Grüne Led (die funktioniert garantiert) parallel auf die Lötaugen gehalten. Die leuchtet auch ned. :/

Hat jemand ne Idee?
(Ich komme an mein Werkzeug leider erst wieder am Montag, hab nur ne Lötstation zur Hand.)

Arexx-Henk
21.01.2007, 12:56
Hallo ace,

'Init();' sollte noch zugefugt sein.


int main(void)
{
Init();
int linedaten[2];

Die Atmega8L bootloader startet immer zuerst und wartet 3 Sekunden bis das Anwender Program gestartet wird.
Im bootloader wird dass Atmega8L USART/RS232 Teil schon benutzt und initialisiert aber nicht ganz korrekt fur das Anwender Program. Deshalb wird unglucklicherweise die erste String 'Los' ausgestrahlt aber nicht den Rest. Durch ausfuhren von 'Init()' wird alles richtig initialisiert.

Gruss,

Henk

gtacelt
21.01.2007, 14:42
OMG, danke!
Da wär ich jetzt nie drauf gekommen. :D
Ist mir auch noch nie passiert, ich dachte eigentlich, wenn man Init() nicht aufruft, dann tut der Asuro gar nichts.
Danke für die Aufklärung des (peinlichen ^^') Fehlers.

Ich editier gleich rein, obs nun klappt.

[edit]:
Yeah! :)
Es funktioniert.
Immer diese Kleinigkeiten. *grml*


[edit2]:
Achja, muss man die Variablen vor Init() initialisieren, oder danach?
Oder ist es egal in welcher Reihenfolge?

damaltor
21.01.2007, 15:46
davor.

*textfüller*textfüller*

gtacelt
21.01.2007, 16:21
davor.


Ok. :) (Warum? ;P)

Dadurch, das das ned so leer wirken soll. Poste ich mal meinen Code zum Linienverfolgen. :)

#include "asuro.h"
#define TRUE 1
#define FALSE 0

void pollswitch_richten(unsigned int a)
{int b;
for (b=0;b<=a;b++)
{
PollSwitch();
}
}


int vornefrei(void) //sry fuers abkupfern, is aber ne gute idee so.. habs trotzdem kombiniert
{
char data[3];
data[0]=PollSwitch();
data[1]=PollSwitch();
data[2]=PollSwitch();
if ((data[0] == data[1]) && (data[1] == data[2]))
{return data[0];}
else return 0;
}

void kollision(void)
{unsigned int i;
BackLED(ON,ON);
MotorDir(BREAK,BREAK);
for (i=0;i<=1000;i++) //zu dem zeitpunkt, hatte ich noch ned die neue lib..
{Sleep(72);}
MotorDir (FWD,FWD); //motorkabeln verpolt..
MotorSpeed (120,120);
for (i=0;i<=1000;i++)
{Sleep(72);}
MotorDir(FREE,FREE);
for (i=0;i<=200;i++)
{Sleep(72);}
MotorDir(BREAK,BREAK);
for (i=0;i<=200;i++)
{Sleep(72);}
BackLED(OFF,OFF);

}



int main(void)
{ int linedaten[2],diffR,diffR1,diffR2,diffR3;
char flagL=FALSE;
char flagR=FALSE;


Init();
StatusLED(RED);
Msleep (2000);
pollswitch_richten(20); //zum kondensator entladen
StatusLED (YELLOW);
FrontLED (ON);
while (vornefrei()==0) //hier den asuro auf ein weißes blatt stelln, damit man die liniendingsda kalibriern kann
{
LineData(linedaten); //irgendne taste drücken, wenn er dort war und beginnen kann
diffR1= linedaten[0]-linedaten[1];
diffR2= linedaten[0]-linedaten[1];
diffR3= linedaten[0]-linedaten[1];
diffR=(diffR1+diffR2+diffR3)/3;
PrintInt(diffR);
}
Msleep(1000);
while (1) //jetz auf die linie stellen (asuro muss von linie "wegstarten")
{
StatusLED (GREEN);
MotorDir (RWD,RWD); //motrenkabln sind falschherum angelötet.. ^^
MotorSpeed (150,150);
if ((linedaten[0] < (linedaten[1]+diffR)) && (flagL == FALSE))
{
MotorSpeed (200,150);
flagL = TRUE;
}
if ((linedaten[0] < (linedaten[1]+diffR)) && (flagL == TRUE))
{
MotorSpeed (150,100);
flagL = FALSE;
}
if (((linedaten[1]+diffR) < linedaten[0]) && (flagR == FALSE))
{
MotorSpeed (150,200);
flagR= TRUE;
}
if (((linedaten[1]+diffR) < linedaten[0]) && (flagR == TRUE))
{
MotorSpeed (100,150);
flagR= FALSE;
}
while (vornefrei()!=0)
{
kollision();
}
}

return 0;
}
Verbesserungsvorschläge? :)

Nachtrag:
Das Programm ist Mist. *gg*
Werde mich mal drannsetzen.

damaltor
21.01.2007, 21:13
das ist in allen c-programmen so.
zuerst werden die variablen deklariert (in jeder funktion), und dann kommen anweisungen. eine ausnahme bietet die funktion malloc(), in der bei vielen architekturen auch später speicher reserviert werden kann.