Mikrocontroller AT89S52 flashen

#7619255
Lesenswert?

Hallo,

ich möchte auf dem Mikrocontroller AT89S52 eine Datei (datei.hex) übertragen. Dazu habe ich natürlich viele Informationen auch hier im Forum gefunden, leider keine die zu einer Lösung meiner Probleme beigetragen haben. Ich gehe mal davon aus das der mikrocontroller AT89S52 einen Bootloader hat und über die ISP-Schnittstelle (MOSI, MISCO, SCK, RESET) geflasht wird. Mein Interface ist ein „USBASP V2.0", mit einnem 10-poligen Anschluss Meine Probleme sind:

  1. den benötigten Treiber (usbasp-windriver.2011-05-28.zip bzw.USBasp-win-driver-x86-x64-ia64-v1.2.4.zip) für den USBASP unter WINDOWS 11 Pro 64 Bit zu installieren dazu habe ich einen Beitrag „Windows 10 unsignierte Treiber installieren“ gefunden. https://code-bude.net/2015/08/19/windows-10-unsignierte-treiber-installieren/ Hat aber leider nicht funktioniert.

  2. die Anschluss-Belegung für den USBASP mit 10-poligen Anschluss Dazu habe ich zwei verschieden Versionen gefunden: Meine verwendete Verbindung zum Mikrocontroller

1
USBASP     AT89S52
2
1 MOSI  ------  6 P1.5 (MOSI)
3
2 VCC  ------  40 VCC (+5V)
4
3 
5
4 GND  ------  20 GND
6
5 RESET  ------  9 RST
7
6 GND      
8
7 SCK  ------  8 P1.7 (SCK)
9
8 GND
10
9 MISO  ------  7 P1.6 (MISO)
11
10 GND
  1. Anschluss von RESET Dazu habe ich zwei verschiedene Versionen gefunden: a: Anschluss eines Widerstandes 10K gegen +5V b: das Signal RESET vom USBASP über eine Schaltung mit einem PNP-Transistor invertieren Aktuell habe ich die Version „a“ verwendet.

  2. als Programmer Software benutze ich „AVRDUDE“ Version 7.1 mit Erweiterung von avrdue.conf für die Mikrocontroller AT89S51/52

1
avrdude -c usbasp -p 8052 -U flash:r:test.hex:i
2
avrdude warning: a1 would normally be expected to be a9 [E:\Baben\Dokumentation\ELEKTRO\Mikrokontroller\ATmega\AT89S51 flashen\Software\AVRDUDE\avrdude.conf:16252]
3
avrdude warning: a0 would normally be expected to be a8 [E:\Baben\Dokumentation\ELEKTRO\Mikrokontroller\ATmega\AT89S51 flashen\Software\AVRDUDE\avrdude.conf:16252]
4
avrdude warning: mcuid -1 for AT89S51 is out of range [0..2039], use a free number >= 372 [E:\Baben\Dokumentation\ELEKTRO\Mikrokontroller\ATmega\AT89S51 flashen\Software\AVRDUDE\avrdude.conf:16254]
5
avrdude warning: a1 would normally be expected to be a9 [E:\Baben\Dokumentation\ELEKTRO\Mikrokontroller\ATmega\AT89S51 flashen\Software\AVRDUDE\avrdude.conf:16310]
6
avrdude warning: a0 would normally be expected to be a8 [E:\Baben\Dokumentation\ELEKTRO\Mikrokontroller\ATmega\AT89S51 flashen\Software\AVRDUDE\avrdude.conf:16310]
7
avrdude warning: mcuid -1 for AT89S52 is out of range [0..2039], use a free number >= 372 [E:\Baben\Dokumentation\ELEKTRO\Mikrokontroller\ATmega\AT89S51 flashen\Software\AVRDUDE\avrdude.conf:16312]
8

9
avrdude error: program enable: target does not answer (0x01)
10
avrdude error: initialization failed, rc=-1
11
        - double check the connections and try again
12
        - use -B to set lower ISP clock frequency, e.g. -B 125kHz
13
        - use -F to override this check
14

15

16
avrdude done.  Thank you.

Juergen B.

(Firma: matzetronics) #7619258
Lesenswert?

Juergen B. schrieb:

Ich gehe mal davon aus das der mikrocontroller AT89S52 einen Bootloader hat und über die ISP-Schnittstelle (MOSI, MISCO, SCK, RESET) geflasht wird.

Er hat keinen Bootloader, wenn er fabrikfrisch ist, kann aber über ISP geflasht werden. Er unterscheidet sich aber in der Polarität des Reset Signals. Bei ihm ist Reset aktiv high, wie bei nahezu allen MCS51 Derivaten. Für den USBASP kann ich nicht sprechen, aber mein AVRISP MkII programmiert den AT89S52 ohne Probleme und behandelt auch das Resetsignal richtig. Du solltest also mal in der Doku zu deinem USBASP schnüffeln und schauen, ob der MC unterstützt wird.

Zum USB Treiberproblem kann ich nicht viel sagen, empfehle dir aber, mal auszuprobieren, ob Zadig funktionieren würde: https://zadig.akeo.ie/

#7619284
Lesenswert?

Matthias S. schrieb:

Zum USB Treiberproblem kann ich nicht viel sagen, empfehle dir aber, mal auszuprobieren, ob Zadig funktionieren würde: https://zadig.akeo.ie/

Dem TO koennte ich "libusbK" empfehlen. Vorteil: Der ist signiert. Den aktuellen Status von Zadig kenne ich aber nicht.

Ganz frueher™ hatte man einen Kandadongle fuer den Parallelport, und Treiber dafuer brauchte man auch nicht. :)

#7620216
Lesenswert?

Hallo, vielen Dank für Eure schnellen Antwort. Dazu habe ich noch folgendes zu sagen:

  1. Den Treiber für den USBASP konnte ich ersteinmal unter WINDOWS7 installieren.

  2. die Signal MOSI,MISO,SCK kann ich aber nicht erkennen (Oszilloscope). Das Signal "RESET" wird kurz auf "GND" geschaltet. Test mit:

1
avrdude -c usbasp -p 8052 -U flash:r:blink.hex:i -F

Damit erhalte ich die Meldung:

1
avrdude: error: program enable: target doesn’t answer. 1
2
avrdude. Initialization faild, rc=-1
3
avrdude: AVR device initialized and ready to accept instructions
4
avrdude: Device signature = 0x656570
5
avrdude: Expected signature for AT89S52 is 1E 52 06

Die Signatur für den "AT89S52" in der "avrdude.conf" ist:

1
#------------------------------------------------------------
2
# Below chips by added by me .. Joy Shukla(joy_shukla@yahoo.in)
3
# these chips can be programmed with my usbasp programmer(changed atmega8 program)
4
# after adding avrdude support in this file ..
5
#------------------------------------------------------------
6

7
#------------------------------------------------------------
8
# AT89S52
9
#------------------------------------------------------------
10
part
11
    id               = "8052";
12
    desc             = "AT89S52";
13
    signature        = 0x1E 0x52 0x06;
14
    chip_erase_delay = 20000;
15
    pgm_enable       = "1 0 1 0  1 1 0 0    0 1 0 1  0 0 1 1",
16
                       "x x x x  x x x x    x x x x  x x x x";
17

18
    chip_erase       = "1 0 1 0  1 1 0 0    1 0 0 x  x x x x",
19
                       "x x x x  x x x x    x x x x  x x x x";
20

21
    timeout      = 200;
22
    stabdelay      = 100;
23
    cmdexedelay      = 25;
24
    synchloops      = 32;
25
    bytedelay      = 0;
26
    pollindex      = 3;
27
    pollvalue      = 0x53;
28
    predelay      = 1;
29
    postdelay      = 1;
30
    pollmethod      = 0;
31

32
    memory "flash"
33
        size            = 8192;
34
        paged           = no;
35
        min_write_delay = 4000;
36
        max_write_delay = 9000;
37
        readback_p1     = 0xff;
38
        readback_p2     = 0xff;
39
        read            = "  0   0   1   0    0   0   0   0",
40
                          "  x   x   x a12  a11 a10  a9  a8",
41
                          " a7  a6  a5  a4   a3  a2  a1  a0",
42
                          "  o   o   o   o    o   o   o   o";
43

44
        write           = "  0   1   0   0    0   0   0   0",
45
                          "  x   x   x a12  a11 a10  a9  a8",
46
                          " a7  a6  a5  a4   a3  a2  a1  a0",
47
                          "  i   i   i   i    i   i   i   i";
48
   mode      = 0x21;
49
   delay      = 12;
50
      ;
51

52
    memory "signature"
53
        size            = 3;
54
        read            = "0  0  1  0   1  0  0  0   x  x  x  0   0  0 a1 a0",
55
                          "0  0  0  0   0  0  0  0   o  o  o  o   o  o  o  o";
56
      ;
57
  ;

Hier weiss ich leider nicht ob es an dem fehlenden Bootloader oder an der Verdrahtung (habe ich nätürlich mehrmals geprüft) liegt.

  1. Frage zum Bootloader: "Er hat keinen Bootloader, wenn er fabrikfrisch ist, kann aber über ISP geflasht werden" Wie kann ich denn dann den MC flashen, bzw. wie bekomme ich den Bootloader auf den MC ?

Juergen

Gast #7620252
Lesenswert?

Bootloader gibts beim AT89S52 nicht, der kann nur via ISP oder parallel programmiert werden, nicht aus einem eigenen Programm heraus.

Und dein Programmer benötigt mindestens eine kleine Hardwaremodifikation bzgl des Reset-Pins.

#7620403
Lesenswert?

Hallo,

das mit dem Bootloader ist mir nun klar, deswegen über die ISP-Schnittstelle (MOSI,...), anders als beim AT89C51 über die Serielle-Schnittstelle (TxD,RxD).

Die Hardwaremodifikation habe ich so verstanden das RESET-Signal vom USBASP invertiert werden muss. Das habe ich mit einem IC 7404 (Hex-Inverter) realisiert, erhalte aber die gleichen Fehler-Meldungen. Oder habe ich das falsch verstanden ?

Juergen

#7620544
Lesenswert?

H. H. schrieb:

Mit welchem USBasp genau?

Allem Anschein nach ein "normaler" USBasp ohne die spezielle Firmware, die das Invertieren von Reset selbst erledigt (daher auch der Inverter aus Transistor und zwei Widerständen). Wobei man das vermutlich nicht braucht wenn man laut Datenblatt Reset fest auf Vcc setzt.

Ich spekuliere einfach mal dass das Problem des TO am fehlenden Takt für den AT89S52 liegen könnte.

Beitrag #7620633 wurde von einem Moderator gelöscht.
Gast #7621224
Lesenswert?

Juergen B. schrieb:

  1. die Signal MOSI,MISO,SCK kann ich aber nicht erkennen (Oszilloscope).

Wenn Du keinerlei Aktivität auf der SPI siehst, wird er kaum irgendwas ausgelesen haben. Das hier

avrdude: AVR device initialized and ready to accept instructions avrdude: Device signature = 0x656570

ist dann sicher gelogen. Der Wert stand noch zufällig in irgendeiner Variablen drin.

Mit MISO auf Low sollte als Signatur 0x000000 gelesen werden. Und man sollte auf MOSI und SCLK Aktivität sehen. Den Controller brauchst Du dafür nicht. Mit MISO auf High sollte 0xFFFFFF geliefert werden. Wenn das nicht klappt, ist der Brenner hin oder der Treiber falsch installiert.

#7621227
Lesenswert?

Soul E. schrieb:

avrdude: AVR device initialized and ready to accept instructions avrdude: Device signature = 0x656570

ist dann sicher gelogen. Der Wert stand noch zufällig in irgendeiner Variablen drin.

Das scheint auch bei den AVRs als Signatur zu kommen wenn etwas beim Zugriff auf den Chip schief geht. Man findet einige AVRDUDE Logs mit diesem Wert. Woher das "eep" kommt habe ich noch nicht untersucht.

#7623265
Lesenswert?

Ein Test mit einem AT89S51 und ISP kam bei mir zu unterschiedlichen Ergebnissen (AVRDUDE ging nicht, PROGISP hat funktioniert). Folgendes wurde verwendet:

  • ein USBasp Klon mit ATmega8L von 2013 (MX-USBISP V3.01), die Firmware ist die unveränderte Version von damals

  • ein USBasp Klon mit ATmega8L von 2023 (HW-437), die Firmware ist die unveränderte Version

  • AVRDUDE 6.3 mit den Ergänzungen für AT89S51 und AT89S52 in der "avrdude.conf" Datei

  • PROGISP 1.72 von 2010 (läuft auch unter Windows 7)

  • Beschaltung zum Programmieren entsprechend dem Datenblatt, allerdings mit externem Takt (ca. 14 MHz) anstelle Quarz (Bilder für beide Varianten siehe Anhang)

  • Reset wurde in unterschiedlichen Varianten beschaltet, siehe weiter unten.

Bezüglich Takt bei ISP den Hinweis aus dem Datenblatt beachten: "The maximum serial clock (SCK) frequency should be less than 1/16 of the crystal frequency"

Ergebnis:

  • Bei mir hat AVRDUDE 6.3 mit keinem der USBasp Klons und deren Firmware funktioniert, Reset wurde sowohl direkt als auch invertiert mit dem USBasp verbunden, zusätzlich auch noch fest auf Vcc gelegt

  • PROGISP 1.72 funktioniert mit beiden USBasp Klons problemlos, Reset ist direkt mit dem USBasp verbunden

Bei einem der USBasp Klons ist der ATmega8L nicht gelockt und man kann die Firmware auslesen. Man sieht schnell dass die Basis dafür eine alte Version (noch ohne TPI) der original USBasb Firmware von Thomas Fischl ist, mit ein paar kleinen Erweiterungen.

Die entscheidende Erweiterung für den AT89S51/2 ist ein zusätzlicher Parameter beim Connect Kommando (USBASP_FUNC_CONNECT), damit kann man festlegen dass Reset invertiert wird und bei "Programming Enable" der Rückgabewert für AT89S51/2 berücksichtigt wird (der ist anders als bei den AVRs).

PROGISP 1.72 verwendet diese Erweiterung, AVRDUDE benutzt sie nicht. Ich habe zum Testen auf die Schnelle diesen Parameter in AVRDUDE eingebaut, dann würde auch AVRDUDE mit den USBasp Klons und dem AT89S51/2 funktionieren.

Man findet auch ein paar Änderungen für die USBasp Firmware (z.B. auf Github) die automatisch beim Connect den AT89S51/2 erkennen und sich dann bezüglich Reset passend verhalten.

Alternativ kann neben dem hier bereits erwähnten AVRISP mkII auch der STK500 bzw. AVRISP mit AVR Studio 4 den AT89S51/2 programmieren.

Inwieweit sich alle USBasp Klons so wie beschrieben verhalten weiß ich nicht, aber vielleicht einfach mal PROGISP 1.72 ausprobieren.

Angehängte Dateien:
#7624122
Lesenswert?

Hallo,

vielen vielen Dank für Eure Beiträge. Speziellen Dank an Dieter S. für seinen ausführlichen und verständlichen Beitrag. Mein Problem konnte ich aber noch nicht lösen. Mein Status ist:

  1. Ich konnte auch den Treiber für den USBASP unter WINDOWS 11 installieren
1
https://alselectro.wordpress.com/2018/06/08/usbasp-how-to-install-driver-on-windows-8-10/ 
2
https://protostack.com.au/download/USBasp-win-driver-x86-x64-v3.0.7.zip
  1. Als Software habe ich PROGISP V1.72 verwendet
1
http://exploreembedded.com/wiki/images/1/1a/Progisp1.72.rar
  1. damit konnte ich den MC AT90S8515 programmieren Das RESET-Signal vom USBASP ist mit dem RESET-Signal vom MC verbunden. Interner Takt (Quarz 4Mhz)
  2. den MC AT89S52 konnte ich nicht programmieren Das RESET-Signal vom MC ist über 10K mit Vcc(+5V) verbunden. Das RESET-Signal invertiert oder direkt verbunden hat auch nicht funktioniert. Interner Takt (Quarz 4+16MHz) Meldung von PROGISP: "Chip Enable Program Error"
  3. der Unterschied zwischen Pkt.4 und 5 ist: den MC AT90S8515 hatte ich schon mit dem Board STK200 (Parallel Interface von Kanda, OS = WINDOWS XP) programmiert. Der MC AT89S52 ist neu.
  4. D.h. für mich das mein USBASP funktioniert, aber nicht für den MC AT89S51/52 ausgelegt ist. Kann ich für den USBASP eine entsprechende Firmware verwenden ? Die aktuelle Firmware ist: usbasp 2011-05-28.tar.gz --> Atmega8 Firmware von:
1
https://www.fischl.de/usbasp/

Juergen

#7624154
Lesenswert?

Vermutlich wird die Firmware des USBasb nicht die für PROGISP erforderliche Funktionalität enthalten.

Falls Dein USBasb auf einem ATmega8L basiert und Du die Möglichkeit hast ihn zu progammieren (z.B. mit einem zweiten USBasb) dann kannst Du die Firmware im Anhang ausprobieren. Diese stammt aus dem oben beschriebenen "USBasp Klon mit ATmega8L von 2023 (HW-437)". Die Fuses dafür sind:

HFUSE=0xc9 LFUSE=0xef

Damit funktioniert bei mir der Zugriff auf den AT89S51 mit PROGISP, Reset ist dabei direkt mit dem USBasp verbunden.

Angehängte Dateien:
#7624309
Lesenswert?

Hallo, ich konnte doch noch die neue Firmware auf den USPASP uploaden (anderes USB-Kabel für den UNO verwendet). Kleiner Erfolg: den MC AT89S51/52 kann ich nun löschen (Chip Erase, Blank Check = OK). Auch bei "Verify Signature" erhalte ich keine Meldung. Problem ist bei "Program FLASH". da erhalte ich auch keine Meldung und auch kein Fortschritts-Balken (den grünen).

Juergen

#7624375
Lesenswert?

Das Problem beim Programmieren kann ich nicht nachvollziehen. PROGISP braucht für ein einfaches "LED Blinken" Testprogramm weniger als eine Sekunde zum Schreiben, da taucht nicht mal ein Fortschrittsbalken auf. Im Status-Fenster steht dass die Datei geschrieben wurde, Verify bzw. Zurücklesen des Flash bestätigt auch dass die richtigen Daten geschrieben wurden.

#7624796
Lesenswert?

Hallo, mit dem richtigen Hex-File für den MC AT89S51/52 kann ich die MC's mit dem Programm PROGISP programmieren (mit Fortschrittsbalken). Mein Fehler: ich hatte zum Test den Hex-File für den MC AT90S8515 verwendet. Vielen Dank für Eure Hilfe. Hier noch einmal die Zusammenfassung:

  1. Interface: USBASP mit der Firmware: USBasb_Klon_HW-437_ATmega8.hex (bereitgestellt von Dieter S.)
  2. Treiber für WINDOWS 10/11 für den USBASP:
1
https://alselectro.wordpress.com/2018/06/08/usbasp-how-to-install-driver-on-windows-8-10/ 
2
https://protostack.com.au/download/USBasp-win-driver-x86-x64-v3.0.7.zip
  1. Programm PROGISP:
1
http://exploreembedded.com/wiki/images/1/1a/Progisp1.72.rar
  1. Schaltung für den MC AT89S51/52: Interner Takt mit Quarz 16 MHz
1
USBASP          AT89S51/52
2
1 MOSI  ------  6 P1.5 (MOSI)
3
2 VCC  -------  40 VCC (+5V)
4
3 
5
4 GND  -------  20 GND
6
5 RESET  -----  9 RST (mit Elko 10uF an +5V)
7
6 GND      
8
7 SCK  -------  8 P1.7 (SCK)
9
8 GND
10
9 MISO  ------  7 P1.6 (MISO)
11
10 GND
12
                31 +5V

Ich habe aber noch eine Frage zu den "Fuses": wozu werden die verwendet ?

Juergen

#7624815
Lesenswert?

Juergen B. schrieb:

Ich habe aber noch eine Frage zu den "Fuses": wozu werden die verwendet?

Geht es um die Fuses für den USBasp die ich weiter oben bei der Firmware angegeben habe?

Die Fuse Bits legen u.a. fest woher der Takt für den ATmega8 kommt (alle Details siehe Datenblatt des ATmega8). Vermutlich werden die Fuses bei einem USBasp auf ATmega8 Basis bereits stimmen, falls nicht sollte man die entsprechenden Werte einstellen (das sind auch die Werte für die USBasb Firmware von Thomas Fischl).

(Firma: matzetronics) #7624968
Lesenswert?

Der AT89S52 hat als einzige 'Fuse' Bits (obwohl sie nicht so bezeichnet werden) die drei Memory Lock Bits, die auf verschiedenen Ebenen den Zugang zum Programmspeicher verhindern. Sieht Tabelle 17.1 im Atmel Datenblatt.

Darin unterscheidet er sich von moderneren MC, wie der AVR8 Serie. Bei denen kannste alle möglichen Dinge festsetzen, die schon beim Start gelten, wie Oszillator Hardware, Resetvektoren, Startup Zeiten, Memory Lockouts usw. Sowas kann man bei den diversen Fuse Kalkulatoren im Internet anschauen.

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