
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.

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
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
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ą.

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
Po tej modyfikacji programator może programować zarówno AVR jak i AT89S52.
Code: bash

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