Problema con compilatore C e PIC

Ciao a tutti,

usando il compilatore PICC della HT-SOFT (come plug-in in MPLAB) su un PIC

16F876, purtroppo, sono incappato in alcuni problemi abbastanza singolari.

Utilizzo le interruzioni di TMR0 come riferimento "tempo", TMR1, CAPTURE1 e CAPTURE2 per misurare la frequenza di 2 segnali ad onda quadra (300 Hz e 150 Hz max.), il convertitore A/D, e piloto un display LCD HD44780.

Il programma occupa circa meta' ROM, e, continuando ad aggiungere routines, d'un tratto ha iniziato a bloccarsi (con il display che indica caratteri casuali), dopo qualche secondo dall'alimentazione. Modificando impostazioni del compilatore quali ottimizzazione globale (e relativo livello), ottimizzazione assembler e cose del genere spesso riesco a risolvere (dopo qualche tentativo), ma e' sufficiente aggiungere-togliere anche 1 sola riga e ricompilare per ottenere un HEX con i problemi descritti sopra...mi e' stato fatto notare che potrebbe essere un problema dovuto alla complessita' (e lunghezza) del codice presente in routine di interruzione, e devo dire che, tagliandone una parte, pareva che il problema fosse risolto. Purtroppo e' bastato aggiunegere un po' di codice (non in routine INT) per tornare al punto di prima :-(. Suppongo sia un qualcosa legato ai salti tra le varie pagine e gestione dei relativi bit che costituiscono la "parte alta" dell'indirizzo RP1:RP0 in fase di ingresso/uscita dagli interrupt...ma non saprei proprio come risolvere... Succede solo a me o qualcun'altro ha avuto esperienze simili ? :-/

Ringrazio in anticipo per l'interessamento... :)

Ciao, Pier.

Reply to
PierGSi
Loading thread data ...

"PierGSi" ha scritto nel messaggio news:YQ5Sc.95307$ snipped-for-privacy@news3.tin.it... [...]

routines,

impostazioni

riga

[...]

Utilizzando gli interrupt in modo non corretto può tranquillamente generare errori casuali di quelli descritti da te. Tieni presente che l'interruzione può avvenire in qualsiasi momento ed è quindi necessario che il programma salvi correttamente lo "stato" in cui è per poterlo ripristinare alla fine della routine di interruzione. Per esempio, è conveniente utilizzare nell'interrupt SOLO variabili dedicate, cioé non utilizzate in altre parti del programma (contatori, variabili temporanee, ecc). Se stai utilizzando un contatore per un ciclo nel programma principale e ti capita un interrupt, rischi di modificare il valore di quel contatore e, al ritorno dall'interruzione, puoi ottenere un comportamento anomalo.

Inoltre è sempre bene tenere le ruotine di interrupt MOOOLTO corte e veloci in modo che durino poco.

Per quanto riguarda il compilatore, ti consiglio di eliminare durante lo sviluppo qualsiasi tipo di ottimizzazione. Successivamente, se proprio vuoi, puoi cercare di ottimizzare qualcosa con calma, cercando di capire cosa fa il compilatore guardando numerose volte nell'assembler generato. Certo è che se hai problemi di spazio nel memoria codice, devi iniziare ad ottimizzare fin da subito.

Ti conviene circoscrivere il problema, magari cercando di non utilizzare interrupt per vedere se il problema è lì. Ma ci giurerei che è così.

Reply to
pozz

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.