PIC18F97J60 improvvisi blocchi del microcontrollore
9 Anni 9 Mesi fa #1
da mirko pettinelli
PIC18F97J60 improvvisi blocchi del microcontrollore è stato creato da mirko pettinelli
Buongiorno a tutti,
sto utilizzando PIC18F97J60 e sto lavorando con MLAB X IDE v2.05 and C18,
sto realizzando una scheda che ha il compito di comunicare con due periferiche in seriale RS232 ed con alcuni expander in I2C .
le seriali sono gestite come interrupt ad alta priorità mentre il timer0 come bassa priorità.
Nel corso dello sviluppo del programma mi sono imbattuto in moltissimi problemi che ho attribuito in parte al compilatore e in parte alla gestione della memoria a banchi che questo micro possiede.
Condivido con voi queste brutte esperienze che di fatto hanno reso inutilizzabile questo microcontrollore:
durante l'elaborazione delle stringhe acquisite tramite seriale mi sono accorto che utilizzando delle funzioni presenti nella libreria string.h tipo strlen per quantificare il il numero dei caratteri oppure sprintf copiare il contenuto del buffer in una variabile di appoggio accadono fenomeni di diverso tipo, blocco del processore oppure valori letti nel buffer che non sono reali.
Questo accade quando il compilatore esegue accessi ai banchi di memoria diversi, in pratica quando andiamo a chiamare Array che sono state dichiarate in un altro file.
Esempio risposta_seriale [100] è dichiarata nel file seriale.c dove viene svolta l'acquisizione delle stringhe provenienti dalla seriale. nel file elaborazioni.c viene invece elaborato il contenuto per cui dichiariamo extern risposta_seriale [] per poter accedere all' array .
In buona sostanza sembra che il compilatore o il micro non esegua correttamente lo switch dei banchi di memoria andando ad accedere di fatto in un banco di memoria non desiderato.
Se qualcuno si è imbattuto in uno di questi problemi e l'ha risolto vi prego di rispondermi
Grazie anticipatamente .
sto utilizzando PIC18F97J60 e sto lavorando con MLAB X IDE v2.05 and C18,
sto realizzando una scheda che ha il compito di comunicare con due periferiche in seriale RS232 ed con alcuni expander in I2C .
le seriali sono gestite come interrupt ad alta priorità mentre il timer0 come bassa priorità.
Nel corso dello sviluppo del programma mi sono imbattuto in moltissimi problemi che ho attribuito in parte al compilatore e in parte alla gestione della memoria a banchi che questo micro possiede.
Condivido con voi queste brutte esperienze che di fatto hanno reso inutilizzabile questo microcontrollore:
durante l'elaborazione delle stringhe acquisite tramite seriale mi sono accorto che utilizzando delle funzioni presenti nella libreria string.h tipo strlen per quantificare il il numero dei caratteri oppure sprintf copiare il contenuto del buffer in una variabile di appoggio accadono fenomeni di diverso tipo, blocco del processore oppure valori letti nel buffer che non sono reali.
Questo accade quando il compilatore esegue accessi ai banchi di memoria diversi, in pratica quando andiamo a chiamare Array che sono state dichiarate in un altro file.
Esempio risposta_seriale [100] è dichiarata nel file seriale.c dove viene svolta l'acquisizione delle stringhe provenienti dalla seriale. nel file elaborazioni.c viene invece elaborato il contenuto per cui dichiariamo extern risposta_seriale [] per poter accedere all' array .
In buona sostanza sembra che il compilatore o il micro non esegua correttamente lo switch dei banchi di memoria andando ad accedere di fatto in un banco di memoria non desiderato.
Se qualcuno si è imbattuto in uno di questi problemi e l'ha risolto vi prego di rispondermi
Grazie anticipatamente .
Si prega Accedi o Crea un account a partecipare alla conversazione.
- mirko pettinelli
- Autore della discussione
- Visitatori
9 Anni 9 Mesi fa #2
da Mauro Laurenti
Risposta da Mauro Laurenti al topic PIC18F97J60 improvvisi blocchi del microcontrollore
Ciao Mirco,
ti consiglio di migrare al compilatore XC8.
Il C18 non ha più aggiornamenti.
Nella seguente guida trovi i punti salienti sul come migrare.
Il compilatore XC8, come migrare dal C18
Controlla se i problemi persistono con l'ultima versione del software.
Saluti,
Mauro
ti consiglio di migrare al compilatore XC8.
Il C18 non ha più aggiornamenti.
Nella seguente guida trovi i punti salienti sul come migrare.
Il compilatore XC8, come migrare dal C18
Controlla se i problemi persistono con l'ultima versione del software.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Mauro Laurenti
- Moderator
Riduci
Di più
9 Anni 9 Mesi fa #3
da mirko pettinelli
Risposta da mirko pettinelli al topic PIC18F97J60 improvvisi blocchi del microcontrollore
Ciao Mauro,
prima di tutto ti ringrazio per la pronta risposta e colgo l'occasione per farti i complimenti per il sito e tutto il supporto che dai, personalmente ho usufruito di alcune tue schede Demo e di molte guide che hai realizzando in maniera accademica .
Tornando al mio grande problema :
il tuo consiglio di passare al XC8 ovviamente l'ho valutato , ma ho un problema di tempistica che non mi permette di fare questa scelta, se non costretto per estremo , so che il passaggio non è così lite per cui non vorrei trovarmi ad aver perso qualche settimana per poi affrontare di nuovo questi problemi .
In passato ho utilizzato 8051 delle Silab e devo dire che non ho mai trovato questi problemi , il mio piano B se non risolvo è quello di rifare la scheda con questo processore così che sono sicuro che non avrò problemi .
Questo mi costerebbe molti soldi perché ho già prodotto 500 PCB con questo micro .
L'unica cosa che ho trovato nelle opzioni del compilatore C18 un setting chiamato Default Storage Class , qui puoi scegliere 3 modalità di funzionamento :Auto,Static,Overlay, queste differiscono da come appunto gestiscono le variabili locali, infatti mettendo questa opzione in static la RAM da 29% diventa 39% questo evidenzia un differente modo di archiviare i dati.
attivando la modalità overlay Infatti apparentemente adesso non ho più visto il fenomeno che avevo elencato: Ma non è detto che abbia risolto perché mi era successo in passato basta cambiare qualcosa prima dell'utilizzo della variabile incriminata (che cambia casualmente di valore ) che torna funzionare regolarmente, salvo magari che dopo a causa di un interrupt non programmatico tipo richiesta sulla seriale per ritornare a fare il pazzo fino a creare dei blocchi del processore.
Quello che mi chiedo sinceramente, che non ho trovato su nessun forum elencare un fenomeno simile ,dato che a me succede con una facilità abbastanza evidente (tanto da costringermi a inserire alcuni Array che poi non utilizzavo proprio per spostare il punto su cui salvava la variabile GLOBALE in RAM) .
Questo di fatto è un problema così grave che non avrebbe permesso a questo processore il successo che ha avuto .
Infatti credo che sia un qualche settaggio da impostare in maniera diversa . All'inizio ho dato subito la colpa all' ottimizzatore che non ostate averlo pagato 300 euro sembra essere inutilizzabile …..
Tu hai mai avuto problemi simili ?
Grazie di nuovo per la tua disponibilità
Mirko
prima di tutto ti ringrazio per la pronta risposta e colgo l'occasione per farti i complimenti per il sito e tutto il supporto che dai, personalmente ho usufruito di alcune tue schede Demo e di molte guide che hai realizzando in maniera accademica .
Tornando al mio grande problema :
il tuo consiglio di passare al XC8 ovviamente l'ho valutato , ma ho un problema di tempistica che non mi permette di fare questa scelta, se non costretto per estremo , so che il passaggio non è così lite per cui non vorrei trovarmi ad aver perso qualche settimana per poi affrontare di nuovo questi problemi .
In passato ho utilizzato 8051 delle Silab e devo dire che non ho mai trovato questi problemi , il mio piano B se non risolvo è quello di rifare la scheda con questo processore così che sono sicuro che non avrò problemi .
Questo mi costerebbe molti soldi perché ho già prodotto 500 PCB con questo micro .
L'unica cosa che ho trovato nelle opzioni del compilatore C18 un setting chiamato Default Storage Class , qui puoi scegliere 3 modalità di funzionamento :Auto,Static,Overlay, queste differiscono da come appunto gestiscono le variabili locali, infatti mettendo questa opzione in static la RAM da 29% diventa 39% questo evidenzia un differente modo di archiviare i dati.
attivando la modalità overlay Infatti apparentemente adesso non ho più visto il fenomeno che avevo elencato: Ma non è detto che abbia risolto perché mi era successo in passato basta cambiare qualcosa prima dell'utilizzo della variabile incriminata (che cambia casualmente di valore ) che torna funzionare regolarmente, salvo magari che dopo a causa di un interrupt non programmatico tipo richiesta sulla seriale per ritornare a fare il pazzo fino a creare dei blocchi del processore.
Quello che mi chiedo sinceramente, che non ho trovato su nessun forum elencare un fenomeno simile ,dato che a me succede con una facilità abbastanza evidente (tanto da costringermi a inserire alcuni Array che poi non utilizzavo proprio per spostare il punto su cui salvava la variabile GLOBALE in RAM) .
Questo di fatto è un problema così grave che non avrebbe permesso a questo processore il successo che ha avuto .
Infatti credo che sia un qualche settaggio da impostare in maniera diversa . All'inizio ho dato subito la colpa all' ottimizzatore che non ostate averlo pagato 300 euro sembra essere inutilizzabile …..
Tu hai mai avuto problemi simili ?
Grazie di nuovo per la tua disponibilità
Mirko
Si prega Accedi o Crea un account a partecipare alla conversazione.
- mirko pettinelli
- Autore della discussione
- Visitatori
9 Anni 9 Mesi fa #4
da Mauro Laurenti
Risposta da Mauro Laurenti al topic PIC18F97J60 improvvisi blocchi del microcontrollore
Visto che hai una licenza potrebbe convenire rimanere con la versione che hai, ma il passaggio da C18 a XC8 non e' molto dolorosa. Con 24-48 hai fatto il porting, a meno di non usare cose troppo "fancy".
Non ho giocato molto con le ottimizzazioni ma queste potrebbero in generale causare problemi (non nel caso specifico C18).
Con piccoli progetti mi sono capitate cose strane ed alcune volte il modo per risolvere il problema e' stato creare un progetto nuovo ed includere nuovamente i file di codice e relativi header. Sembrava come se il compilatore linker usasse informazioni vecchie del progetto e il nuovo codice ereditasse le vecchie impostazioni e codice.
Controlla pure l'errata del PIC e del compilatore se tante di quelle volte non ci siano cose note documentate.
Saluti,
Mauro
Non ho giocato molto con le ottimizzazioni ma queste potrebbero in generale causare problemi (non nel caso specifico C18).
Con piccoli progetti mi sono capitate cose strane ed alcune volte il modo per risolvere il problema e' stato creare un progetto nuovo ed includere nuovamente i file di codice e relativi header. Sembrava come se il compilatore linker usasse informazioni vecchie del progetto e il nuovo codice ereditasse le vecchie impostazioni e codice.
Controlla pure l'errata del PIC e del compilatore se tante di quelle volte non ci siano cose note documentate.
Saluti,
Mauro
Si prega Accedi o Crea un account a partecipare alla conversazione.
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.