Vai al contenuto
PLC Forum


Interrupt E Timer Col 16f84a


aduri

Messaggi consigliati

Salve a tutti.

Ho travato parecchi siti che parlano della gestione degli interrupt e dei timer del pic.

Pero' tutti hanno degli esempi in assembler.

Qualcuno mi sa indicare qualche sito che parli di questo argomento in c Hi-tech picclite oppure se qualcuno di voi ha un programmino anche molto sintetico su cui

farmi le ossa?

Ciao e grazie

Aduri

Link al commento
Condividi su altri siti


Ciao

Mi sono letto i data sheets chiaramente e' tutto riferito all'assembler ma piu' o meno credo di averci capito.

Ho provato a tirare giu' questo semplice listato con un primo led che lampeggia ma non riesco ad attivare l'interrupt per fare attivare il secondo led.

Eppure ho attivato il registro generale degli interrupt INTCON

mettendo tutto a zero al di fuori del flag GIE di abilitazione.

Faccio poi un controllo sul flag del RB0 (INTF) e dovrebbe partire la procedura di lampeggio del secondo led (ma niente da fare).

Riabilito poi INTCON per altri interrupt.

Per favore mi potete dare una mano cosi' passo ai timer.

Uso come compilatore C Picclite v8.01.

Probabilmente e' qualche errore di sintassi ma non riesco a trovarlo.

Grazie

Allego listato:

// led lampeggiante su RA0

// interrupt su RB0 che fa lampeggiare altro led su RA1

// Pic16f84A

// Compilatore Picclite v 8.01 Hitech-c

#include<pic.h> // compila per il PIC generico

#include"delay.c"

void interrupt isr(void)

{

TRISA = 0; // setta le porte A del PIC come uscite

TRISB = 255; // setta le porte B del PIC come ingresso

GIE=0; // disabilito INTCON cosi' non ci sono altri interrupt

if(INTF==1)

{ //graffa di apertura if

PORTA = 0b00000010;DelayMs(150); //sequenza lamp

PORTA = 0b00000000;DelayMs(150);

PORTA = 0b00000010;DelayMs(150); //sequenza lamp

PORTA = 0b00000000;DelayMs(150);

PORTA = 0b00000010;DelayMs(150); //sequenza lamp

PORTA = 0b00000000;DelayMs(150);

PORTA = 0b00000010;DelayMs(150); //sequenza lamp

PORTA = 0b00000000;DelayMs(150);

PORTA = 0b00000010;DelayMs(150); //sequenza lamp

PORTA = 0b00000000;DelayMs(150);

PORTA = 0b00000010;DelayMs(150); //sequenza 5 lamp

PORTA = 0b00000000;DelayMs(150);

} //graffa di chiusura sequenze

INTCON=0b10000000; // riabilito INTCON

}

main(void) //l'inizio del programma

{

unsigned short i; // def variabile

TRISA = 0; // setta le porte A del PIC come uscite

TRISB = 255; // setta le porte B del PIC come ingresso

i=0;

INTCON = 0b10000000; // sul registro INTCON abilito GIE e stato RB0 (INTF=0)

while(1) //ripete il ciclo all'infinito

{ //graffa di apertura di while

PORTA = 0b00000001; //sequenza lamp

for(i=0;i<3500;i++)

{

//intervallo

}

PORTA = 0b00000000; //sequenza 5 lamp

for(i=0;i<3500;i++)

{

//intervallo

}

} //graffa di chiusura di while

INTCON = 0b10000000; // sul registro INTCON riabilito GIE e stato RB0 (INTF=0)

//che era stato azzerato durante l'interrupt

} //graffa di chiusura main (void)

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