Newsgroup: it.hobby.elettronica.digitale
Titolo: taratura clock

Salve!
Pensavo alla creazione di un orologio sfruttando l'interrupt del timer1 di 
un Pic 16F877 con quarzo a 20 Mhz.
Vorrei mettere un compensatore in serie ad un piedino del quarzo per fare 
una regoalzione fine dell'esatta frequenza di clock, pensavo per fare cio' 
di creare un main vuoto ed una routine di interrupt per owerflow del timer 
1, considerando che il timer1 e a 16bit quindi 2alla 16 e' 65536 il timer 
funzioanndo alla frequenza di 20mhz/4 ovvero a 5mhz dovrei avere un 
interrupt ogni 13,1072 ms cioe' ad una frequenza di 76,2939453125 HZ ora che 
ne pensate di misurare questa frequenza con un frequenzimetro con la sonda 
su un piedino di uscita? per fare questo si puo' usare:
#define prova_freq pin_a1
#int_TIMER1
void TIMER1_isr()
{
output_toggle (prova_freq);
}
considerando che in assembler il compilatore produce per 
output_toggle(prova_freq):
  BSF    03.5
  BCF    06.4
  MOVLW  10
  BCF    03.5
  XORWF  06,F
insomma come si fa a regolare esattamente il clock del micro? 

 un Pic 16F877 con quarzo a 20 Mhz.
Ciao!
Hai un motivo particolare per usare un qurzo da 20MHz?
Perchè altrimenti se usi un quarzo da 32,768KHz mi sa che risolvi i 
problemi molto più facilmente! Del resto tale quarzo è molto facile da 
trovare!
32768 / 4 = 8192 / 32 = 256 (!!!!)
Il 32 sarebbe l'impostazione del prescaler sul TMR.
Ciao!
-- 
Stefano Martini (Italy)
WEB: 
http://www.lemming.it
I am so scared, / I am so guilty, / I am so sad!!

 insomma come si fa a regolare esattamente ilclockdel micro?
I quarzi con compensatore hanno il fascino della
regolazione del pendolo dei vecchi orologi, ma non
sono molto pratici.
Via software è molto più semplice.
Per esempio, se il clock è di 20 MHz, non devi fare
avanzare il contatore dei secondi ogni 20.000.000
cicli costanti, ma di un valore che stabilirai in fase
di esecuzione. In questo modo puoi regolare l'orologio
con una finezza di 0.05 ppm, molto migliore di
qualunque compensatore e, inoltre, puoi tararlo a colpo
sicuro osservando quanti secondi sbaglia in quanti
giorni.

 giorni.
Perdonami ma ci sono alcune inesattezze...
Innanzi tutto il ciclo di istruzione di un PIC vale f/4 quindi 
viaggia in pratica a 200nS per istruzione. La finezza dei ppm scende 
quindi a 0,2ppm.
Ma anche in questo caso dovresti teorizzare che il PIC faccia solo ed
eslusivamente quello (cioč contare i secondi) senza memorizzarli da 
nessuna parte nč mostrarli su alcun piedino di uscita (altrimenti 
altri cicli di istruzione e abbassamento ulteriore della 
regolazione)...
-- 
Diagnostics are the programs that run when nothing else will.
News 2002 [v 2.3] / StopDialer / PopDuster - 
http://www.socket2000.com
Akapulce portal: 
http://www.akapulce.net

 di esecuzione.
Forse faresti meglio a precisare che si tratta di aggiungere o togliere
un'unità al registro di periodo del timer ogni N timeout, altrimenti
qualche ritardato potrebbe pensare che tu proponga di fare un RTC con dei
loop di... ritardo.

 loop di... ritardo.
L'unico ritardato in questo thread, esimio frescone, è il solito 
bertolazzi...
Se non conosci i PIC statti zitto. Continua a farti pippe con gli 
atmel.
-- 
In God we trust; all else we walk through.


 registro di periodo
Quello che nel PIC16F877 si chiama PR2.

 di esecuzione. In questo modo puoi regolare l'orologio
Pero' pensare di farlo su una produzione di, per esempio, 1000
esemplari, mi genera un principio di esaurimento nervoso. :)
Per le derive termiche invece che soluzioni avete?
Saluti
Massimo IW0HKG

 Per le derive termiche invece che soluzioni avete?
Eh, bella domanda. Se riesci a caratterizzare la deriva ed accoppiare
termicamente il quarzo ad un sensore di temperatura (o, meglio ancora, se
hai un controller tipo ATtiny 2/4/84 o 2/4/85 col suo termometrino dentro)
forse, chissà...

Ciao a tutti!
Sono mancato per due girni da casa e quando sono tornato, mi sono detto ora 
leggo cosa hanno scritto i miei amici :-) a proposito della mia richiesta, 
ho notato che come al solito ci sono i litigi fra Due di Picche e 
Bertolazzi, mi domando ma non c'e' modo alcuno di non farvi litigare? poi ci 
sono le risposte che mi sa nno tanto di accademia............. e la risposta 
a quello che avevo chiesto? qualcuno ha tentato dicendo si usare un quarzo 
che dia tempi interi, a questo ci avevo pensato, pero' stavo cercando fra i 
valori standard un quarzo con velocita' maggiore.
Al preambolo del mio messaggio alla fine chiedevo se con )toggle piedino di 
uscita) su interrupt del timer potevo monitorare monitorare la frequenza del 
timer. 

 timer. 
Se ho capito bene cosa vuoi fare, la risposta è si, e non è molto
difficile, sepre però ti parlo di routine ASM.
Ciao!
Stefano


 un Pic 16F877 con quarzo a 20 Mhz.
puoi utilizzare il modulo CCP; lo utilizzi in modalità "compare" creando
un interrupt ogni (ad esempio) 100ms; a questo punto ti basta incrementare
una variabile ad ogni interrupt e, quando arrivi a 10, incrementi di un
secondo e azzeri la variabile.
Io ho fatto un piccolo timer con questa filosofia..  è altresì vero che
tanto conta 2 minuti quindi anche se non è precisissimo importa il giusto!
-- 
Davide C.
www.ingegnerando.it
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 insomma come si fa a regolare esattamente il clock del micro? 
Se hai un frequenzimetro per misurare l'uscita perchè non misurare 
direttamente sul quarzo su OSC2? Se hai paura di caricare lo stadio 
allora l'idea dell'interrupt è buona però non arriverei a frequenze 
così basse (anche perchè è difficile trovare frequenzimetri che 
leggano molti decmali sugli hertz).
-- 
Earth is 98% full...please delete anyone you can.


 qualcosa. Fammi sapere se ti interessa.
E' quello che vorrei fare cioe' sfruttare gli interrupt dei timer, la parte 
di  codice che ho postato si riferisce all' interrupt del TIMER1 di un 
PIC16F877A, il problema vero sta nel monitorare l'interrupt dall' esterno, 
mi spiego meglio, con i settaggi che ho, cioe' quarzo da 20Mhz, prescaler 
1:1 uso del timer1, si ha un interrupt ogni 13,1072 ms cioe' ad una 
frequenza di 76,2939453125 HZ,  il mio dubbio era se nella routine di 
interrupt metto (toggle piedino dle pic), succedera' che ad ogni interrupt 
lo stato del pin del pic variera' da 0 ad 1, quindi in teoria se metto un 
frequenzimetro su tale piedino deovrei leggere la frequenza dell' interrupt? 
siccome non sono bravo in C per non parlare dell' assembler, non so 
l'istruzione toggle quando tempo impieghi e quindi non so se la misurazione 
sia veritiera o quando ritardo aggiungera' , avevo postato anche il codice 
assembler dato da toggle.
Pensavo anche al modo di leggere la frequenza del quarzo, ma non so cosa 
succede se metto la sonda del frequenzimetro direttamente sui piedini dle 
quarzo. 


Questa la devo provare, pero' ho paura che la modesta sonda che ho possa 
bloccare l'oscillatore, secondo te l'idea che ho avuto, cioe' mettere toggle 
nell' interrupt e' valida? oppure bisognerebbe calcolare questa istruzione 
quanti cicli richiede ed aggiungere tale valore a quello dell'interrupt?

 tanto conta 2 minuti quindi anche se non è precisissimo importa il giusto!
A dire il vero con gli interrupt sul timer0 che e' ad 8 bit e con il timer1 
a 16 bit ho fatto un timer che in 24 ore perde circa 15 secondi, il problema 
che mi ponevo era il sistema per tarare le piccole tolleranze del clock che 
su tempi lunghi danno errori rilevanti. 

 quanti cicli richiede ed aggiungere tale valore a quello dell'interrupt?
L'importante č che le istruzioni contenute nell'interrupt durino meno
del periodo selezionato per l'interrupt stesso. Non devi sommare 
nulla se riesci a stare in questa finestra temporale.
-- 
IBM: Ici Beaucoup Merde


 forse, chissà...
Magari ci fossero solo le derive termiche! Comunque eliminando
il compensatore si toglie la principale fonte di instabilità.
I quarzi poi non sono tutti uguali, bisogna usarne uno buono.
Infine l'alimentazione deve essere bella stabile e per i condensatori
usare condensatori ceramici NP0 o, meglio ancora, a mica
argentata.

 Quello che nel PIC16F877 si chiama PR2.
Eh si... TMR2. Peccato che "...The input clock (FOSC/4) has a 
prescale option of 1:1, 1:4 or 1:16..."
cioč 200nS di risoluzione non 50nS...  Come dicevo appunto. 
-- 
All new: The software is not compatible with previous versions.



Ho trovato la soluzione quasi perfetta "ora sto facendo girare l'orologio 
per vedere di quanto si scosta" vi dicono niente i registri TMR1H e TMR1L ? 
giocando con questi due registri si puo' fare in modo che anche un quarzo da 
20Mhz possa dare degli intervalli di interrupt interi "quasi". caricando in 
questi registri  i valori 00X7F in TMR1H e 00X81 in TMR1L.
Con questi valori impostando il prescaler a 2:1 ho un interrupt ogni 13,158 
ms quindi dopo 76 cicli ho 1000,008ms.
Per i calcoli ho usato un calcolatore trovato in rete si chiama PIC timer 
calculator versione 0.9.2

 sia veritiera o quando ritardo aggiungera' , avevo postato anche il codice 
Beh, questo è facilmente calcolabile in ASM.
Considerando il toggle fatto così:
MOVLw 1
XORWF PORTB, f
entrambe le istruzioni sono da 1 ciclo, quindi con un quarzo da 20MHz 
corispondono a 20000000 / 4 = 5000000 * 2 = 10000000 = 0,0000001 secondi.
Ovviamente questo è un esempio, dipende da come strutturi il tuo firmw. 
Generalmente preferisco utilizzare questi sistemi per effettuare un 
toggle di una variabile.
Ciao!


 ha scritto nel messaggio 
news:49bd833b$0$710$5fc...@news.tiscali.it...

Vuoi correggere un errore di precisione del quarzo (hanno anche loro una 
certa tolleranza), oppure non riesci ad implementare un orologio efficiente 
nel tuo software ?
Nel primo caso, c'è poco da fare...in base alla precisione che vuoi ottenere 
devi utilizzare cristalli con xppm di errore.
Considera anche che l'utlilizzo di compensatori per 'affinare' il clock ha 
in primo luogo una controindicanzione in quanto per tempi lunghi (dopo 
qualche anno) le capacità variabili 'variano' (ossidazione,vibrazioni,...), 
ed in secondo luogo c'è la necessità di tarare tutte le schede in 
produzione.
La taratura, per essere precisa, deve essere fatta quando la frequenza è 
ancora 'alta' (prima del prescaler), altrimenti l'errore aumenta.
Se invece il tuo scopo è di realizzare un rtc preciso via sw, affidandoti 
all'hw che hai, ti si presentano 2 strade: utilizzare un quarzo che abbia 
una frequenza che sia una potenza di 2 (classico il 32768kHz) e (micro 
permettendo) collegarlo all'ingresso oscillatore del timer1 in modo da avere 
un rtc separato dal clock di sistema.
L'altra alternativa è di non ostinarsi a cercare un fattore di divisione ed 
un prescaler precisi, quando ci sarà sempre un errore.
Invece di contare il tempo, è molto più sensato contare direttamente i cicli 
di clock (visto che hgli interrupt sono scatenati dopo un conteggio di cicli 
di click, appunto).
Ne abbiamo parlato abbastanza a lungo qui 
http://www.ccsinfo.com/forum/viewtopic.php?t=26177&postdays=0&postorder=asc&highlight=timer+precision&start=0
Il codice riportato funziona perfettamente. 

 argentata.
Visto che è alimentato a 220V sono però indeciso se non semplificare il
tutto ed agganciarmi alla frequenza di rete.
Tra l'altro, essendo montato sulla cappa di aspirazione, è possibile che
non sia sempre a temperatura costante.
Tu che ne dici?

non sia sempre a temperatura costante.
La frequenza di rete è stabilissima, però è abbastanza difficile da
sincronizzare bene.
I disturbi e gli impulsi spuri presenti sempre sulla linea fanno si che gli
orologi sincronizzati sulla rete tendano sempre ad andare avanti.
Io ormai ho standardizzato il 41T81 con un quarzo a 32Khz, costa e consuma poco
e ha anche funzioni interessanti, quali la memoria del power off.
--
ciao
  Stefano

 e ha anche funzioni interessanti, quali la memoria del power off.
Lo stampato è già fatto, il timer è già montato. Anche per questo, a
pensarci meglio, non credo mi aggancerò alla rete, in quanto dovrei portare
un altro filo, preso prima dell'alimentatorino switching, per il sense
dello zerocross.
Vado di quarzo e, forse, implementerò l'algoritmo suggerito da Crowned.

 Vado di quarzo e, forse, implementerò l'algoritmo suggerito da Crowned.
Questo costa due lire e lo posso mettere pari pari al posto del risuonatore
http://www.vishay.com/docs/35014/xt49s.pdf
I condensatori li piazzo lato saldature.

 mica argentata.
Questi ultimi Farnell li fa a 1,11 euro l'uno, il doppio del quarzo.
Questi costano un quinto
http://www.farnell.com/datasheets/58252.pdf
Vanno bene uguaglio, vero?

 La frequenza di rete è stabilissima,
stabilissima può darsi, però che sia esattamente 50Hz è tutto da vedere, 
almeno per quel che ne so.
Ricordo ai tempi della scuola la visita ad una centrale elettrica: c'era 
un bell'indicatore analogico che indicava la frequenza e segnava una 
cosa tipo 49,98Hz.
La cosa ha anche un senso: in fondo a monte di tutto c'è un albero che 
gira ad una determinata velocità angolare, che deve rimanere il più 
possibile vicina al setpoint, ma le oscillazioni ci possono essere.
Ciao

possibile vicina al setpoint, ma le oscillazioni ci possono essere.
Mi sembra di ricordare che nel lungo periodo le varizioni fossero compensate, ne
abbiamo parlato anche qui:
http://tinyurl.com/c9czqd
http://tinyurl.com/d9yq72
--
ciao
  Stefano

SB ha scritto:

molto interessante! grazie!

 gira ad una determinata velocità angolare,
Ma, soprattutto, a valle ci sono altre decine di centrali tutte connesse
alla stessa griglia di distribuzione.


La frequenza è molto precisa, ma solo per il lungo periodo.
Sul breve è piuttosto ballerina.
Vedi qui:
http://www.ucte.org/
Ciao.
lucky

 Il codice riportato funziona perfettamente.
Ho letto quella discussione, ho usato quel codice che in particolare fa in 
modo che il decremento avvenga una volta dopo 76 cicli e poi dopo 77 cicli 
facendo una media una volta meno di 1 secondo la secondo qualcosa in piu' 
facendo la media si quasi 1 secondo, ma l'errore dopo 24 ore si nota.
Scusami una cosa che non capisco tu dici che e' piu' sensato contare i cicli 
di clock, come se fossero due cose indipendenti? per me sono legati quindi e 
come dire ho una frequenza di 10Hz  oppure un perido di 10ms. 

 quindi e come dire ho una frequenza di 10Hz  oppure un perido di 10ms.
Una cosa innanzitutto, stai utilizando un quarzo da 20MHz su un 16f877A o su 
un 16f877 ?
Nel secondo caso, per andare a 20MHz ti devi assicurare di avere un 
16f877-20 altrimenti ti funzionerebbe un pò x caso (overclock un pò 
azzardato, specialmente se vuoi misurare tempi).
Tornando alla tua domanda...
Il discorso è che un interrupt è generato ogni numero ben preciso di clock, 
che imposti e che non cambiano mai.
Se invece vuoi generare un interrupt ogni 10ms, come ti sei accorto, entrano 
in gioco delle cifre decimali (dovute alla frequenza del quarzo che non è 
potenza di 2) che fanno si che si generi un piccolo errore.
Se trascuri l'errore e consideri come 10ms esatti la durata di tale 
intervallo, e sommi il conteggio x avere i dsec e quindi i secondi/ore, non 
farai altro che sommare anche gli errori, arrivando dopo tempi lunghi ad 
avere un errore non indifferente.
Il programma che ti ho indicato (e  che io stesso ho avuto modo di 
utlizzare), conta effettivamente i cicli di clock annullando questa somma di 
errori.
Se con questo metodo ed in sole 24ore arrivi avere un errore non 
trascurabile, verifica la tua parte di circuito oscillatore.
Tieni presente che con un quarzo da 20MHz dovresti utilizzare capacità nel 
range 15..33pF.
Se vuoi la stabilità dell'oscillatore è bene optare x i valori di capacità 
maggiori, ovvero 33pF.
Siccome utilizzi un 16f877, come ti ho precedentemente suggerito, hai 
considerato la posssibilità di collegare un quarzo da 32kHz, sui pin T1OSI e 
T1OSO ?
Questo ti svincolerebbe dal clock principale, e partendo da una frequenza 
più bassa, ti consentirebbe una precisione superiore.

 lucky
bello il grafico in tempo reale!
I fumi dell'alcool si sono dissipati un attimo e mi č venuto in mente 
che durante il corso di controlli automatici facemmo una gita a Milano 
in visita a quella che oggi si chiama Terna: la regolazione della 
potenza delle centrali dipende ovviamente dal carico e ha come setpoint 
appunto i 50Hz; si tratta di ottimizzare un sistema dinamico non lineare 
e dal punto di vista teorico era un problema per niente banale [leggi: 
non ci avevo capito una mazza].
Ricordo molto meglio il rutto soffocato che era scappato in un momento 
di silenzio ad un mio amico. Una fatica per non scoppiare a ridere, 
eravamo lě in quindici in tutto... Che figure di merda, LOL

 Sul breve è piuttosto ballerina.
Beh, certo, il carico varia parecchio, nelle 24H, ma non così tanto da un
giorno all'altro.

 errori.
Sì, ma usa un timer senza prescaler per poi fare operazioni a 16 bit.
Mi sembra un'inutile spreco di risorse con un nome pomposo e inappropriato
("zero-drift" ?). Anzi, ti rende ancor più difficile fare i conti per
eventuali correzioni del drift del quarzo.

 clock, che imposti e che non cambiano mai.
Hai analizzato quel codice? l'interrupt arriva sempre dopo 13,1072 ms poi 
viene decrementato Ticker di 65536 che corrisponde a 2 elevato alla 16 
perche' il timer e' a 16bit cioe' viene decrementato ogni ciclo (ogni ciclo 
comunque e' 13,1072ms) dopo 76 cicli si verifica che la variabile Ticher e' 
minore di 65536 esattamente sara' 19264 sara' assegnato a Ticker 
19264+5000000 quindi si ricomincia e la varibile seocnds questa volta verra' 
aumentata di una unita' dopo 77 cicli.
ora 76 cicli sono 996,1472ms invece 77 cicli sono 1009,2544ms ora spiegami 
dove sta la differenza nell' uso dei cicli al posto del tempo (sono o non 
sono due grandezze legate matematicamente?) secondo me il discorso di quel 
codice e' valido per la portabilita'.
Al momento ti dico come ho risolto:
ho scelto un fattore di prescaler 1:8 ho scelto per TMR1H 00X0B e per TMR1L 
00XDC cosi' ho un interrupt ogni 100ms tondi cioe' una frequenza di 10Hz
nell'istruzione dell' interrupt carico appunto:
#int_TIMER1
void TIMER1_isr()
{
set_timer1(0x0BDC);
Ticker -= 1;
if ( Ticker == 0 ) {
Ticker = 10;
seconds++;
}
Credo che cosi' si raggiunga una buona precisione legata alla tolleranza del 
quarzo con molta semplicita', che ne pensi?

 capire quanto gli viene suggerito.
Caro Bertolazzi io cerco solo di imparare quello che non so e sono felice di 
ricevere aiuto da parte tua, non sono nessuno e non voglio insegnare ne la 
buona creanza ne altro, facevo notare solo che sembra che tu e Due di Picche 
facciate la guerra  con cose che non servono al titolo iniziale del 
messaggio.
Scusami se ti richiedo potresti rispegarmi sempre se vuoi in cosa consisteva 
il tuo suggerimento?

 del quarzo con molta semplicita', che ne pensi?
A 20MHz ,con prescaler a 8 e il timer caricato con 0xBDC hai effettivamente 
un interrupt ogni 100ms.
Il codice mi sembra corretto.

 capire quanto gli viene suggerito.
LOL... Avrebbe dovuto dar retta a te che lo avresti costretto a 
cercarsi una fonte MOLTO PRECISA per effettuare la taratura di un non
ben specificato firmware solo teorico e dover lasciare tale fonte 24 
ore collegata al suo orologio solo per la tarataura?
-- 
Everyone is entitled to my opinion! 


 ore collegata al suo orologio solo per la tarataura?
Veramente rispondevo a Massimo IW0HKG che parlava di tarare 1.000
esemplari. Ma già, tu leggi il NG solo per trovar pretesti per darmi
addosso, quindi ti sarà sfuggito.
Ma insomma, cosa vuoi da me? Ti ho già spiegato che non sono omosessuale e
che comunque le persone insignificanti e meschine non mi interessano.

 cioè 200nS di risoluzione non 50nS...  Come dicevo appunto.
Peccato che io non abbia mai sostenuto il contrario, e che comunque questo
non c'entri nulla con quanto ho scritto.
Ti rendi conto che sei entrato in una spirale senza uscita? Più ti incazzi,
più cerchi di darmi addosso, più mi dai addosso più spari cazzate, più
spari cazzate più ti incazzi.
Smettila, una buona volta. Non sei il mio tipo e non mi farai certo
cambiare idea attirando l'attenzione in questo modo.

 Il codice mi sembra corretto.
si, ma la latenza viene accumulata ogni volta.
e il paziente e' in ritardo cronico patologico.
saluti
-- 
  lowcost

"lowcost" ha scritto nel messaggio:

Puoi darmi qualche indicazione in piu'? il programma sta girando su una 
scheda sperimentale al momento dopo circa 7 ore e' in ritardo di mezzo 
secondo. 

 secondo. 
E' tutto normalissimo. Un quarzo standard ha un errore tra i 30 ed i 
70ppm... Fai i tuoi calcoli. ..
-- 
Base 8 is just like base 10, if you are missing two fingers.  - Tom Lehrer



Grazie, posso avere il tuo parere sulla strada seguita da me? a me e' 
sembrata la piu' facile e funzionale 

 sembrata la piu' facile e funzionale 
Beh, dipende da che genere di precisione hai bisogno. Senza alcuna 
regolazione e utilizzando il timer in quel modo la precisione dipende
solo ed esclusivamente dal quarzo e puoi arrivare a sballare di una 
cinquantina di secondi (in più o in meno) al mese.
-- 
This screen intentionally left blank.


 cinquantina di secondi (in più o in meno) al mese.
Io sto cercando di imparare un po di C ed ho voluto fare qualche esperimento 
con i timer e gli interrupt, quindi non era finalizzato ad un progetto 
finito, il prototipo ha 3 led uno per i secondi uno per i minuti e l'altro 
per le ore.
Personalmente pensavo "forse sbagliando essendo un essere umano" che volendo 
fare un orologio tipo quelli che vengono venduti a 5 euro, la strada fosse 
quella di compensare l'oscillatore quarzato con un piccolo compensatore, 
fatto cio' avere un ritardo intero per poter scandire i secondi e da questi 
fare il resto, ma in tutta la discussione vuoi per il fatto che mi e' 
sfuggito qualcosa oppure non sapendo leggere non ho capito se la mia strada 
e' percorribile seriamente  "se fosssi stato DIO o l'equivalente amicone 
Bertolazzi probabilmente avrei usato un riferimento atomico gestito 
ovviamente da un micro ATMEL :-) "

 ovviamente da un micro ATMEL :-) "
..e avresti minimo realizzato una serie industriale da 10000 pezzi. 
Per meno lui non si muove. ;-)
-- 
Who is General Failure and why is he reading my disk?


 Per meno lui non si muove. ;-)
Ma poi li venderebbe solo a gente super come lui :-)? che dici ne venderebbe 
uno anche a me? :-(

 uno anche a me? :-(
Venderli? Dovrebbero funzionare prima di poterlo fare... ;-)
-- 
IBM: Ill-mannered Besotten Macrocasm


 Venderli? Dovrebbero funzionare prima di poterlo fare... ;-)
Ma come un DIO come lui non e' capace di far funzionare un micro ATMEL :-) ?

Ciao a tutti
Per cronaca, dopo circa 26 ore il ritardo accumulato e' di 1,5 secondi 

 una volta che il circuito entrava a regime termico.
E' una soluzione classica adottata tuttora in strumenti di misura
precisi. In realtà, per funzionare al meglio, il quarzo viene tagliato
apposta per fare in modo che il minimo di deriva in temperatura abbia
luogo a 50°C, ovvero alla temperatura che viene mantenuta con il
circuito esterno.
Strumenti di gamma alta hanno anche un indicatore di allarme attivo
nelle fasi iniziali in cui il forno termostatizzato non è giunto in
temperatura.

 Per cronaca, dopo circa 26 ore il ritardo accumulato e' di 1,5 secondi
Puoi provare a correggere il valore 0xBDC di una o 2 unità x cercare di 
compensare le istruzioni che il micro deve eseguire per salvare lo stack 
prima di entrare nell'interrupt (che influiscono probabilmente sull'errore).
Per essere preciso, però dovresti vedere il codice disassemblato e contare i 
cicli di clock delle singole istruzioni.
Il pericolo è che vista la granularità introdotta dal prescaler,sarà 
improbabile togliere il numero di cicli esatti.
Inoltre, in 26 ore il tuo interrupt è stato scatenato 10dsec * 60sec * 60min 
*26ore= 936000 volte.
Con un errore massimo di 936000 * 0,002 = 18,72sec = 1,872sec.
Inoltre sempre se è un quarzo std ha una deriva termica di +-0,4ppm/°C, che 
non è molto, ma che si fa sentire se qusta mattina hai aperto le finestre, 
non so da te, ma qui la temperatura si è abbassata parecchio...;-) 

 secondo. 
dal cpuclock che scatena interrupt (timer overflow) a quando tu scrivi
il valore iniziale nel timer (azzerando automaticamente il prescaler),
il core esegue varia roba: terminata l' istruzione corrente (o la
sezione critica o un altro isr) viene finalmente salvato il PC e
impostato il vettore interrupt, poi salva questo e quello e finalmente
esegue la isr del timer1: tutti questi clock che avevano incrementato il
prescaler o il timer sono persi quando ricarichi il timer; e' vero che
puoi contare i clock e compensare, ma non sai esattamente quanti clock
sono.
saluti
-- 
  lowcost

 compensare le istruzioni che il micro deve eseguire per salvare lo stack 
Non vedo perché, visto che ha a disposizione un timer con registro di
periodo.

"F. Bertolazzi" <TOGL...@MAIUSCOLEtdd.it> ha scritto nel messaggio 
news:1910s3prwqjzy$.17b36ad81xepn.dlg@40tude.net...

Se fosse possibile reimpostare il timer al valore 0xBDC esattamente quando 
questo raggiunge lo zero, non ci sarebbero questi errori.
Ma 'purtroppo' quandi il timer raggiunge lo zero si sprecano alcune decine 
di cicli di clock per provvedere al salvataggio dei registri nello stack, 
per poi effettivamente riassegnare il valore ai registri TMR1H e TMR1L.
Questo sarebbe necesario anche se la parte del codice isr fosse scritta in 
assembler, visto che per l'assegnazione del valore ai registri del timer 
occorre in ogni caso 'sporcare' W, che quindi deve essere prima salvato 
(forse si ridurrebbero però il numero di istruzioni, ma qui dipende la 
compilatore e dall'ottimizzazione impostata).
Visto poi che il suo codice è in c, occorre analizzare quali istruzioni ha 
messo il compilatore in cima alla sua chiamata isr, contare i cicli di clock 
complessivi e variare il valore di conteggio del timer x tenerne conto. 

 conto.
Prima degli interrupt si devono salvare i dati nello stack, se il programma 
al primo owerflow interrupt per timer 1 sta eseguendo la funzione1 con poche 
varibili si fa un calcolo per vedere quanti ciccli occorrono, se invece sta 
facendo la funzione 2 molto piu' complessa fai altri calcoli? poi alla fine 
fai la media? mi sembra una strada impercorribile.

 impercorribile.
Scusami, ma sai di che cosa stai perlando ?
Conosci l'architerrura del pic che sta usando il ns. amico ?
Prima di entrare in un interrupt, si esegue il salvataggio di registri e non 
di variabili, e questo lo fa il compilatore nel caso il programma sia in 
linguaggio ad alto livello.
Eventuali variabili globali che devono essere modificate sia nel ciclo del 
programma che in interrupt devono essere dichiarate come di conseguenza (es. 
come di tipo 'volatile').
Il 16f877 ha un solo indirizzo di interrupt, al quale saltare.
Poi all'interno di questa routine occorre verificare quale è l'evento cha ha 
generato l'interrupt stesso.
Prima di questa verifica, in genere, occorre almeno salvare i registri W, 
STATUS, PCLATH e FSR.
Il tutto si riduce a 15 istruzioni fisse e sempre eseguite ad ogni 
interrupt, qualcosa del tipo (non ho testato nulla di quanto sotto, ma in 
linea di massima dovrebbe essere corretto)
 MOVWF Saved_W
 SWAPF STATUS,W
 CLRF STATUS
 MOVWF Saved_Status
 MOVF PCLATH,W
 MOVWF Saved_Pclath
 CLRF PCLATH
 MOVF FSR,W
 MOVWF Saved_Fsr
controllare il tipo di interrupt
 BTFSS PIR1,TMR1IF
 GOTO EXIT
poi si può passare al ricaricare i registri del timer1.
 MOVLW 0x0B
 MOVWF TMR1H
 MOVLW 0xDC
 MOVWF TMR1L
azzerare il flag intterupt
 BCF PIR1,TMR1IF
decrementare il registro dei decimi ed incrementare i secondi
 DECFSZ Ticker,F
 GOTO EXIT
 MOVLW 0x0A
 MOVWF Ticker
 INCF Second,F
EXIT
e ripristinare lo stato precedente
 MOVF Saved_Fsr,W
 MOVWF FSR
 MOVF Saved_Pclath,W
 MOVWF PCLATH
 SWAPF Saved_Status,W
 MOVWF STATUS
 SWAPF Saved_W,F
 SWAPF Saved_W,W
 RETFIE
Questo se si lavora in assembler (o si vuole gestire questa parte in 
assebler), se invece si vuole/necessita/preferisce lavorare in linguaggio ad 
alto livello occorre vedere il codice generato e vedere quali istruzioni 
sono inserite. 

 Quasi quasi lo implemento sul mio timer per la pasta
Per un uso così specifico al tuo posto farei qualcosa
di più comodo:
PC sicronizzato con un time server atomico, lettore di codice
a barre per accedere immediatamente al data base dei tipi
di pasta, sensore di temperatura dell'acqua, feedback
del gradimento dell'utente del grado di cottura. Il resto è solo
un po' di software.

 ..........
Statistica del compilatore:
ROM used: 180 words (2%)
Largest free fragment is 2048
RAM used: 20 (5%) at main() level
20 (5%) worst case
Stack:    2 worst case (1 in main + 1 for interrupts)
Provo a postare il codice prima in C poi l'assember generato dal 
compilatore:
....................   enable_interrupts( INT_TIMER1 );            // Start 
RTC
0064:  BSF    03.5
0065:  BSF    0C.0
....................
....................
....................
.................... }
0066:  BCF    03.5
0067:  BCF    0A.3
0068:  BCF    0A.4
0069:  GOTO   079 (RETURN)
.................... #int_TIMER1
.................... void TIMER1_isr()
.................... {
....................       set_timer1(0x0BDC);
*
0035:  MOVLW  0B
0036:  MOVWF  0F
0037:  MOVLW  DC
0038:  MOVWF  0E
....................
.................... Ticker -= 1;
0039:  MOVLW  01
003A:  SUBWF  28,F
003B:  MOVLW  00
003C:  BTFSS  03.0
003D:  MOVLW  01
003E:  SUBWF  29,F
003F:  MOVLW  00
0040:  BTFSS  03.0
0041:  MOVLW  01
0042:  SUBWF  2A,F
0043:  MOVLW  00
0044:  BTFSS  03.0
0045:  MOVLW  01
0046:  SUBWF  2B,F
.................... if ( Ticker == 0 )
0047:  MOVF   28,F
0048:  BTFSS  03.2
0049:  GOTO   059
004A:  MOVF   29,F
004B:  BTFSS  03.2
004C:  GOTO   059
004D:  MOVF   2A,F
004E:  BTFSS  03.2
004F:  GOTO   059
0050:  MOVF   2B,F
0051:  BTFSS  03.2
0052:  GOTO   059
.................... {
....................     Ticker = 10;
0053:  CLRF   2B
0054:  CLRF   2A
0055:  CLRF   29
0056:  MOVLW  0A
0057:  MOVWF  28
....................
....................      seconds++;                           // 
Increment number of seconds
0058:  INCF   2C,F
....................
....................
....................
....................   }
....................
....................    }

 Il resto è solo un po' di software.
E che sarà mai? :D

 questo raggiunge lo zero, non ci sarebbero questi errori.
Esattamente per ciò, dopo aver consultato il datasheet del processore
obsoleto citato nel post originale, ho parlato fin dall'inizio di registro
di periodo.
Quando il processore esegue l'interrupt il conteggio sarà assai prossimo
allo zero e quindi parecchio lontano dal valore del registro di periodo,
che potrà essere modificato con tutto comodo e senza alcun rischio o
necessità di calcoli sui tempi di esecuzione.

 necessità di calcoli sui tempi di esecuzione.
Potresti indicarmi quale e' il registro da te indicato? voglio imparare se 
mi dai una mano......... 

F. Bertolazzi:

Certo che se chi pone la domanda non solo non conosce il processore che sta
usando, ma non si preoccupa neppure di leggere ciò che gli ho scritto, e
chi gli risponde lo fa solo per rompermi i coglioni (non mi riferisco a te,
ma al mitomane esaltato) senza manco dare un'occhiata al datasheet, non
potremo far altro che perder tempo.

diego:

Figurati se sto a predere altro tempo con un rompicoglioni che non legge
mai le risposte. Te l'ho già scritto, pirla.

 mai le risposte. Te l'ho già scritto, pirla.
dai dico sul serio puo' essere che l'hai scritto ma non l'avro' notato cosa 
ti costa nell'indicare una sigla di tre quattro caratteri? dai poi tu non 
rispondi vogliamo incontrarci? 

 potremo far altro che perder tempo.
Certo che se chi posta le risposte, lo facesse in modo costruttivo,con 
l'intento di aiutare veramente, senza postare messaggi su messaggi con il 
solo scopo di scatenare flames, perderemmo tutti meno tempo, senza dover 
leggere messaggi inutili...
Ci vuole molto a scrivere CCPR1 ? 

 Ci vuole molto a scrivere CCPR1 ?
Grazie Roberto, questo e' lo spirito del gruppo AIUTARE. 

 Ci vuole molto a scrivere CCPR1 ?
Se ho capito bene il Timer1 e' copiato in CCPR1 quindi andando a leggere 
CCPR1H e CCPR1L dopo x interrupt dovrei veder cosa si perde? 

 Ci vuole molto a scrivere CCPR1 ?
Ti invito, prima di fare ulteriori commenti, a leggere la mia risposta a
"calcolare interrupt del timer", leggere tutti i commenti di Due di Picche
ai post del sottoscritto negli ultimi sei mesi, ed infine le mie prime due
risposte a questo thread.
Ti sembra che le mie risposte non fossero chiare e sufficienti e che il
vago accenno allo sbruffone ritardato non fosse giustificato?
Il datasheet DS3029C, relativo ai PIC 16F87x, a pag 55 mostra il diagramma
a blocchi del Timer 2, dove il registro di periodo viene chiamato PR2.
Dei dettagli implementativi di quel cesso di timer non me ne potrebbe
fregar di meno, non vado certo a studiarmi tutto il datasheet per
rispondere ad uno che, come ha provato più e più volte, non legge
minimamente le risposte ai suoi quesiti balenghi.
Quanto ai messaggi inutili, non trovi che, fra tutti, se aveste letto le
mie prime risposte, non avreste scritto niente altro, salvo forse qualche
precisazione su come utilizzare il registro di periodo?

 vago accenno allo sbruffone ritardato non fosse giustificato?
Bertola' Ti ho dimostarto che di micro puoi capire qualcosa ma di altre cose 
non capisci un cazzo permettimi di ricordati le spiegazioni che ti ho dato 
sulla saldatura reflow, mica ti ho dato dell'incompetente? equesta e' la tua 
natura ti diverti cosi'? continua a farlo per me non c'e' problema 

 potremo far altro che perder tempo.
e' anche certo che tu potresti aumentare il peso netto dei tuoi
interventi con una riduzione drastica della tara (gli inutili flames in
risposta alle provocazioni) ;  diego avrebbe preso in considerazione da
subito il tuo suggerimento (che e' esatto, fatto salvo che occupa il
ccp1).
saluti
-- 
  lowcost

 compilatore:
boh , a parte la variabile 32bit per contare 0_10 , voi come giudicate
questo compilatore ?
saluti
-- 
  lowcost

 "calcolare interrupt del timer", leggere tutti i commenti di Due di Picche
Sei veramente strano hai fatto un casino che non finisce mai semplicemnte 
per non dirmi, vatti a rileggere "calcolare interrupt del timer" dove hai 
scritto:
"Ad esempio, se il timer č a 16 bit, carichi 15.625 (5^6) nel registro di
compare, cosě avrai esattamente 5 interrupt al secondo."
Preferisci ingolfare una discussione piuttosto che scrivere due righe, io 
sono pirla peche' effetivamente non ho letto tu sei proprio un pirlone per 
qcome fai :-) 

ccp1).
Effettivamente ha dato un suggerimento ma in un messaggio diverso, sarebbe 
bastato dire: "rileggi il messaggio calcolare interrupt del timer" ma in 
effetti il suo modo di essere lo porta a fare quello che tutti hanno notato, 
peraltro mi sono messo  a rileggere un po' dei suoi messaggi, sono tutti ma 
proprio tutti cosi', quindi e' il suo modo di essere, quando dice una cosa 
dall' altra parte ci deve essere sempre chi deve capire, non possono esserci 
fraintendimenti "io ho scritto di essere un principiante in questo campo, 
questo e' un news di hobbysti", se solo fai un errore, sei un pirla un 
ritardato ecc., e non meriti piu' le sue risposte, in parole semplici lui si 
sente DIO, forse un giorno capira' che non e' cosi'.
Dal messaggio dove io dovevo capire, ho letto solo la prima parte perche' 
era quella la risposta che per ME era pertinente alla richiesta , il dopo 
era un di piu' apprezabile perhce' era una informazione importante, ma io 
quando ho scritto quell' messaggio volevo capire come si facevano dei 
calcoli lui ha dato la  spiegazione, ho fatto i suoi calcoli ed 
effettivamente mi sono trovato.
L'errore e' nato dopo 11/03/09 perche' non ho collegato il tutto con il suo 
messaggio del 07/03/09

 subito il tuo suggerimento 
Sì, come ha preso in considerazione quello in "calcolare interrupt del
timer", che non mi pare contenesse spunti polemici (quanti altri post ha
scritto, dopo, chiedendo di fogli di Excel o programmi per calcolare le
costanti per 'sto belin di timer?), oppure i suggerimenti su come incollare
e saldare i connettori SMD, o sul programmatore/debugger Atmel...

 e saldare i connettori SMD, o sul programmatore/debugger Atmel...
Cosa ho fatto di male? dove ho sbagliato dovevo chiedere il permesso a DIO 
F. Bertolazzi? 


Merda mi leggi, il tuo kill-file ficcatelo nel culo stronzo frocio 

 qualcosa di attinente l'elettronica...
Il kill file è per le menti deboli, per chi è incapace di controllare
le proprie reazioni.
-- 
A successful tool is used to do something undreamed of by its author.  - Johnson
News 2002 [v 2.3] / StopDialer / PopDuster - 
http://www.socket2000.com
Akapulce portal: 
http://www.akapulce.net


Mi sono letto un po' dei suoi stupidi messaggi ti aveva messo nel suo 
kill-file gia' diversi mesi fa, ma poi misteriosamente ti legge, ti 
risponde, ed afferma che non puo' leggerti perche' inserito nel suo 
kill-file, biasimalo ha problemi ed ha bisogno di comprensione.
Lo stesso vale per Salvy doveva essere nel suo kill-file non sa da quanti 
mesi, e' patetico oltre che  .............. 

Salvy:

Certo che ti leggo, quando capita. Tu vieni sistematicamente segnato come
già letto da sempre. Non vali la mia attenzione, ma voglio tenere tutti i
tuoi messaggi. Un giorno me li guarderò tutti insieme per vedere se hai mai
fatto un solo intervento in cui parlassi di elettronica.
Anche Due di Picche, prima, veniva segnato come già letto. Ma era così
appiccicoso e rompicoglioni che non bastava più. Ora i suoi messaggi
vengono sistematicamente cancellati, non li potrò leggere né ora né mai.