Forum: Mikrocontroller und Digitale Elektronik AT89LP51ED2 flashen


von Bernhard B. (bernieb)


Lesenswert?

Hallo zusammen,
ein Programm für AT89C51ED2 soll auf AT89LP51ED2 portiert werden. 
Minimale Anpassungen waren nötig. Flashen mit FLIP funktioniert. "Start 
Application" im FLIP startet das Programm. Programm läuft ohne Probleme, 
macht bis ins Detail alles genauso wie gewünscht. Soweit eigentlich 
alles erledigt. Aber: Ich kann nur genau 1x flashen. Wird danach Erase - 
Blank Check - Program - Verify mit demselben HEX-File durchgeführt, dann 
geht es nicht mehr. Im Flash steht überall 0xFF. Verify geht 
logischerweise schief. Schalte ich das Target aus, verbinde neu und 
führe anschließend Program - Verify durch, so klappt das. Im Flash 
stehen die richtigen Bytes. Das Programm läßt sich aber nicht starten. 
Wieso? Hat jemand ein Idee? Was ist nach dem ersten Programmiervorgang 
anders? Irgendwelche Fuses? Da gibts ja nicht viel im Flip.

Viele Grüße
Bernie

von Klaus S. (kseege)


Lesenswert?

Bernhard B. schrieb:
> Hat jemand ein Idee?

Ja.
Laut Datenblatt müssen Vcc, Reset und PSEN in bestimmter Reihenfolge auf 
verschiedene Pegel gesetzt werden, um korrekt zu flashen.
Wurde das beachtet?

von Lothar (Gast)


Lesenswert?

Ich muss auch demnächst was mit AT89LP51ED2 machen und hätte Fragen:

Braucht es für das erstmalige FLIP flashen einen externen Quarz? Oder 
nutzt der Bootloader den internen 8 MHz Oszillator?

Ab Wert ist laut Datenblatt die Fuse für externen 12 MHz Quarz gesetzt 
und die kann nicht mit FLIP auf den internen 8 MHz Oszillator geändert 
werden. Es ist also ein Programmer erforderlich?

Kennst Du diesen Arduino "Programmer"?

https://petervanhoyweghen.wordpress.com/

Soweit ich das sehe braucht der aber auch erst mal einen externen Quarz.

von Klaus S. (kseege)


Lesenswert?

Lothar schrieb:
> Ich muss auch demnächst was mit AT89LP51ED2 machen und hätte Fragen:

Falls Du mich meinst: Ich weiß von den LP-Typen erst seit diesem Thread.
Ich habe nur vor ca. einem Jahr zeitgleich einen 80C51 und einen 80S51 
programmiert, daher kenne ich noch die grundlegenden Unterschiede und 
worauf man achten muß. Ich hatte nur noch dunkel in Erinnerung, daß da 
was mit Reset und PSEN war und hab daraufhin ins Datenblatt geschaut.
Im Kapitel 23 "Flash Memory Programming" steht eigentlich Alles drin.

> Es ist also ein Programmer erforderlich?
"Programmer" ist ein Universalwort wie Dongle oder Dingsbums. Es ist 
sinnvoll, genauer zu spezifizieren, wenn man Klarheit möchte. Um das vom 
"Programmierer" geschriebene und vom Compiler/Assembler übersetzte 
"Programm" in den Flash-Speicher des uC zu bekommen, braucht es immer 
einen "Programmer". Da hat der AT89LP51ED Laut Datenblatt mehrere 
Möglichkeiten. Entweder nutzt man als  "Programmer" den im ROM 
befindlichen Bootloader, dann muß man diesen mit der passenden 
Pegelfolge an Reset und PSEN aktivieren und per Programm Flip (oder 
einem anderen Programm) die passenden Kommandos über den UART an den uC 
schicken. Dazu muß die CPU arbeiten und benutzt den in den Fuses 
eingestellten Takt. Ist der auf extern gestellt, muß man eben einen 
externen Takt bereitstellen.

Oder man nutzt den von Atmel ISP genannten Modus über MISO/MOSI/SCK, der 
kommt ohne CPU und deren Takt aus, SCK ist der Takt. Dazu braucht man 
dann externe Hardware, die diese Signale erzeugt. Dazu muß der uC das 
Resetsignal aktiviert haben. Das scheint der folgende Aufbau zu machen:
> Kennst Du diesen Arduino "Programmer"?
> https://petervanhoyweghen.wordpress.com/
Ich kenne ihn nicht, aber aus kurzem Durchlesen scheint mir klar zu 
sein, daß es ein ISP-Programmer ist. Damit kann man dann auch die Fuses 
setzen und den internen Oszillator für den Betrieb auswählen.

Jetzt darfst Du aussuchen, was Dir lieber ist.

Gruß Klaus (der soundsovielte)

von Bernhard B. (bernieb)


Lesenswert?

Hallo Klaus,

das Problem ist, daß das Programm beim AT89LP51ED2 nicht startet. Nicht 
nach click auf "Start Application" und auch nicht nachdem die Spannung 
weggenommen wurde. Das Programm wird in den Flash geschrieben. Das wurde 
mit Read oder auch Verify geprüft. Ich kann es nur starten nachdem es im 
fabrikneuen Zustand geflasht wurde.

Beim AT89C51ED2 hingegen funktioniert alles wie es soll.
Die Sequenz bezüglich PSEN und RST über die Leitungen DTR und RTS macht 
FLIP beim AT89C51ED2 offensichtlich richtig. Der LP scheint sich hier 
anders zu verhalten. Zumindest nach dem ersten flashen.

Grüße
Bernie

von HolgerT (Gast)


Lesenswert?

Wenn Programm korrekt im Flash steht, aber nicht startet, prüfe ob BLJB 
richtigen Status hat. (Vermutung: Die Fuse wurde beim ersten Flashen 
geändert.)

von Klaus S. (kseege)


Lesenswert?

Bernhard B. schrieb:
> Der LP scheint sich hier
> anders zu verhalten. Zumindest nach dem ersten flashen.

Dazu kann ich wohl wenig beitragen. Wie ich schon schrieb, kenne ich die 
LP-Serie erst, seit ich Deine Anfrage gelesen habe. Zur Sicherheit würde 
ich nochmal mit einem Oszilloskop nachprüfen, ob die Folge 
Resetaktiv/PSENauf0/Resetpassiv korrekt abläuft, aber das ist wohl nur 
sinnvoll, wenn der 89LP51 auf einer anderen Platine sitzt als der 89C51, 
davon schreibst Du ja nichts.
Und wenn das Verify Deinen Programmcode bestätigt, sollte eigentlich 
auch Alles okay sein. Einzige Möglichkeit außer einem Hardwarefehler 
scheint mir nur noch ein im LP-Typ neu eingeführter Bootmode zu sein, 
den es im C-Typ nicht gibt. So genau habe ich mir das Datenblatt noch 
nicht durchgelesen.
Ein Erratasheet scheint es noch nicht zu geben, von daher hilft dann 
wohl nur der Umstieg auf einen ISP-Programmer.

Gruß Klaus (der soundsovielte)

von Lothar S. (schudi)


Lesenswert?

Hallo Bernhard S,

Die AT89LP... Serie verfügt über zwei mögliche Reset-Verfahren:
1. Der Standard-Reset aller 8051 Controller funktioniert mit einem
   active-High Reset-Impuls.

2. Die LP-Serie lässt sich über eine Fuse alternativ auch auf einen
   active-Low-Impuls einstellen.

3. Des Weiteren verfügt die LP-Serie auch über einen automatischen
   Power-on-Reset.

Hier gilt es das gewünschte Reset-Verfahren über die richtige 
Fuse-Einstellung auszuwählen. Wahrscheinlich liegt hier das Problem,
warum die AT89C... Serie startet und die AT89LP... Serie nicht,
weil der falsche Reset-Impuls eingestellt ist.

Ich hoffe geholfen zu haben

Grüße von Lothar

von Bernhard B. (bernieb)


Lesenswert?

> von HolgerT
> Wenn Programm korrekt im Flash steht,
> aber nicht startet, prüfe ob BLJB
> richtigen Status hat.
> (Vermutung: Die Fuse wurde beim ersten Flashen geändert.)
BLJB ist laut FLIP gesetzt. Das ist aber auch egal, solange im BSB 0x00 
steht springt er spätestens bei dieser Abfrage auch zu User Application. 
Siehe Seite 206 im Datasheet. Einwände?

> von Klaus S.
> Oszilloskop nachprüfen, ob die Folge
> Resetaktiv/PSENauf0/Resetpassiv korrekt abläuft
werde ich mal machen.

> 89LP51 auf einer anderen Platine sitzt als der 89C51
Ich habe von beiden Versionen beliebig viele Leiterplatten zur 
Verfügung.
Diese sind identisch bis auf den getauschten LP-Typ.

> LP-Typ neu eingeführter Bootmode
nur warum soll das dann beim ersten mal gehen und dann nicht mehr?
Ich forsche...

> Umstieg auf einen ISP-Programmer
das wird wohl nicht ausbleiben und ich muß ein paar Leitungen anbringen

Grüße
Bernie

von Lothar S. (schudi)


Lesenswert?

Hallo Bernhard B,

ich habe hier noch eine Ergänzung für dich, aus einem Kommentar,
den ich auf meinem Platinenlayout hinterlassen habe, um diese
Information bei jeder Bearbeitung immer sofort zur Verfügung zu haben.
Ich gebe sie dir hier unbearbeitet wieder:

Achtung!

- Der Reset arbeitet mit wechselnder Polarität,
  abhängig von der Beschaltung des POL Pins:
  - POL = +Vcc bedeutet einen Reset mit Active-High
  - POL =  GND bedeutet einen Reset mit Active-Low
  Der Controller verfügt über einen internen Power-On-Reset (POR),
  so dass eine Klassische Reset-Beschaltung nicht unbedingt
  erforderlich ist.
- Dieses Board kann primär mit folgenden Controllertypen bestückt 
werden:
   a) AT89LP51RB2
   b) AT89LP51RC2
   c) AT89LP51RD2
   d) AT89LP51ED2
   e) Es sind auch noch (evtl. mit Einschränkungen) folgende
      Controller möglich:
       - AT89C51RB2, AT89C51RC2, AT89C51RD2, AT89C51ED2
          (Nur per Bootloader, z.B. mit Atmel FLIP programmierbar).
       - AT89S8253 (Nur per SPI programmierbar, z.B. mit LSISP).
       - AT89S52, AT89LS52 (Nur per SPI programmierbar, z.B. mit LSISP).
       Für diese "klassischen" AT89-Controller ist die Reset-Beschaltung
       aus C7 und R8 installiert, die nur dann arbeitet, wenn mit
       J4 = 1 - 2 ein positiver Reset eingestellt ist.

- Wenn der Quarzoszillator mit den Jumpern J1 und J2 stillgelegt wird,
  können die beiden frei werdenden Pins P4.6 und P4.7 über eine Fuse-Bit
  Einstellung als normale Pins betrieben werden betrieben werden.
  Per weiterer Fuse-Bit muss dann auf den internen 8 MHz RC-Oszillator
  umgeschaltet werden.
- Der Controller kann auch per Bootloader über RXD und TXD programmiert
  werden.
  - Um in den Bootloader-Modus zu gelangen, muss folgender Ablauf
    durchgeführt werden:
     1. RST-Taster drücken und halten
     2. PSEN-Taster drücken und halten
     3. RST-Taster loslassen
     4. PSEN-Taster loslassen
   Der Controller ist jetzt bereit über TXD und RXD
   Programmdaten zu empfangen, z.B. von der
   Atmel-Software FLIP.

Vielleicht hilft Dir das weiter.

Grüsse von Lothar

von Klaus S. (kseege)


Lesenswert?

Bernhard B. schrieb:
> Diese sind identisch bis auf den getauschten LP-Typ.

Da kann ich nur kichern. Gleich sind sie nur, wenn auf derselben Platine 
die CPU getauscht wurde. Ansonsten hängt es von der Qualität der 
Endtests ab, ob alle Abweichungen gefunden wurden. Und auch danach 
können noch Fehler eingebracht werden.

Da aber inzwischen die Experten aufgetaucht sind, die die LP-Typen zu 
kennen scheinen, würde ich erstmal auf die hören. Ich bin nur ein 
kleiner Physiker, der mit zwanzig verschiedenen CPU-Typen gearbeitet hat 
und zusätzlich ein bißchen von den Grundlagen der Fehlersuche versteht.
Grundsatz eins: Traue niemandem, am wenigsten Dir selber!
Grundsatz zwei: Miß alles mindestens zweimal nach! Ab und an erlebst Du 
eine ungeahnte Überraschung.

Gruß Klaus (der soundsovielte)

von HolgerT (Gast)


Lesenswert?

Bernhard B. schrieb:
> BLJB ist laut FLIP gesetzt.

Nimm ihn (von mir aus testweise) raus, denn im Manual heißt es:

"Unprogrammed (‘1’ value) to start the user’s application on next reset 
at address 0000h.
Programmed (‘0’ value) to start the boot loader at address F800h on next 
reset (Default)."

Du weißt nicht, ob der Haken "Programmed" bedeutet oder "1-Unprogrammed" 
(und ich kann mich nicht mehr erinnern, wie es war, als ich ähnliche 
Probleme hatte. Beitrag "Re: Probleme mit einer Charge AT89C51CC03") 
Gut, der ..CC03 hat kein SBV, ich würde es an Deiner Stelle trotzdem 
probieren...

von pegel (Gast)


Lesenswert?


von Bernhard B. (bernieb)


Lesenswert?

Hallo!

@Lothar: Danke für die ausführliche Info.
Hier ist POL = +Vcc, also Reset = Active-High
RST ist im Betrieb auf 0.
Pin 4.6 und 4.7 sind mit einem 12MHz Quarz beschaltet. Der schwingt.
RST-PSEN-Sequenz stimmt.

@HolgerT: Ich bin mir nicht mehr sicher, ob FLIP alles korrekt ausgibt.
Es gibt zwar Checkboxes für BLJB und X2, die lassen sich aber nicht 
beliebig an- und abwählen.
Clicke ich z.B. auf BLJB, so kommt in der Statuszeile unten "BLJB fuse 
disabled", aber der Haken bleibt drin. Abwählen geht nicht.
Im Debug Fenster wird die Message :030000030A0401EB ausgegeben.

@Klaus S:
> Gleich sind sie nur, wenn auf derselben Platine die CPU getauscht wurde.
Ja, so war's. Bin also in die Produktion und habe mir ein paar geholt, 
getestet und erst anschliessend mit dem neuen Controller versehen. Das 
Programm läuft sowohl auf dem 89C51 als auch auf dem 89LP51. Bei 
letzterem eben nur wenn er frisch aus dem Werk geflasht wird.

Grüße
Bernie

von Klaus S. (kseege)


Lesenswert?

Bernhard B. schrieb:
> Clicke ich z.B. auf BLJB, so kommt in der Statuszeile unten "BLJB fuse
> disabled", aber der Haken bleibt drin. Abwählen geht nicht.

Das Datenblatt sagt eindeutig: die CPU kommt nicht an die Fuses, also 
Flip ebenfalls nicht, da Flip über die CPU programmiert.
Ist wohl Zeit, einen Arduino als ISP-Programmer einzusetzen. Hat bei mir 
gut funktioniert, als PonyProg mit STK200-Dongle nicht funktionieren 
wollte. Geht natürlich mit jedem anderen uC ebenfalls, den man selbst 
programmieren kann.

Gruß Klaus (der soundsovielte)

von Peter D. (peda)


Lesenswert?

Klaus S. schrieb:
> Das Datenblatt sagt eindeutig: die CPU kommt nicht an die Fuses, also
> Flip ebenfalls nicht, da Flip über die CPU programmiert.

Lt. Datenblatt kann der Bootloader sehr wohl das BLJB ändern.
Table 23-20. Bootloader Command Summary,
Command 03h, 0Ah, 04h

Nach dem Häckchen setzen noch das Return drücken.

von Lothar (Gast)


Lesenswert?

Peter D. schrieb:
> kann der Bootloader sehr wohl das BLJB ändern

Soweit ich verstanden habe startet der Bootloader aber nur ab Werk und 
nach dem ersten Flashen nur nochmal wenn BLJB dabei gesetzt wurde. Wenn 
also jetzt der Botloader nicht mehr startet, geht nur noch Programmer, 
oder?

von Klaus S. (kseege)


Lesenswert?

Peter D. schrieb:
> Lt. Datenblatt kann der Bootloader sehr wohl das BLJB ändern.

In Kapitel 23.2 steht:
Note that the bootloader only has limited access to the fuses. For full 
device configuration an
external ISP programmer is required.

Das habe ich wohl etwas überinterpretiert. Mein Fehler!

In Fig.23.9 steht, wie der Bootvorgang abläuft und BLJB, ENBOOT und BSB 
gesetzt sein müssen.

Gruß Klaus (der soundsovielte)

von Bernhard B. (bernieb)


Lesenswert?

Hallo!

Derzeit habe ich noch keine Lösung und habe das Thema erstmal auf die 
Seite gelegt, bis ich einen neuen GALEP habe. Mein alter GALEP kann mit 
dem Controller nicht umgehen. Der ist noch aus einer Zeit in der das 
Fernsehen schwarz-weiß war. Über den Bootloader kommt man nicht an alles 
ran. So macht das keinen Sinn. Ich melde mich wieder.

Danke und Grüße
Bernie

von Lothar S. (schudi)


Lesenswert?

Hallo Bernhard B.,

Mit dem Bootloader kannst Du den Controller schon in seinen 
Kompatibilitätsfunktionen in Betrieb nehmen, z.B. als Ersatz für den 
AT89C51ED2. Das funktioniert mit Flip. Habe ich selbst vor ein paar 
Tagen aus Interesse ausprobiert.
Willst Du allerdings das neue Feature der LP-Serie, den single cycle 
Mode aktivieren, so geht das nur mit einem ISP-Programmer und einer 
entsprechenden Software, da Du die Fuses verändern musst und an die 
kommt man mit dem Bootloader nicht heran.

V.G. von Lothar

von Bernhard B. (bernieb)


Lesenswert?

Hallo Lothar,

ja, der LP-Typ ist als Ersatz für den C-Typ vorgesehen, weil der eben 
lieferbar ist. Benötige keine neuen Features. Das Programm läuft auch 
einwandfrei nach dem ersten mal flashen. Ich könnte mich damit zufrieden 
geben, da im Service-Fall sowieso die ganze Elektronik getauscht wird. 
Außerdem werden in der Produktion nur die Bootloader-Commands genutzt. 
Andere Möglichkeiten sind auf der Leiterplatte nicht vorgesehen. 
Redesign will man auch nicht. Also wird es sowieso darauf hinauslaufen 
das zu akzeptieren. Da ich aber die letzte Instanz bin, gebe ich mich 
damit nicht zufrieden und will es ganz genau wissen. Ich sehe den Tag 
schon kommen, daß man irgendeine neue Funktion implementieren will und 
ich dann aber erklären muß, daß vorhandene Geräte nicht Update-fähig 
sind.
Wenn du das probiert hast, dann sag mir bitte mal, ob das bei dir auch 
so ist? Es scheint so, daß bei mir zu irgendeinem Zeitpunkt das XRAM 
config bit geändert wird. Nach dem ersten mal flashen steht im 
Hardware-Byte noch 0xB7 drin. Damit funktioniert alles. Später, nach 
einem weiteren erase/flash-Vorgang steht dann nur noch 0xBF drin. Damit 
funktioniert das Programm nicht mehr. Dabei ist das XRAM Config bit nur 
über programmer tools zugänglich. Nur eine Vermutung. Wie schon 
geschrieben, ich brauche jetzt erstmal geeignetes Werkzeug.

Grüße
Bernie

von Lothar (Gast)


Lesenswert?

Bernhard B. schrieb:
> brauche jetzt erstmal geeignetes Werkzeug

Wie geschrieben es sollte auch mit Arduino gehen:

https://petervanhoyweghen.wordpress.com/

https://github.com/PeterVH/ArduinoISP/tree/at89

const unsigned char fuses[] = { ... };

von Lothar S. (schudi)


Lesenswert?

Hallo Bernhard B.,

ich arbeite auf Hobby Ebene seit Jahren mit dem AT89LP51RC2 ohne 
Probleme. Ich habe mir dafür meine ISP-Hardware als USB -> RS232 
Umsetzer für unter 5,00 € in China gekauft und die Programmiersoftware 
in VB6 selbst geschrieben. Das funktioniert seit ca. 2009 für meine 
Bedürfnisse zufriedenstellend. Die Software kann sowohl im ISP, als auch 
im Bootloader Betrieb arbeiten.
Ich habe mich erst jetzt, aufgrund Deines Problems, aus Interesse mal 
wieder seit Jahren mit FLIP beschäftigt. Ich kann Dein Problem 
allerdings nicht nachvollziehen. Das einzige Problem, dass sich mir 
stellte, war das BLJB Bit. Da muss halt das Häkchen in FLIP 
herausgenommen werden, wenn der Controller nach einem Spannungsreset 
nicht im Anwendungsprogramm starten will, sondern in den Bootloader 
springt und nichts tut.

Aber ich habe noch einen anderen Hinweis für Dich.
Du sprachst davon, dass Du zum Testen beliebig viele Boards aus der 
Produktion bekommen kannst und dass die Boards dort mit FLIP 
programmiert werden.

Also handelt es sich um ein kommerzielles Produkt und ich gehe davon 
aus, dass alle 3 Lock-Bits in der Produktion gesetzt werden, damit 
niemand an das Programm herankommen kann.

Möglicherweise liegt in dieser Tasache Dein Problem begründet, warum 
sich der Controller Deiner Meinung nach seltsam verhält.

Ich selbst habe als Hobbymensch noch keine Versuche mit den Lock-Bits 
gemacht. Vielleicht lohnt es sich, darüber mal im Datenblatt 
nachzulesen?

L.G. von Lothar

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.