Newsgroup: it.hobby.elettronica.digitale
Titolo: sul watchdog timer

Ciao,
a seguito del thread sui vari reset dei PIC, vorrei discutere su come 
usare proficuamente il wdt. Nei vostri codici come decidete la durata 
del time-out e soprattutto con che criterio "farcite" il codice con le 
istruzioni di clear_wdt() ?
Marco / iw2nzm

istruzioni di clear_wdt() ?
La risposta non penso possa essere univoca
dipende molto dal tipo di programma
Io di solito sono costretto a tenermi abbastanza lungo con i tempi
(quando non uso il watchdog realizzato esternamente)
Utilizzo infatti sempre quasi tutti gli interrupt disponibili e quindi
devo considerare (se metto l'azzeramento del watchdog all'interno del
programma principale) il caso peggiore in cui si susseguano in
continuazione i vari interrupt.
Cmq, se possibile io metto una sola istruzione di clear del watchdog
in un punto del programma in cui si deve necessariamente passare in
maniera ciclica e cerco di calcolare il tempo massimo in cui passo in
questo punto
..al tempo massimo calcolato.. aggiungo poi una certa tolleranza

 ..al tempo massimo calcolato.. aggiungo poi una certa tolleranza
ok.
A me capita spesso di dover sviluppare appliacazioni in cui il micro 
rimane in attesa di ricevere comandi (quindi all'interno del while(1) 
nel main) e poi all'arrivo del comando lo esegue. Tipicamente si tratta 
di sequenze di operazioni temporizzate che possono durare molto anche 
decine di secondi. Finore ho sempre chiamato funzioni esterne al main 
che rilasciano il controllo solo al termine della procedura. In questo 
caso il wdt andrebbe inserito nelle procedure di tanto in tanto in 
funzione della durata del codice da eseguire.
So che come soluzione non č fra le piů eleganti, ma a livello di 
architettura del programma come si puň migliorare?
Marco / iw2nzm

Marco / iw2nzm

sono d'accordo con marcello...il programma non si deve mai fermare (e
qui cito il mio prof. di sistemi).
certo magari il tuo micro (o la tua applicazione) ha delle limitazioni
tali da non consentire questa struttura ma io ti consiglio una sana
macchina a stati eal suo interno x 1 sola volta mettere il reset del
watchdog. in questo modo sai anche più o meno a quanto devi impostare
il watchdog: sapendo il tempo di ciclo della macchina a stati ci
aggiungi un po' x eventuali interrupt e sei apposto.
buon lavoro
ale

alerug...@virgilio.it
 ha scritto:

Grazie delle risposte, a te e a Marcello.
Facciamo un esempio semplice il classico id CW: il micro rimane in 
attesa per 10 minuti. Poi trasmette tramite un pin I/O una parola in 
codice morse. Ovvero diversi punti e linee. I punti e le linee sono 
costituiti tra treni di onde quadre a frequenza di circa 1 KHz.
Come organizzare la struttura per fare quanto detto nei post precedenti?
Uso gli overflow dei timer per generare l'onda quadra e le durate dei 
punti e (di conseguenza) delle linee. L'attesa dei 10 minuti la realizzo 
contanto n del più lungo overflow che riesco a generare.
Mi rimane scomodo però creare un main dove continuo a girare, inviando 
nel frattempo la stringa cw. Sarebbe più intuitivo passare l'esecuzione 
a una funzione che legge in un array il carattere da inviare, lo 
codifica in morse tramite una LUT e gestisce la trasmissione dei punti e 
delle linee. Però così rimango nella funzione fino a che non ho 
trasmesso tutto e ci posso rimanere anche dei minuti!
Come riorganizzare ciò? :)
Grazie per la pazienza!
Marco / iw2nzm

Scusa se non sono molto pratico del mondo dei radiomatori(mi scuso in
partenza)
a scuola però ho fatto un breve corso con dei tuoi "colleghi" e se non
sbaglio l'idCW è quella storia che bisogna ripetere ciclicamente ogni
(come dici nel messaggio) 10 minuti il prorpio nome.
comunque io per macchina a stati intendevo una roba del genere:
main{
	while(1){
		switch(stato){
			case null:
				//non fa niente
				break;
			case idCW:
				//Stato di invio idCW
				break;
		}
		Refresh_watchdog();
	}
}
interrupt Timer10min{
	stato=idCW
}
interrupt TimerPunto{
}
adesso è solo una bozza tanto x capire come è strutturato il
programma. non so come fai a gestire la soria del punto e della linea e
dell'array. comunque se hai già un programma che ti fa l'invio lo
metti direttamente nello stato che io ho chiamato "idCW". negli
interrupt devi avere l'accortezza di non andare a modificare
direttamente il programma, ma solo impostare flag o cambiare di stato,
come diceva marcello.
fai sapere se ti ho risolto qualcosa o se ti ho solo complicato la
vita...=D
ciao ale