atmega 328 standalone: BOD e clock

buongiorno,

essendo la prima volta che mi cimento con un 328 standalone avrei bisogno di alcune informazioni, che non sono riuscito a trovare nel PG e nel web. ho montato un circuito SA come descritto nel PG, con oscillatore esterno 16MHz e lo programmo senza problemi con un convertitore USB/Serial (originale). il problema nasce alimentando il circuito a 3V: infatti sotto i 3V la MCU sembra completamente morta, non da alcun segno di funzionamento. credo che il problema sia dovuto al brownout, che blocca il funzionamento dell MCU al di sotto di una certa tensione di alimentazione. la prima domanda è come disabilitare il BOD? in rete ho trovato qualcosa, ma la maggior parte fa riferimento a vecchie board e non so se possono esserci differenze. ho a disposizione UNO rev3, MEGA 2560 e il sopra citato convertitore usb/serial.

altra domanda: per il compito che deve svolgere 16MHz sono esagerati, e dato che alla fine dovra funzionare a batterie credo che facendolo lavorare a 8MHz, o forse anche a 1MHz, si ha anche una maggiore durata delle batterie. ma come si fa a programmare il 328 a 8 e 1 MHz?

grazie in advance :P

Puoi farlo funzionare anche a frequenze inferiori al MHz, magari anche con un quarzetto da 32KHz.

La cosa migliore è dare un’occhiata al datasheet del componente, alla sezone riguardante la configurazione dl clock, e di conseguenza la programmazione dei fuse.

Inoltre, visto che l’applicazione è a batteria, suggerisco lo studio della sezione relativa alla messa in IDLE o SLEEP, in modo da mettere la MPU a riposo quando non è interessata a operazioni.

grazie BaBBuino, la messa in sleep l'ho già presa in considerazione ed è già implementata nello skecth e funzionante.

per la programmazione dei fuse credo che avrò qualche problema: l'ho fatto una sola volta con un attiny, copia/incollando il comando di avrdude. ma non c'è un altro modo? con un bootloader specifico magari? o impostando i parametri nel board.txt dell IDE? ho cercato e sto cercando ancora, ma non riesco a trovare una guida o della documentazione a riguardo. eppure il 328 credo sia abbastanza usato...

aggiungo una cosa: al momento to usando un 328P (perchè non ho altro), ma alla fine credo che migrerò il tutto su un 168P o 88P a seconda delle dimensioni finali dello sketch. a livello software ci saranno da fare aggiustamenti o sono perfettamente compatibili?

I fuse li puoi anche impostare da IDE, crei una board virtuale nel file boards.txt e lì ci metti i fuse che vuoi. Aiutati con AVR Fuse Calculator: http://www.engbedded.com/fusecalc E' un tool online che permette di calcolare i fuse in base alle impostazioni, ma fa anche l'opposto, ossia passando i fuse ti dice com'è regolato il micro. mettendo i fuse dell'Arduino e togliendo il brownout, ricalcoli i fuse.

Ricordati però che i fuse sono stati messi per uno scopo. Impediscono al chip di funzionare al di sotto di una specifica tensione. Ricorda che per andare a 16 MHz, ad esempio, il micro necessariamente necessita di un'alimentazione superiore ai 4V, pena instabilità e funzionamenti anomali. Sotto ai 3V poi il micro può lavorare solo con determinati range di frequenza, mi pare di ricordare solo max 10 MHz. Ci sono delle tabelle sul datasheet.

Qui la guida di Michele --> http://www.michelemenniti.it/arduino_burn_bootloader.php

vi ringrazio ragazzi, credo di aver iniziato a capirci qualcosa, ma vorrei una vostra conferma per evitare di brickare il chip.

dalla guida del prof. Menniti ho ricavato le board virtuali per la programmazione a 1 e 8 MHz:

1MHz

mega3201.name=ATmega in Stand Alone 1MHz internal clock (w/ Arduino as ISP)

mega3201.upload.protocol=stk500
mega3201.upload.maximum_size=32768
mega3201.upload.speed=115200
mega3201.upload.using=arduino:arduinoisp
mega3201.bootloader.low_fuses=0x62
mega3201.bootloader.high_fuses=0xdf
mega3201.bootloader.extended_fuses=0x07
mega3201.bootloader.path=optiboot
mega3201.bootloader.file=optiboot_atmega328.hex
mega3201.bootloader.unlock_bits=0x3F
mega3201.bootloader.lock_bits=0x0F
mega3201.build.mcu=atmega328p
mega3201.build.f_cpu=1000000L
mega3201.build.core=arduino

8mhz

mega3208.name=ATmega in Stand Alone 8MHz internal clock (w/ Arduino as ISP)

mega3208.upload.protocol=stk500
mega3208.upload.maximum_size=32768
mega3208.upload.speed=115200
mega3208.upload.using=arduino:arduinoisp
mega3208.bootloader.low_fuses=0xe2
mega3208.bootloader.high_fuses=0xdf
mega3208.bootloader.extended_fuses=0x07
mega3208.bootloader.path=optiboot
mega3208.bootloader.file=optiboot_atmega328.hex
mega3208.bootloader.unlock_bits=0x3F
mega3208.bootloader.lock_bits=0x0F
mega3208.build.mcu=atmega328p
mega3208.build.f_cpu=8000000L
mega3208.build.core=arduino

e fin qua ci siamo. tramite il calcolatore suggerito da Leo sono andato a verificare i fuse, in particolare l'Extended fuse per l'impostazione del BOD, ma c'è qualcosa che non mi torna: nelle board di Menniti è impostato a 0x07. inserendo questo valore nel calcolatore mi dice (se ho capito bene) che il BOD è disabilitato (nessuno dei tre livelli è flaggato). se invece agisco direttamente sui flag, togliendoli tutti e tre, il valore che mi da il calcolatore è 0xFF. cosa significa? entrambi i valori hanno lo stesso effetto?

Si è uguale, sia con 0x07 che con 0xFF il BOD è disabilitato. 0x07 equivale ad accendere il bit 2, 1 e 0 che ognuno pesa 4, 2, 1 che sommati fanno 7. 0x0FF in decimale vale 255 che equivale ad accendere tutti i bit da 0 fino a bit 7. Visto che l'extended fuse ha solo 3 bit LSB i 4 MSB non modificano nulla. Per impostare il BOD a 1.8V Extended fuse deve essere uguale a 4 + 2 = 0x06.

Leggi i fuse attuali con avrdude.

 avrdude -q -u -p m328p -c arduino -P COMPORT -U lfuse:r:-:h -U hfuse:r:-:h -U efuse:r:-:h

Al posto di COMPORT scrivi la seriale a cui è connesso l'arduino su cui c'è installato ArduinoISP.

Ciao.

leo72: I fuse li puoi anche impostare da IDE, crei una board virtuale nel file boards.txt e lì ci metti i fuse che vuoi. Aiutati con AVR Fuse Calculator: http://www.engbedded.com/fusecalc

Fantastico sto aggeggio. Mi mancava! XD

ricdata:
nelle board di Menniti è impostato a 0x07. inserendo questo valore nel calcolatore mi dice (se ho capito bene) che il BOD è disabilitato (nessuno dei tre livelli è flaggato).
se invece agisco direttamente sui flag, togliendoli tutti e tre, il valore che mi da il calcolatore è 0xFF.
cosa significa? entrambi i valori hanno lo stesso effetto?

I bit non usati possono assumere indifferentemente valore 0 oppure valore 1, dipende da come è stata scritta la memoria del micro. Se hai notato nel calcolatore, accanto al valore ti appare occasionalmente una nota in rosso che riporta di provare un altro valore.
Nello specifico, come ti ha spiegato Mauro, 0x07 o 0xFF sono per il micro indifferenti perché i bit dal 4° all’8° non sono usati. Però lo stato di default in memoria non è sicuro, devi verificare con entrambi i valori. Alle volte avrdude in verifica ti segnala un errore proprio per come è stata settata la sua memoria, e si usa il valore alternativo.

non riesco a caricare il bootloader :frowning:
ecco il messaggio dell’ ide

avrdude: Yikes! Invalid device signature.

  • Double check connections and try again, or use -F to override*
  • this check.*

ho controllato i collegamenti più volte e sono giusti.
sto usando UNO come programmatore ISP e un atmega328P-PU che ha già un bootloader e uno scketch caricati

sono riuscito a caricare il boootloader con la configurazione MEGA2560 come programmatore e la UNO come target. se comunque dovesse venirvi in mente perchè con la UNO come programmatore e breadboard target, accetto volentieri la soluzione. togliere e mettere i chip sulla UNO non mi fa impazzire.

grazie ancora a tutti gli intervenuti :)

A me viene in mente questa --> http://www.robot-italy.com/it/avr-isp-shield-programmatore-isp-per-arduino.html Se compri i singoli componenti te la puoi ricreare facilmente.

ricdata: sono riuscito a caricare il boootloader con la configurazione MEGA2560 come programmatore e la UNO come target. se comunque dovesse venirvi in mente perchè con la UNO come programmatore e breadboard target, accetto volentieri la soluzione. togliere e mettere i chip sulla UNO non mi fa impazzire.

Vedendo solo quello che viene scritto da avrdude, mi viene da pensare che hai fatto male dei collegamenti oppure hai scelto la combinazione di programmatore e board sbagliata. Però senza dirci come hai fatto i collegamenti vado ad intuito.

i collegamenti fatti sono quelli riportati nella guida di Menniti:

UNO - 328 10 - reset + 10K verso +5V 11 - 17 12 - 18 13 - 19 - 8 e 22 GND - 7 e 20 +5v - 9 e 10 quarzo 16mhz con condensatori 22pF verso massa

poi dopo aver programmato la UNO con ArduinoISP, ho selezionato la duemilanove (ma ho provato anche con altre) come board, Arduino as ISP come programmatore, infine Scrivi bootloader

Se selezioni 2009, viene scritto il bootloader della 2009. Se hai creato le board virtuali devi selezionare quest'ultime, altrimenti è meglio usare il bootloader della UNO.

sì Paolo, ho provato anche le board virtuali e la UNO, ma quell'errore esce in ogni caso.

ricdata: avrdude: Yikes! Invalid device signature. * Double check connections and try again, or use -F to override* * this check.*

Se non sono problemi di collegamenti, e ti invito a controllare eventuali contatti della broadboard, di solito questo errore indica che il micro è andato. Puoi usarlo come fermacarte. :roll_eyes:

la breadboard l'ho montata e smontata più volte (usando diverse zone): posso quasi sicuramente escludere che si tratti di falsi contatti o collegamenti sbagliati.

di solito questo errore indica che il micro è andato.

anche questo lo escludo, perchè in seguito, lo stesso chip, sono riuscito a programmarlo con successo con la MEGA2560.

Credo allora che sia il momento di chiamare Roberto Giacobbo. :grin: :grin:

credo di sì. hai il numero? :D