Sanguinololu

Da raspibo.
Jump to navigation Jump to search

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. I dettagli per la configurazione di Raspberry come programmatore sono quiProgrammazione dei microcontrollori

Raspberry programmer sanguinololu.png
dettaglio pin
dall'alto