AtMega8 w Arduino UNO R3: operacja „przeszczep”

Podczasatmega8_00 budowania układu regulowanego obciążenia (Mocy ubywaj…) wymyśliłem, żeby docelowe urządzenie było zlutowane na niewielkiej płytce przewlekanej. Wykluczyło to użycie płytki Arduino UNO. Po prostu zajmuje za dużo miejsca. Dla wygody postanowiłem pozostać w świecie Arduino IDE, ale do projektu użyć znalezioną w szufladzie AtMega8. W tym celu „przeszczepiłem” AtMega8 na płytkę Arduino UNO, wgrałem bootloader i zaprogramowałem przez kabel USB.

Ale po kolei.

Pierwsze pytanie: czy AtMega8 zadziała w płytce Arduino UNO (gdzie normalnie jest AtMega328)? Tak. Co więcej – pierwsze serie Arduino UNO (nie: R3) zawierały właśnie kontroler Atmega8, 328 pojawił się dopiero w R3. „Ślady” AtMega8 znajdziecie w wielu miejscach. Na przykład w podkatalogu „/hardware/arduino/avr/bootloaders” Arduino IDE jest folder: „atmega8”. Przyda się.

atmega8_03

AtMega8 vs AtMega328

AtMega 8 i AtMega328 umieszczono w obudowie PDIP z 28 pinami. Nie ma również między nimi żadnej różnicy w wyprowadzeniach portów:

atmega_8 atmega_328Kontrolery różnią się za to możliwościami:

AtMega8 AtMega328
Pamięć kodu (flash) 8k 32k
Pamięć operacyjna (RAM) 1k 2k
EEPROM 512b 1k
Ilość wyjść PWM 3 6

Przeszczep

Więcej o uruchamianiu AtMega8: Kupione na wyprzedaży: uruchamianie AtMega8.

Wyłuskanie 328 z płytki UNO nie jest problemem. Wystarczy trochę podważyć… Róbcie to delikatnie, żeby nie pogiąć styków. Ja to robię płaskim śrubokrętem, powoli i po trochę z każdej strony.

atmega8_00Teraz w miejsce AtMega328 włóżcie AtMega8. Nie bójcie się – napięcia i masy pasują, reset jest również w tym samym miejscu. Pamiętajcie jedynie, żeby ząbek (góra) AtMega8 był skierowany w stronę złącza programatora:

atmega8_01

Fusy i bałagan

Będziecie potrzebować programator ICSP. Ja używam dwunapięciowy usbasp2. Możecie też użyć drugiego Arduino UNO. Przykład użycia Arduino UNO jako programator znajdziecie tutaj: programowanie AtTiny85 przez UNO.

Teraz do portu ICSP Arduino trzeba podłączyć programator:

atmega8_02Wywołamy avrdude dla programatora usbasp (parametr „-c usbasp”) i kontrolera AtMega8 (-p m8):

Pierwsza próba nieudana. Spróbujmy spowolnić komunikację (parametr -B4):

No to mamy fusy:

  • Wysoki hfuse = 0xd9
  • Niski lfuse = 0xe1
  • (i poza konkursem) Rozszerzony (E): 0xFF

Jak to przetłumaczyć? Pomoże w tym http://www.engbedded.com/fusecalc/.

fuse_0Ta konfiguracja fusów oznacza, że kontroler działa z częstotliwością 1MHz wykorzystując wewnętrzny rezonator. Jest to konfiguracja o tyle bezpieczna, że na płytce nie wymaga dodatkowego oscylatora. Ale jest też wolna…

UWAGA: nieostrożne manipulowanie fusami może skutecznie zablokować dostęp do kontrolera. Upewnijcie się, że wiecie co robicie. W razie jakby co: w tekście Kupione na wyprzedaży AtMega8… znajdziecie przepis na zbudowanie programatora HVPP, który może „uratować” kontroler.

Standardowe ustawienia dla kilku kontrolerów (znalezione tutaj, unlock i lock: zawsze 03/0f):

lfuse hfuse efuse Bootloader
328p/UNO/16MHz 0xff 0xde 0x05
optiboot/optiboot_atmega328.hex
168p/UNO/8Mhz 0xc6 0xdd 0x00
atmega/ATmegaBOOT_168_pro_8MHz.hex
168p/UNO/16Mhz 0xff 0xdd 0x00
atmega/ATmegaBOOT_168_diecimila.hex
8p/UNO/8MHz 0xdf 0xca
Wymaga przekompilowania dla F_CPU ustawionego na 8000000L
8p/UNO/16MHz 0xdf 0xca
atmega8/ATmegaBOOT-prod-firmware-2009-11-07.hex .hex

fuse_1Na płytce Arduino znajduje się oscylator 16 MHz, takąż więc opcje wybierzemy. Spróbujmy więc zapisać nowe ustawienia na kontroler:

Fusy ustawione, możemy palić bootloader:

Pozostaje uruchomić Arduino IDE.

Bez wgrania bootloadera, Wasze „nowe” Arduino nie dogada się ze środowiskiem Arduino IDE. Oczywiście dalej będziecie mogli zaprogramować je przez ICSP, ale przecież nie o to chodziło.

Arduino IDE

Ustawienia poszczególnych płytek Arduino możecie znaleźć w pliku „hardware/arduino/avr/boards.txt” w podkatalogu, w którym zainstalowane jest Arduino IDE. W sieci znajdziecie kilka propozycji, jak należy go zmienić, żeby Wasza AtMega8 zadziałała. Przykładowo: gotowe rozszerzenie: https://github.com/sleemanj/optiboot/tree/master/dists. Mimo, że wyglądało atrakcyjnie – nie udało mi się uruchomić AtMega z tą wtyczką.

Przeglądając plik boards.txt do wersji Arduino IDE 1.6.11 znalazłem w nim sekcję:

Brzmi znajomo? I faktycznie, w menu znajdziecie element: Arduino NG; wybierzcie go:

ide_01Teraz wybierzcie kontroler: AtMega8:

ide_02Nie zapomnijcie wybrać port, do którego podłączona jest płytka z Arduino (tu: linuxowe nazwy urządzeń, w Windows będzie coś jak COMx, gdzie x to numer portu szeregowego). Teraz powinniście uż bez problemu wgrać swój program.

UWAGA: Wasz program wystartuje po ok. 5s. W tym czasie bootloader czeka na dane z Arduino IDE. Jeżeli nie otrzyma polecenia załadowania nowego programu – rozpocznie wykonywanie tego, który już jest w pamięci flash.

A na płytce…

Praktyczne podłączenie AtMega8 na płytce wymaga kilku zabiegów. Doskonały tekst na ten temat znajdziecie tutaj: Minimalne podłączenie pinów kontrolera. Nic dodać – nic ująć, po prostu zlutować. JEDNA UWAGA: podlinkowany tekst odnosi się do AtMega8 w obudowie TQFP (do montażu powierzchniowego). Rozkład pinów w wersji „nóżkowej” (przewlekanej, THT) jest inny.

Do AtMega8 musicie podciągnąć masę i zasilanie.

Pamiętajcie: to jest czysty czip bez stabilizatora! 5v max – inaczej będzie niebieski dym:)

Zasilone muszą być piny Vcc i AVcc. Masa idzie do GND i AGND. Dalej trzeba zająć się resetem oraz oscylatorem. Razem na płytce:

atmega8_04Blink działa:

 

Podsumowanie

Jak widzicie, na płytce UNO R3 można swobodnie użyć AtMega8 zamiast oryginalnego AtMega328p. Podmiana nie jest specjalnie skomplikowana, choć może wymagać trochę zabawy z fusami.

Zysk? Możecie w łatwy sposób programować czipy ATMega8 bez potrzeby budowania podstawki ze złączem ICSP. Proste i wygodne.

Źródła

Dodaj komentarz