Spaceshuttle-Countdown für C-Control Pro Mega128 gesucht

Wenn ich das nächste Mal in die Stadt fahre, nehme ich das Board mit und test im Conrad ein anderes.
Sollte das andere dann funktionieren, wiessen wir, dass es am board liegt.
 
Klingt nach einer guten Idee, sofern du dort den Code auf das Board spielen kannst.

Gruß
BlackMark
 
Ich hab ein Tablet, und installiere auf dieses die IDE. Somit ist das kein Problem.

Ich habe mir den Code von "Board Test 4" angeschaut.
Solche Darstellungsfehler können nur am Board liegen.


Edit:

Wenn ich nur diesen Code dastehen hab, dann wird "Seven" angezeigt.
Code:
void main( void )
{
    LCD_Init();
    LCD_ClearLCD();
    LCD_CursorOn();

    LCD_CursorPos(0);
    LCD_ClearLCD();
    LCD_WriteText( "Seven" );
    AbsDelay( 2000 );

    LCD_CursorPos(0);
    LCD_ClearLCD();
    LCD_CursorOff();
}

Sobald mehr dasteht, wird Blödsinn angezeigt.
 
Zuletzt bearbeitet:
Ja, mit einem Tablet ist das natürlich kein Problem.

Sieht wirklich sehr danach aus, als wäre dein Board oder dein LCD Defekt. Scheinbar funktionieren mehrere Schreibaufrufe nicht.

Gruß
BlackMark
 
Hallo BlackMark,

ich war gerade im Conrad (wo ich von einem sehr unfreundlichen Berater bedient wurde, der mir nicht helfen wollte und dies mehrmals auch vor seinem Kollegen wiederholt hat, da dies schließlich Entwicklerhilfe sei) und habe dort das letzte vorhande Board ausprobiert.
Ergebnis ist, dass auch dieses die gleichen kryptischen Ziechen anzeigt.
Der zweite Berater hat mir eine E-Mailadresse gegeben, an die ich mich wenden sollte.
Jetzt meine Frage:
Darf ich dein "Board Test 4" als Beispiel in die E-Mail anhängen, mit der Frage warum der Code mit den standard IDE Einstellungen nicht richtig funktioniert?

Gruß
von Schnitzel
 
da dies schließlich Entwicklerhilfe sei
Naja, so ganz stimmt das nicht. Die Hardware muss machen was der Code sagt, wenn sie das nicht tut, dann geht man von einem Hardware Defekt aus und das ist definitiv etwas, das die Typen im Conrad Laden sich anschauen müssen!

Ergebnis ist, dass auch dieses die gleichen kryptischen Ziechen anzeigt.
Ein zweites defektes Board wäre schon äußerst unwahrscheinlich. Ich wüsste aber auch nicht was an meinem Code falsch sein soll. Ich habe LCD_Init() aufgerufen, das müsste eigentlich genug sein um das LCD zu verwenden, vor allem machen es die Beispiel Programme auch nicht anders.

Darf ich dein "Board Test 4" als Beispiel in die E-Mail anhängen, mit der Frage warum der Code mit den standard IDE Einstellungen nicht richtig funktioniert?
Natürlich darfst du den Code an die E-Mail anhängen! Du darfst auch gerne den Countdown Code mit anhängen, falls das helfen sollte. Aber danke, dass du fragst, so etwas sieht man sehr selten!

Gruß
BlackMark
 
Wurde schon die kompilierte Datei der jeweils anderen Seite getestet?

Prüfsummen bei identischem Quellcode?
 
BlackMark schrieb:
Ein zweites defektes Board wäre schon äußerst unwahrscheinlich. Ich wüsste aber auch nicht was an meinem Code falsch sein soll. Ich habe LCD_Init() aufgerufen, das müsste eigentlich genug sein um das LCD zu verwenden, vor allem machen es die Beispiel Programme auch nicht anders.

Deshalb dachte ich mir, dass ich das zweite Board dann behalten und weiter mache.


BlackMark schrieb:
Natürlich darfst du den Code an die E-Mail anhängen!
Danke, ich probier es erst einmal mit dem Test und dann schauen wir weiter.


omaliesschen schrieb:
Wurde schon die kompilierte Datei der jeweils anderen Seite getestet?

Prüfsummen bei identischem Quellcode?

Ja, das haben wir mit dem "Board Test..." gemacht - bis auf die Prüfsummen.
Wo finde ich die Prüfsumme?
 
Zuletzt bearbeitet:
omaliesschen schrieb:
Wurde schon die kompilierte Datei der jeweils anderen Seite getestet?
Bei mir laufen die von ihm kompilierten Dateien einwandfrei, bei ihm laufen die von mir kompilierten Dateien ebenfalls nicht.

omaliesschen schrieb:
Prüfsummen bei identischem Quellcode?
Die *.bc ( Byte Code ) Dateien sind identisch, bei gleichem Quellcode, funktionieren aber bei mir schon und bei ihm nicht.

von Schnitzel schrieb:
Deshalb dachte ich mir, dass ich das zweite Board dann behalten und weiter mache.
Hast du das Board also ausgetauscht?

von Schnitzel schrieb:
Ja, das haben wir mit dem "Board Test..." gemacht - bis auf die Prüfsummen.
Wo finde ich die Prüfsumme?
In einem Programm das Prüfsummen von Dateien erstellen kann. ( MD5, SHA1, CRC32 )
Habe ich allerdings schon überprüft, unsere Compiler erstellen den selben Byte Code.

Gruß
BlackMark
 
Zuletzt bearbeitet:
Was wenn Du die Eingabe in eine Textdatei schreibst um zu sehen ob lediglich die Darstellung des LCDs kryptisch ist, die eingegeben Daten aber dennoch richtig übermittelt werden?

LCD mal an und ausschalten Im Programmablauf?
 
Muss nochmal kurz weg.
Bin in ca. einer Stunde wieder da ...

C U
 
omaliesschen schrieb:
Was wenn Du die Eingabe in eine Textdatei schreibst um zu sehen ob lediglich die Darstellung des LCDs kryptisch ist, die eingegeben Daten aber dennoch richtig übermittelt werden?
Das C-Control Pro kann ( soweit ich weiß ) keine Textdateien im internen Speicher erstellen, einzig über den seriellen Port könnte man die Daten übermitteln. Würde aber auch nichts bringen, weil die Daten definitiv in Ordnung sind:
Code:
LCD_WriteText( "Test" );
Ein string literal wird wohl kaum fehlerhaft sein. Auch andere Datentypen gehen nicht, ich habe alle unterstützten Write Funktionen getestet ( word, float, char, string ( char array ) ).

omaliesschen schrieb:
LCD mal an und ausschalten Im Programmablauf?
Geht auch nicht. Es gibt nur LCD_Init(), aber kein LCD_Deinit() oder so etwas. Nur LCD_ClearLCD() existiert, aber das ist schon Teil meines Testprogramms.

Edit:
Ich habe jetzt noch einmal das Manual durchgeblättert und ein paar interessante Dinge gefunden. Es gäbe noch eine andere Möglichkeit Daten auszugeben, nicht nur über den seriellen Port. Wenn man das USB Kabel verwendet und die IDE läuft, dann kann man mit Msg_Write[...]() arbeiten. Das wird dann in der IDE ausgegeben.
Außerdem sind PortA.6 und PortA.7 mit der Verwaltung des SRAMs belegt, das sollte zwar nichts ausmachen, weil Countdown den SRAM nicht verwendet, aber um es sauber zu machen müsste der Jumper JP6 nach links gesteckt sein. Da es jedoch auch unbelegte Ports gibt, habe ich einfach den Code verändert und verwende jetzt PortF.6 und PortF.7, dann muss man keinen Jumper umstecken.
Weiters habe ich noch die Funktion LCD_TestBusy() gefunden, welche so lange wartet bis der LCD Controller nichts mehr zu tun hat, wenn man nämlich LCD Funktionen verwendet während der LCD Controller beschäftigt ist, kann das zu korrupten Ausgaben führen.

Im Anhang ist zum einen das veränderte Countdown Projekt, welches nun PortF.6 und PortF.7 verwendet ( aber noch kein LCD_TestBusy() ).
Und zum anderen ein neues Board Test Projekt, das Msg_Write[...]() und LCD_TestBusy() beinhaltet.

Gruß
BlackMark
 

Anhänge

Zuletzt bearbeitet:
Nach dem Start von "Board Test 5" habe ich vollgendes von der IDE vollgendes gemeldet bekommen:
(Es sind alle Projektoptionen aktiviert)

Meldung IDE.jpg

Jedoch im Display zu sehen war:

ss (die erste Stelle war leer)
.77
(es wurde nichts angezeigt)
ven

------------------------------------------

(Es sind keine Projektoptionen aktiviert)

Vom IDE gemeldet:
Meldung IDE 2.jpg

Im Display zu sehen war:

777
εs
(es wurde nichts angezeigt)
ven

----------------------------------

Den Unterschied macht nur die Aktivierung bzw. die Deaktivierung der Option "Debug Code erzeugen".
Alle anderen Optionen haben keine Auswirkung.


Edit:

Das Verhalten der Anzeige beim Contdown ist unverändert; sowohl mit, alsauch ohne aktivierte Optionen.
 
Zuletzt bearbeitet:
Die IDE Ausgabe stimmt schonmal, also sind die Daten in Ordnung, es ist einzig und allein das LCD, das die Probleme verursacht.

Debug Code liefert ein anderes Resultat als normaler Code, interessant. Ich glaube nun zu Wissen was das Problem ist. Ich vermute, dass das LCD welches Conrad in deinem C-Control Pro verbaut hat ein anderes ist, als das das ich habe. Das heißt, dass die Befehle mit denen man es anspricht auch entsprechend unterschiedlich sind. LCD_Write[...]() sind alles Funktionen, die nur auf dem dafür gedachten Display funktionieren können, weil sie intern die Opcodes aufrufen, die vom Hersteller für dieses eine Display definiert wurden.
Oder es ist wirklich LCD_TestBusy(). Ich werde mal vor jede einzelne LCD Funktion ein LCD_TestBusy() setzen, wenn das nicht funktioniert, dann stimmt wahrscheinlich meine vorher genannte Theorie. Im Anhang findest du "Board Test 6", mit so vielen LCD_TestBusy() wie nur gehen. Ich bin mir nicht sicher ob es funktioniert LCD_TestBusy() vor LCD_Init() aufzurufen, deshalb habe ich "Board Test 6.1" gemacht, wo als erstes LCD_Init() aufgerufen wird und erst danach LCD_TestBusy().

Countdown hätte auch unverändert bleiben sollen, ich habe schließlich nur die Ports geändert, das hat keine Auswirkungen auf das LCD.

Gruß
BlackMark
 

Anhänge

Hallo zusammen,

nachdem wir uns ja schon seit einiger Zeit mir diesem Thema beschäftigen, ist bei mir die Fähigkeit zu programmieren wieder aufgeglimmt^^.
Ich habe mal folgendes probiert:

Code:
void main( void )
{
    LCD_Init();
    LCD_TestBusy();
    LCD_ClearLCD();
    LCD_CursorOn();
    AbsDelay(100);

    LCD_CursorPos(0);
    AbsDelay(100);
    LCD_ClearLCD();
    AbsDelay(100);
    LCD_TestBusy();
    AbsDelay(100);
    LCD_WriteWord( 777, 3 );
    AbsDelay(100);
    Msg_WriteWord( 777 );
    AbsDelay(100);
    Msg_WriteChar( '\r' );
    AbsDelay( 2000 );

    LCD_CursorPos(0);
    AbsDelay(100);
    LCD_ClearLCD();
    AbsDelay(100);
    LCD_TestBusy();
    AbsDelay(100);
    LCD_WriteFloat( 7.77, 2 );
    AbsDelay(100);
    Msg_WriteFloat( 7.77 );
    AbsDelay(100);
    Msg_WriteChar( '\r' );
    AbsDelay( 2000 );

    LCD_CursorPos(0);
    AbsDelay(100);
    LCD_ClearLCD();
    AbsDelay(100);
    LCD_TestBusy();
    AbsDelay(100);
    LCD_WriteChar( '7' );
    AbsDelay(100);
    Msg_WriteChar( '7' );
    AbsDelay(100);
    Msg_WriteChar( '\r' );
    AbsDelay( 2000 );

    LCD_CursorPos(0);
    AbsDelay(100);
    LCD_ClearLCD();
    AbsDelay(100);
    LCD_TestBusy();
    AbsDelay(100);
    LCD_WriteText( "Seven" );
    AbsDelay(100);
    Msg_WriteText( "Seven" );
    AbsDelay(100);
    Msg_WriteChar( '\r' );
    AbsDelay( 2000 );

    LCD_CursorPos(0);
    LCD_ClearLCD();
    LCD_CursorOff();
}
Überall einen Warteschritt eingefügt - OK, ich habe es etwas übertrieben, aber es zeigte den gesuchten Erfolg, sodass der von mir abgewandelte "Board Test 5" alles korrekt anzeigte.

Es scheint mir, als wäre etwas (ich tippe auf das Display) bei der Verarbeitung der Daten nicht schnell genug.
So zu sagen, der Datenstrom fängt an und es wird erst dann wahrgenommen nachdem schon ein Teil der Daten "vorbeigerauscht" ist.

----------------------

Edit 1:

Ein weiterer Test mit "Board Test 3" ergab, dass diese kleine Pause nach "LCD_ClearLCD()" auch erfolgreich war.

----------------------

Edit 2:

Hallo BlackMark,
ich habe "Board Test 6" mit und ohne die kleine Anpassung nach jedem "LCD_ClearLCD()" ausprobiert.
Ohne die Erweiterung des Codes gab es die bekannten Fehlanzeigen.
Es sieht so aus, als wäre das genau das Problem.
Diese Anweisung (und wohl einige andere) benötigt etwas zu viel Zeit, was dann nur zur Wahrnehmung eines Teils des Datenstoms führt.

----------------------

Edit 3:

Was macht der Befehl "Msg_WriteChar( '\r' );"?
 
Zuletzt bearbeitet:
von Schnitzel schrieb:
Hallo BlackMark,
ich habe "Board Test 6" mit und ohne die kleine Anpassung nach jedem "LCD_ClearLCD()" ausprobiert.
Ohne die Erweiterung des Codes gab es die bekannten Fehlanzeigen.
Es sieht so aus, als wäre das genau das Problem.
Diese Anweisung (und wohl einige andere) benötigt etwas zu viel Zeit, was dann nur zur Wahrnehmung eines Teils des Datenstoms führt.
Interessant. Eine Pause funktioniert, aber LCD_TestBusy() nicht. Scheinbar funktioniert LCD_TestBusy() nicht richtig, denn eigentlich sollte diese Funktion selbst eine Pause machen, bis das LCD funktionsfähig ist.
Kannst du mal testen wie groß der kleinste Wert ist, bei dem alles korrekt angezeigt wird und welche Befehle genau eine Pause benötigen?

von Schnitzel schrieb:
Was macht der Befehl "Msg_WriteChar( '\r' );"?
Eine ausgezeichnete Frage! Msg_WriteChar() schreibt ein Zeichen ( character ) in des Ausgabefenster der IDE. Mit \ kennzeichnet man sogenannte Escape-Sequenzen, damit kann man normalerweise nicht darstellbare Zeichen darstellen. '\r' entspricht 13 im ASCII-Table und hat die Funktion Carriage return, also den Cursor an den Anfang der Zeile zu bringen. '\n' sollte man ebenfalls kennen, 10 im ASCII-Table und definiert als Line feed, also in die nächste Zeile springen. Normalerweise macht '\n' ein Line feed und Carriage return, das kommt aber auf die Konsole oder das OS an. Die C-Control IDE ist etwas seltsam, weil dort ein Carriage return das macht, was ein Line feed normalerweise macht, also in die nächste Zeile springen und den Cursor an den Anfang setzen. '\n' hingegen fängt nur eine neue Zeile an, behält den Cursor jedoch auf gleicher höhe.

Gruß
BlackMark
 
BlackMark schrieb:
Kannst du mal testen wie groß der kleinste Wert ist, bei dem alles korrekt angezeigt wird und welche Befehle genau eine Pause benötigen?

Ich hab bis "AbsDelay( 1 )" erfolgreich getestet.
Gibt es auch kleinere Werte? "0.9" bracht die bekannten Fehler.

(Getestet mir "Board Test 4)

BlackMark schrieb:
Die C-Control IDE ist etwas seltsam, weil dort ein Carriage return das macht, was ein Line feed normalerweise macht, also in die nächste Zeile springen und den Cursor an den Anfang setzen. '\n' hingegen fängt nur eine neue Zeile an, behält den Cursor jedoch auf gleicher höhe.

Vertauscht sozusagen.
Jetzt stellt sich mir die Frage, Absicht oder Versehen.
 
Zuletzt bearbeitet: ("(Getestet mir "Board Test 4)" hinzugefügt)
von Schnitzel schrieb:
Ich hab bis "AbsDelay( 1 )" erfolgreich getestet.
Gibt es auch kleinere Werte? "0.9" bracht die bekannten Fehler.
Nein, kleiner als 1 ms geht nicht. Aber eine Millisekunde ist schon sehr wenig, könnte man praktisch vernachlässigen, nur warum braucht das LCD diese winzige Pause?!
Nun müsste ich noch wissen, nach welchen Funktionen AbsDelay( 1 ) absolut notwenig ist um Fehler zu vermeiden. Nur nach LCD_ClearLCD() oder auch nach LCD_Write[...]() oder bei anderen Funktionen auch noch?

von Schnitzel schrieb:
Vertauscht sozusagen.
Jetzt stellt sich mir die Frage, Absicht oder Versehen.
Ja, so in etwa vertauscht.
Ich habe keine Ahnung ob das Absicht ist oder nicht. '\n' macht das was es eigentlich machen sollte, nur '\r' macht das, was "\r\n" bzw. "\n\r" eigentlich machen sollte. Irgendwie seltsam das Ganze.

Gruß
BlackMark
 
BlackMark schrieb:
Nein, kleiner als 1 ms geht nicht. Aber eine Millisekunde ist schon sehr wenig, könnte man praktisch vernachlässigen, nur warum braucht das LCD diese winzige Pause?!
Nun müsste ich noch wissen, nach welchen Funktionen AbsDelay( 1 ) absolut notwenig ist um Fehler zu vermeiden. Nur nach LCD_ClearLCD() oder auch nach LCD_Write[...]() oder bei anderen Funktionen auch noch?

OK, dann konnte "0.9" nicht funktionieren.

Ich habe mit "Board Test 4" getestet und dort hast du nach "LCD_Write..." immer ein "AbsDelay(2000) angegeben, was trotzdem die Fehlanzeige zur Folge hatte.
Wenn ich jetzt immer nach "LCD_ClearLCD()" ein Delay von 1 eingeben, funktioniert es, wie es soll.
Wenn ich das Delay nach LCD_Write... lösche, wird nicht im Display nichts angezeigt.
Somit sind beide nötig.
Ergänzung ()

Ich hab nochmal etwas rumprobiert und muss leider das Delay von 1 auf 10 erhöhen, da die 7 bei "Board Test 4" nicht angezeigt wird.
Die Freude hatte mich leider anscheinend etwas blind gemacht.
Sorry.

Code:
    LCD_CursorPos(0);
    LCD_ClearLCD();
    AbsDelay( 10 );
    LCD_WriteChar( '7' );
    AbsDelay( 2000 );

Bei den anderen LCD_Write... genügt ein Delay von 1.
 
Zuletzt bearbeitet:
Zurück
Oben