-
Hallo
Zeiger sind auch nicht mein Gebiet (was kann ich überhaupt?). Das Ampersand & bedeutet die Speicheradresse der Variablen. Ich hab's nun so gelöst (Vorsicht beim Betrachten!) und kann nun warnungsfrei Übersetzen:
Code:
char message[5], *zeiger_auf_message;
zeiger_auf_message=&message[0]; // oje, so kann ich es fehler- und warnungsfrei
SerWrite(zeiger_auf_message,1); // kompilieren
Zurück zum Problem: Das Hyperterminal sendet nur, wenn man auch [Enter] drückt! Es werden also mindestens zwei Zeichen gesendet. Mein aufgebockter (=Räder berühren nicht den Boden) Clon reagiert nun mit diesem Testcode:
Code:
#include "asuro-probot.h"
#include "asuro-probot.c"
//#include "asuro.h"
//#include "stdlib.h"
void BackLED(char left, char right){}; // Dummi
void SerRead(char *data, unsigned char length,unsigned int timeout)
{
unsigned char i = 0;
unsigned int time = 0;
UCSRB = 0x10; // enable receiver
/* non blocking */
if (timeout != 0) {
while (i < length && time++ < timeout) {
if (UCSRA & 0x80) {
data[i++] = UDR;
time = 0;
}
}
if (time > timeout) data[0] = 'T';
}
/* blocking */
else {
while (i < length) {
if (UCSRA & 0x80)
data[i++] = UDR;
}
}
}
void pause_ms(unsigned int dauer)
{
while(dauer--) Sleep (36); // Sleep(72) bei asuro-CD-Library!
}
int main(void)
{
unsigned int data[2];
char data0[5], data1[5];
char message[5], *zeiger_auf_message;
Init();
SerWrite("Hallo :)\n\n\r", 11);
while( 1 )
{
pause_ms(200); // ohne diese Pause empfängt der asuro seine eigenen Meldungen!
StatusLED(RED);
SerRead(message,2,0); // Warten auf zwei Zeichen: Befehl und Enter?
zeiger_auf_message=&message[0]; // oje, so kann ich es fehler- und warnungsfrei
SerWrite(zeiger_auf_message,1); // kompilieren
SerWrite("\n\r", 2);
StatusLED(YELLOW);
if(message[0] == 'g')
{
FrontLED(ON);
Sleep(10); // Eine LED wird nicht schlagartig hell
LineData(data);
itoa (data[0], data0, 5);
itoa (data[1], data1, 5);
SerWrite (data0, 4);
SerWrite (" links\n\r", 8);
SerWrite (data1, 4);
SerWrite (" rechts\n\r", 9);
pause_ms(2);
MotorDir(FWD,FWD);
MotorSpeed(110,100);
BackLED(OFF,OFF);
if ( data[0] < 50 )
{
MotorDir(RWD,RWD);
MotorSpeed(100,150);
BackLED(ON,OFF);
pause_ms(120);
} // if
if ( data[1] < 50 )
{
MotorDir(RWD,RWD);
MotorSpeed(100,150);
BackLED(OFF,ON);
pause_ms(120);
} // if
if (PollSwitch() >= 1)
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
BackLED(OFF,OFF);
StatusLED(RED);
pause_ms(300);
} // if PollSwitch()
} // if(message[0] == 'G')
if(message[0] == 's')
{
MotorDir(FREE,FREE);
FrontLED(OFF); //Dieser Teil müste eigentlich so funktonieren oder
StatusLED(OFF);
} // if(message[0] == 's')
} // while( 1 )
return 0;
} //main(void)
Das ist im wesentliche immer noch das alte Programm, allerdings etwas geputzt. Neu ist pause_ms() für die Wartezeiten. Das ist natürlich noch die Variante für meinen Clon. Man muss im Moment die Befehle mehrmals senden bis er reagiert.
Ungetestet für den orginalen asuro:
Code:
#include "asuro.h"
#include "stdlib.h"
void pause_ms(unsigned int dauer)
{
while(dauer--) Sleep (72);
}
int main(void)
{
unsigned int data[2];
char data0[5], data1[5];
char message[5], *zeiger_auf_message;
Init();
SerWrite("Hallo :)\n\n\r", 11);
while( 1 )
{
pause_ms(200); // ohne diese Pause empfängt der asuro seine eigenen Meldungen!
StatusLED(RED);
SerRead(message,2,0); // Warten auf zwei Zeichen: Befehl und Enter?
zeiger_auf_message=&message[0]; // oje, so kann ich es fehler- und warnungsfrei
SerWrite(zeiger_auf_message,1); // kompilieren
SerWrite("\n\r", 2);
StatusLED(YELLOW);
if(message[0] == 'g')
{
FrontLED(ON);
Sleep(10); // Eine LED wird nicht schlagartig hell
LineData(data);
itoa (data[0], data0, 5);
itoa (data[1], data1, 5);
SerWrite (data0, 4);
SerWrite (" links\n\r", 8);
SerWrite (data1, 4);
SerWrite (" rechts\n\r", 9);
pause_ms(2);
MotorDir(FWD,FWD);
MotorSpeed(110,100);
BackLED(OFF,OFF);
if ( data[0] < 50 )
{
MotorDir(RWD,RWD);
MotorSpeed(100,150);
BackLED(ON,OFF);
pause_ms(120);
} // if
if ( data[1] < 50 )
{
MotorDir(RWD,RWD);
MotorSpeed(100,150);
BackLED(OFF,ON);
pause_ms(120);
} // if
if (PollSwitch() >= 1)
{
MotorDir(RWD,RWD);
MotorSpeed(255,255);
BackLED(OFF,OFF);
StatusLED(RED);
pause_ms(300);
} // if PollSwitch()
} // if(message[0] == 'G')
if(message[0] == 's')
{
MotorDir(FREE,FREE);
FrontLED(OFF); //Dieser Teil müste eigentlich so funktonieren oder
StatusLED(OFF);
} // if(message[0] == 's')
} // while( 1 )
return 0;
} //main(void)
Gruß
mic
-
Hallo
Aufgeben will ich nicht ich lass es nur mal eine weile gehen weil ich jetzt gerade mein Ultraschall löte und dann mach ich da weiter
Lg
-
Ich glaube der Fehler liegt darin das beim Flashen nur 32 von 33 seiten übertragen werden
aber keine Ahnung wie ich die 33 PAGE auch noch flashen soll
Bei allen anderen Programmen werden immer alle Seiten geflasht
Mfg
-
Gelegentlich ergeben Rundungsfehler falsche Angaben für die Seiten. Wenn das Flashen fehlerfrei beendet wurde, wurde das gesamte Programm geflasht.
-
Ok danke
Man lernt nie aus O:)