Visualizza messaggio singolo
Vecchio 22 novembre 10, 20:00   #84 (permalink)  Top
MSchiepp
User
 
L'avatar di MSchiepp
 
Data registr.: 21-01-2004
Residenza: Milano
Messaggi: 989
Citazione:
Originalmente inviato da elicottero78 Visualizza messaggio
secondo te questo codice che effettua un interrupt quando schiaccio rb0...è corretto?
No! E neanche secondo il PIC!
Fai un po' di confusione:

il bit INTEDG serve solo per specificare se l'interrupt deve essere sul fronte di salita o su quello di discesa; una volta settato non serve andarlo a vedere, perchè rimane come l'hai settato tu!
Nella routine di interrupt si testa il bit che indica se c'è stato quell'interrupt e il fatto che quell'interrupt sia effettivamente abilitato; neltuo caso non è necessario perchè è l'unico interrupt attivo, ma è buona norma farlo per quando avrai più interrup da distinguere. alla fine della routine il flag che ha generato l'interrupt DEVE essere cancellato sempre.

Nel main prima di abilitare l'interrpt globale, è buona norma azzerare i flag di interrupt.

La routine di interrupt sarà quindi:

void interrupt(){
if(INTCON.F4 && INTCON.F1){
portb.f4=1;
}

INTCON.INTF = 0;
}

void main() {
trisa=0;
trisb=0b00000001;
porta=0;
portb=0;
OPTION_REG.INTEDG = 1;
INTCON.INTE=1;
INTCON.INTF = 0;
INTCON.GIE=1;
while(1){
portb.f3=1;
delay_ms(1000);
portb.f3=0;
delay_ms(1000);
}
}

Michele
__________________
__________________________________________________
The worst day flying is better than the best day working.
MSchiepp non è collegato   Rispondi citando