Newsgroup: it.hobby.elettronica.digitale
Titolo: Delay - Atmega8

Salve,
sto programmando un Atmega8 in C con WinAvr e Avrstudio 4.
Vorrei riuscire ad ottenere un delay di 1 secondo ma non so come fare.
Ho provato con la libreria <util/delay.h> e la seguente funzione:
void delay_ms(uint16_t ms)
{
  while ( ms )
  {
    _delay_ms(1);
    ms--;
  }
}
Quando la chiamo in questo modo:
delay_ms(500);
mi dura 4-5 secondi...
Utilizzo un quarzo di 8Mhz, e quando compila setta la seguente variabile:
-DF_CPU=8000000UL
Dove sbaglio??
Grazie
xoooox
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 mi dura 4-5 secondi...
Anche a te la solita domanda: hai controllato i fusibili?
Se è un 88 c'è anche da considerare il clock prescaler.

 Se è un 88 c'è anche da considerare il clock prescaler.
E' un Atmega8-16pi.
Premetto che ho collegato ai pic C0-C5 e D2 un display a 7 segmenti.
Comunque mi fa un comportamento strano, ossia gli ho messo un quarzo a 4Mhz
e la frequenza delle visualizzazioni sul display e' sempre la stessa (4-5
secondi).
Ho provato ad accendere il circuito eliminando i due condensatori e il
quarzo e il PIC continua a funzionare.
Perche?
Forse questo e' il mio problema?
grazie


 Forse questo e' il mio problema?
Senza dubbio. Controlla i fusibili.

 
nel gergo dei microcontrollori i "fusibili" o "fuse bit" in inglese sono 
   alcuni bit di configurazione del microcontrollore scrivibili solo in 
fase di programmazione
tipici usi sono la protezione dalla lettura della flash, il controllo 
del clock , del watchdog , di compatibilita' con altri chip o la 
configurazione di periferiche
in questi casi urge un R.T.F.M. :-)


Se ho capito bene, sto usando un "oscillatore" interno. Questo spiega
ilfatto perche' senza quarzo funziona.
La cosa che non ho capito, e' il discorso dei fusibili.
E' un settaggio del programmatore SW oppure c'e' qualcosa che non va nel
programmatore HW?
Uso il PonyProg2000 su parallela, con un programmatore HW realizzato come
indicato nel sito 
www.lancos.com
.



Per programmare il mio atmega8 uso il ponyprog2000.
Nel menu' "Command" ho trovato: "security and configuration bits" dove le
varie checkbox (tutte non spuntate):
bootlock12
bootlock11
bootlock02
bootlock01
lock2
lock1
WDTON
CKOPT
EESAVE
BOOTSZ1
BOOTSZ0
BOOTTRST
BODLEVEL
BODEN
SUT0
CHSEL3
CHSEL2
CHSEL1
CHSEL0
E due checkbox che non mi fa spuntare:
RSTDISBL
SPIEN
Penso che qui devo fare qualcosa... ma cosa???
Grazie


 Penso che qui devo fare qualcosa... ma cosa???
Come gią suggeritoti, RTFM.


Dato che con i settaggi elencati non ho trovato corrispondenza con RTFM,
ho consultato il seguente link:
http://elecrom.wordpress.com/2007/10/15/configuring-avr-fuse-bits-for-clock-selection/
Ossia ho chekkato: BOOTSZ1, BOOTSZ2 e SUT1.
A questo punto sembra che qualcosa inizia a funzionare,
ossia con il quarzo sembra andare bene, se lo levo va molto piu' lento...
Pero' come fattore negativo... non lo riesco piu' a programmarlo...
Il SW non riesce piu' a fare ne un read e ne un write. In poche parole mi
sono fumato l'AVR.
Adesso me ne rimane solo uno...


   
Con PonyProg (X=Checkmark) la configurazione per funzionamento
stand-alone, clock 8MHz interno e piu' o meno la seguente:
BOOTSZ1:X   ->0
BOOTSZ0:X   ->0
(Tutti gli altri senza checkmark)
I fuse CkSel1,2 e 3 servono per selezionare il clock:
Con questi setting in PonyProg imposti il clock interno a 8MHz
CKOPT:--       -> 1=Clock interno
CKSEL3:X      -> 0
CKSEL2:--      -> 1
CKSEL1:X      -> 0
CKSEL8:X      -> 0
Nota che in PonyProg i bit col il checkmark sono quelli che vengono
AZZERATI (0), quelli senza checkmark sono invece lasciati a 1
quindi attenzione! Puo' darsi che altri programmi usino una convenzione
diversa !!!!!!!!
Attenzione che se accidentalmente programmi qualche pin che utilizza
la SPI (SPIEN deve essere abilitato), ti fumi la possibilita'
di programmare via seriale il micro: a questo punto lo puoi
sbloccare solo con un programmatore hardware.
Ho notato che con il mega8 l' abilitazione del pin di RESET esterno
mi disattiva la possibilità di programmare la CPU via SPI e non
ho ancora capito perche'.
Se abiliti l' oscillatore esterno (perche mai poi???), questo deve
essere attivo, ovviamente, altrimenti la CPU non funzia ;-)
B.

ho ancora capito perche'.
Perchè durante la programmazione il reset viene tenuto basso.
Difatti i fili usati per la programmazione seriale sono 4 + 2 alimentazioni.
--
ciao
  Stefano

 Dove sbaglio??
A parte tutti i problemi di fuse bits, ma a cosa serve una funzione del 
genere?
Perché non puoi chiamare direttamente _delay_ms(500)?
-- 
  _|/ Francesco Sacchi - Develer S.r.l., R&D dept.
   |\ 
http://www.develer.com/
 - 
http://www.bertos.org/


Posso pure utilizzare i 500ms pero' in questo modo utilizzo, se ho capito
bene, un clock interno.
A questo punto, dato che il mega8 ha un clock interno, per applicazioni non
molto particolari, tipo accensione di led oppure comunicazione con la
seriale posso omettere il quarzo esterno.
Allora perche' tutti i circuiti di esempio che ho trovato in rete usano un
quarzo esterno pure per accendere un singolo led? Non e' indispensabile?



Grazie per il link...
anche se adesso ho paura di programmare l'ultimo atmega che ho...



In tutti gli esempi circuitali ho notato che c'e' sempre un quarzo a 8Mhz.
Se esiste un oscillatore interno perche' utilizzarne uno esterno (A parte
applicazioni particolari)?
grazie


   
Perche' l' oscillatore interno è realizzato con un circuito RC, che è un 
po' meno
preciso di un oscillatore al quarzo esterno: pero' se non ti serve una 
estrema
precisione del clock, pui farne benissimo a meno e risparmiare pin e costi
del quarzo esterno.
B.

 carissimo).
Oppure il più economico (ma non troppo) STK500, preziosissimo a
prescindere, che gli permetterebbe anche di "resuscitare" l'ATmega8.

 quarzo esterno pure per accendere un singolo led? Non e' indispensabile?
Perché sono la base per fare altri progetti. Se, per esempio, hai una
seriale asincrona, salvo procedimenti particolari di autocalibrazione devi
avere almeno un risuonatore ceramico, se non un quarzo.
La STK 500 ti permette, con un paio di jumper, di utilizzare quarzi,
risuonatori o il suo PLL che arriva a poco meno di 4MHz.

 bene, un clock interno.
Non hai capito, il mio punto era un altro: a cosa serve la funzione 
scritta sopra?
Che differenza c'è tra chiamare _delay_ms() e chiamare la tua 
delay_ms()? Qual è il suo scopo?


applicazioni particolari)?
Usando la UART spesso si deve calibrare l'oscillatore, per cui in genere si
preferisce mettere un quarzo o almeno un risuonatore ceramico.
--
ciao
  Stefano


Quindi, se ho capito bene per ottenere un oscillatore preciso mi conviene
usarne uno esterno.


usarne uno esterno.
Se ti serve un clock abbastanza preciso, si.
--
ciao
  Stefano