Vai al contenuto
PLC Forum


Watchdog e Mikrobasic - help in uso w


oh-pazzo

Messaggi consigliati

buongiorno a tutti. io sto giocando col mikrob e il pic 16f876/a non riesco ad implementare il controllo wtd perchè non so come aumentarne il tempo di intervento. il pre l'ho settato a 128 ma avento usato tempi di attesa di 1,5sec nel programma non riesco ad azzerarlo in tempo.

Mi potete aiutare...grazie1000...

ottimo forum..

Link al commento
Condividi su altri siti


Ciao.

Non dice che frequenza del quarzo hai.

Ammesso che tu abbia settato il tempo di watchdog al massimo, mi sembra strano che il tuo main impieghi piu' del tempo di watchdog per fare un giro completo e quindi ricaricarlo.

Perdi tempo in qualche routine di attesa ?

Link al commento
Condividi su altri siti

  • 2 weeks later...

scusa del ritardo ma non sono stato presente in questo periodo.

No il problema è che il tempo lo perdo per delle segnalazioni luminose, comunque ho parziamente risolto il problema diminuendo questi tempi.

Se conosci il Mikrobasic ti chiedo come mai in una routine di interrupt tmr0 in cui incremento una variabile non riesco a leggere la stessa variabile dal corpo del programma.

ex

sub procedure interrupt

inc (x)

tmr0=10

ecc ecc

end sub

________________

_____________

____________

_____

nel corpo del programma:

if x=50 then

porta.0=1

x=0

end if

se l' if lo metto dentro la routine di interrupt tutto va se cerco di leggerla dal programma no......

Link al commento
Condividi su altri siti

Se hai di questi problemi devi obbligatoriamente mettere le WD CLEAR all'interno del sotto-codice main (Routine di ritardo, loops, ect )

RT

Link al commento
Condividi su altri siti

Non credo sia un problema di watchdog ed e' vivamente scosigliato "seminare" l'aggiornamento del watchdog in piu' punti del programma.

Dovrebbe essere in un solo punto nel main e MAI nelle funzioni di interrupt.

Il tempo di esecuzione di tutto il programma deve essere minore del tempo di chiamata dell'interrupt con tmr0.

Infatti se il confronto lo fai nella routine di interrupt e' ovvio che funziona.

Se l'interrupt di tmr0 e' di 10 milliSec. e nel tuo applicativo (main) fai il test della variabile X ogni 20 millSec. difficilmente riuscirai a trovare la carrispondenza (o se la trovi, la trovi per caso).

Spero di spiegarmi meglio con un esempio.

1) poniamo che X sia = 49

2) nel main leggi X (che ovviamente e' 49) e non trovi corrispondenza.

3) scatta l'interrupt tmr0: X=50

4) trascorrono 10 milliSec. ma tu nel main fai altre cose...

5) scatta l'interrupt tmr0: X=51

6) quando sono trascorsi 20 milliSec. nel main torni a leggere la variabile X, ma ormai hai perso il passaggio.

Una prova veloce la puoi fare dando per controllo un intervallo piu' ampio:

if ((x>40) && (x<60))

Altra prova: aumenta il tempo di tmr0.

Facci sapere...

Ciao.

Link al commento
Condividi su altri siti

Per quanto microbasic non sia ottimizzato se 4 righe semplici fanno scattare il watch dog i casi non sono molti:

1 - lo "if" non è come lo hai scritto

2 - la routine di interrupt senza if rimane incompleta e cicla all'infinito

3 - il programma è talmente poco ottimizzato che è necessario rivederlo seriamente. mad.gif

Se il termometro segna febbre si non si cambia non si cambia termometro, cerca una cura adeguata! smile.gif

Link al commento
Condividi su altri siti

Fai una misura precisa utilizzando un piedino del micro e l'oscilloscopio. In questo modo avrai una misura precisa del tempo di esecuzione del tuo ciclo "main"

RT

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...