Vai al contenuto
PLC Forum


Aiuto Interrupt 16f84 - nn riesco a capire il perchè...


franco2

Messaggi consigliati

ciao a tutti,

ho un problema nella programmazione di un 16f84, ovvero di interrupt sul fronte di RB0:

vorrei, tramite il registro OPTION, che l'interrupt fosse abilitato sul fronte di salita e su quello di discesa

alternativamente. Ho provato mascherando l'OPTION register durante la routine di interuzione e funziona (infatti per vedere quale

parte della routine faceva faccio accendere due led distinti), ma cambiando il valore del bit 6 l'interrupt rimane sempre sul fronte di

salita, eppure il valore viene effettivamente cambiato altrimenti dovrebbe accendersi sempre lo stesso led!

come mai?

io cambio il bit dell' OPTION register prima di riabilitare gli int tramite bcf INTCON,0 e retfie...

grazie mille

Link al commento
Condividi su altri siti


Vediamo se ho capito:

Hai abilitato l'interrupt del pin rb0/int.

Ad ogni routine di interrupt inverti il bit 6 di option reg (intedg) e questo funziona perchè lo testi con i led.

Il tutto ti va però in interrupt sempre e solo sul fronte di salita del pin rb0.

A prima vista sembra corretto. Hai provato a scrivere diversamente il nome del bit del registro?

Ad esempio, invece di OPTION_REG,INTEDG scrivi magari OPTION_REG,06 oppure 0X81,06 ?

Magari è solo un errore nel file .inc che definisce il modo di assemblare il programma...

Per accendere i led usi delle istruzione poste dopo le istruzioni che agiscono sul registro option o testi effettivamente il bit option,06 e a seconda del risultato accendi uno o l'altro led?

Per ora non mi viene in mente altro....

Ciao.

Link al commento
Condividi su altri siti

grazie, ma sono riuscito a trovare l'errore ovvero dimenticavo di riattivare gli int col bit GIE, proprio un errore da dilettante!!!!!

grazie comunque per l'interessamento

Link al commento
Condividi su altri siti

io oltre a quella modifica ne ho fatta un'altra ma credevo non fosse quello, overo quando modificavo l' option register non facevo caso al banco dei registri e allora prima di una qualsiasi operazione su tale banco scrivo nello status register di selezionare il banco giusto... allora deve essere questo il motivo...

Link al commento
Condividi su altri siti

Ecco, mi sembra che queso sia più importante.

Tra le altre cose, ti sei ricordato di salvare i valori del registro W e status all'inizio della routine di interrupt e ripristinarli alla fine? Potresti avere problemi al programma principale altrimenti.

Tra l'altro non ti conviene riabilitare manualmente il bit GIE di INTCON prima della fine dell'interrupt. Non avrai problemi in questo caso, ma se tu usassi più di una condizione di interrupt, e se la seconda ti si verifica durante l'esecuzione della routine della prima, abilitando il GIE ti si verificherebbe una immediata nuova chiamata alla routine di interrupt, prima che sia terminata la vecchia routine, e questo ti darebbe problemi.

Se invece lasci il GIE a 0, sarà l'istruzione RETFIE a risettarlo, e nel caso in cui al momento della fine della prima routine esista già una nuova condizione di interrupt, la nuova routine verra eseguita immediatamente dopo la fine della prima, in maniera corretta.

Ciao!

Modificato: da bit
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...