====== Programator ======
===== Wstęp =====
Dawno temu kiedy komputery posiadały jeszcze [[wp>Parallel_port|pory równoległe]] programowanie układów AVR wymagało jedynie [[go>avr%20lpt%20programmer|kilku rezystorów]]. Dzisiaj w erze laptopów konieczne jest zbudowanie dodatkowego urządzenia pośredniczącego: programatora. Zadaniem urządzenia jest wysyłanie komend do układu docelowego w celu wykorzystania wbudowanego modułu [[wp>In-system_programming|ISP]] układów AVR, który to posiada między innymi możliwość zmiany zawartości pamięci Flash (programu).
===== Idea =====
Obecnie popularne programatory posiadają następujące wady:
* Są stosunkowo drogie - Najtańszy oficialny programator [[http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3891|AVR Dragon]] to wydatek rzędu ∼250 PLN
* Są skomplikowane - wiele programatorów posiada np. bufory konieczne do programowania układów pracujących przy napięciach zasilania innych niż 5V
* Wymagają niepodpisanych sterowników (problemy w 64 Windowsie) (Edit: Najnowsze wydania USBLib nie posiadają tego problemu)
Oraz co najgorsze:
* Wymagają innego programatora do uruchomienia!
Kod programatora opiera się na projekcie wchodzącym w skład pakietu LUFA((Lightweight USB Framework for AVRs by Dean Camera)): [[http://www.fourwalledcubicle.com/AVRISP.php]] Natomiast płytka została zaprojektowana przeze mnie.
===== Zalety tego programatora =====
* Dzięki wbudowanemu [[bootloaderowi]] USB nie jest konieczne posiadanie innego programatora w celu jego uruchomienia.
* Umożliwia zasilenie układu docelowego
* Zastosowanie elementów [[SMD]] eliminuje konieczność wiercenia (chyba najbardziej uciążliwy proces podczas wytwarzania płytek).
* Tylko 4 elementy wymagają odpowiedniej polaryzacji + mikrokontroler (trudniej o pomyłkę).
* Pracuje z avrdude lub z AVR Studio (w zależności od wybranego firmware)
* Niski koszt (20÷25 PLN październik 2011)
* Małe wymiary
* Posiada generator 4MHz (do ratowania zablokowanych układów przez złe ustawienie fusebitów źródła taktowania)
* Programuje układy korzystające z interfejsów [[ISP]], PDI, TPI (Układy AVR32 i xMega)
* Prawdziwe USB (nie przekombinowane jak w przypadku np. USBASP)
===== Schematy =====
{{:pl:avrc:art:avrisp_schematic.png?600|}}
{{:pl:avrc:art:board_kolory.png?600|}}
TODO zdjęcie - wzór
===== Lista elementów =====
^ Element ^ Wartość ^ Opis ^
| IC1 | AT90USB162 | Mikrokontroler |
| USB | - | Pola lutownicze do podłączenia przewodu USB |
| F1 | 500 [mA] | Bezpiecznik polimerowy |
| R1 R2 | 22 [Ω] | Rezystory linii USB |
| C1 | 1 [uF] | Kondensator stabilizatora napięcia 3V3 ((Dla modułu USB układu)) |
| C3 C4 | 33 [pF] | Kondensatory oscylatora |
| Y1 | 16 [MHz] | Oscylator kwarcowy |
| C2 | 100 [nF] | Kondensator szyny zasilania |
| C5 | 10 [uF] | Kondensator szyny zasilania |
| R3 | 1 [kΩ] | Rezystor ustalający stan nieaktywny (wysoki) na sygnale reset uC |
| R4 | 1 [kΩ] | Rezystor ustalający stan nieaktywny (wysoki) na sygnale hardware bootloader uC |
| R5 R6 | x [kΩ] | Rezystory ograniczające prądy w diodach sygnalizacyjnych |
| LED1 LED2 | Diody sygnalizacyjne |
| | | Złącza szpilkowe typu goldpin |
===== Wykonanie =====
- Laminat należy przyciąć do odpowiednich wymiarów
- Krawędzie laminatu należy zaokrąglić za pomocą pilnika do metalu lub papieru ściernego
- Laminat należy dokładnie oczyścić z zabrudzeń
- Na laminat należy przenieść obraz ścieżek układu dowolną metodą
- Laminat należy wytrawić
- Obraz ścieżek należy zmyć
- Wszystkie ścieżki należy sprawdzić pod kątem przerw i zwarć z pobliskimi ścieżkami
- Płytkę należy zabezpieczyć roztworem kalafonii
- Pobielamy pady układu scalonego
- Jako pierwszy montujemy układ scalony, po dokładnym spozycjonowaniu i sprawdzeniu poprawności pozycji. Przylutowywujemy dwa naprzeciw położone wyprowadzenia cały czas przytrzymując układ. Po unieruchomieniu układu przylutowywujemy pozostałe wyprowadzenia.
- Sprawdzamy każde wyprowadzenie układu pod kątem zwarć i przerw
- Przylutowywujemy kolejne elementy zaczynając od najmniejszych.
- Diody oraz kondensatory [[integra:elemkondensatory|tantalowe]] muszą być odpowiednio spolaryzowane.
- Przylutowywujemy przewody USB
- Przewody przylutowywujemy do pól lutowniczych (:!: w złączu linie MOSI i MISO muszą być zkrosowane!)
===== Uruchomienie =====
==== Sprawdzenie poprawności działania i troubleshooting====
- Sprawdzamy polaryzację kondensatorów
- Sprawdzamy poprawność połączeń
- Sprawdzamy czy nie ma zwarcia pomiędzy masą a szyną zasilania
- Sprawdzamy czy kryształ jest połączony z uC i czy nie ma zwarć
- Sprawdzamy czy nie ma zimnych lutów (matowe połączenie zamiast błyszczącego)
- Podłączamy urządzenie do komputera
- Sprawdzamy napięcie na kondensatorach tantalowych: na większym powinno wynosić 5±0.5 [V] na mniejszym (regulator 3V3 dla szyny danych USB) 3.3±5 [V]
- Sprawdzamy czy linie MOSI i MISO są skrosowane
==== Oprogramowanie ====
1. Ściągamy potrzebne narzędzia:
* [[http://sourceforge.net/apps/trac/libusb-win32/wiki|Najnowsze libUSB-win]]
* [[http://www.fourwalledcubicle.com/LUFA.php|Najnowszy pakiet LUFA]] (wymaga modyfikacji)
* [[http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3886|Narzędzie Atmel FLIP]] lub [[http://dfu-programmer.sourceforge.net/|DFU-programmer]] pod Linuksem
* (Dodatkowo) [[http://www.ftdichip.com/Support/Utilities.htm|USBView]]
Osoby korzystające z Linuksa powinny pobrać odpowiednie dla siebie narzędzia i odpowiednio dostosować następujące kroki.
:!: Kod z pakietu LUFA wymaga modyfikacji: pin PB4 musi być w czasie pracy nieaktywny. Najnowszy kod posiada błąd uniemożliwiający poprawną prace (reset aktywny stanem wysokim) :!:
2. Sprawdzony układ podłączamy do komputera, za pomocą menedżera urządzeń lub programu USBView powinniśmy zaobserwować pojawienie się nowego urządzenia. (Pod Linuksem można użyć narzędzia lsusb)
3. Instalujemy sterowniki które znajdują się w katalogu instalacyjnym narzędzia Atmel FLIP.
4. Jeżeli skompilowaliśmy program samodzielnie, do zaprogramowania układu możemy wykorzystać makro znajdujące się w pliku makefile. Jeżeli wgrywamy prekompilowany program należy:
- uruchomić narzędzie Atmel FLIP
- wybrać opcje z menu głównego: __Device__->__Select__...->__AT90USB162__->OK
- wybrać opcje z menu głównego: __Settings__->__Communication__->__USB__
- w momencie pojawienia się okna __USB Port Connection__ wybieramy opcje __Open__
- wybrać opcje z menu głównego: __File__->__Load HEX File...__ i otworzyć odpowiedni plik
- w zakładce __Operations Flow__ klikamy przycisk __Run__
- zamykamy narzędzie Atmel FLIP
5. Resetujemy urządzenie poprzez ponowne podłączenie do portu USB. W śród urządzeń USB powinno się pojawić nowe urządzenie, sterowniki instalujemy z katalogu instalacji libUSB-win.
6. Jeżeli nasz system nie chce uruchomić niepodpisanego sterownika musimy jeszcze wygenerować odpowiednie pliki INF za pomocą narzędzia inf-wizard należącego do pakietu libUSB-win.
==== Możliwe problemy ====
* Jeżeli na komputerze zainstalowano AVRStudio to w systemie będą zainstalowane sterowniki [[http://www.jungo.com/st/windriver_usb_pci_driver_development_software.html|Jungo WinDriver]], urządzenie nie będzie działało poprawnie dopóki nie zostanie zainstalowany sterownik libUSB. [[http://www.societyofrobots.com/robotforum/index.php?topic=6664.0|Pomoc]]
===== Korzystanie z programatora =====
Jeżeli programujemy za pomocą avrdude należy korzystać z następującego schematu:
avrdude -pXX -cavrispmkii -P usb
gdzie pod XXX wstawiamy nazwę układu do programowania (np. -pm8 dla ATmega8). Użytecznym argumentem linii poleceń jest -B 4
który ustala okres trwania sygnału taktującego (w tym przypadku 4 [us]: 250 [kHz] )
===== Aktualizacja oprogramowania =====
Kiedy kupujemy MCU ma on wgrany jedynie bootloader znajdujący się na końcu pamięci programu. Po resecie PC((program counter)) "przelatuje" przez całą pamięć (wypełnioną rozkazem NOP((NO Opearation)) ) aż trafia na program bootloadera.
Po wgraniu oprogramowania MCU, bootloader nie jest automatycznie aktywowany. Można jednak wymusić uruchomienie bootloadera już po wgraniu programu. Należy:
* Podciągnąć linię HWB((HardWare Boot)) do minusa [1]
* Zresetować układ poprzez linię reset [2] (tutaj wystarczy ułamek sekundy zwarcia z masą, ale linia HWB musi być w tym czasie również zwarta)
Aby to zrobić należy zewrzeć następujące punkty do masy (układ ma być podłączony do komputera).
{{:pl:avrc:art:avrisp_boot.jpg?direct&700|}}
TICK Do zwarcia linii z masą konieczne jest metalowe narzędzie. Jedna z ścieżek może zostać zwarta za pomocą czarnego przewodu wyprowadzonego z płytki.
:!: Należy zwrócić szczególną ostrożność podczas procedury, można spowodować zwarcie linii zasilania komputera. Kolorem czerwonym oznaczyłem ścieżki szyny zasilania,
niebieskim masę a fioletowym ścieżki do zwarcia z masą.
===== Pliki =====
* {{:pl:avrc:art:programmer_v3.zip|}} Schematy ([[http://www.cadsoftusa.com/|Cadsoft Eagle 6]])
* {{:pl:avrc:art:avrisp-mkii2.zip|Aktualny wsad do procesora}} Maj 2012