- Messaggi: 31
- Ringraziamenti ricevuti 3
Watchdog e Sleep/Idle mode
6 Anni 1 Mese fa #1
da Youth Crew
Watchdog e Sleep/Idle mode è stato creato da Youth Crew
Leggendo il datasheet del PIC18F2620, a me non risulta troppo chiaro il funzionamento del WDT.
Premetto che mi riferisco a codice in XC8.
Supponendo di aver attivato il WDT, nel punto del codice in cui viene eseguita l'istruzione Sleep() il PIC va in risparmio energetico e non prosegue ad eseguire il codice seguente; quando poi avviene un risveglio da parte del WDT cosa accade? Da dove torna ad eseguire il codice? Dall'inizio come nel caso MCLR? Dal main? Dalla riga immediatamente successiva all'istruzione Sleep()?
Inoltre lo stato dei pin configurati come uscite (es. un LED connesso su RB0) vengono resettati o mantenuti immobili quando il PIC va in sleep?
Grazie a tutti per i vostri commenti e suggerimenti
Premetto che mi riferisco a codice in XC8.
Supponendo di aver attivato il WDT, nel punto del codice in cui viene eseguita l'istruzione Sleep() il PIC va in risparmio energetico e non prosegue ad eseguire il codice seguente; quando poi avviene un risveglio da parte del WDT cosa accade? Da dove torna ad eseguire il codice? Dall'inizio come nel caso MCLR? Dal main? Dalla riga immediatamente successiva all'istruzione Sleep()?
Inoltre lo stato dei pin configurati come uscite (es. un LED connesso su RB0) vengono resettati o mantenuti immobili quando il PIC va in sleep?
Grazie a tutti per i vostri commenti e suggerimenti
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Youth Crew
- Autore della discussione
- Junior Member
Riduci
Di più
6 Anni 1 Mese fa #2
da maddley83
Per aspera ad astra.
Risposta da maddley83 al topic Watchdog e Sleep/Idle mode
Ciao Youth Crew,
anche per me è la prima volta in questo forum.
Partiamo dall'inizio. Immagino che tu sappia già cos'è a grandi linee un watchdog (letterarmente cane da guardia); ebbene, solo per conoscenza, non è altro che un semplice timer indipendente dal clock di sistema, allo scadere del quale il micro si resetta. per evitare che ciò avvenga bisogna alimentarlo (feed) prima della scadenza. Questo timer viene solitamente usato come forma di reset nel caso il micro si blocchi, nel caso si riscontrino delle condizioni bloccanti (e.g.: while(FLAG == 0) con flag che non diventa mai '1', per risvegliarlo da alcune condizioni, ecc.
Ma veniamo ai tuoi dubbi:
Se prendi il datasheet (pag. 43, figura 4-1) troverai un diagramma semplificato del sistema di reset. Da questo diagramma si evince che il watchdog (timeout) entra in gioco solo se entrambi ()_IDLE e Sleep sono bassi. Quindi stando a questo diagramma sembrerebbe che in sleep il WDT non abbia efficacia durante lo sleep.
In realtà se prendi il paragrafo 4-6 (pag. 50) vedrai una tabella dove viene riportato il PC (program counter) in corrispondenza dei vari reset. Dobbiamo distinguere due casi per quanto riguarda il WDT:
Tieni presente non è detto che la funzione C Sleep() coincida con l'ultima istruzione assemby su detta; però immagino che quest'ultima istruzione sia all'interno di Sleep(). Se così fosse, in poche parole, il programma dovrebbe ripartire dalla riga successiva alla funzione Sleep().
Spero di esserti stato d'aiuto.
Davide.
anche per me è la prima volta in questo forum.
Partiamo dall'inizio. Immagino che tu sappia già cos'è a grandi linee un watchdog (letterarmente cane da guardia); ebbene, solo per conoscenza, non è altro che un semplice timer indipendente dal clock di sistema, allo scadere del quale il micro si resetta. per evitare che ciò avvenga bisogna alimentarlo (feed) prima della scadenza. Questo timer viene solitamente usato come forma di reset nel caso il micro si blocchi, nel caso si riscontrino delle condizioni bloccanti (e.g.: while(FLAG == 0) con flag che non diventa mai '1', per risvegliarlo da alcune condizioni, ecc.
Ma veniamo ai tuoi dubbi:
Se prendi il datasheet (pag. 43, figura 4-1) troverai un diagramma semplificato del sistema di reset. Da questo diagramma si evince che il watchdog (timeout) entra in gioco solo se entrambi ()_IDLE e Sleep sono bassi. Quindi stando a questo diagramma sembrerebbe che in sleep il WDT non abbia efficacia durante lo sleep.
In realtà se prendi il paragrafo 4-6 (pag. 50) vedrai una tabella dove viene riportato il PC (program counter) in corrispondenza dei vari reset. Dobbiamo distinguere due casi per quanto riguarda il WDT:
- Un WDT reset durante il normale funzionamento: il programma riparte dall'inizio (PC = 0000h).
- Un WDT risvegliante dallo sleep : il programma riparte dall'istruzione successiva a quella in cui è andato in sleep (PC = PC + 2)
Tieni presente non è detto che la funzione C Sleep() coincida con l'ultima istruzione assemby su detta; però immagino che quest'ultima istruzione sia all'interno di Sleep(). Se così fosse, in poche parole, il programma dovrebbe ripartire dalla riga successiva alla funzione Sleep().
Spero di esserti stato d'aiuto.
Davide.
Per aspera ad astra.
Ringraziano per il messaggio: Youth Crew
Si prega Accedi o Crea un account a partecipare alla conversazione.
- maddley83
- Junior Member
Riduci
Di più
- Messaggi: 25
- Ringraziamenti ricevuti 5
6 Anni 1 Mese fa #3
da Youth Crew
Risposta da Youth Crew al topic Watchdog e Sleep/Idle mode
Grazie mille per l'immediata risposta!
Adesso mi risulta tutto più chiaro, tuttavia ora non posso provare materialmente con il PIC, ma il prossimo weekend conto di smanettarci un po' e poi ti dirò
Supponendo quindi che io vada a scrivere in assembler l'istruzione sleep, al risveglio il PIC dovrebbe ripartire dall'istruzione immediatamente successiva, ma i registri TRISx e PORTx dovrebbero rimanere intaccati o sbaglio? Per esempio se prima di entrare in sleep avevo posto allo stato alto il pin RBO (configurato come uscita), entrando in sleep viene "freezato tutto" ed RB0 non viene cambiato fintanto che io non lo ricambio volutamente? Corregimi se sbaglio.
Adesso mi risulta tutto più chiaro, tuttavia ora non posso provare materialmente con il PIC, ma il prossimo weekend conto di smanettarci un po' e poi ti dirò
Supponendo quindi che io vada a scrivere in assembler l'istruzione sleep, al risveglio il PIC dovrebbe ripartire dall'istruzione immediatamente successiva, ma i registri TRISx e PORTx dovrebbero rimanere intaccati o sbaglio? Per esempio se prima di entrare in sleep avevo posto allo stato alto il pin RBO (configurato come uscita), entrando in sleep viene "freezato tutto" ed RB0 non viene cambiato fintanto che io non lo ricambio volutamente? Corregimi se sbaglio.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Youth Crew
- Autore della discussione
- Junior Member
Riduci
Di più
- Messaggi: 31
- Ringraziamenti ricevuti 3
6 Anni 1 Mese fa #4
da maddley83
Per aspera ad astra.
Risposta da maddley83 al topic Watchdog e Sleep/Idle mode
Ciao Youth Crew,
osservando la tabella 4-4 ("INITIALIZATION CONDITIONS FOR ALL REGISTERS"), in particolare a pagina 54, troviamo che i bit dei registri TRISx e PORTx (ad eccezione del TRISA e PORTA) sono "uuuu-uuuu" nell'ultima colonna, cioè quella contrassegnata con "Wake-up via WDT or Interrupt". Se leggi nelle note "u" sta per "unchanged" cioè invariato.
In poche parole al risveglio via watchdog ritrovi lo stato precedentemente congelato, quindi non sbagli.
Fammi sapere come vanno le prove, sono curioso.
Saluti.
Davide.
osservando la tabella 4-4 ("INITIALIZATION CONDITIONS FOR ALL REGISTERS"), in particolare a pagina 54, troviamo che i bit dei registri TRISx e PORTx (ad eccezione del TRISA e PORTA) sono "uuuu-uuuu" nell'ultima colonna, cioè quella contrassegnata con "Wake-up via WDT or Interrupt". Se leggi nelle note "u" sta per "unchanged" cioè invariato.
In poche parole al risveglio via watchdog ritrovi lo stato precedentemente congelato, quindi non sbagli.
Fammi sapere come vanno le prove, sono curioso.
Saluti.
Davide.
Per aspera ad astra.
Ringraziano per il messaggio: Youth Crew
Si prega Accedi o Crea un account a partecipare alla conversazione.
- maddley83
- Junior Member
Riduci
Di più
- Messaggi: 25
- Ringraziamenti ricevuti 5
6 Anni 1 Mese fa #5
da Youth Crew
Risposta da Youth Crew al topic Watchdog e Sleep/Idle mode
Eccomi, ho finalmente rimesso le mani sul progetto e tutto torna
In pratica, io devo leggere degli ingressi analogici, spedire i dati via RS-232, aggiornare delle uscite e poi mettermi in sleep per una decina di secondi. Bene, usando il WDT riesco proprio a fare quanto voluto Infatti prima di Sleep() attivo il WDT ed al risveglio parto correttamente dalla riga di codice successiva e le uscite rimangono intaccate. Non ho monitorato la riduzione dei consumi sotto sleep, ma non mi aspetto sorprese.
Non ho approfondito nello specifico l'istruzione XC8 Sleep(), ma il comportamento che ottengo è quello desiderato.
Grazie di nuovo maddley83
In pratica, io devo leggere degli ingressi analogici, spedire i dati via RS-232, aggiornare delle uscite e poi mettermi in sleep per una decina di secondi. Bene, usando il WDT riesco proprio a fare quanto voluto Infatti prima di Sleep() attivo il WDT ed al risveglio parto correttamente dalla riga di codice successiva e le uscite rimangono intaccate. Non ho monitorato la riduzione dei consumi sotto sleep, ma non mi aspetto sorprese.
Non ho approfondito nello specifico l'istruzione XC8 Sleep(), ma il comportamento che ottengo è quello desiderato.
Grazie di nuovo maddley83
Ringraziano per il messaggio: maddley83
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Youth Crew
- Autore della discussione
- Junior Member
Riduci
Di più
- Messaggi: 31
- Ringraziamenti ricevuti 3
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.