
Programator umożliwia:
- programowanie i zrzucanie zawartości pamięci mikrokontrolerów jednoukładowych Atmel AT89CX051
- programowanie i zrzucanie zawartości pamięci EEPROM I2C AT24C02
- komunikację z urządzeniami slave 1-wire
- generowanie sygnału zegarowego dla Atmela, wystawianie i pobieranie wartości portów (coś jakby zalążek interfejsu debuggera)
Programator ma interfejs szeregowy RS-232 (na układzie MAX232), ale ma także wyprowadzone złącze UART, co pozwala podłączyć go do portu USB. W tym celu używam kabla USB typu Nokia CA-42 (nieoryginalny, na chipie ArkMicro 3116), ze zmienioną końcówką pasującą do złącza UART.
Programator jest zasilany napięciami 5V i 12V, ma gniazdo zasilania Molex. Do zasilania używam prostego zasilacza transformatorowego z prostownikiem na mostku Graetza i stabilizatorami 7805 i 7812.



Programator jest zbudowany na mikrokontrolerze DS89C430 i jest "samoprogramowalny", tzn. firmware do głównego mikrokontrolera można wgrać w zmontowanym układzie.
Firmware napisałem tak, że interfejs od strony komputera jest kompatybilny z interfejsem ISP układu DS89C420.
Inaczej mówiąc, dzięki temu programatorowi można wgrywać firmware do mikrokontrolerów AT89CX051 (pozbawionych ISP, mających tylko równoległy protokół programowania) w taki sam sposób (z użyciem tych samych narzędzi), co do wyposażonych w ISP mikrokontrolerów DS89C4X0.
Aczkolwiek muszę tutaj zastrzec, że nie testowałem działania z oryginalnym programem Dallas Semiconductor Microcontroller ToolKit dla Windows, a jedynie z opensource'owym odpowiednikiem dla Linuxa (dsmtk).
Interfejs ten jest opisany w rozdziale 15 dokumentu Ultra-High-Speed Flash Microcontroller User's Guide (USER GUIDE 4833) i tam też odsyłam po szczegóły; skrótowo napiszę tylko, że jest to interfejs komend tekstowych, a zawartość pamięci jest przesyłana w formacie Intel Hex.
W mojej implementacji występują oczywiście pewne różnice. Nie ma funkcji automatycznego dopasowywania baudrate, zamiast tego używana jest zawsze prędkość 57600 bodów. Lista komend pokrywa się tylko częściowo z oryginalną. Oto ona:
- W <port> <bajt_hex> - wystawienie bajtu na port
Wystawia podaną wartość na określony port mikrokontrolera sterującego.
Możliwe porty: P0, P1, P2, P3.
Przykład: W P0 FF - R <port> - pobranie wartości portu
Odczytuje wartość z podanego portu mikrokontrolera sterującego.
Możliwe porty: P0, P1, P2, P3.
Przykład: R P0 - L - ładowanie programu do pamięci Flash Atmela z weryfikacją (zalecane)
Dla tego polecenia dostępny jest wrapper w programie dsmtk: /load, umożliwiający wczytanie pliku hex z dysku. - LB - ładowanie programu do pamięci Flash Atmela bez weryfikacji (niezalecane)
Dla tego polecenia dostępny jest wrapper w programie dsmtk: /load_blind, umożliwiający wczytanie pliku hex z dysku. - V - weryfikacja zawartości pamięci Flash Atmela
Dla tego polecenia dostępny jest wrapper w programie dsmtk: /verify, umożliwiający wczytanie pliku hex z dysku. - D <adres_początku> <adres_końca> - zrzut pamięci Flash Atmela
Adresy są słowami 16-bitowymi. <adres_końca> to adres pierwszego niezrzucanego bajtu.
Przykład: D 0000 0800 - DS <adres_początku> <adres_końca> - zrzut sygnatury
Przykład: DS 0000 0020 - K - kasowanie pamięci Flash Atmela
- LX - ładowanie pamięci I2C EEPROM (AT24C02)
Dla tego polecenia dostępny jest wrapper w programie dsmtk: /load_extern, umożliwiający wczytanie pliku hex z dysku. - DX <adres_początku> <adres_końca> - zrzut pamięci EEPROM
Starsze bajty adresów są ignorowane.
Przykład: DX 0000 00FF - G - obsługa generatora sygnału zegarowego dla Atmela
- wyłączenie sygnału zegarowego: G
- włączenie sygnału zegarowego: G <słowo_hex>
<słowo_hex> jest początkową wartością 16-bitowego timera, po przepełnieniu którego każdorazowo będzie zmieniany stan linii XTAL1 Atmela. - wypisanie aktualnego stanu timera: G_ (gdzie _ oznacza spację)
[*:a7d7e03acf]A - wypisanie aktualnego adresu programowania Atmela
Wypisuje <słowo_hex> z aktualnym adresem programowania Atmela. (Programator prowadzi mirror tego wewnętrznego licznika Atmela.)
[*:a7d7e03acf]M <bajt_hex> - ustawienie wartości górnego bajtu 16-bitowego licznika adresu Atmela, przy której licznik ten przekręca się na 0
Domyślnie jest to wartość 16 - licznik przekręca się przy 4 KB. Dla AT89C2051, mającego 2 KB, wystarczyłoby 8. Jednak za duża wartość spowoduje tylko to, że programator niepotrzebnie przekręci licznik adresu więcej razy niż trzeba przy próbie jego wyzerowania.
[*:a7d7e03acf]1WR - resetowanie magistrali 1-wire
[*:a7d7e03acf]1W - komunikacja z magistralą 1-wire
- 1W <ciąg_bajtów_hex> - wysłanie ciągu bajtów na magistralę
- 1W - odczyt bajtu z magistrali
Przykład - odczyt temperatury z DS18B20:
1WR
1W CC44
1WR
1W CCBE
1W
1W
Firmware tłumaczy te komendy odpowiednio na:
- protokół programowania równoległego AT89CX051, opisany w dokumencie AT89C2051 Complete (doc0368) - dot. L, LB, V, D, DS, K
- protokół programowania AT24C02 po I2C, opisany w dokumencie Interfacing AT24CXX Serial EEPROMs with AT89CX051 MCU (doc0507) - dot. LX, DX
- protokół 1-wire - dot. 1WR, 1W
Schemat programatora:


Na schemacie brakuje jeszcze kondensatora 1uF między RST DS89C430 a VCC. Zapewne niejeden mógłby wytknąć, że na schemacie brakuje też kondensatorów 100nF przy scalakach, a układ resetu jest niekompletny, ale w praktyce układ działa, więc nie widzę potrzeby w nim dalej grzebać.
Na schemacie płytki są tylko rozmieszczone elementy, brak narysowanych połączeń wynika stąd, że łatwo było narysować scieżki ręcznie od razu na płytce (port P2 Dallasa z P1 Atmela połączyłem taśmą 8-żyłową).
Dioda LED sygnalizuje obecność napięcia 12V na pinie RST/VPP Atmela.
Programator ma 3 przełączniki:
- S2: RESET DS
- S1: PROG DS
- S3: PROG AT
Wejście w tryb programowania procesora głównego (ISP) polega na włączeniu RESET DS i PROG DS już przed podłączeniem zasilania.
Obsługa 1-wire i EEPROM I2C jest możliwa przy wyłączonych wszystkich przełącznikach, ale także przy włączonym PROG AT.
Programowanie (także zczytywanie pamięci) AT89CX051 jest możliwe przy włączonym PROG AT, który podłącza sterowanie resetem Atmela z głównego procesora (przełączanie między 5V/12V).
Przy wyłączonym PROG AT Atmel może normalnie działać, bo przy pomocy komend G/W/R można generować sygnał zegarowy dla Atmela oraz czytać i ustawiać wartości portów, jest nawet wyprowadzone złącze portu UART Atmela. Jednak użyteczność takiego trybu działania jest w sumie niewielka.
Załączniki:
- Pliki schematu w formacie programu Eagle (widoczne powyżej jako png)
- Firmware - asm (1569 linii w asemblerze, ASEM-51), hex
Cool? Ranking DIY