HVSP dla AtTiny85

Są (co najmniej) dwa powody, dla których warto mieć HVSP dla AtTiny85:hvsp_15

  • Bawiąc się fusami wyłączyliście możliwość programowania przez ICSP (jasne, że przez przypadek),
  • Żeby odzyskać dodatkowy port, wyłączyliście RESET na pinie 1 AtTiny85 – a teraz chcecie ją przeprogramować… (to z premedytacją).

W obydwu przypadkach nie ma innej możliwości jak przyłożyć 12v na RESET i za pomocą drugiego kontrolera wpisać nowe ustawienia fusów. Spokojnie, to wcale nie jest takie trudne.

W jednym z poprzednich tekstów ratowałem AtMega8 przy pomocy programatora High Voltage Parallel Programmer (zobacz: Kupione na wyprzedaży AtMega8).

HVPP dla AtMega8/328
HVPP dla AtMega8/328

W przypadku kontrolerów o mniejszej liczbie nóżek (8 lub 14), stosuje się HVSP: High Voltage Serial Programmer. Programatory HVPP czy HVSP potrafią „nadpisać” ustawienia fuse bitów – nawet wtedy, gdy przypadkiem wyłączycie reset czy programowanie przez ISP.

Przypadkiem, albo specjalnie.

Tym razem potrzebowałem skonstruować HVSP dla AtTiny. Zadanie polegało na wyłączeniu resetu na pinie 1. Dzięki temu uzyskałem dodatkowy port wejściowy/wyjściowy. Do wyłączenia resetu wystarczy zwykły programator ICSP. Zbudowałem go w tekście Programowanie AtTiny85 za pomocą Arduino. Po operacji wyłączenia resetu (koniecznego dla ICSP) stracę jednak możliwość ponownego programowania AtTiny. Chyba, że przywrócę ustawienia fusów – do czego właśnie potrzebuję  HVSP.

Programator zbuduję na płytce, którą zacząłem w jednym z poprzednich postów: AtMega8 w Arduino UNO R3.

atmega8_04Jest na niej jeszcze trochę miejsca – chociaż kilka rzeczy trzeba tu dodać. Będę potrzebował przycisk wyzwalający nagrywanie, źródło 12v oraz podstawkę do programowania AtTiny85. No i zasilanie całości: chciałbym ograniczyć się do baterii 9v:)

Projekt oparty na tekście: ATiny Fuse reset with 12v charge pump. W stosunku do oryginalnego tekstu musiałem dokonać kilku zmian związanych z dodatkowymi elementami na płytce oraz użyciem AtMega8 zamiast AtMega328.

Zasilanie

Postanowiłem, że mój programator będzie zasilany z bateryjki 9v. Tego typu baterie nie dają wiele prądu (100-200mA, czasami więcej – zależnie od jakości) – ale wystarczająco na potrzeby programatora.

Używam tu „czystego” AtMega8 (bez płytki Arduino). Muszę więc obniżyć napięcie zasilania z 9 do 5v. W tym celu użyłem niewielkiego stabilizatora AMS117. Znacie go z płytki Arduino.

hvsp_01Całość dopełniłem wyłącznikiem.

hvsp_02Dzięki temu uzyskałem 5v do zasilenia kontrolera.

hvsp_03

Obudowa

Mając już rozmiar płytki i wyłącznik, mogłem zbudować sobie małą obudowę.

hvsp_04hvsp_05hvsp_06hvsp_07

12v: charge pump

Nazwa „High Voltage” bierze się z tego, że na pin resetu (fizyczny 1 AtTiny85, ale i AtMega8/328) przykładane jest wysokie napięcie rzędu 12v. Tylko pin reset jest w stanie wytrzymać takie napięcie. Przyłożenie podobnego do każdego innego pinu, spowoduje uszkodzenie kontrolera.

Skąd wziąć te 12v? HVPP był zbudowany na bazie Arduino UNO. Wystarczyło podłączyć zasilacz 12v i podpiąć się pod VIN. W tej realizacji mam tylko 9v – maksymalnie, wraz ze zużywaniem się baterii mniej. Oczywiście, mógłbym do bateryjki podłączyć przetwornicę step-up. Ale to oznacza dodatkowy element w obudowie i zwiększony pobór mocy (przetwornice mają ograniczoną sprawność). Koszty może nie są wielkie, ale nie zawsze znajdziecie taką pod ręką.

Okazuje się, że samo Arduino może „wygenerować” te 12v. Wymaga to naprawdę podstawowych elementów – kilku rezystorów, diod, kondensatorów oraz tranzystora – czyli takich, które zawsze znajdziecie w swoich kuferkach. Arduino sprytnie manipuluje kondensatorami ładując je i zmieniając ich wzajemne połączenie między szeregowym i równoległym – uzyskując w ten sposób wyższe napięcie.

Schemat znajdziecie tutaj: 12 Volt Arduino based charge pump.

Schemat "charge pump - pobrany ze strony 12v Arduino-based charge pump
Schemat „charge pump – pobrany ze strony 12v Arduino-based charge pump

Do zmontowania „pompy” będziecie potrzebować:

  • 3 kondensatory ceramiczne, ja miałem pod ręką 104 (100nF),
  • Kondensator elektrolityczny 2uF,
  • 4 diody 1n4148,
  • Tranzystor – właściwie dowolny NPN (np. 2n2222),
  • Rezystor na bazę tranzystora, np. 4k7,
  • Rezystory na dzielnik napięcia 12v do 5v – ja miałem 86k i  210k (o tym poniżej),
  • Płytkę z kontrolerem.

Jak widać do zbudowania takiej pompy nie potrzeba wiele. Możecie użyć praktycznie dowolnego tranzystora NPN. Ma jedynie służyć do włączania/wyłączania wysokiego napięcia – a prąd płynie tu niewielki.

Podobnie ma się z dzielnikiem napięcia R2/R3. Jedyne czemu ma służyć, to podzieleniu napięcia pompy Up tak, żeby można było je zmierzyć Arduino. Wejścia analogowe tolerują max Vcc (czyli napięcie zasilania). Stąd napięcie na A0:

{U_{A0}}={{U_p} \cdot {{R_3} \over {R_3 + R_2}}}

Dobierzcie duże rezystory dla minimalnego prądu tak, żeby Ua0 < Vcc dla napięcia pompy Up = 12v.

Pierwsze próby na płytce stykowej:

hvsp_08Próby i testy:

hvsp_09Lutowanie zacząłem od rzędu diod:

hvsp_10Potem poszło już z górki:

hvsp_11I więcej testów, już na zlutowanej płytce:

hvsp_12Na razie układ generuje ponad 13v, później dostroję to w kodzie.

HVSP

Miałem już 12v, pora na zbudowanie programatora. Znajdziecie go na tej samej stronie blogu Wayne’s Tinkering Page:

HVSP dla AtTiny, pobrane z ATTiny fuse reset with 12v...
HVSP dla AtTiny, pobrane z ATTiny fuse reset with 12v…

Potrzebna wam będzie podstawka 8-pinowa pod AtTiny85 i kilka rezystorów 1kΩ.

hvsp_14

I jeszcze przycisk…

Pod port D7 dodałem przycisk tact, którego wciśnięcie wyzwoli proces programowania. W oryginalnym kodzie programowanie uruchamiało wysłanie jakiegoś znaku na konsolę.

hvsp_13Przy podłączaniu przycisku pamiętajcie o podciągnięciu go rezystorem pod zasilanie, o tak:

switch_0Program

Biblioteka TimerOne

Podstawą do działania pompy jest tu biblioteka TimerOne. Niestety w obecnej wersji nie jest ona kompatybilna z AtMega8. Rozwiązanie znalazłem na forum Arduino. Modyfikacja polega na wstawieniu w pliku TimerOne.h sekcji:

Ta modyfikacja umożliwi skompilowanie kodu pod AtMega8.

Dołączcie tą bibliotekę do projektu.

Obsługa przycisku

W odróżnieniu do oryginalnego projektu, do wyzwalania nagrywania fusów używam przycisku. Przycisk podłączyłem do pinu D7 a diodę świecącą – standardowo, do portu D13. Przycisk podciągnąłem do 5v, więc jego wciśnięcie będzie sygnalizowane stanem niskim. Do kontrolowania stanu przycisku napisałem prostą klasę:

Metoda ButtonStateMachine.isUp() zwróci wartość true jeżeli przycisk został właśnie puszczony. Inaczej zwróci wartość false.

Zmiany w oryginalnym kodzie

Najważniejsze zmiany w stosunku do oryginalnego kodu:

  1. Usunięcie wszelkich referencji do portu szeregowego – nie mam go podłączonego dla AtMega
  2. Definicję REF ustawiłem na 670 – w ten sposób moja pompa generuje 12v. Możliwe, że wartość ta będzie inna w Waszym projekcie,
  3. Usunąłem referencje do innych typów AtTiny – mój programator obsługuje jedynie 85,
  4. Miałem problemy z metodami delay() – wygląda na to, że nie działały poprawnie dla AtMega8, np, millis() zawsze zwracało „0”. Zastąpiłem je własnymi „opóźniaczami” delayMe() i delayMeUs(). Działają tak… trochę i mniej więcej – ale na potrzeby tego projektu wystarczą. Poprawię je przy następnej okazji.
  5. Usunąłem niepotrzebne funkcje.
  6. Funkcje przepisałem tak, że zwracają true w przypadku sukcesu – false w przypadku porażki.
  7. Usunąłem kilka pętli, które w nieskończoność czekały na odpowiedź z czipu. Teraz odpowiedź jest próbkowana a gdy nie nadejdzie – kod zgłasza błędy. W ten sposób kod nie zacina się, gdy AtTiny nie odpowie (np. gdy zapomnę go włożyć do gniazda),
  8. Po zakończeniu bootowania programatora, mruga dioda podłączona do d13.  Po rozpoczęciu programowania dioda ta się zapala i gaśnie po skończeniu wypalania. Jeżeli podczas programowania wystąpi błąd – mruga kilkakrotnie.

Kod poniżej:

Testy

Zacznijmy od odczytania fusów.

attiny85_05Włożyłem AtTiny do mojego programatora i odczytałem fusy:

Na razie nie szalejmy: wyłączmy dzielenie zegara przez 8:

No to do programatora HVSP. Po ponownym odczytaniu fusów:

…powróciły do stanu poprzedniego.
No to teraz jedziemy po całości – wyłączamy reset:

I teraz:

Próba przywrócenia fusów za pomocą tego samego programatora nic nie da:

Do programatora HVSP i sprawdzamy jeszcze raz w ICSP:

Udało się!

Podsumowanie

Niewielkim nakładem kosztów uzyskałem HVSP dla AtTiny85. Urządzonko wyszło całkiem zgrabne i na pewno mi się przyda. A o wykorzystaniu „dodatkowego” portu AtTiny85 – już wkrótce.

Źródła

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *