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:
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.
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
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.
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
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/
Hier weiss ich leider nicht ob es an dem fehlenden Bootloader oder an der Verdrahtung (habe ich nätürlich mehrmals geprüft) liegt.
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 ?
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 ?
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.
Ich spekuliere einfach mal dass das Problem des TO am fehlenden Takt für
den AT89S52 liegen könnte.
PICs koennen auch ohne Takt ICSP. Sind wohl intelligenter.
Sagt ja auch das Datenblatt: "Peripheral Intelligent Computer".
Aber einen artgerechten Reset moechten sie schon.
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.
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.
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.
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:
Ich konnte auch den Treiber für den USBASP unter WINDOWS 11 installieren
damit konnte ich den MC AT90S8515 programmieren
Das RESET-Signal vom USBASP ist mit dem RESET-Signal vom MC verbunden.
Interner Takt (Quarz 4Mhz)
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"
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.
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:
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.
Hallo,
Danke für die Firmware USBASP.
Gestern konnte ich noch die Firmware mit einem ARDUINO UNO uploaden, jetzt wird der UNO nicht mehr erkannt.
D.h. ich muss mir ersteinmal einen neuen bestellen (das kann etwas dauern).
Ich werde mich dann wieder melden.
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).
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.
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:
Interface: USBASP mit der Firmware: USBasb_Klon_HW-437_ATmega8.hex (bereitgestellt von Dieter S.)
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).
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.