Elektroda.de
Elektroda.de
X

Programmieren von AT89S5x-Schaltungen mit USBasp

Mlody_Zdolny 3438 15
This content has been translated flag-pl » flag-de View the original version here.
  • Programmieren von AT89S5x-Schaltungen mit USBasp
    In älteren elektronischen Geräten, die aus dem Gebrauch gezogen wurden, findet man interessante Bauteile, darunter verschiedene Arten von Mikrocontrollern.
    Obwohl heutzutage 32-Bit-Mikrocontroller mit hoher Rechenleistung und Netzwerkschnittstellen für kleines Geld leicht erhältlich sind, reicht manchmal ein älterer 8-Bit-Chip, beispielsweise aus einem zur Entsorgung vorgesehenen Gerät, aus, um das Projekt umzusetzen.
    Besonders interessant sind die 89S5x-Chips von Atmel. Dies sind Schaltungen der 8051-Familie, ausgestattet mit einer ISP-Schnittstelle (der Buchstabe S in der Bezeichnung), was heute nichts Ungewöhnliches und sogar eine Norm ist, wobei jedoch zu bedenken ist, dass andere Schaltungen dieser Familie nur parallel einprogrammiert werden konnten (z. B. AT89C51, ganz zu schweigen von Versionen ohne Flash-Speicher).

    Ich fing an, eine DCF77-Uhr mit programmierbarer Steuerungsfunktion zu entwerfen, und suchte nach einem geeigneten Prozessor.
    Da ich mehrere 89S52-Schaltungen aus der Demontage in meiner Sammlung habe, habe ich mich entschieden, diese für diesen Zweck zu verwenden. Damit der Entwicklungsprozess nach aktuellen Standards abläuft, wollte ich natürlich ISP für die Programmierung nutzen. Es stellte sich jedoch heraus, dass alle AVR-Programmierer, die ich habe, nicht in der Lage sind, seriell mit dem 89S52 zu kommunizieren.

    Programmieren von AT89S5x-Schaltungen mit USBasp

    Eine kurze Websuche führte mich zum USBasp-Projekt: https://www.fischl.de/usbasp. Innerhalb weniger Stunden entstand ein Prototyp mit ATmega8, montiert auf einer universellen Platine. Der Start verlief problemlos, das Programm avrdude erkannte den Programmierer.
    Leider bekam ich beim Versuch, den Inhalt von 89S52 abzulesen, folgende Meldung:

    Code: bash
    Melde dich an, um den Code zu sehen

    Irgendetwas stimmte nicht mit der Kommunikation auf der Leitung USBasp - AT89S52.
    Debugging mit einem Oszilloskop und Suchen im Internet brachten die Antwort. Das Problem war, dass USBasp eine fest codierte Prozedur zum Setzen des RESET-Pins auf der ISP-Schnittstelle hatte. Die AVR-Chips haben einen negierten RESET-Eingang, während die 89S5x-Chips einen nicht negierten Eingang haben. Mit anderen Worten, der RESET-Aktivzustand für AVR ist niedrig, für 89S5x ist er hoch.

    Der Autor von USBasp hat auf seiner Website Quellen hinterlegt, wo man den Grund für diesen Sachverhalt finden kann:
    Code: c
    Melde dich an, um den Code zu sehen

    In der obigen Funktion, sowie an einigen anderen Stellen ist es klar, dass der aktive Zustand der RESET-Leitung low ist, was dem AVR-Standard entspricht.
    In dieser Situation hat der Programmierer keine Möglichkeit, den aktiven Zustand auf low zu ändern, selbst wenn die USB-Steuerbefehle Informationen darüber enthalten würden, welchen Standard der USBasp bei der Kommunikation mit dem programmierten Chip verwenden sollte.

    Also habe ich beschlossen, einen Hardware-"Griff" in Form eines Goldpins und eines Jumpers hinzuzufügen, mit dem ich bestimmen kann, welchen aktiven Zustand der Programmierer während der Programmierung verwenden soll.
    Ich habe den Jumper an Pin 26 angeschlossen, den das Programmiergerät während der Programmierung ausliest. Unten sieht man einen schaltplan aus dem Internet mit meinem Jumper hinzugefügt.

    Programmieren von AT89S5x-Schaltungen mit USBasp

    Im Programm habe ich alle Stellen, die den RESET-Pin setzen, durch Aufrufe der setReset(uchar)-Funktion ersetzt, die die RESET-Leitung an der ISP-Schnittstelle je nach Position des Griffes entsprechend setzt.

    Code: c
    Melde dich an, um den Code zu sehen

    Nach dieser Änderung kann der Programmierer sowohl den AVR als auch den AT89S52 programmieren.

    Code: bash
    Melde dich an, um den Code zu sehen

    Programmieren von AT89S5x-Schaltungen mit USBasp

    Diejenigen, die die vollständigen Quellen mit der Änderung sehen möchten, füge ich im Archiv, das ist die FW-Version von usbasp von 2011.
    Anhänge:

    Cool? DIY-Rangliste
    Über den Autor
    Mlody_Zdolny
    Niveau 25  
    Offline 
    Mlody_Zdolny hat 765 Beiträge geschrieben mit der Bewertung 384 geschrieben, und dabei 46 Mal geholfen. Er ist seit 2022 bei uns.
  • #2
    Zubiik
    Niveau 14  
    Dank dir kann ich endlich meine Prozessoren wiederbeleben, danke!
  • #3
    pawlik118
    Niveau 31  
    Hallo, kann der 89LP2052 auch mit diesem modifizierten USBasp programmiert werden? Gibt es irgendwo eine Liste mit kompatiblen Chips?
  • #4
    Mlody_Zdolny
    Niveau 25  
    pawlik118 hat geschrieben:
    Hallo, kann der 89LP2052 auch mit diesem modifizierten USBasp programmiert werden? Gibt es irgendwo eine Liste mit kompatiblen Chips?

    Hallo
    Ich verwende avrdude Version 6.3-20171130, um den Programmierer zu betreiben.
    Leider enthält die Liste der unterstützten Mikrocontroller nicht den, nach dem du fragst.
    Generell sieht der Fall nicht interessant aus, denn diese Liste enthält nur einen Typ aus der 89x-Familie

    Valid parts are:
      uc3a0512 = AT32UC3A0512
      8052     = AT89S52
      c128     = AT90CAN128
      c32      = AT90CAN32 (...)

    Neuere Versionen von avrdude, einschließlich der neuesten 7.1, unterstützen meines Erachtens keine der älteren Prozessoren mehr.

    Der Programmierer selbst wäre wahrscheinlich in der Lage, es zu programmieren, aber du müsstest avrdude eine solche Funktionalität hinzufügen.
    Vielleicht kann es eine andere Software programmieren, aber ich kenne keine.
  • #5
    gulson
    Forenbetreiber
    Großartig, schreiben Sie mir für ein kleines Geschenk.
  • #6
    ArturAVS
    Moderator HP/Truck/Electric
    Vor ein paar Jahren habe ich es einfacher gemacht (was mich betrifft), ich habe ein einzelnes 74HC1G14-Gate und einen Jumper hinzugefügt, der das RESET-Signal schaltet (typisch oder negiert, abhängig vom programmierten uC).
  • #7
    Mamut
    Niveau 18  
    ähm... Vor einiger Zeit habe ich diese Firmware gemacht:
    https://github.com/mamut-tme/UsbAsp-flash_89S52

    Die Unterstützung für s51 und s52 funktioniert darin problemlos.

    Patch zur Beschleunigung von sck (eher für AVR, s51/52 funktioniert nicht mit so einer schnellen Uhr) für avrdude wurde inzwischen in dem Haupt-Repo angeschlossen. Es war ein Projekt, das ich während der Covid-Selbstisolation gemacht habe, leider ist mein einziges Ziel bei 89s52 am Ende gestorben, also hatte ich keine Zeit, alles zu optimieren.
  • #8
    Wirnick
    Niveau 29  
    @Mlody_Zdolny Ich habe deine Quellen heruntergeladen und das Projekt mit den Originaldateien zusammengestellt, aber es lässt sich nicht in Eclipse kompilieren.
    Sogar die ursprünglichen Projekte lassen sich nicht kompilieren - etwas fehlt (und ich habe definitiv wenig Öl).
    Programmieren von AT89S5x-Schaltungen mit USBasp
    Ich werde mehr Punkte für die Binärdatei deines Projekts geben, um einige alte Prozessoren wiederzubeleben.
    Ich wäre dir dankbar, wenn du die Ergebnisse deiner Arbeit teilen würdest.
  • #9
    Mlody_Zdolny
    Niveau 25  
    @Wirnick Ich kompiliere in einer Linux-Umgebung (Mint Vera 21.1) mit den neuesten Versionen der Tools rund um gcc und avr. Ich verwende Makefile zum Kompilieren, indem ich den folgenden Befehl im Firmware-Ordner ausführe:

    Code: bash
    Melde dich an, um den Code zu sehen
  • #10
    Wirnick
    Niveau 29  
    @Mlody_Zdolny vielen Dank für deine Antwort, aber die .hex-Datei ist unabhängig von der Entwicklungsumgebung. Ich programmiere derzeit in MPLAB (nach der Übernahme von Atmel durch Microchip). Ich gehe auf das Neue ein, ohne die Geschichte des Elektroschrotts zu vergessen. In unserem Fall wird das Hex durch avrdude bestimmt.
  • #11
    Mlody_Zdolny
    Niveau 25  
    Wirnick hat geschrieben:
    aber die .hex-Datei ist unabhängig von der Entwicklungsumgebung

    Ja, aber die Werkzeuge, mit denen Hex erstellt wird, hängen von der Umgebung ab. Es gibt Versionen für Linux und Windows, daher habe ich meine Konfiguration kurz beschrieben. MplabX kann xc8 verwenden, gcc aber auch. Avrdude hingegen ist ein Programm, das den USBasp-Programmierer mithilfe von USB-Steuerbefehlen unterstützt.
  • #12
    Wirnick
    Niveau 29  
    Wie üblich habe ich mich verirrt. Ich dachte an AVR Toolchain und schrieb avrdude. Soll ich verstehen, dass du die Früchte deiner Arbeit nicht länger teilen wirst?
  • #13
    Mlody_Zdolny
    Niveau 25  
    Wirnick hat geschrieben:
    Soll ich verstehen, dass du die Früchte deiner Arbeit nicht länger teilen wirst?

    Ich kann das Hex teilen, aber im Allgemeinen denke ich, dass die Quellen mehr Wert haben, weil jeder etwas nach seinen Bedürfnissen ändern kann. Ich schicke heute Abend etwas.

    Vielleicht liegt das Problem mit Kompilierung in den usbdrv.*-Dateien, wo man nur 'const' hinzufügen muss, zum Beispiel:
    PROGMEM const char usbDescriptorString0[].
    Ich hänge Dateien mit dieser Modifikation und Hex-Dateien an.
  • #14
    Mamut
    Niveau 18  
    hex zu meiner Firmware-Variante (Link oben). Es erfordert keine Änderung des ursprünglichen Schaltplans von USBasp.
    Die Erkennung, ob es sich um s5x oder avr handelt, erfolgt automatisch. Die Target-Initialisierung versucht zuerst AVR, dann s5x. Kommentare im Code mögen seltsam aussehen, aber es ist eine Kombination aus zwei verschiedenen Lösungen, es gibt auch i2c- und spi- (und Microwire?) Unterstützung für seriellen Speicher (es gibt Software auf dem Repo, obwohl ich es ehrlich gesagt nicht überprüft habe ).
  • #15
    Wirnick
    Niveau 29  
    @Mlody_Zdolny vielen Dank und du bist mein Freund!
    Ich habe Erfolg erzielt, wie im beigefügten Bild gezeigt. In der Datei main.ci und usbdrv.h habe ich eine Korrektur in den #include-Pfade vorgenommen und in der Datei clock.h habe ich geändert auf //#define F_CPU 12000000L /* 12MHz */ . Gleichzeitig wird die Datei .eep erstellt, die auch auf AT8 hochgeladen werden muss (glaube ich).

    Programmieren von AT89S5x-Schaltungen mit USBasp

    Ich fange an einen Programmierer zu bauen.
    Grüße
    Wirnik

    @Mamut ich interessiere mich auch für Ihr Projekt aufgrund der Fähigkeit, sehr viele Schaltungen zu lesen und zu programmieren. Ich programmiere in Delphi 10.1 Berlin. Ist es möglich, dein Programmprojekt auf meine Plattform zu übertragen?
  • #16
    Mamut
    Niveau 18  
    Wirnick hat geschrieben:
    @Mamutich interessiere mich auch für Ihr Projekt aufgrund der Fähigkeit, sehr viele Schaltungen zu lesen und zu programmieren. Ich programmiere in Delphi 10.1 Berlin. Ist es möglich, dein Programmprojekt auf meine Plattform zu übertragen?

    Da kann ich leider nicht viel helfen. Wie es in der Github-Repo-Beschreibung heißt, ist mein Code eine Kombination aus einer Lösung von nofeletru (aus Moskau) und Miles McCoo (von einer nicht mehr existierenden Site, aber man kann immer noch über archive.org darauf zugreifen). Ich habe viele Teile des Codes von Miles modifiziert, weil die s5x-Unterstützung ziemlich langsam war und daran habe ich hauptsächlich gearbeitet - ich habe den Paged Mode zum Lesen (verifiziert) und Schreiben (nicht verifiziert) und einige andere Verbesserungen basierend auf der Analyse der Dokumentation des AT89S51/52 vorgenommen. Aus dem Code von nofeletru habe ich jedoch 3 MHz SCK für AVR "übernommen" (der ursprüngliche USBasp hat es nicht) und meine eigenen 6 MHz hinzugefügt, aber es funktioniert nur bei Chips mit Quarzoszillator 20 MHz und nach Änderungen in Prozessoren, da sie immer noch von Atmel waren, weiß ich nicht, ob einige andere mit dieser Frequenz arbeiten können (einmal denke ich, dass ATTiny2313 konnte, es gab andere, aber ich erinnere mich nicht). Ich habe das Teil für den seriellen Speicher nicht angerührt, es ist unverändert.
    Wie ich schrieb, war es für mich ein "covid"-Projekt, ich hatte einige Bauteile zu Hause und habe sie genutzt. Dann ist der einzige S52 gestorben, ich kam wieder an die Arbeit und das Projekt wanderte in die Schublade.
    [F]