Jak dobrze wiecie, albo i nie wiecie, nie musicie zakupywać “całych zestawów Arduino Uno,mini etc”, a sami zakupić scalak Atmega328p za kilka złoty, wgrać bootloader Arduino i cieszyć się półprawnym arduino.
Czego potrzebujemy?
Konfiguracja dotyczy pracy układu z zewnetrzny kwarcem 16Mhz!
- Atmega328 (np. od Seguro, tak obsługują paczkomaty :) )
- Programator USBasp (np. od electropark, brak paczkomatów :()
- Opcjonalnie konwerter USB<->UART (electropark) – jeżeli zamierzamy wygrywać soft klasycznie, czyli przez RX/TX via bootloader arduino, co nie jest konieczne i zależne od poniższej konfiguracji
- Modyfikacja pliku C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt
Dopisujemy na końcu pliku
16 Mhz – kwarc zewnętrzny
[code]
##############################################################
atmega328bb.name=ATmega328 on a breadboard (16 MHz external clock)
atmega328bb.upload.maximum_size=30720
atmega328bb.upload.speed=57600
atmega328bb.bootloader.tool=avrdude
atmega328bb.upload.tool=avrdude
atmega328bb.upload.protocol=stk500v1
atmega328bb.bootloader.low_fuses=0xFF
atmega328bb.bootloader.high_fuses=0xDA
atmega328bb.bootloader.extended_fuses=0x05
atmega328bb.bootloader.path=atmega
atmega328bb.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex
atmega328bb.bootloader.unlock_bits=0x3F
atmega328bb.bootloader.lock_bits=0x0F
atmega328bb.build.mcu=atmega328p
atmega328bb.build.f_cpu=16000000L
atmega328bb.build.core=arduino:arduino
atmega328bb.build.variant=arduino:standard
[/code]
- Zapisujemy, odpalamy Arduino IDE
- Wybieramy płytę “ATmega328 on a breadboard (16 MHz external clock)”
- Wybieramy programator USBasp
- Wybieramy port dla programatora, np. COM3 (dla powyżej konfiguracji)
- Wypal bootloader
- Wypal aplikacje
UART czy USBasp?
No i teraz tak, aplikacja ładuje się przez UART! jeżeli chcemy programowac bezpośrednio (USBasp) to zmieniamy wpis z
atmega328bb.upload.protocol=stk500v1
na
atmega328bb.upload.protocol=usbasp
Zastosowanie usbasp + 8mhz + fix odnośnie błędu “target doesn’t answer” + Arduino 1.6 = nie ma problemu z bezpośrednim wypalaniem :)
8 Mhz – kwarc wewnętrzny
Zaleznie do czego nam potrzebna, jeżeli operujecie na niskich napięciach – to wymaga niższego taktowania. Jeżeli chcemy wgrać bootloader z 8mhz wewnętrznym kwarcem to wrzucamy poniższy cfg
##############################################################
atmega328bb.name=ATmega328 on a breadboard (8 MHz internal clock)
atmega328bb.upload.maximum_size=30720
atmega328bb.upload.speed=57600
atmega328bb.bootloader.tool=avrdude
atmega328bb.upload.tool=avrdude
atmega328bb.upload.protocol=stk500v1
atmega328bb.bootloader.low_fuses=0xE2
atmega328bb.bootloader.high_fuses=0xDA
atmega328bb.bootloader.extended_fuses=0x05
atmega328bb.bootloader.path=atmega
atmega328bb.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex
atmega328bb.bootloader.unlock_bits=0x3F
atmega328bb.bootloader.lock_bits=0x0F
atmega328bb.build.mcu=atmega328p
atmega328bb.build.f_cpu=8000000L
atmega328bb.build.core=arduino:arduino
atmega328bb.build.variant=arduino:standard
20Mhz – brak możliwości wgrywania przez uart?
Zmiana kwarcu na 20mhz wymusi zmianę predkości portu, daltego zmieniamy linijkę
atmega328bb.upload.speed=57600
na
atmega328bb.upload.speed=72000
Wzór : 57600*20/16
Wszystkie dostępne możliwe konfiguracje portów/procesor
Problematyka-Reset? DTR?
Zauwazyłem, że jest problem z resetem w porównaniu do arduino 1.0.5 (niekoniecznie), występuje jakiś kłopot z pinem DTR (podłączonym do atmegi – reset) który powinien resetować układ zaraz przed wgraniem romu. Dlatego przed jego wgraniem należy ręcznie zainicjować reset lub pomiędzy DTR a RESET wstawić 100nF monol. Ale to też może nie zadziałać kiedy stan wysoki DTR to 3.3V, które inrepretuje arduino jako niski. Najprościej to właczyć atmegę zaraz przy próbie komunikacji Arduino IDE z Arduino, ewentaulnie zrestartować lub zastosować konwerter napięć.
Atmega328p 8mhz na Arduino 1.0.x
atmega328bb.name=ATmega328 (8 MHz internal clock)
atmega328bb.upload.protocol=stk500v1
atmega328bb.upload.maximum_size=30720
atmega328bb.upload.speed=57600
atmega328bb.bootloader.low_fuses=0xE2
atmega328bb.bootloader.high_fuses=0xD8
atmega328bb.bootloader.extended_fuses=0x07
atmega328bb.bootloader.path=atmega
atmega328bb.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex
atmega328bb.bootloader.unlock_bits=0x3F
atmega328bb.bootloader.lock_bits=0x0F
atmega328bb.build.mcu=atmega328p
atmega328bb.build.f_cpu=8000000L
atmega328bb.build.core=arduino:arduino
atmega328bb.build.variant=arduino:standard
Atmega8 8mhz na Arduino 1.0.x
atmega8_opti_8mhz.name=ATmega8 Optiboot (8MHz internal OSC)
atmega8_opti_8mhz.upload.protocol=arduino
atmega8_opti_8mhz.upload.maximum_size=7680
atmega8_opti_8mhz.upload.speed=115200
atmega8_opti_8mhz.bootloader.low_fuses=0xa4
atmega8_opti_8mhz.bootloader.high_fuses=0xcc
atmega8_opti_8mhz.bootloader.path=atmega8
atmega8_opti_8mhz.bootloader.file=optiboot_atmega8_8.hex
atmega8_opti_8mhz.bootloader.unlock_bits=0x3F
atmega8_opti_8mhz.bootloader.lock_bits=0x0F
atmega8_opti_8mhz.build.mcu=atmega8
atmega8_opti_8mhz.build.f_cpu=8000000L
atmega8_opti_8mhz.build.core=arduino
atmega8_opti_8mhz.build.variant=standard
Atmega8 Arduino Piny
avrdude: error: programm enable: target doesn’t answer. 1
Mimo powyższych wskazówek z bootloaderem, to w wersji Adruino 1.6 będa dalej problemy z połączeniem.
Otwieramy plik : C:\Program Files (x86)\Arduino\hardware\arduino\avr\platform.txt
Odnajdujemy linijkę (linia 91) : tools.avrdude.erase.pattern=”{cmd.path}” “-C{config.path}” {erase.verbose} -p{build.mcu} -c{protocol} {program.extra_params} -e -Ulock:w:{bootloader.unlock_bits}:m -Uefuse:w:{bootloader.extended_fuses}:m -Uhfuse:w:{bootloader.high_fuses}:m -Ulfuse:w:{bootloader.low_fuses}:m
Zastępujemy ją na : tools.avrdude.erase.pattern=”{cmd.path}” “-C{config.path}” {erase.verbose} -p{build.mcu} -B 8 -c{protocol} {program.extra_params} -e -Ulock:w:{bootloader.unlock_bits}:m -Uefuse:w:{bootloader.extended_fuses}:m -Uhfuse:w:{bootloader.high_fuses}:m -Ulfuse:w:{bootloader.low_fuses}:m
Co zrobiłem? dopisałem flagę -B 8 która mówi o prędkości komunikacji portu w zależności od taktowania atmegi.