Sanguinololu
Sanguinololu è una scheda che viene utilizzata per pilotare stampanti 3d.
Normalmente viene utilizzato un Atmega 644, è possibile inoltre utilizzare un Atmega1284P Pu.
Per programmarlo con l'ide Arduino è necessario aggiungere i dati dell'ATMEG1284P nel file di configurazione di avrdude, tenendo conto che Arduino ne ha una sua copia generalmente in /usr/share/arduino/hardware/tools/avrdude.conf
Il contenuto da aggiungere per la compatibilità con Atmega1284P è simile a questo, attenzione non è ancora la versione definitva :
#------------------------------------------------------------ # ATmega1284P #------------------------------------------------------------ # similar to ATmega164p part id = "m1284p"; desc = "ATmega1284P"; has_jtag = yes; stk500_devcode = 0x82; # no STK500v1 support, use the ATmega16 one avr910_devcode = 0x74; signature = 0x1e 0x97 0x05; pagel = 0xd7; bs2 = 0xa0; chip_erase_delay = 9000; pgm_enable = "1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1", "x x x x x x x x x x x x x x x x"; chip_erase = "1 0 1 0 1 1 0 0 1 0 0 x x x x x", "x x x x x x x x x x x x x x x x"; timeout = 200; stabdelay = 100; cmdexedelay = 25; synchloops = 32; bytedelay = 0; pollindex = 3; pollvalue = 0x53; predelay = 1; postdelay = 1; pollmethod = 1; pp_controlstack = 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, 0x66, 0x76, 0x67, 0x77, 0x6A, 0x7A, 0x6B, 0x7B, 0xBE, 0xFD, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02; hventerstabdelay = 100; progmodedelay = 0; latchcycles = 6; togglevtg = 1; poweroffdelay = 15; resetdelayms = 1; resetdelayus = 0; hvleavestabdelay = 15; chiperasepulsewidth = 0; chiperasepolltimeout = 10; programfusepulsewidth = 0; programfusepolltimeout = 5; programlockpulsewidth = 0; programlockpolltimeout = 5; idr = 0x31; spmcr = 0x57; allowfullpagebitstream = no; ocdrev = 3; memory "eeprom" paged = no; /* leave this "no" */ page_size = 8; /* for parallel programming */ size = 4096; min_write_delay = 9000; max_write_delay = 9000; readback_p1 = 0xff; readback_p2 = 0xff;
read = " 1 0 1 0 0 0 0 0",
" 0 0 x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o";
write = " 1 1 0 0 0 0 0 0",
" 0 0 x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i";
loadpage_lo = " 1 1 0 0 0 0 0 1", " 0 0 0 0 0 0 0 0", " 0 0 0 0 0 a2 a1 a0", " i i i i i i i i"; writepage = " 1 1 0 0 0 0 1 0", " 0 0 x x a11 a10 a9 a8", " a7 a6 a5 a4 a3 0 0 0", " x x x x x x x x"; mode = 0x41; delay = 10; blocksize = 128; readsize = 256;
; memory "flash" paged = yes; size = 131072; page_size = 256; num_pages = 512; min_write_delay = 4500; max_write_delay = 4500; readback_p1 = 0xff; readback_p2 = 0xff; read_lo = " 0 0 1 0 0 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; read_hi = " 0 0 1 0 1 0 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 a6 a5 a4 a3 a2 a1 a0", " o o o o o o o o"; loadpage_lo = " 0 1 0 0 0 0 0 0", " 0 0 x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; loadpage_hi = " 0 1 0 0 1 0 0 0", " 0 0 x x x x x x", " x a6 a5 a4 a3 a2 a1 a0", " i i i i i i i i"; writepage = " 0 1 0 0 1 1 0 0", "a15 a14 a13 a12 a11 a10 a9 a8", " a7 x x x x x x x", " x x x x x x x x";
mode = 0x41; delay = 10; blocksize = 256; readsize = 256;
; memory "lock" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x x x o o o o o o"; write = "1 0 1 0 1 1 0 0 1 1 1 x x x x x", "x x x x x x x x 1 1 i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "lfuse" size = 1; read = "0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 0 0 0", "x x x x x x x x i i i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "hfuse" size = 1; read = "0 1 0 1 1 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 1 0 0 0", "x x x x x x x x i i i i i i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "efuse" size = 1; read = "0 1 0 1 0 0 0 0 0 0 0 0 1 0 0 0", "x x x x x x x x o o o o o o o o"; write = "1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0", "x x x x x x x x 1 1 1 1 1 i i i"; min_write_delay = 9000; max_write_delay = 9000; ; memory "signature" size = 3; read = "0 0 1 1 0 0 0 0 x x x x x x x x", "x x x x x x a1 a0 o o o o o o o o"; ; memory "calibration" size = 1; read = "0 0 1 1 1 0 0 0 0 0 0 x x x x x", "0 0 0 0 0 0 0 0 o o o o o o o o"; ; ;
Questo il contenuto del file boards.txt (/usr/share/arduino/hardware/sanguino/boards.txt) in cui si specificano i valori dei bit di fuses, la frequenza di clock, il file ed il percorso del file bootloader ed altri parametri:
############################################################## atmega1284.name=Sanguino W/ ATmega1284p 16mhz # Tipo di protocollo utilizzato per caricare il firmware(stk versione 2). # Questo protocollo permette di inviare i dati usando la seriale invece che il programmatore per per glia avr atmega1284.upload.protocol=stk500v2 atmega1284.upload.maximum_size=129024 #Velocità della connessione seriale per il caricamento del firmware. Sul micro questa velocità è impostata #durante la compilazione del bootloader ed è indipendente dalla velocità impostata sugli sketch. #Quando il micro viene resettato passa su questa velocità per attendere la stringa inviata per l'inizio del dialogo stk. atmega1284.upload.speed=115200 #Alcuni bit di fuses che indicano al micro qualce tipo di clock usare, i settaggi della porta jtag ed altri parametri. atmega1284.bootloader.low_fuses=0xD7 atmega1284.bootloader.high_fuses=0xDC atmega1284.bootloader.extended_fuses=0xFD #Quella qui sotto è la cartella in cui si trova il file del bootloader atmega1284.bootloader.path=Gen7 #Il nome del file che contiene il bootloader compilato da caricare su Sanguinololu atmega1284.bootloader.file=bootloader-1284P-16MHz.hex #Bit di blocco e sblocco dell'area di memoria in cui viene scritto il bootloader. atmega1284.bootloader.unlock_bits=0x3F atmega1284.bootloader.lock_bits=0x0F #Probabilmente il tipo di impostazione usato per la compilazione. Se impostato a standard non funziona! atmega1284.build.mcu=atmega1284p #Frequenza di lavoro del micrcontrollore (attenzione se cambia, bisogna anche cambiare il bootloader) atmega1284.build.f_cpu=16000000L atmega1284.build.core=arduino atmega1284.build.variant=standard #
Schema collegamenti per la programmazione del bootloader o del firmware via SPI. In questo caso si usa Raspberry Pi come programmatore. Per i dettagli [Programmazione_dei_microcontrollori]