Kupione na wyprzedaży… uruchamianie atmega8

Na jednej z wyprzedaży garażowych kupiłem AtMega8. Nie żadne tam Arduina – kontrolery w najczystszej postaci.

atmegas_0Wiecie jak to jest – cena kusi – 15PLN za komplet:) Okazało się jednak, że ich uruchomienie nie było takie proste!

AtMega8

AtMega8 to całkiem ciekawy kontroler. 8kB pamięci programu, 512 bajtów EEPROM i 1kB RAM – to znacznie mniej niż w przypadku napędzającej UNO R3 AtMega 328P. Ale to właśnie AtMega8 użyto do budowy pierwszych serii Arduino. Jej „ślady” możecie odnaleźć nawet w samej w samej aplikacji Arduino. W katalogu hardware/arduino/avr/bootloaders/atmega8 znajdziecie bootloader Arduino dla AtMega8 (przyda nam się później).

AtMega8, które kupiłem, umieszczono w 28-pinowej obudowie do montażu przewlekanego (DIP28). Spójrzmy na wyjścia AtMega8:

AtMega8 - opis pinów (pobrane z instrukcji)
AtMega8 – opis pinów (pobrane z instrukcji)

Warto zauważyć, że są takie same jak dla 328P.

Przygotowanie

W pierwszym kroku zależy mi jedynie na tym, żeby kontrolerek odpowiedział swoją sygnaturą i wartościami fuse bitów.

Każdy typ kontrolera Atmela ma swoją charakterystyczną sygnaturę – taki numerek, który go opisuje. Dla przykładu, AtMega8 to 0x1e9307, AtMega328P: 0x1e950f, AtTiny85: 0x1e930b. Dokładniej, pierwszy bajt oznacza producenta (1e: Atmel), drugi – ilość pamięci programu (flash, 93: 8kB, 95: 32kB) a trzeci – typ procesora.

Ponieważ mamy do czynienia z czystymi kontrolerami AtMega, bez całej otoczki, którą daje nam Arduino, koniecznym będzie użycie programatora ICSP. Ja używam takiego usbasp2:

USBASP2
USBASP2

W roli programatora możecie też użyć inne Arduino.

Interesuje nas wtyczka IDC-6. Należy ją podłączyć do AtMega następująco:

atmega_1Pamiętajcie o podłączeniu:

  • Vcc i AVcc (piny 7 i 20 AtMega) do zasilania Vcc z programatora (pin2, Vcc),
  • Masy GND (piny 8 i 22 AtMega) do masy programatora (pin 6 – GND)
  • MOSI AtMega (pin 17) do pinu 4 programatora,
  • MISO (pin 18) do pinu 1 programatora,
  • SCK (pin 19) do pinu 3 programatora,
  • RST (pin 1 AtMega) do pinu 5 programatora.

Tak to wygląda na płytce stykowej:

atmega_5Pamiętajcie o włączeniu zasilania z programatora. Dodatkowo wpiąłem czerwone LED między zasilanie a masę (z rezystorem 360Ω). W ten sposób wiedziałem, kiedy czip jest zasilany.

Po podłączeniu programatora do Arduino, możecie wykorzystać program avrdude:
$ sudo avrdude -c usbasp -v -p m8

Zawarte tu doświadczenia wykonuję na linuksie. Nie ma jednak problemu, żeby przeprowadzić je na Windows. Po zainstalowaniu Arduino IDE, avrdude znajdziecie w katalogu:
cd "C:\Program Files (x86)\Arduino\"
Do uruchomienia musicie podać plik konfiguracyjny:
hardware\tools\avr\bin\avrdude.exe -C "c:\Program Files (x86)\Arduino\hardware\tools\avr\etc\avrdude.conf" -c usbasp -v -p m8

Poszczególne parametry wywołania avrdude oznaczają:

  • c: tryp programatora, tu usbasp,
  • v: tryb 'verbose' – program jest bardziej 'gadatliwy',
  • p: rodzaj czipa, m8 oznacza atmega8 (np. t85 – attiny85),

Dla losowo wybranej AtMega8, wywołanie:

…skończyło się niepowodzeniem. Do roboty!

AtMega8: sztu(cz)ka #1

Domyślnie AtMega8 sprzedawana jest z ustawieniami wskazującymi źródło taktowania kontrolera na wewnętrzny rezonator 1MHz. Problem polega na tym, że częstotliwość pracy programatora musi być co najmniej 4 razy mniejsza od częstotliwości pracy programowanego układu.  Stąd bierze się parametr -B wywołania avrdude:

Parametr ten pozwala na zmniejszenie szybkości komunikacji programatora z AtMegą. Wartość podawana za B to ilość us opóźnienia na linii zegarowej. -B4 powinno wystarczyć (jeżeli nie, to spróbujcie zwiększyć ten parametr – czyli zmniejszyć częstotliwość programowania):

AtMega8: sztu(cz)ka #2

Najczęstszą przyczyną problemów z procesorami Atmela są fuse bity. Są to rejestry w pamięci kontrolera, które ustawiają sposób w jaki on pracuje. Niektóre z nich odpowiadają za ustawienia zegara. Domyślnie AtMega8 sprzedawana jest z ustawieniami wskazującymi na wewnętrzy rezonator 1MHz. Jeżeli ustawienie to zostanie zmienione np. na zewnętrzny kwarc – i taki nie zostanie podłączony do wejść XTAL – kontroler nie wstanie.

Dołączenie zewnętrznego kwarcu powinno pomóc. Ja znalazłem taki o częstotliwości 4MHz. Jego nóżki należy podłączyć do wyjść 9 i 10 (XTAL1 i XTAL2). Następnie nóżki oscylatora podłączony do masy przez kondensatory ceramiczne 12-22pF (ja akurat miałem 30pF). Na płytce stykowej wygląda to tak:

atmega_3Ogólny schemat:

atmega_6Czas na wywołanie programatora:

Druga gotowa. Udało się odczytać sygnaturę czipa i fusy.

Zamist kwarcu możecie użyć:

Zmieńmy jeszcze ustawienia fusów tak, żeby kwarc nie był już potrzebny:

Można odłączyć kwarc, AtMega wystartuje bez problemów (pamiętajcie o parametrze -B4).

AtMega8: sztu(cz)ka #3 i #4

Niestety kolejne AtMegi nie były uprzejme „poddać” się jak poprzednie. Nie odpowiadały na wywołania programatora.

Pewne ustawienia fusów mogą nieźle namieszać. Przykładem może tu być wyłączenie zewnętrznego resetu (hfuse, bit RSTDISBL ustawiony na „0” – czyli zaprogramowany) lub wyłączenie możliwości programowania po SPI (hfuse , bit SPIEN ustawiony na „1” – czyli niezaprogramowany).

W świecie fusów, bity mogą być zaprogramowane (0) lub niezaprogramowane (1). Jeżeli bit nie jest zaprogramowany, przyjmuje wartość 1 i dana opcja jest wyłączona. Jeżeli bit jest zaprogramowany, przyjmuje wartość „0” i dana opcja jest włączona.

Kalkulator fusów: tutaj.

Zwłaszcza wyłączenie możliwości programowania układu przez SPI jest dość… uciążliwe. Robi się tak, gdy nie chcemy, żeby ktoś (łatwo) nadpisał program w nim się znajdujący. Nie jest to przeszkoda ostateczna – można to zmienić – ale wymaga dużo zachodu. Hasło przewodnie: HVPP.

HVPP – High Voltage Parallel Programmer

Programator HVPP – High Voltage Parallel Programmer jest pomocny np. w przypadku złego ustawienia fuse-bitów. Umożliwia ich przeprogramowanie nawet jeżeli nieostrożnie wyłączono ICSP.

Inaczej niż szeregowy ICSP, programator HVPP posługuje się komunikacją równoległą. Niestety oznacza to, że wykorzystuje całą furę pinów, które trzeba podłączyć.

Mniejsze AtTiny można zaprogramować za pomocą HVSP: High Voltage Serial Programmer. Jest dużo prostszy w budowie i podłączeniu.

Zaprogramowanie Atmela w trybie równoległym wymaga podania na pin reset napięcia 12v. Jeżeli spojrzycie na dokumentację wszystkie piny mają tolerancję do 5.5V (Vcc+0.5)- tylko RESET ma 13V. Oczywiście wykluczone jest programowanie w samym module Arduino. Takiego delikwenta trzeba po prostu najpierw wyciągnąć (wylutować).

Programatory HVPP można kupić, ale firmowe są stosunkowo drogie. Postanowiłem skorzystać z projektu MightyOhm. Nie wydawał się ani specjalnie kosztowny, ani skomplikowany.

Projekt HVPP - MightyOHM
Projekt HVPP – MightyOHM

Postanowiłem złożyć HVPP na szybko na płytce stykowej… Nie spodziewałem się, że przerodzi się to w lekki horror…

atmega_4HVPP na płytce stykowej

HVPP na płytce stykowej

Ale ten programator zadziałał! Trochę zmieniłem kod MightyOhm:

#define  HFUSE  0xD9
#define  LFUSE  0xE1 

W ten sposób fusy ustawiły się na takie same jak w przypadku poprzednich AtMega i mogłem uruchomić 2 ostatnie Atmegi:)

Mission completed.

Programtor MightyOhm spodobał mi się na tyle, że zbudowałem jego wersję 'lutowaną'!

hvpp_0

Źródła

10 myśli w temacie “Kupione na wyprzedaży… uruchamianie atmega8”

  1. Witam.Bardzo fajna stronka .Mam prosbe.Posiadam arduino mega 2560.Jaksie maja piny tego arduino do pinów ze schematu HPVV.W szczególności piny 0 do 5.Czy to analogi?.Jestem poczatkujacy,a nie chce zepsuc arduino a mam pare atmego 8 zablokowanych, stad te pytanie.Dziekuje za porade

    1. Cieszę się, że Ci się podoba mój blog. Zadałeś bardzo dobre pytanie. Fizycznie i funkcyjnie rozkład pinów UNO R3 i „początku” płytki Mega2560 jest taki sam – np. rozszerzenia z UNO „pasują” do Mega. W tych samych miejscach są zasilania, masy i wyjścia np. przetwornika analog-cyfra. ALE: wewnętrznie piny te podłączone są do różnych portów kontrolera. Np. A0 w mega2560 podłączone jest do portu PF0 – a w UNO do portu kontrolera PC0. Oprogramowanie z MightyOhm powstało dla AtMega168 – które jest bardzo podobne do ATmega328 (168 ma 2x mniej flasha). Ale mega2560 to całkiem inna historia. Podsumowując: podłączenie „fizycznie” będzie takie samo, ale oprogramowanie musiałoby być pozmieniane.
      Myślę jednak, że powinieneś zacząć od góry listy…

      1. Dziekuje Arku za odpowiedz.To ze mi sie podoba to malo powiedziane(dodałem oczywiscie do ulubionych;)).Piszesz jasno do rzeczy zrozumiale.A wiele glogów przepatrzyłem.
        Tylko co to znaczy „od góry listy”?;).
        Podejrzewam ze da sie podłaczyc mege uwzgledniając roznice atmega68 i mega.
        Ale te piny z lewej od 0 do 5 .Czy jak 0 podepne pod Analog In A0 bedzie OK?.Gdzie to wpiac w medze?.Z prawej kumam pwm itd.Zreszta sa zabezpiecznie 1 k wiec chyba moge sie czuc bezpiecznie.Domyslam sie ze same arduino moze byc zasilane przez usb 5V i soft wrzucam wlasnie do ardiuno mega.Potem guzior S1 i dać na msze;).Acha ,tak dla pewnosci,Vin to napiecie wprost np z zasilacza ,a 5 V to po np obnizeniu i stabilizacji?
        Poszperam jeszcze nt atmega168.Jeszcze raz dzieki i łapka w góre;)

  2. Witam Cie ponownie.Sory ze zawracam Ci glowe.Tak pomyslalem i porownalem pinouty megi i uno i doszedlem do wniosku ze przypne do megi wg portów uno.Wtedy soft’u nie trzeba ruszac.Sluchaj czy to słuszna koncepcja?.

Dodaj komentarz