Atmega328 via Arduino IDE 1.5.x/1.0.x

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!

  1. Atmega328 (np. od Seguro, tak obsługują paczkomaty :) )
  2. Programator USBasp (np. od electropark, brak paczkomatów :()
  3. 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
  4. Modyfikacja pliku C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt

Dopisujemy na końcu pliku

16 Mhz – kwarc zewnętrzny

############################################################## 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
  1. Zapisujemy, odpalamy Arduino IDE
  2. Wybieramy płytę “ATmega328 on a breadboard (16 MHz external clock)”
  3. Wybieramy programator USBasp
  4. Wybieramy port dla programatora, np. COM3 (dla powyżej konfiguracji)
  5. Wypal bootloader
  6. 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ęć.

minimal-shrimp-no-uart-circuit

 

 

 

 

 

 

 

 

 

 

 

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

Plik Bootloadera

 

Atmega8 Arduino Piny

 

arduino328_8_pinouts

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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.

Ten wpis został opublikowany w kategorii Code, Ideas i oznaczony tagami . Dodaj zakładkę do bezpośredniego odnośnika.

Dodaj komentarz

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