Vai al contenuto
PLC Forum


Programmazione PIC - Gestione interrupt


bit

Messaggi consigliati

Quando faccio eseguire una subroutine di interrupt ad un PIC (attualmente 16F876, ma il problema vale per tutti) mi ritrovo con un problema abbastanza comune, ma che non sono ancora riuscito a risolvere adeguatamente.

Se la subroutine di interrupt compie operazione con il registro W, o compie operazioni che influiscono sui bit del registro Status, ho la necessità di salvare queste configurazioni all'inizio della subroutine e ripristinarle alla fine, in modo che il programma principale non venga influenzato in modo anomalo dall'esecuzione della subroutine (una specie di istruzioni tipo Push e Pop dello Z80 ad esempio).

Per il registro W non ho particolari problemi, con la prima istruzione della subroutine salvo il suo valore in un registro apposito e con l'ultima istruzione lo ricarico.

Il salvataggio del registro Status mi invece crea problemi e tutte le soluzioni che ho adottato mi causano instabilità e errori del programma.

Se qualcuno può aiutarmi magari posso inviargli spiegazioni più dettagliate e il listato della parte di programma che mi crea problemi.

Grazie dell'aiuto, la mia e-mail è bit.mail[at]tin.it

Link al commento
Condividi su altri siti


Io non ho mai incontrato il problema che segnali, forse perchè programmo in C. Uso un compilatore della CCSC, la cui versione che si integra con MPlab costa meno di 100€ e ti risparmia un sacco di problemi.

Link al commento
Condividi su altri siti

Beh, io programmo direttamente in assembler, così ho sott'occhio direttamente il programma che esegue il microprocessore e posso ottimizzarlo al massimo. Se però è possibile sapere come risolve questo problema il compilatore in C potrebbe essermi utile. Ovviamente avrei bisogno delle istruzioni dopo la compilazione in assembler. Grazie.

Link al commento
Condividi su altri siti

  • 1 month later...

i pic sono molto poveri in quanto ad interrupts, li odio anche se li uso dall'89.. Questo è un esempio funzionante che uso di solito.

Se la tua isr us anche il fsr salva anche lui.

devi riservare una posizione per wsave in ogni pagina che possa essere in uso

movwf wsave ;could be sopra o sotta

swapf status,w ;ma senza alterarlo

bcf _rp0 ;accertiamo per non duplicare anche lui

movwf statussave ;put

movfw pclatch

movwf pclsave ;

.........

... interrupt service

esci

movfw pclsave ;

movwf pclatch

swapf statussave,w

movwf status

swapf wsave,stesso

swapf wsave,w

retfie

Link al commento
Condividi su altri siti

Interessante! Io non avevo pensato all'istruzione swapf al posto di movf per trasferire un dato senza alterare il registro status.

Ho visto che hai salvato anche il valore di pclatch. Non ho capito bene la funzione di questo registro, dovrebbe contenere la parte alta del program counter se non sbaglio, ma come si gestisce?

Un'altra cosa, rimanendo in tema di program counter: nei PIC con più di 2K di memoria programma, come fa una istruzione tipo goto e call a indirizzare una locazione con soli 11 bit di indirizzo, che corrispondono appunto a 2K di memoria? E' necessario selezionare prima la pagina indirizzata?

Grazie dei consigli! Ciao!

Ah! Potresti segnalarmi un'altro tipo di microprocessore migliore in alternativa al PIC?

Dovrebbe essere adatto per lo stesso tipo di applicazioni, sempre riprogrammabile elettricamente (niente EPROM, non posso cancellare un micro mettendolo 20 volte al giorno sotto la lampada), con ram, EEPROM dati, oscillatore e interfaccie varie interne.

Non ho trovato nulla in giro. Il concorrente principale del PIC mi pare l'ST6, ma è cancellabile solo con la lampada. Inoltre la documentazione relativa dovrebbe essere facilmente reperibile, proprio come per i PIC.

Link al commento
Condividi su altri siti

gli avr della atmel non sono male, sicuramente più regolari di architettura e senza tutte quelle stranezze dei cambio pagina.

La storia di pclatch è lunga, leggi con moolta attenzione i manuali.

la swap è suggerita dalla letteratura, non è farina del mio sacco. essenziale è riservare una posizione per salvare w in ogni pagina utilizzata.

piero

www.tele-log.com

Link al commento
Condividi su altri siti

  • 1 year later...

Il PIC presenta interrupt sensibili al fronte o al livello del segnale di INT?

E qual è la resistenza di ingresso delle porte usate dal convertitore analogico-digitale di un PIC?

Grazie

Link al commento
Condividi su altri siti

La resistenza di ingresso del tuo equivalente Thevening deve essere inferiore a 3,2k pena un trasferimento non corretto del segnale alla periferica ADC.

Ciao

Link al commento
Condividi su altri siti

Non so che PIC usi ma per il 18Fxxx l'impendenza massima consigliata è 2,5k (manuale pag.184). Tutto dipende dalla velocità per caricare il S/H. 10k mi sembrano un pò troppi però...

Saluti

Link al commento
Condividi su altri siti

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