Programmierung XC167

OP #1336625
Lesenswert?

Hallo!

Ich bin gerade dabei ein eigenes Board mit dem XC167 zu entwickeln und 
die passende Software dazu zu schreiben. Als Programmierumgebung 
verwende ich VX-Tools von Tasking. Damit kann ich meine Software in den 
XC167 flashen. Für die Entwicklungsphase ist das auch ok. Für später 
möchte ich dafür aber meine eigene Software verwenden. Ich habe in der 
Dokumentation auch Infos zum BSL gefunden, aber keinen Quellcode für die 
32 Bytes.

Vielleicht kann mir hier jemand weiterhelfen?

Grüße
Jürgen
Gast #1346231
Lesenswert?

Hallo,

ich werde aus dem Ganzen nicht schlau!

Ich habe einen Preloader geschrieben, der 0x40 Bytes in den Speicher von 
0xE0024 bis 0xE0063 schreibt (siehe Sourcecode) und anschließend an die 
Stelle 0xE0024 springen soll.

Der Preloader läuft (ich sende nach dem Empfang der 0x40 Bytes ein 
Zeichen über die serielle Schnittstelle). Allerdings speichere ich die 
0x40 Bytes entweder an eine falsche Stelle oder der Sprung dahin 
funktioniert nicht.

Ich wollte erstmal einen Pin toggeln lassen bzw. weitere Zeichen 
ausgeben. Nichts funktioniert.

Hat jemand eine Idee was falsch laufen könnte?


Danke
Jürgen
Angehängte Dateien:
Gast #1347029
Lesenswert?

Hallo Jürgen,

wenn der Preloader (die 32 Byte) läuft, hast Du schon gewonnen.

Bei dem nachgeladenen Code würde ich zuerst den Watchdog disablen und 
den Stack aufsetzen.

Wenn der Preloader genau 32 Byte umfasst (NOPs einfügen) und wie bei Dir 
das nachgeladene Programm direkt dahinter liegt, wird es auch ohne 
Sprungbefehl aktiviert.

Tschü Dude
OP #1350653
Lesenswert?

Hallo Dude,

ich bin jetzt ein bisschen weiter. Der Code, der nach dem Preloader 
geladen wird, sendet mir tatsächlich ein Byte zurück.

Allerdings gibt es Probleme beim Senden mehrerer Bytes. Manchmal geht's 
manchmal nicht. Vielleicht liegt das daran, dass die Register durch den 
BSL nicht korrekt gesetzt wurden. Da muss ich jetzt nochmal danach 
schauen. Allerdings bekommt man auch keine Information, welche 
Einstellungen der BSL vornimmt.

Grüße
Jürgen
Gast #1354457
Lesenswert?

Hallo Jürgen,

der BSL konfiguriert die Schnittestelle sicherlich richtig, wenn die 
Baudrate mit dem Takgeber möglich ist. Rechne das mal für Deine 
Konfiguration (Quarz) nach, oder wähle eine andere Baudrate für die 
erste Initialisierung.
Der BSL hat eine automatische Baudratenerkennung anhand des ersten 
(Null-) Byte, das er zur Initialisierung empfängt. Als Antwort sendet er 
darauf eine Kennung der Chip Familie (s. Manual). Wenn dieses Byte 
stimmig ist, passt die UART Konfiguration.

Wie sendest Du "mehrere Bytes"? Ist sichergestellt, dass es keinen 
Buffer overflow gibt?

Tschü Dude
OP #1354639
Lesenswert?

Hallo Dude,

die Schnittstelleneinstellungen waren wohl schon in Ordnung. Nachdem ich 
jetzt aber auch fast alle anderen Register auf die Werte meiner 
"normalen" Software gesetzt habe, kann ich auch mehrere Zeichen 
hintereinander senden. Was jetzt genau die Ursache war, habe ich nicht 
im Detail nachvollzogen.

Ich prüfe vor jedem Zeichen auf den Transmit-Interrupt, so dass es 
sichergestellt ist, dass der Sendepuffer schon leer ist.

Danke und Grüße
Jürgen
OP #1405285
Lesenswert?

Hallo Dude,

ich habe mittlerweile ein ganz merkwürdiges Phänomen:
Ich kann mein Programm übertragen und ich kann Zugriffe auf das Flash 
ausführen lesen, löschen, schreiben..., aber es gibt Probleme, wenn ich 
zuviel Code (vielleicht auch zuviele Funktionsaufrufe) in meinem 
Programm habe.
Mein Programm macht dann undefinierbare Dinge zum Beispiel in Zeile 10, 
wenn ich in Zeile 15 eine Ausgabe über RS232 machen würde. Ohne die 
Zeile 15 läuft mein Programm bis zum Ende fehlerfrei.

Kann da beim Linken etwas schief gehen? Bis auf den zusätzlichen 
Funktionsaufruf (von Zeile 15) kann ich aber nicht soviele Unterschiede 
feststellen. Den Stack habe ich auch schon vergrößert, leider ohne 
Erfolg.

Hast du noch eine Idee?

Grüße
Jürgen
Angehängte Dateien:
Gast #1407005
Lesenswert?

Hallo Dude,

ich habe den Fehler mittlerweile gefunden. Mein Konverter srectobin 
funktionierte nicht richtig. Er hat die Lücken im Code nicht gefüllt. 
Ich habe das mittlerweile korrigiert und es scheint jetzt problemlos zu 
funktionieren.

Grüße
Jürgen

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren