Buongiorno a tutti
Vorrei porre a voi un problema che ancora non sono riuscito a risolvere, nonostante anche le mie richieste di aiuto in newsgroup e forum.
Ho realizzato un apparecchietto che in certe condizioni deve emettere un BIIIP. Inizialmente il 328P girava quarzato a 16MHz e non accadeva nulla di strano; poi, quando tutto era più o meno finito, ho cominciato a ottimizzare, principalmente per ridurre l'assorbimento, che era circa 14mA. L'alimentazione viene fornita da una pila da 9V, con la tensione regolata a 5V da uno stabilizzatore micropower low-dropout.
Ho, perciò, riprogrammato i fuse per il funzionamento con clock interno a 1MHz (8MHz/DIV8) inserendo nel file boards.txt una voce "Arduino uno 1MHz (ATmega328)":
uno1MHz.name=Arduino uno 1MHz (ATmega328)
uno1MHz.upload.protocol=arduino
uno1MHz.upload.maximum_size=32256
uno1MHz.upload.speed=9600
uno1MHz.bootloader.low_fuses=0x62
uno1MHz.bootloader.high_fuses=0xd9
uno1MHz.bootloader.extended_fuses=0xfd
uno1MHz.bootloader.path=optiboot
uno1MHz.bootloader.file=optiboot_atmega328.hex
uno1MHz.bootloader.unlock_bits=0x3F
uno1MHz.bootloader.lock_bits=0x0F
uno1MHz.build.mcu=atmega328p
uno1MHz.build.f_cpu=1000000L
uno1MHz.build.core=arduino
uno1MHz.build.variant=standard
Il bootloader in realtà non mi serve, perché programmo con USBasp, ma così programmo i fuse.
Tutto sembrava funzionare normalmente tranne le temporizzazioni delayMicroseconds(100), problema che ho risolto impiegando delay(.12) (per ottenere 100uS ho dovuto impostare 0,12 causa la tolleranza dell'oscillatore interno).
C'è, invece, un piccolo problema: adesso il "BIIIP" ha delle interruzioni periodiche, un "cri-cri-cri" circa ogni 400mS per un BIIIP a 1kHz. Da che cosa dipende??? Con il clock a 16MHz non lo fa...
I 400mS della ripetizione del disturbo variano se cambio la frequenza del BIIIP
Il difetto è lo stesso anche cambiando I/O (4, 6, 12...)
Il difetto non parte sempre con lo stesso ritardo rispetto all'inizio del suono, ma ha una sua temporizzazione indipendente dal momento in cui il suono ha inizio.
Ecco uno sketch di test:
int a=12; //Pin su cui è collegato il buzzer piezo
void setup()
{
pinMode (a, OUTPUT);
}
void loop()
{
tone(a, 1000);
delay (2000);
noTone(a);
delay (1000);
}
A che cosa può essere dovuto? Interrupt?
E' un difetto del compilatore (IDE di Arduino)?
Come posso risolvere il problema?
Grazie!
Gianluca