Atmega328 Standalone - Problema delay

Salve a tutti, ho un problema e non ne sto venendo fuori.
Ho un semplicissimo circuito atmega328 standalone che si occupa di far lampeggiare un led 5mm.
E' configurato per usare il clock interno, quindi 8 mhz.
Il led lampeggia in questo modo: 1 secondo acceso e 1 secondo spento.
In queste condizioni funziona bene.
Mi sono accorto che se monto il quarzo da 16 mhz e i 2 condensatori ceramici, e rifaccio l'upload dello sketch, sempre da arduino ide, l'istruzione delay si comporta male, cioè il led lampeggia con la metà della frequenza (2 secondi si e 2 secondi no).
Come programmatore uso arduino as isp.
Cosa devo controllare?

Ciao ho avuto lo stesso problema con un attiny, probabilmente devi ricaricare anche il bootloader per la frequenza giusta sul tuo atmega(dall'ide "scrivi bootloader")

Praticamente col quarzo piú veloce va piú lento?

Sei sicuro che il 328 non funziona ancora col oscillatore interno a 8Mhz ma lo sketch é compilato per 16MHz?

Ciao Uwe

Devi crearti una nuova board per gli 8Mhz e far compilare gli sketch alla nuova velocità di clock.
Quella standard di Arduino compila per i 16Mhz.
Oppure compili per "Arduino Pro Micro" scegliendo dal menù "processore" l'ATmega328P a 8Mhz.

Se imposti il chip per lavorare col clock interno, se poi dopo intendi usare un quarzo esterno devi risettare i fuse per questa condizione, altrimenti anche con il quarzo il chip continua a prendere il segnale di clock dall'oscillatore interno.
Oltre ovviamente al fatto che devi poi ricompilare lo sketch per la MCU con la nuova frequenza.

Ok con l'arduino ide ho risolto. E' necessario riscrivere il bootloader ogni volta.
Ora vorrei risolvere con atmel studio.
Ho sempre lo sketch del led,
ho messo queste istruzioni all'inizio:
#define F_CPU 8000000
#define ARDUINO 100
#include "Arduino.h"

ho importato le librerie
e uso questo external tool:
-C"C:\WinAVR-20100110\bin\avrdude.conf" -p atmega328p -c stk500v1 -P COM1 -b 19200 -Uflash:w:"$(ProjectDir)Debug$(ItemFileName).hex":i
però anche se lavora con il clock interno il delay risponde con il doppio del previsto.

Devi reimpostare anche i fuse.
Apri il file boards.txt e cerca tra le voci dell'Arduino Uno quelle relative ai fuse denominati high, low ed extended. Ecco i valori:
uno.bootloader.low_fuses=0xff
uno.bootloader.high_fuses=0xde
uno.bootloader.extended_fuses=0x05

Poi li passi come parametri ad avrdude.
La tua riga diverrebbe così:

-C"C:\WinAVR-20100110\bin\avrdude.conf" -p atmega328p -c stk500v1 -P COM1 -b 19200 -Uflash:w:"$(ProjectDir)Debug$(ItemFileName).hex":i -Uhfuse:w:0xde:m -Ulfuse:w:0xff:m -Uefuse:w:0x05:m

questa è la board:

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

atmega328bb.name=ATmega328 on a breadboard (8 MHz internal clock)
atmega328bb.upload.protocol=stk500
atmega328bb.upload.maximum_size=30720
atmega328bb.upload.speed=57600
atmega328bb.bootloader.low_fuses=0xE2
atmega328bb.bootloader.high_fuses=0xDA
atmega328bb.bootloader.extended_fuses=0x05
atmega328bb.bootloader.path=arduino:atmega
atmega328bb.bootloader.file=ATmegaBOOT_168_atmega328_pro_8MHz.hex
atmega328bb.bootloader.unlock_bits=0x3F
atmega328bb.bootloader.lock_bits=0x0F
atmega328bb.build.mcu=atmega328p
atmega328bb.build.f_cpu=8000000L
atmega328bb.build.core=arduino:arduino
atmega328bb.build.variant=arduino:standard

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

non fuziona quell'external tool

F-cpu su atmel studio viene usato per dare il giusto riferimento al compilatore, ma non va a programmare fisicamente i fuse.
Questo lo devi fare sempre manualmente tramite il programmatore.
Quindi o lo fai dall ide arduino, caricando il bootloader ( anche se il bl poi non ti serve) oppure lo fai da atmel studio dalla sezione programmatore.
Atmel studio però nasce per usare i programmatori originali atmel, quindi ad esempio usbasp, oppure arduinoISP non sono nativamente supportati.
Volendo, per programmare più chip velocemente, cerca un mio post in merito, puoi creare un unico file che include codice+fuse

Problema risolto. Mi è bastato ricompilare il file core.a dall'arduino ide con le impostazioni della board a 8mhz, poi l'ho importato nel mio progetto in atmel studio.

Non per essere ripetitivo ma... te l'avevo detto :wink:

leo72:
Oltre ovviamente al fatto che devi poi ricompilare lo sketch per la MCU con la nuova frequenza.