USB Tiny ja Arduinon IDE

Lisää tyhmiä kysymyksiä.

Hommasin ja kasasin LadyAdan USBTinyn.

Arduinon IDEssa saan ladattua Bootloaderin ilman ongelmia, joten
elektroniikka lienee kunnossa.

Mutta miten saan breadboardille ohjelmat? Jos teen Arduinon IDElla,
niin mistään ei löydy *.hex -tiedostoja… AVRStudion olen lataillut,
mutta miten siinä pystyy käyttämään Arduinon kirjastoja? Voiko
.h:t jotenkin linkata mukaan?

Mölökysymyksiä, mutta jos joku viitsisi vastata, niin hyvä.

-kari

Hieman samansuuntaista mietin joskus itsekin, mutta ei ole ollut koskaan aikaa kokeilla. Kuka on kokeillut?

Vastaan itse, koska kerrankin onnisti.

Eli

  • ohjelmoinnissa Arduinon IDE (v. 0022 minun tapauksessani)
  • rautapuolella breadbordille istutettu Atmelin 328p, jossa ISP-liitin (minulla 6 pinnaa)
  • välissä LadyAdan USBTiny

Arduinon IDEllä pääsee lataamaan Bootloaderin, löytyy Tools-valikosta BurnBootloaderin yhtenä valintana. Bootloaderin polttamalla voi tarkistaa, että yhteydet (COM-asetukset, Tiny, ajurit) toimivat.

Sitten tuli ongelma. Kuinka polttaa Arduinon IDEllä tehty koodi piirille?

Tätä ei ole tehty ihan yksinkertaiseksi. Arduino tekee .hex -tiedoston, jonka voi polttaa AvrDudella (Dude tulee USBTinya). Ihmettelin aikani, mihin piruun .hex -tiedosto menee, ja löytyihän se. Käännösvaiheessa Arduinon IDEssa voi painaa SHIFT-näppäimen pohjaan, ja käynnistää käännöksen, jolloin näkee, mitä mihinkin hakemistoon menee.

.hex -tiedostot menevät temppihakemistoon, esim.

C:\Documents and Settings\User1\Local Settings\Temp\build7849452436754059347.tmp

Alku on aina vakio, eli C:\Documents and Settings<owner>\Local Settings\Temp\ ja buildin ajantasaisuuden näkee kansion aikaleimasta. Tosin en ensin nähnyt koko Local Settings -hakemistoa, koska se on ilmeisesti Windowsin oletusarvona “hidden”! Aseta Explorerilla näkyväksi.

Lähdetiedostoni nimi oli SleepCode.pde, ja tuon build…-hakemiston alta löytyy kääntämisen jälkeen SleepCode.cpp.hex, joka on siis poltettava data. HUOM! Arduinon IDE täytyy pitää auki, sillä temppihakemistot ja -tiedostot (myös .hex) häipyvät IDEn sulkemisen jälkeen huitsin Nevadaan.

Sitten vaan copy-paste SleepCode.cpp.hex, ja AvrDudella piirille.

Hyväksi koetun :wink: käytännön mukaan kopioin .hex -tiedoston C:-levyn juurihakemistoon, mistä käynnistän avrduden (luonnollisesti avrdude.exe on kätketty polun C:\Documents and Settings\User1\Desktop\arduino-0022\hardware\tools\avr\bin taakse, mutta laitoin polun DOSsin pathiin, joten dude lähtee käyntiin C:n juuresta.

Ei tätä ihan helpoksi ole tehty, mutta tiettyjä etuja on:

  1. Ohjelman voi kirjoittaa Arduinon IDElla, jota varten on saatavana hyvin paljon ohjelmointia helpottavia kirjastoja ja apuja netistä. Lyhyen tuntuman perusteella Arduinon IDE on Lada, ja AVRStudio Mersu, mutta Mersussa on pirun paljon vaihteita… Arduinon IDEllä aloitus on aikakin helppoa.
  2. Ohjelman voi testata valmiiksi jollain Arduinon kortilla, mikä mielestäni helpottaa elämää, sillä Arduinon kortti on tietokoneessa kiinni USBilla, eikä erityisvälineitä (breadboard, poweri) tarvita protoiluun.

Komento C:>avrdude -c usbtiny -p m328p -e -U flash:w:SleepCode.cpp.hex

ja johan alkaa tapahtua. Ohjelmakoodi tippuu piirille ja toimiikin vielä niin kuin pitää.

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e950f
avrdude: erasing chip
avrdude: reading input file “SleepCode.cpp.hex”
avrdude: input file SleepCode.cpp.hex auto detected as Intel Hex
avrdude: writing flash (3430 bytes):

Writing | ################################################## | 100% 2.02s

avrdude: 3430 bytes of flash written
avrdude: verifying flash memory against SleepCode.cpp.hex:
avrdude: load data flash data from input file SleepCode.cpp.hex:
avrdude: input file SleepCode.cpp.hex auto detected as Intel Hex
avrdude: input file SleepCode.cpp.hex contains 3430 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 1.80s

avrdude: verifying …
avrdude: 3430 bytes of flash verified

avrdude: safemode: Fuses OK

avrdude done. Thank you.

Itse löysin toisen ratkaisun ostaessani AVR Pocket Programmerin Sparkfunilta, joka tietääkseni pohjautuu USBTinyyn. Tällöin ohjelmien pudottaminen tapahtuu arduino IDEstä aivan kuten usb:n kautta, mutta välissä onkin programmer. Kohdepiiri tarvitsee kuitenkin bootloaderin ja ISP-pinnit.

Eli, ensin muokataan arduinon boards.txt -tiedostoa, joka löytyy arduino-0022/hardware/arduino -kansiosta (arduino-0022 siis IDEn asennushakemisto, muista sulkea IDE). Tiedostossa on listattuna IDE:n Tools>Board -valikon lankkujen asetukset, joita käytetään uploadaamisessa. Listasta valitaan oikea piiri/bootloader yhdistelmä, useimmilla AtMega328 (uusi duemilanove, nano) ja johonkin sen kohdan alueelle lisätään rivi, jolla valitaan, millä uploadataan.

atmega328.upload.using=usbtinyisp

josta atmega328:n voi korvata oikealla bootloaderilla, esim. uno, diecimila.

Tämän jälkeen, mikäli programmer toimii ja sillä on bootloaderin pudottanut piirille, pystyy IDEllä ohjelmoimaan breadboardille ISP-pinnien kautta. Jos kuitenkin haluat ilman bootloaderia niin silloin en osaa auttaa. Tässä tapauksessa tarvittanee myös ulkoinen 16MHz kide, mutta joku kokeneempi saa kertoa siitä lisää kun en osaa varmaksi sanoa.

Itse tein vielä sellaisen tempun, että kun omistan Unon, jätin Unon asetukset kuten ne olivatkin, ja pudotin breadboardille duemilanoven bootloaderin ja muokkasin kakkosvaihtoehdon eli duemilanove-lankun asetuksia siten, että se käyttää programmeria, ja nimesin sen vielä uudestaan “ATmega328 w/ USBTinyISP”, jolloin pystyn valikosta suoraan vaihtamaan, teenkö ohjelmia Unolleni vai breadboardille. Asetuksista voi säätää myös fuseja yms, jos tarve tulee.

Moi,

Menetelmäsi (boards.txt muokkaus) on ehdottomasti parempi kuin AvrDuden käyttö. Kokeilin muuttaa asetuksia, mutta ei vielä toimi… kun yrittää kääntää, tulee ilmoitus

No board selected; please choose from the Tools->Board menu

Uusi valikko-itemi kyllä näkyy Board menussa ja sen saa täpättyä.

Tämän tekstin laitoin Diecemilan tilalle:

diecimila.name=AtMega 328p Breadboard w/ USBTiny

atmega328.upload.protocol=stk500
atmega328.upload.maximum_size=30720
atmega328.upload.speed=57600
atmega328.upload.using=usbtinyisp

atmega328.bootloader.low_fuses=0xFF
atmega328.bootloader.high_fuses=0xDA
atmega328.bootloader.extended_fuses=0x05
atmega328.bootloader.path=atmega
atmega328.bootloader.file=ATmegaBOOT_168_atmega328.hex
atmega328.bootloader.unlock_bits=0x3F
atmega328.bootloader.lock_bits=0x0F

atmega328.build.mcu=atmega328p
atmega328.build.f_cpu=16000000L
atmega328.build.core=arduino

Ongelmahan tuossa ainakin on, että nimi on diecimilalle, mutta loput ovat atmega328:lle. Verratessani omaa tiedostoani eroja diecimilan ja atmega328:n (duemilanove, nano) on ainakin, että osa fuseja on eri tavalla ja upload speed ja max upload size ovat eri. Toimisiko jos tuon diecimila.name kohdan vaihtaisi atmega32.name:ksi?

Muutin Duemilenovan asetuksia siten, että jätin muun koskematta,
mutta laitoin lisää rivin

atmega328.upload.using=usbtinyisp

Kääntää, mutta ei uploadaa. Saan javavirheen latauksen yhteydessä.
Muutin myös programmers -tiedoston tiny-lauseen kirjoitusmuodon
small capsiksi, mutta ei auta oikein mikään.

Mikä on IDE-versiosi? Minulla se on 0022.

-kari

0022 on itsellänikin. Korjatakseni aikaisempaa lausantoani bootloaderia näköjään tarvitse, löysin vihdoinkin sivun josta ko. keinon löysin.

http://www.arduino.cc/en/Hacking/Programmer

Oma boards.txt on seuraavanlainen:

##############################################################

uno.name=Arduino Uno
uno.upload.protocol=stk500
uno.upload.maximum_size=32256
uno.upload.speed=115200
uno.bootloader.low_fuses=0xff
uno.bootloader.high_fuses=0xde
uno.bootloader.extended_fuses=0x05
uno.bootloader.path=optiboot
uno.bootloader.file=optiboot_atmega328.hex
uno.bootloader.unlock_bits=0x3F
uno.bootloader.lock_bits=0x0F
uno.build.mcu=atmega328p
uno.build.f_cpu=16000000L
uno.build.core=arduino

##############################################################

atmega328.name=ATmega328 w/ USBtinyISP

atmega328.upload.protocol=stk500
atmega328.upload.maximum_size=30720
atmega328.upload.speed=57600

atmega328.bootloader.low_fuses=0xFF
atmega328.bootloader.high_fuses=0xDA
atmega328.bootloader.extended_fuses=0x05
atmega328.bootloader.path=atmega
atmega328.bootloader.file=ATmegaBOOT_168_atmega328.hex
atmega328.bootloader.unlock_bits=0x3F
atmega328.bootloader.lock_bits=0x0F

atmega328.build.mcu=atmega328p
atmega328.build.f_cpu=16000000L
atmega328.build.core=arduino
atmega328.upload.using=usbtinyisp

##############################################################

diecimila.name=Arduino Diecimila, Duemilanove, or Nano w/ ATmega168

diecimila.upload.protocol=stk500
diecimila.upload.maximum_size=14336
diecimila.upload.speed=19200

diecimila.bootloader.low_fuses=0xff
diecimila.bootloader.high_fuses=0xdd
diecimila.bootloader.extended_fuses=0x00
diecimila.bootloader.path=atmega
diecimila.bootloader.file=ATmegaBOOT_168_diecimila.hex
diecimila.bootloader.unlock_bits=0x3F
diecimila.bootloader.lock_bits=0x0F

diecimila.build.mcu=atmega168
diecimila.build.f_cpu=16000000L
diecimila.build.core=arduino

##############################################################

mega2560.name=Arduino Mega 2560

mega2560.upload.protocol=stk500v2
mega2560.upload.maximum_size=258048
mega2560.upload.speed=115200

mega2560.bootloader.low_fuses=0xFF
mega2560.bootloader.high_fuses=0xD8
mega2560.bootloader.extended_fuses=0xFD
mega2560.bootloader.path=stk500v2
mega2560.bootloader.file=stk500boot_v2_mega2560.hex
mega2560.bootloader.unlock_bits=0x3F
mega2560.bootloader.lock_bits=0x0F

mega2560.build.mcu=atmega2560
mega2560.build.f_cpu=16000000L
mega2560.build.core=arduino

##############################################################

mega.name=Arduino Mega (ATmega1280)

mega.upload.protocol=stk500
mega.upload.maximum_size=126976
mega.upload.speed=57600

mega.bootloader.low_fuses=0xFF
mega.bootloader.high_fuses=0xDA
mega.bootloader.extended_fuses=0xF5
mega.bootloader.path=atmega
mega.bootloader.file=ATmegaBOOT_168_atmega1280.hex
mega.bootloader.unlock_bits=0x3F
mega.bootloader.lock_bits=0x0F

mega.build.mcu=atmega1280
mega.build.f_cpu=16000000L
mega.build.core=arduino

##############################################################

mini.name=Arduino Mini

mini.upload.protocol=stk500
mini.upload.maximum_size=14336
mini.upload.speed=19200

mini.bootloader.low_fuses=0xff
mini.bootloader.high_fuses=0xdd
mini.bootloader.extended_fuses=0x00
mini.bootloader.path=atmega
mini.bootloader.file=ATmegaBOOT_168_ng.hex
mini.bootloader.unlock_bits=0x3F
mini.bootloader.lock_bits=0x0F

mini.build.mcu=atmega168
mini.build.f_cpu=16000000L
mini.build.core=arduino

##############################################################

fio.name=Arduino Fio

fio.upload.protocol=stk500
fio.upload.maximum_size=30720
fio.upload.speed=57600

fio.bootloader.low_fuses=0xFF
fio.bootloader.high_fuses=0xDA
fio.bootloader.extended_fuses=0x05
fio.bootloader.path=arduino:atmega
fio.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex
fio.bootloader.unlock_bits=0x3F
fio.bootloader.lock_bits=0x0F

fio.build.mcu=atmega328p
fio.build.f_cpu=8000000L
fio.build.core=arduino:arduino

##############################################################

bt328.name=Arduino BT w/ ATmega328

bt328.upload.protocol=stk500
bt328.upload.maximum_size=28672
bt328.upload.speed=19200
bt328.upload.disable_flushing=true

bt328.bootloader.low_fuses=0xff
bt328.bootloader.high_fuses=0xd8
bt328.bootloader.extended_fuses=0x05
bt328.bootloader.path=bt
bt328.bootloader.file=ATmegaBOOT_168_atmega328_bt.hex
bt328.bootloader.unlock_bits=0x3F
bt328.bootloader.lock_bits=0x0F

bt328.build.mcu=atmega328p
bt328.build.f_cpu=16000000L
bt328.build.core=arduino

##############################################################

bt.name=Arduino BT w/ ATmega168

bt.upload.protocol=stk500
bt.upload.maximum_size=14336
bt.upload.speed=19200
bt.upload.disable_flushing=true

bt.bootloader.low_fuses=0xff
bt.bootloader.high_fuses=0xdd
bt.bootloader.extended_fuses=0x00
bt.bootloader.path=bt
bt.bootloader.file=ATmegaBOOT_168.hex
bt.bootloader.unlock_bits=0x3F
bt.bootloader.lock_bits=0x0F

bt.build.mcu=atmega168
bt.build.f_cpu=16000000L
bt.build.core=arduino

##############################################################

lilypad328.name=LilyPad Arduino w/ ATmega328

lilypad328.upload.protocol=stk500
lilypad328.upload.maximum_size=30720
lilypad328.upload.speed=57600

lilypad328.bootloader.low_fuses=0xFF
lilypad328.bootloader.high_fuses=0xDA
lilypad328.bootloader.extended_fuses=0x05
lilypad328.bootloader.path=atmega
lilypad328.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex
lilypad328.bootloader.unlock_bits=0x3F
lilypad328.bootloader.lock_bits=0x0F

lilypad328.build.mcu=atmega328p
lilypad328.build.f_cpu=8000000L
lilypad328.build.core=arduino

##############################################################

lilypad.name=LilyPad Arduino w/ ATmega168

lilypad.upload.protocol=stk500
lilypad.upload.maximum_size=14336
lilypad.upload.speed=19200

lilypad.bootloader.low_fuses=0xe2
lilypad.bootloader.high_fuses=0xdd
lilypad.bootloader.extended_fuses=0x00
lilypad.bootloader.path=lilypad
lilypad.bootloader.file=LilyPadBOOT_168.hex
lilypad.bootloader.unlock_bits=0x3F
lilypad.bootloader.lock_bits=0x0F

lilypad.build.mcu=atmega168
lilypad.build.f_cpu=8000000L
lilypad.build.core=arduino

##############################################################

pro5v328.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328

pro5v328.upload.protocol=stk500
pro5v328.upload.maximum_size=30720
pro5v328.upload.speed=57600

pro5v328.bootloader.low_fuses=0xFF
pro5v328.bootloader.high_fuses=0xDA
pro5v328.bootloader.extended_fuses=0x05
pro5v328.bootloader.path=atmega
pro5v328.bootloader.file=ATmegaBOOT_168_atmega328.hex
pro5v328.bootloader.unlock_bits=0x3F
pro5v328.bootloader.lock_bits=0x0F

pro5v328.build.mcu=atmega328p
pro5v328.build.f_cpu=16000000L
pro5v328.build.core=arduino

##############################################################

pro5v.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168

pro5v.upload.protocol=stk500
pro5v.upload.maximum_size=14336
pro5v.upload.speed=19200

pro5v.bootloader.low_fuses=0xff
pro5v.bootloader.high_fuses=0xdd
pro5v.bootloader.extended_fuses=0x00
pro5v.bootloader.path=atmega
pro5v.bootloader.file=ATmegaBOOT_168_diecimila.hex
pro5v.bootloader.unlock_bits=0x3F
pro5v.bootloader.lock_bits=0x0F

pro5v.build.mcu=atmega168
pro5v.build.f_cpu=16000000L
pro5v.build.core=arduino

##############################################################

pro328.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328

pro328.upload.protocol=stk500
pro328.upload.maximum_size=30720
pro328.upload.speed=57600

pro328.bootloader.low_fuses=0xFF
pro328.bootloader.high_fuses=0xDA
pro328.bootloader.extended_fuses=0x05
pro328.bootloader.path=atmega
pro328.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex
pro328.bootloader.unlock_bits=0x3F
pro328.bootloader.lock_bits=0x0F

pro328.build.mcu=atmega328p
pro328.build.f_cpu=8000000L
pro328.build.core=arduino

##############################################################

pro.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168

pro.upload.protocol=stk500
pro.upload.maximum_size=14336
pro.upload.speed=19200

pro.bootloader.low_fuses=0xc6
pro.bootloader.high_fuses=0xdd
pro.bootloader.extended_fuses=0x00
pro.bootloader.path=atmega
pro.bootloader.file=ATmegaBOOT_168_pro_8MHz.hex
pro.bootloader.unlock_bits=0x3F
pro.bootloader.lock_bits=0x0F

pro.build.mcu=atmega168
pro.build.f_cpu=8000000L
pro.build.core=arduino

##############################################################

atmega168.name=Arduino NG or older w/ ATmega168

atmega168.upload.protocol=stk500
atmega168.upload.maximum_size=14336
atmega168.upload.speed=19200

atmega168.bootloader.low_fuses=0xff
atmega168.bootloader.high_fuses=0xdd
atmega168.bootloader.extended_fuses=0x00
atmega168.bootloader.path=atmega
atmega168.bootloader.file=ATmegaBOOT_168_ng.hex
atmega168.bootloader.unlock_bits=0x3F
atmega168.bootloader.lock_bits=0x0F

atmega168.build.mcu=atmega168
atmega168.build.f_cpu=16000000L
atmega168.build.core=arduino

##############################################################

atmega8.name=Arduino NG or older w/ ATmega8

atmega8.upload.protocol=stk500
atmega8.upload.maximum_size=7168
atmega8.upload.speed=19200

atmega8.bootloader.low_fuses=0xdf
atmega8.bootloader.high_fuses=0xca
atmega8.bootloader.path=atmega8
atmega8.bootloader.file=ATmegaBOOT.hex
atmega8.bootloader.unlock_bits=0x3F
atmega8.bootloader.lock_bits=0x0F

atmega8.build.mcu=atmega8
atmega8.build.f_cpu=16000000L
atmega8.build.core=arduino

Tuolla se pelitti aikaisemmin. Minulla ei juuri nyt ole atmegaa protolevyllä että voisin tarkistaa vielä asian.

Asioita joita voisi kokeilla on mm. bootloaderin polttaminen piirille, avrdudella programmerin varmistaminen ja programmerin siirtämistä toiseen usb-porttiin. Olen itsekin melko vasta-alkaja ongelmatilanteissa, tiedän, että itse tätä ehdotin mutta koska en ole itse ongelmiin törmännyt tämän kanssa niin en oikein osaa neuvoakaan niiden selvityksessä. Parhaani teen kuitenkin.

meni ohjeet “vähän” yli hilseen, etin itelle nyt tarpeeseen bootloaderia,eli kasassa on nyt jokunen projekti kortilla arduino uno R3 eli se uudempi kortti.
nyt tarve ostaa (mistä edullisimmat?) atmega 328 tyhjiä piirejä ja polttaa niihin tuo arduinon vaatima joku bootloaderi.
mitä tarvitsen ?
rauta ?
ohjelmat?
kirjastot ja missä kansioissa pitää olla ?
sitten kai tuo piiri toimii samoin kuin alkuperäinen arduinon oma piiri ja kortti ?

piirit laitan valmistuneiden projektien itsetehdyile piirilevyille koteloihin jolloinka ei tarvi koko arduinoa tunkea laatikkoon ja käyttöön.vain piiri ja ne pinnit mitä juuri siinä tehtävässä tarvitaan,
eli riisuttu kortti käyttöön eri projekteihin.
alkuperäinen jää ohjelmointia ja kokeiluja varten sitten, eikä tarvi ostaa uusia arduino kortteja enää.

hei! ite kikkailin saman ongelman kansaa joskus… sattu silmään… kokeile valita pelllä usbtiny
atmega328.upload.using=usbtiny

tai tarkista josko jostain löytyy millä nimellä sen on kirjoitettu… programmers.txt löytyy jostain ja siellä näkynee… itellä muistaakseni ongelma ratkes sillon tuohon…