elsabz Inserito: 20 giugno 2006 Segnala Inserito: 20 giugno 2006 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!
Livio Orsini Inserita: 20 giugno 2006 Segnala Inserita: 20 giugno 2006 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.
elsabz Inserita: 20 giugno 2006 Autore Segnala Inserita: 20 giugno 2006 La tecnica solitamente usata prevede un interupt scatenato dalla mancanza di rete per un semiperiodo
Livio Orsini Inserita: 20 giugno 2006 Segnala Inserita: 20 giugno 2006 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
elsabz Inserita: 20 giugno 2006 Autore Segnala Inserita: 20 giugno 2006 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
dlgcom Inserita: 21 giugno 2006 Segnala Inserita: 21 giugno 2006 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.
accacca Inserita: 21 giugno 2006 Segnala Inserita: 21 giugno 2006 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.
elsabz Inserita: 23 giugno 2006 Autore Segnala Inserita: 23 giugno 2006 (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 ciaoSergio Modificato: 23 giugno 2006 da elsabz
elsabz Inserita: 23 giugno 2006 Autore Segnala Inserita: 23 giugno 2006 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!CiaoSergio
elsabz Inserita: 1 settembre 2006 Autore Segnala Inserita: 1 settembre 2006 Ciao, infine ho risolto il problema!Come al solito il problema sono io! 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!
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora