Vai al contenuto
PLC Forum


Pic16f877a - Interrupt Power Down


Messaggi consigliati

Inserito:

Ciao,

ho un problema con un PIC16F877A, in pratica nel PIC utilizzo un interrupt per la comunicazione seriale e questo funziona correttamente. Oltre a questo devo salvare dei dati sulla EEPROM e anche quì nessun problema, ho realizzato una funzione e va a dovere.

Il problema è che quando va la seriale e contemporaneamente devono essere salvati i dati sulla EEPROM, la comunicazione seriale da problemi!

Ho analizzato la questione ed ho scoperto che questo si manifesta a causa del fatto che durante il salvataggio dei dati su EEPROM il GIE (Global Interrupt Enalble) deve essere diattivato, come scritto sul manuale. Pertanto, ho pensato che il salvataggio dei dati (2 byte) potrebbe andare soltanto prima che la tensione VDD scende sotto un valore minimo, cioè un attimo prima che il PIC va in BOR(Brown Out Reset).

Purtroppo, guardando attentamente il manuale, mi sembra che questa cosa non si può fare! Mi aspettavo di trovare un interrupt che si attiva un attimo prima del reset, ma non lo trovo!

Ho pensato di usare un comparatore con il riferimento a VRIF ma questo con il BOR (necessario per questa applicazione) non può andare perchè il riferimento rispetto a VDD può essere impostato a 0,75 del valore di VDD, pertanto con VDD a 5V si andrebbe a 5x0,75=3,75V che sono iferiori a 4V del VBOR e quindi l'interrupt del comparatore non farebbe in tempo ad intervenire in quanto il PIC si resetterebbe prima!

Mi sembra che l'unica soluzione sia quella di usare un comparatore con due valori esterni al PIC ma questo per ora non mi risulta possibile da fare. Qualcuno ha delle idee in merito? C'è qualcosa che si può fare secondo voi?

Grazie!


Inserita:

La tecnica solitamente usata prevede un interupt scatenato dalla mancanza di rete per un semiperiodo. IL tempo di scarica del condensatore di filtro, dopo il ponte, mantiene l'alimentazione per il tempo sufficiente al salvataggio dati.

Inserita:

La tecnica solitamente usata prevede un interupt scatenato dalla mancanza di rete per un semiperiodo

Inserita:

Generalmente si usano dei chip di supervisione dell'alimentazione, oppure pui buttare l'uscita del trasformatore, tramite partitore di valore opportuno, ad uno schimt trigger o un NOT con schimt trigger (non ricordo la sigla), l'uscita la mandi all'ingresso di interupt del PIC. L'intervallo tra un Int e l'altro è di 10ms, quindi in quel periodo pui abilitare la seriale. Se trascorrono più di 10 ms senza un nuovo interrupt scateni il salvataggio dei parametri. Praticamente l'interrupt da rete serve per azzerare un timer. Se il timer scade prima c'è il buco di rete :)

Inserita:

Ciao,

Livio come sempre sei molto esaustivo nelle tue risposte, grazie!

Purtroppo nel mio caso l'alimentazione della scheda in questione è in corrente continua 24V!

Quando ho effettuato le prime prove si presentò subito il problema del reset in caduta dell'alimentazione.

In pratica pensai anchio ad un chip supervisore della rete, poi però ho trovato On-Board la funzionalità BOR che risolse brillantemente la situazione. Ora però è saltato fuori quest'ultimo inconveniente e a dire il vero pensavo che il PIC ha delle risorse interne per fare questo tipo di cose, scusa se insisto ma ho 40 schede già fatte sul tavolo, non vorrei buttarle via!

Sto spulciando il manuale del PIC16F877A (nel mio caso PDIP 40), aime mi sa che non c'è scampo!

Per le prossime schede dovrò rivedere il board e prevedere un comparatore che compara due segnali AD esterni. Un segnale misura la tensione VDD (5V) e l'altro segnale misura un valore leggermente inferiore di 4,5V, magari sparato fuori da un DA de PIC stesso. Non appena manca la tensione questa scende gradualmente e il comparatore interno al PIC rileva che VDD scende al di sotto del valore di soglia (4,5), a questo punto si scatena un interrupt CMIF, dal quale avvio la routine di salvataggio dei dati in EEPROM, poi quando la tensione scende al di sotto di VBOR (4V) il PIC si resetta da solo!

Questa è l'unica soluzione che vedo! :ph34r:

Un altra cosa che mi continuo a domandare è se esiste un altro PIC compatibile al 16F877A ad esempio un 18F che magari ha un qualcosa interno volto alla risoluzione di questa problematica, sto consultando il sito microchip...........................................

Grazie, Ciao!

Sergio

Inserita:

Ciao Sergio,

Leggendo il manuale , devi disabilitare l'interrupt solo per inviare i codice 55h poi il AAh poi puoi riabilitarlo.

Quindi se ti arriva un carattere nella seriale e l'interrupt e' disabilitato il flag del buffer della seriale si alza lo stesso.

Appena riabiliti il GIE si scatenera' l'int della seriale .

la ricezione della seriale rimane scoperta per solo 4 cicli , non ti dovrebbe dare problemi.

Se e' critico , potresti come prima cosa leggere il buffer della seriale per liberare una locazione , ricorda che la usart del pic ha un buffer di due locazioni , quindi puoi ricevere 2 byte prima di andare in overrun.

Inserita:

Potresti sincronizzare il salvataggio dei due byte con la comunicazione seriale.

Credo che nel traffico seriale ci siano delle brevi pause tra un ciclo RX/TX e il successivo.

Sull'ultimo interrupt di trasmissione, se necessario, abiliti il task di scrittura eeprom.

E' corretto quello che dice dlgcom a pag37 del manuale dice che l'interrupt dev'essere disabilitato solo quando invii la sequenza di programmazione poi puoi riabilitarlo suibto.

Inserita: (modificato)

Ciao,

grazie per l'interessamento anche a dlgcom e accacca e scusate se ci ho messo tanto per rispondere!

dlgcom hai ragione, mi sono riguardato, a distanza di tempo, la funzione che avevo fatto per salvare i dati ed ho scoperto che questa ha un problema: dovendo memorizzare due byte (1 word) l'ho dovuta fare in due parti quindi il GIE viene disabilitato due volte consecutive e forse quì casca l'asino!

Adesso proverò a migliorarla, poi spero che l'interrupt della seriale non darà più problemi!

Per quanto scrive accacca riguardo i task nel pic, devo ammettere che non ho utilizzato una tecnica di programmazione con dei task, ma ho semplicemente fatto un loop infinito. Magari se mi puoi dare dei ragguagli in merito, forse posso migliorare il mio codice?

Grazie ciao

Sergio

Modificato: da elsabz
Inserita:

Per accacca,

ho riletto meglio il tuo post ed ora ho capito cosa intendi, riguardo i task. Mi sembra giusto quello che dici, proverò anche questo e poi vi farò sapere!

Ciao

Sergio

  • 2 months later...
Inserita:

Ciao,

infine ho risolto il problema!

Come al solito il problema sono io! worthy.gifwallbash.gifworthy.gif

La routine che avevo fatto per scrivere dati in EEPROM era corretta e doveva essere fatta in quel modo, come ha accennato dlgcom.

Il problema stava nella gestione interrupt della seriale, la quale non era ottimizzata. Ora ho risolto il problema, grazie e a tutti!

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...