Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Programowanie układów AT89S5x za pomocą USBasp

Mlody_Zdolny 15 Apr 2023 18:50 3336 15
  • Programowanie układów AT89S5x za pomocą USBasp
    W starszym sprzęcie elektronicznym, który został wycofany z użytku, można znaleźć ciekawe elementy, w tym różnego rodzaju mikrokontrolery.
    Choć obecnie dostępne są bez problemu za niewielką kwotę 32-bitowe mikrokontrolery o dużej mocy obliczeniowej, wyposażone w interfejsy sieciowe, to czasem do realizacji projektu wystarczyć może starszy układ 8-bitowy, pozyskany przykładowo z urządzenia przeznaczonego do utylizacji.
    Szczególnie interesujące są układy 89S5x produkcji Atmel. Są to układy należące do rodziny 8051, wyposażone w interfejs ISP (literka S w oznaczeniu), który dzisiaj nie jest niczym niezwykłym a wręcz to normą, jednakże należy pamiętać, że inne układy z tej rodziny można było co najwyżej programować równolegle (np. AT89C51, nie wspominając o wersjach bez pamięci Flash).

    Zabierałem się za projekt zegara DCF77 z funkcją sterownika programowanego i szukałem odpowiedniego procesora.
    Ponieważ kilka układów 89S52 z demontażu posiadam w swoich zbiorach, postanowiłem je do tego celu wykorzystać. Żeby proces developmentu przebiegał zgodnie z obecnymi standardami, oczywiście chciałem wykorzystać do programowania ISP. Okazało się jednak, że wszystkie programatory do AVR, które posiadam, nie są w stanie skomunikować się z 89S52 w sposób szeregowy.

    Programowanie układów AT89S5x za pomocą USBasp

    Krótkie poszukiwania w sieci naprowadziły mnie na projekt USBasp: https://www.fischl.de/usbasp. W ciągu paru godzin powstał prototyp z ATmega8, montaż na uniwersalnej płytce. Uruchomienie przebiegło bez problemu, program avrdude wykrył programator.
    Niestety, podczas próby odczytania zawartości 89S52 dostawałem komunikat:
    Code: bash
    Log in, to see the code

    Coś było nie tak z komunikacją na linii USBasp - AT89S52.
    Debugging za pomocą oscyloskopu oraz poszukiwania w sieci przyniosły odpowiedź. Problem leżał w tym, że USBasp na sztywno miał wpisaną w kodzie procedurę ustawiania pinu RESET na interfejsie ISP. Układy AVR mają zanegowane wejście RESET, natomiast układy 89S5x posiadają to wejście niezanegowane. Inaczej mówiąc, stanem aktywnym RESET dla AVR jest stan niski, dla 89S5x stan wysoki.

    Autor USBasp na swej stronie umieścił źródła, w których można znaleźć przyczynę takiego stanu rzeczy:
    Code: c
    Log in, to see the code

    W powyższej funkcji, jak i w paru innych miejscach widać wyraźnie, że stanem aktywnym linii RESET jest stan niski, czyli standard AVR.
    Programator nie ma w tej sytuacji możliwości zmiany stanu aktywnego na niski, nawet jeśli komendy sterujące z USB niosłyby informację którego standardu USBasp powinien użyć podczas komunikacji z układem programowanym.

    Postanowiłem więc dodać "wajchę" sprzętową w postaci goldpinów i zworki, za pomocą której mogę ustalać, który poziom aktywny programator ma używać podczas programowania.
    Zworkę podłączyłem do pinu 26, który programator będzie sczytywał podczas programowania. Poniżej schemat znaleziony w sieci z dodaną moją zworką.

    Programowanie układów AT89S5x za pomocą USBasp

    W programie wszystkie miejsca ustawiające pin RESET zamieniłem na wywołania funkcji setReset(uchar), która w zależności od położenia wajchy ustawia w odpowiedni sposób linię RESET na interfejsie ISP.
    Code: c
    Log in, to see the code

    Po tej modyfikacji programator może programować zarówno AVR jak i AT89S52.
    Code: bash
    Log in, to see the code

    Programowanie układów AT89S5x za pomocą USBasp

    Kto chciałby zobaczyć pełne źródła z modyfikacją, załączam w archiwum, to jest wersja FW usbasp z 2011 roku.
    Attachments:

    Cool? Ranking DIY
    About Author
    Mlody_Zdolny
    Level 25  
    Offline 
    Jestem kotem
    Mlody_Zdolny wrote 765 posts with rating 381, helped 46 times. Been with us since 2022 year.
  • #3
    pawlik118
    Level 31  
    Cześć, czy 89LP2052 też da się programować tym zmodyfikowanym USBasp? Czy jest gdzieś lista kompatybilnych układów?
  • #4
    Mlody_Zdolny
    Level 25  
    pawlik118 wrote:
    Cześć, czy 89LP2052 też da się programować tym zmodyfikowanym USBasp? Czy jest gdzieś lista kompatybilnych układów?

    Cześć
    Do obsługi programatora używam programu avrdude version 6.3-20171130.
    Na liście obsługiwanych mikrokontrolerów niestety nie ma tego, o który pytasz.
    W ogóle sprawa wygląda nieciekawie, bo ta lista zawiera tylko jeden typ z rodziny 89x
    Valid parts are:
      uc3a0512 = AT32UC3A0512
      8052     = AT89S52
      c128     = AT90CAN128
      c32      = AT90CAN32 (...)

    Nowsze wersje avrdude, w tym najnowsza 7.1, z tego co widzę nie obsługują już żadnego ze starszych procesorów.

    Sam programator pewnie dałby radę zaprogramować, ale trzeba by dopisać taką funkcjonalność do avrdude.
    Być może inny soft jest w stanie zaprogramować, ale nie znam takiego.
  • #6
    ArturAVS
    Moderator HP/Truck/Electric
    Parę lat temu poradziłem sobie w prostszy sposób (jak dla mnie), dodałem pojedynczą bramkę 74HC1G14 oraz zworkę, którą przełącza się sygnał RESET (typowy lub zanegowany zależnie od programowanego uC).
  • #7
    Mamut
    Level 18  
    ekhm... Jakiś czas temu zrobiłem taki firmware:
    https://github.com/mamut-tme/UsbAsp-flash_89S52

    Obsługa s51 i s52 działa w nim bez problemu.

    Patch przyspieszający sck (to raczej do AVR, s51/52 nie chodzi przy tak szybkim zegarze) do avrdude w międzyczasie został włączony do głównego repo. To był projekt, który zrobiłem w czasie samoizolacji covidowej, niestety pod koniec umarł mi mój jedyny target at89s52, więc nie zdążyłem wszystkiego zoptymalizować.
  • #8
    Wirnick
    Level 29  
    @Mlody_Zdolny pobrałem Twoje źródła i poskładałem projekt z plikami oryginalnymi, ale to się nie kompiluje w Eclipse.
    Nawet oryginalne projekty nie kompilują się - czegoś brakuje (a na pewno mam mały poziom oleju).
    Programowanie układów AT89S5x za pomocą USBasp
    Dodam więcej punktów za binarium Twojego projektu, by reanimować kilka starych procesorów.
    Będę wdzięczny za podzielenie się efektami Twojej pracy.
  • #9
    Mlody_Zdolny
    Level 25  
    @Wirnick ja kompiluję u siebie w środowisku linuksowym (Mint Vera 21.1) z użyciem najnowszych wersji narzędzi wokół gcc i avr. Do kompilacji wykorzystuję Makefile wywołując w katalogu firmware polecenie:

    Code: bash
    Log in, to see the code
  • #10
    Wirnick
    Level 29  
    @Mlody_Zdolny bardzo dziękuję za odzew, ale plik .hex jest niezależny od środowiska programistycznego. Obecnie programuję w MPLAB-ie (po przejęciu firmy Atmel przez Microchipa). Idę w nowe nie zapominając o historii elektrośmieci. W Naszym wypadku o hexe decyduje avrdude.
  • #11
    Mlody_Zdolny
    Level 25  
    Wirnick wrote:
    ale plik .hex jest niezależny od środowiska programistycznego

    Tak, ale narzędzia, za pomocą których jest tworzony hex zależą od środowiska. Są ich wersje na Linuxa i na Windowsa, dlatego podałem krótki opis swojej konfiguracji. MplabX może używać xc8, ale też gcc. Natomiast Avrdude jest programem, który obsługuje programator USBasp za pomocą komend sterujących po USB.
  • #12
    Wirnick
    Level 29  
    Ja to jak zwykle, zakręciłem się. Myślałem o AVR Toolchain, a napisałem avrdude. Mam rozumieć, że już nie będziesz się dzielił owocami pracy?
  • #13
    Mlody_Zdolny
    Level 25  
    Wirnick wrote:
    Mam rozumieć, że już nie będziesz się dzielił owocami pracy?

    Mogę się podzielić hexem, ale ogólnie uważam, że źródła niosą większą wartość, bo każdy może coś zmienić według swoich potrzeb. Wyślę coś wieczorem.

    Być może problem z kompilacją jest w plikach usbdrv.* gdzie wystarczy dodać 'const', na przykład:
    PROGMEM const char usbDescriptorString0[].
    Załączam pliki z tą modyfikacją i hexa.
  • #14
    Mamut
    Level 18  
    hex do mojego wariantu firmware (link wyżej). Nie wymaga żadnej modyfikacji schematu oryginalnego USBasp.
    Wykrywanie czy jest s5x czy avr, jest automatyczne. Inicjalizacja targetu najpierw próbuje AVR, potem s5x. Komentarze w kodzie mogą wyglądać dziwnie, ale to jest połączenie dwóch różnych rozwiązań, tu jest również obsługa i2c i spi (i chyba microwire?) do pamięci szeregowych (jest na repo oprogramowanie, choć powiem szczerze, że nie sprawdzałem tego).
  • #15
    Wirnick
    Level 29  
    @Mlody_Zdolny dziękuję bardzo i jesteś moim Przyjacielem!
    Osiągnąłem sukces co przedstawiam na dołączonym obrazku. Dokonałem jeszcze poprawki w ścieżkach #include w pliku main.c i usbdrv.h oraz w pliku clock.h zmieniłem na //#define F_CPU 12000000L /* 12MHz */ . Przy czym teraz tworzy się plik.eep, który również trzeba wgrać do AT8(tak myślę).

    Programowanie układów AT89S5x za pomocą USBasp

    Przystępuję do budowy programatora.
    Pozdrawiam
    Wirnick

    @Mamut jestem również zainteresowany Twoim projektem ze względu na możliwość odczytywania i programowania bardzo wielu układów. Programuję w Delphi 10.1 Berlin. Czy jest możliwość przeniesienia Twojego projektu programu do mojej platformy?
  • #16
    Mamut
    Level 18  
    Wirnick wrote:
    @Mamut jestem również zainteresowany Twoim projektem ze względu na możliwość odczytywania i programowania bardzo wielu układów. Programuję w Delphi 10.1 Berlin. Czy jest możliwość przeniesienia Twojego projektu programu do mojej platformy?

    Niestety nie bardzo jestem w stanie z tym pomóc. Tak jak jest napisane w opisie repo na githubie mój kod jest połączeniem rozwiązania od niejakiego nofeletru (z Moskwy) i Miles'a McCoo (z nieistniejącej strony, ale można jeszcze wejść przez archive.org). Wiele partii kodu od Miles'a zmodyfikowałem, bo obsługa s5x była dość powolna i nad tym głównie pracowałem - dorobiłem odczyt (sprawdzony) i zapis (niesprawdzony) stronicowany, czyli paged mode i jeszcze kilka innych ulepszeń na podstawie analizy dokumentacji od AT89S51/52. Natomiast z kodu od nofeletru "zgapiłem" 3 MHz SCK dla AVR (nie ma tego oryginalny USBasp) i dodałem swój własny 6 MHz, ale on zadziała tylko z chipami z kwarcem 20 MHz, a po zmianach w prockach jak jeszcze były Atmela nie wiem czy jakieś jeszcze mogą pracować z taką częstotliwością (kiedyś chyba ATTiny2313 mógł, były inne, ale nie pamiętam). Części do obsługi pamięci szeregowych nie ruszyłem, jest bez zmian.
    Tak jak pisałem, był to dla mnie taki projekt "covidowy" miałem w domu jakieś elementy i zrobiłem z nich użytek. Potem jedyny S52 umarł, wróciłem do pracy i projekt poszedł do szuflady.