Elektroda.pl
Elektroda.pl
X
SterControl
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Programator AT89CX051 i AT24C02 + 1-wire na RS-232 i USB

Sam Sung 27 Paź 2012 19:34 10083 5
  • Programator AT89CX051 i AT24C02 + 1-wire na RS-232 i USB
    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 AT89CX051 i AT24C02 + 1-wire na RS-232 i USB Programator AT89CX051 i AT24C02 + 1-wire na RS-232 i USB Programator AT89CX051 i AT24C02 + 1-wire na RS-232 i USB

      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ę)
    • A - wypisanie aktualnego adresu programowania Atmela
      Wypisuje <słowo_hex> z aktualnym adresem programowania Atmela. (Programator prowadzi mirror tego wewnętrznego licznika Atmela.)
    • 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.
    • 1WR - resetowanie magistrali 1-wire
    • 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:
      Programator AT89CX051 i AT24C02 + 1-wire na RS-232 i USB Programator AT89CX051 i AT24C02 + 1-wire na RS-232 i USB
      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


    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
  • SterControl
  • #2 28 Paź 2012 09:56
    robkry
    Poziom 14  

    Niezły projekt, wykonanie i sposób wykorzystania oprogramowania Dallasa czy też jego opensourcowych odpowiedników.

    BTW

    Cytat:
    Dioda LED sygnalizuje obecność napięcia 12V na pinie RST/VPP Atmela.

    czy na schemacie jest prawidłowo spolaryzowana?

  • SterControl
  • #3 28 Paź 2012 11:17
    Sam Sung
    Poziom 31  

    robkry napisał:
    Cytat:
    Dioda LED sygnalizuje obecność napięcia 12V na pinie RST/VPP Atmela.
    czy na schemacie jest prawidłowo spolaryzowana?
    Racja, na schemacie dioda LED jest odwrotnie.

  • #4 28 Paź 2012 18:26
    MrDarkenRahl
    Poziom 13  

    Gratuluję konstrukcji, być może w przyszłości komunikacja 1-wire mi się przyda (planuję budowę małej stacji meteo, ale to pieśń przyszłości). Ode mnie 5/5.

    Mały offtop - czy kabel typu Nokia CA-42 mogę użyć jako erzac dla przejściówki na układzie FT232? Bo za cenę najtańszego kabla CA-42 mogę kupić co najwyżej sam układ scalony...
    Pozdrawiam
    Darken

    EDIT
    Aha - czy taka przejściówka będzie działać na 64 bitowym Windows 7?

  • #5 03 Lis 2012 12:23
    Sam Sung
    Poziom 31  

    MrDarkenRahl napisał:
    czy kabel typu Nokia CA-42 mogę użyć jako erzac dla przejściówki na układzie FT232?
    Jeśli wystarczą Ci linie TxD i RxD z poziomami napięć TTL, to tak. Można to od razu podłączyć do mikrokontrolera - skorzystałem z tego w tym projekcie.

    MrDarkenRahl napisał:
    czy taka przejściówka będzie działać na 64 bitowym Windows 7?
    Zależy, czy są dostępne sterowniki do chipa użytego w kablu.
    Spotkałem się z kablami na chipach ArkMicro 3116 i Prolific PL2303, oba działają w Linuksie.
    Kabel do Siemens x65/x75 również zgłasza się jako Prolific PL2303, więc może też by się nadawał.

  • #6 06 Lis 2012 00:20
    voldek
    Poziom 11  

    Witam,

    po pierwsze gratuluję projektu! Niestety nie miałem zbytnio czasu zobaczyć innych projektów...spytam się jednakże, czy zajmujesz się elektroniką hobbystycznie czy studiujesz/zajmujesz się zawodowo? Jeśli to drugi to poniższe uwagi radziłbym traktować nie jako "czepialstwo tetryka" ale po prostu jako uwagi techniczne o których warto pamiętać na przyszłość.

    Sam Sung napisał:
    programowanie i zrzucanie zawartości pamięci mikrokontrolerów jednoukładowych Atmel AT89CX051

    Pogrzebałem troszkę w necie i może się nie znam na tym za bardzo ale...czy mikrokontroler może być wieloukładowy? Sam mikrokontroler jako chip, kawałek krzemu zamknięty w plastikowej obudowie z wyprowadzeniami, będący autonomicznym układem. Wiem, że istnieją obwody wieloukładowe, zestawy ewaluacyjne wieloukładowe...ale mikrokontrolery? I jeśli tak to na czym by to miało polegać?


    Sam Sung napisał:
    prędkość 57600 bodów

    Prędkość jest wektorowa i odnosi się do ruchu. Szybkość jest skalarna i odnosi się do zmian w czasie, zatem powinno się mówić/pisać "szybkość przesyłu danych", "szybkość 57600 bodów".

    Co do samego schematu to mogłeś się bardziej postarać przy jego projektowaniu. Zalecane jest rysowanie linii pod kątem prostym (z wyjątkiem pogrubionych linii magistrali). Przede wszystkim jest to czytelniejsze i bardziej estetyczne. Widać wiele nadmiarowych węzłów (w eagle'u to się chyba "joint" nazywa), uważaj przy tym bo jak kiedyś naskrobiesz sobie schemat na kilka arkuszy to się umordujesz zanim znajdziesz błąd. Obwód dla maxa232 wystarczyło lekko przesunąć w lewo i wyrównać ścieżki, od razu byłoby to czytelniejsze. Czemu nie są wyświetlane wartości kondensatorów C1-C4? Etykietki przy obwodzie z tranzystorami są daleko przesunięte od elementów i kompletnie nieczytelne. Potrafiłbyś na czarno-białym wydruku schematu powiedzieć jaką wartość ma rezystor R2? Jak dla mnie może mieć wartość 4,7k ale również 47k. Czy rezonatory w eagle'u są oznaczane tą samą literą co tranzystory? Pytam z ciekawości. Ponadto totalnie losowo umieszczasz nazwę/numer elementów i jego wartość. Dla przykładu rezystory R4 i R5. Jeśli już trzymasz się konwencji u góry nazwa, pod spodem wartość to polecam trzymać się jej do końca, ponieważ znacząco podnosi to czytelność schematu i szybciej można coś z niego odczytać. Argument, że jakiś element jest niepotrzebny bo i tak układ działa jest niebezpiecznie bliski sformułowaniu, że "po co w samochodzie 4 koła skoro na upartego na 3 też pojedzie" ;) Rezystor 10k podciągający reset do zasilania/masy albo kondensator filtrujący 100nF kosztuje naprawdę grosze a oszczędzi Ci w przyszłości wielu straconych godzin na poszukiwaniu co jest nie tak. Podobnie te kondensatory przy maxie.

    Co do płytki PCB...a w zasadzie rozmieszczenia elementów to jest dużo lepiej niż na schemacie ;) równo i schludnie...jednakże elementy R1 i R2 oraz D2 i R5 powinny być w nieco większej odległości od siebie pomimo, że mają ten sam potencjał. Jeśli w przyszłości będziesz cynował płytki lub chociażby pobielał pady, to lutując nóżkę do jednego padu, drugiego pod wpływem ciepła dosłownie "zalejesz" cyną która może wpaść w otwór i go zasklepić. Skoro rysowałeś ścieżki jakimś pisakiem, trzeba było chociaż zrobić to przy linijce przejeżdżając kilka razy żeby pogrubić linię. Mimo sporej szerokości spójrz na ścieżkę 12V idącej przy dolnym skraju płytki. Jest bardzo podziurawiona i dużo nie brakuje a na tak szerokiej ścieżce byłaby...przerwa w obwodzie ;) Estetyczność wykonania ścieżek PCB w układzie wbrew pozorom nie jest zupełnie bez znaczenia dla działania urządzenia w niektórych przypadkach...Co do opisu wyprowadzeń to bardzo dobrze jest coś takiego trzymać zawsze w pobliżu układu! powiedziałbym, że jest to wręcz nieocenione bo o ile teraz budząc Cię w środku nocy mógłbyś odpowiedzieć które wyprowadzenie złącza za co odpowiada to już za pół roku...kto wie ;) W przypadku wykonywania prostej płytki termotransferem to polecam umieszczanie pogrubionych napisów na miedzi. Mamy wtedy opis wyprowadzeń zawsze pod ręką i nie trzeba wykonywać kolejnego odciskania opisu płytki np. żelazkiem :) BTW czemu wszystkie opisy zrobiłeś bez tła seledynowym kolorem a napis 1-Wire już na białym tle?

    To tyle ode i jeśli jesteś hobbystą to potraktuj te uwagi z przymrużeniem oka ;)

    Pozdrawiam serdecznie