Forum: Mikrocontroller und Digitale Elektronik M16C Relocatable Vectors Table


von Peter (Gast)


Lesenswert?

Hallo,

Ich habe Problem beim schreiben in Relocatable Vectors Table. Ich habe
schon verschiedene Methoden ausprobiert:
1) INTB register auslesen, dann habe ich FlashWrite function aus
Samples benutz um dieser Speicherbereich zu zugreifen -> ohne erfolg
2) ab INTB addresse die ganze tabelle auslesen, nötige änderung
eintragen und ab 0x0F000 speichern. Aber sobald FMR01 bit auf 0 gesetzt
wird, sieht flash ab 0xF000 nicht mehr richtig aus.
3) die gleiche Schritte wie im 2) aber ab adresse 0xF000. und dann INTB
änderen. In dem Fall funktioniert alles am besten, aber auch nicht
korrekt: die Interrupt vectoren, die mit #pragma vector definiert
worden sind, klappt alles, aber die, die ich selbe eingetragen habe
(function pointer), die funktionieren nicht.

Eigentlich möchte ich INTB register nicht ummappen und die Werte in
tabelle eintragen. Wieso funktioniert bei mir FlashWrite nicht
richtig????

von Quark (Gast)


Lesenswert?

Hallo Peter,

mit welchem M16C arbeitest Du? Flash bei 0x0F000 sieht für mich nach
R8C aus?

Ich probiere etwas mit dem M16C/62P herum und nutze für die
Int.-Vektoren die sect30.inc.
In das RAM mappen klappt auch ganz gut (ohne sect30.inc).
Die FlashWrite Funktion habe ich noch nicht benutzt, daher kann ich Dir
leider nicht helfen.
Hast Du mal normale Daten mit der FlashWrite Funktion geschrieben und
kontrolliert. Was kommt den raus, wenn Du Int.-Vektoren mit FlashWrite
schreibst, sind vieleicht nur die bytes verdreht (high-byte, low-byte)?
Oder steht da dann nur Müll drinn?


Grüße

Quark

von Die Waldfee (Gast)


Lesenswert?

Ich habe mich noch nicht allzusehr mit dem M16C beschäftigt, aber bei
mir hat der C-Compiler sich komplett um alles gekümmert - d.h. er hat
die Interrupt-Vektoren entsprechend definiert. Auch für Assembler gab
es beim Entwicklungspaket entsprechende Include-Files. Nachträglich im
Flash herumschreiben ist dabei nicht notwendig. Bastelst Du an einem
bestehenden System herum? Oder möchtest Du Interrupt-Vektoren während
des laufenden Betriebs umswitchen?

von Olaf (Gast)


Lesenswert?

Vielleicht noch der Tip das man sich bei verwendung von sect30.inc sehr
leicht vertun kann indem man seine Interruptvektoren in den falschen
Bereich schreibt. Das Teil mit seinen ellenlangen defines ist nicht
gerade das was man als guter Programmierstil bezeichnen koennte.

Olaf

von peter (Gast)


Lesenswert?

Bei mir kommt M16C29 im einsatz + IAR compiler.
Beir diesem Prozeccor gibt es 128K Flash ROM. Block A,B und von 0 bis
5.

Compiler mach alles richtig, wenn ich einen interrupt vector definiere.
Aber es muss dynamisch sein! Das heisst dass ich je nach board
konfiguration entweder eine Funktion für die bzw TimerA2 interrupt
benutze oder andere. In anderen Wörten die Interrupt Table muss
geändert werden.

Ich habe früher für PIC was geschrieben und beim PIC in Flash zu
schreiben klappt wunderbar! hier aber - eine Drama.

Ich habe E8 debuger und wenn ich Int. table auf 0xF0000 kopiere, dann
sehe ich nichts im Memory Windows (keine Änderungen), aber die alle
Vectoren auser deren, die von mir definiert worden sind, funktionieren
richtig. mit der adresse 0x0F000 sehe ich meine Änderungen bis FMR01
bit zurück aus 0 gesetzt wird.

von Die Waldfee (Gast)


Lesenswert?

Gibts vielleicht ein Problem mit der Umsetzung der Pointer? Könnte sein,
dass es da eine Verwurschtelung der Typen gibt. Der M16C245, mit dem ich
arbeite, nutzt z.B. long-Pointer - manchmal aber auch nur 24Bit (auf dem
Stack).
Wie sieht denn der Functionpointer aus, wenn Du ihn testweise ins RAM
schreibst?

von Olaf (Gast)


Lesenswert?

Wenn man sich mit dem E8 den Flashinhalt anschauen will dann muss
eingestellt sein das er sich den bei Breaks auch zurueckliesst.
Sonst bekommt er aenderungen die der Prozessor am Flash vornimmt nicht
mit.

Probleme mit der Pointerlaenge sind mir bei der gleichzeitigen Nutzung
zwischen M16C und R8C auch schon aufgefallen. Der eine nimmt naemlich
defaultmaessig FAR und der andere NEAR.

Olaf

von peter (Gast)


Lesenswert?

Ich denke nicht, dass das ein Problem mit der Umsetzung der Pointer ist.
Statt einfach die Adresse in Table zu schreiben, lese ich die ganze
tabelle aus, fülle mit Function addressen und erst dann schreibe in
andere Flash Bereich.

Vor dem Schreiben habe ich den Buffer überpruft...i.O

Aber was mich eingentlich wundert. wieso kann ich in 0xF0000 Schreiben
und in 0xFBD90 nicht! aber sogar Schreiben in 0xF0000 funktioniert 2, 3
Mal und dann nicht mehr!!!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.