dl6lr
27.11.2008, 22:55
Hallo,
mein Sohn fängt an, den Asuro zu programmieren. Er hat als Übung die Daten der Liniensensoren ausgelesen und gibt diese über die ser. aus. Das funktioniert soweit, aber nur manchmal, je nach Sourcecode. Irgendein Seiteneffekt lässt das Programm manchmal irgendwo hängen oder es macht Unsinn. In der derzeitigen Version _muß_ die erste Ausgabe im Hauptprogramm am Anfang stehen, sonst hängt es wenn die Sensordaten gesendet werden sollen. Als weitere Effekte hatten wir vollkommen unsinnige Ausgaben (Schrottzeichen, auch falsche Anzahl, aber Programm lief ansonsten) sowie das Springen in die Unterspannungsfehlermeldung VLVLVL mit Blinken der Status-LED nach Drücken einer Taste.
Hier das derzeitige Programm, wird der erste Aufruf der Funktion SerWriteText nicht im Hauptprogramm ausgeführt (z.B. durch Auskommentieren), wird nichts mehr ausgegeben und auch die Status-LED springt auf rot und verbleibt so.
#include "asuro.h"
#include <stdlib.h>
#include <string.h>
//
// Prototypes
//
void SerWriteText(char* text);
void CheckLine(void);
void MSleep (int dauer);
//
// Text mit Nullterminiertem String ausgeben
//
void SerWriteText(char* text) {
SerWrite((unsigned char*)text,strlen(text));
}
//
// Liniensensoren einlesen und ausgeben
//
void CheckLine(void) {
// 4 Zeichen plus '\0'
char output[5];
// Datenspeicher fuer die beiden Liniensensoren
unsigned int data[2];
LineData(data);
// int in ascii wandeln, variable Laenge
itoa(data[0], output, 10);
SerWriteText("L:");
SerWriteText(output);
itoa(data[1], output, 10);
SerWriteText(" R:");
SerWriteText(output);
SerWriteText("\r\n");
}
//
// Millisekunden schlafen
//
void MSleep (int dauer) {
int z;
for (z = 0; z < dauer; z++)
Sleep (72);
}
//
// Hauptprogramm
//
int main(void) {
unsigned char taste;
Init();
//
// Wenn die folgende Zeile fehlt, hängt sich das
// Programm bei CheckLine in der Ausgabe auf!?
//
SerWriteText("LICHT\r\n");
StatusLED(GREEN);
while(1) {
taste = PollSwitch();
if(taste > 0) {
StatusLED(RED);
FrontLED(ON);
MSleep(100);
CheckLine();
MSleep(800);
FrontLED(OFF);
MSleep(100);
CheckLine();
StatusLED(GREEN);
SerWriteText("--\r\n");
}
}
return 0;
}
Any hints? Ich habe bereits den Assemblercode funktionierender und nichtfunktionierender Versionen verglichen, konnte aber keine signifikanten Unterschiede ausmachen. Verwendet WinAVR-20080402 und WinAVR-20081124rc3, die aber ausser geänderter Registerbelegung keine unterschiedlichen Ergebnisse präsentierten.
Bernd
mein Sohn fängt an, den Asuro zu programmieren. Er hat als Übung die Daten der Liniensensoren ausgelesen und gibt diese über die ser. aus. Das funktioniert soweit, aber nur manchmal, je nach Sourcecode. Irgendein Seiteneffekt lässt das Programm manchmal irgendwo hängen oder es macht Unsinn. In der derzeitigen Version _muß_ die erste Ausgabe im Hauptprogramm am Anfang stehen, sonst hängt es wenn die Sensordaten gesendet werden sollen. Als weitere Effekte hatten wir vollkommen unsinnige Ausgaben (Schrottzeichen, auch falsche Anzahl, aber Programm lief ansonsten) sowie das Springen in die Unterspannungsfehlermeldung VLVLVL mit Blinken der Status-LED nach Drücken einer Taste.
Hier das derzeitige Programm, wird der erste Aufruf der Funktion SerWriteText nicht im Hauptprogramm ausgeführt (z.B. durch Auskommentieren), wird nichts mehr ausgegeben und auch die Status-LED springt auf rot und verbleibt so.
#include "asuro.h"
#include <stdlib.h>
#include <string.h>
//
// Prototypes
//
void SerWriteText(char* text);
void CheckLine(void);
void MSleep (int dauer);
//
// Text mit Nullterminiertem String ausgeben
//
void SerWriteText(char* text) {
SerWrite((unsigned char*)text,strlen(text));
}
//
// Liniensensoren einlesen und ausgeben
//
void CheckLine(void) {
// 4 Zeichen plus '\0'
char output[5];
// Datenspeicher fuer die beiden Liniensensoren
unsigned int data[2];
LineData(data);
// int in ascii wandeln, variable Laenge
itoa(data[0], output, 10);
SerWriteText("L:");
SerWriteText(output);
itoa(data[1], output, 10);
SerWriteText(" R:");
SerWriteText(output);
SerWriteText("\r\n");
}
//
// Millisekunden schlafen
//
void MSleep (int dauer) {
int z;
for (z = 0; z < dauer; z++)
Sleep (72);
}
//
// Hauptprogramm
//
int main(void) {
unsigned char taste;
Init();
//
// Wenn die folgende Zeile fehlt, hängt sich das
// Programm bei CheckLine in der Ausgabe auf!?
//
SerWriteText("LICHT\r\n");
StatusLED(GREEN);
while(1) {
taste = PollSwitch();
if(taste > 0) {
StatusLED(RED);
FrontLED(ON);
MSleep(100);
CheckLine();
MSleep(800);
FrontLED(OFF);
MSleep(100);
CheckLine();
StatusLED(GREEN);
SerWriteText("--\r\n");
}
}
return 0;
}
Any hints? Ich habe bereits den Assemblercode funktionierender und nichtfunktionierender Versionen verglichen, konnte aber keine signifikanten Unterschiede ausmachen. Verwendet WinAVR-20080402 und WinAVR-20081124rc3, die aber ausser geänderter Registerbelegung keine unterschiedlichen Ergebnisse präsentierten.
Bernd