HC08 -> Flash löschen mit "On-Chip Programming Routines"

P

proggi

Guest
Hallo Zusammen!

Ich habe ein Problem beim löschen des Flashs eines HC908GZ16 mit den
ROM-Routinen. Ich habe dazu bereits die AN 2545/D und 2504/D gelesen
und dachte eigentlich, dass das kein Problem ist. Leider stürzt der
Controller aber beim Zugriff auf die Routinen ab. Ich habe das ganze
in C geschrieben und wenn sich jemand anbietet mir zu helfen, dann
schicke ich gerne noch mehr Informationen und Teile vom Code.

Viele Grüße und schon mal vielen Dank!

proggi
 
proggi schrieb:
Mangelnder Realname.

HC908GZ16 ... ROM-Routinen
Die Variante hab ich zwar nicht, aber vermutlich ähnlich wie die
bisherigen:
* es wird RAM ab Start des RAMs benutzt das passend initialisiert
werden muß.
* eventuell einige Bytes Stack werden mehr belegt.
* der Watchdog wird wohl von der Routine im ROM bedient.
* Interrupts sollten abgeschaltet sein.
* Löschen dauert z.B. 1 msec, also länger als Schreiben. Derweil kein
Lesezugriff aufs FLASH und damit keine Programmausführung im FLASH.
Soweit die Routine im ROM die Verzögerungsschleife nicht macht, muß
man im RAM warten.

Soweit man Page-Adressen angeben muß: nur Adressen verwenden
in denen wirklich FLASH ist. Besonders oberhalb des Hauptspeichers
gibt es of Pages in denen nur einige Bytes FLASH sind. Dann muß man
Adresse nehmen wo wirklich das FLASH ist, nicht 1. Byte der Page.

MfG JRD
 
Rafael Deliano <Rafael_Deliano@t-online.de> wrote in message news:<3FB8E9DF.1F3FC34@t-online.de>...

Danke für die Info. Ich dachte, dass ich es genau so mache.
Muss noch mal alles kontrollieren.

Gruß,

Proggi
 
Rafael Deliano <Rafael_Deliano@t-online.de> wrote in message news:<3FB8E9DF.1F3FC34@t-online.de>...

HC908GZ16 ... ROM-Routinen
Die Variante hab ich zwar nicht, aber vermutlich ähnlich wie die
bisherigen:
Ich habe mal versucht, die Funktionen aus der AN zu nutzen:

* es wird RAM ab Start des RAMs benutzt das passend initialisiert
werden muß.
/* FLASH Constants */
#define PAGE_SIZE 64
/* RAM Constants */
#define RAMSTART 0x40
#define CTRLBYT (*(volatile unsigned char*)(0x48))
#define CPUSPD (*(volatile unsigned char*)(0x49))
#define LADDRH (*(volatile unsigned char*)(0x4A))
#define LADDRL (*(volatile unsigned char*)(0x4B))
#define DATA(X) (*(volatile unsigned char*)(0x4C + X))
/* ROM-resident Routines Constants */
#define GETBYTE() {__asm jsr 0x1C00;}
#define RDVRRNG() {__asm jsr 0x1C03;}
#define ERARNGE() {__asm jsr 0xFC09;}
#define PRGRNGE() {__asm jsr 0x1C06;}
#define DELNUS() {__asm jsr 0x1C0C;}

/* 2 X Fop (Busclock) und aufrunden 2X6,25=12,5 -> 13*/
#define OSC 13

void ErasePage(Word *_page) {
Word _address;
_address = *_page;
FLBPR = 0xFF; // Enables erase/write protection.
CPUSPD = OSC; // Set Clock Bus Operation speed.
CTRLBYT &= 0xBF; // Clear bit 6 to page erase mode.

__asm ldhx _address; // Set the page to be erased.

ERARNGE(); // Call ROM-resident routine.

EI(); //Interupts enable;

return;
}

void main(void)
{
unsigned short address;

CONFIG1 = //0x29; /* COP disabled, LVI powered, but disabled set to 5V*/
CONFIG2 = //0x0d; /* Set for CAN active, TBM with div 128, SCIclk = Busclk */

ENABLE_LED_D2;
ENABLE_LED_D3;

PTAPUE_.b2 = 1; //enable Pull Up on Pushbutton input

LED_D2 = 1;

/* init PLL */
PLLon(0x05); //Faktor 5 = 6.25MHz Busclock @ 5 MHz Quarz

EI(); /* authorize interrupts */

address=0xfb40;
LED_D3 = 0;
ErasePage(&address);
LED_D2 = 0;

while(1);

}//Main()


Die ROM-Funktion schaltet die Interrupts selbst ab.

Soweit man Page-Adressen angeben muß: nur Adressen verwenden
in denen wirklich FLASH ist. Besonders oberhalb des Hauptspeichers
gibt es of Pages in denen nur einige Bytes FLASH sind. Dann muß man
Adresse nehmen wo wirklich das FLASH ist, nicht 1. Byte der Page.
Die Adresse liegt im Flash (habe aber auch schon ander getestet.

Leider kehrt das Programm auch hier nicht aus der Funktion ERARNGE()
zurück. Ich habe schon gedacht, das OSC mit 13 falsch ist. Ich habe
aber schon mehrfach nachgerechnet und finde keinen Fehler.

Da ich mit dem MonIf-Programmieren kann muss der Controller aber
OK sein.

Hat noch jemand eine Idee, was das Problem ist?

Vielen Dank schon mal!

Proggi
 
proggi schrieb:
Abgesehen davon, daß sich am Realnamen noch einiges verbessern liesse,

FLBPR = 0xFF; // Enables erase/write protection.
kann man in den alten 908ern die ich kenne das FLBPR so nicht
schreiben. Man kann es einmal programmieren. Das wars dann aber,
löschen kann man es nur noch durch Mass-Erase.
Zugriff auf FLBPR wird auch in AN2545 nicht aufgeführt -> weglasssen.
Am einfachsten wäre es das kurze Beispielprogramm aus AN2545 in
Assembler auszuprobieren. Oder sich ansehen, was der C-Compiler
für Assembler macht.

EI(); /* authorize interrupts */
Die ROM-Funktion schaltet die Interrupts selbst ab.
-> EI weglassen, eine Fehlerquelle weniger.

OSC mit 13 falsch ist.
Für 6,5 MHz scheint 13d richtig.

MfG JRD
 

Welcome to EDABoard.com

Sponsor

Back
Top