martes, 7 de diciembre de 2010

Cruce de semáforos (II) Interrupciones

Hola a todos! bueno después de estar bastante liado con las clases os he preparado el código del cruce de semáforos pero esta vez hecho con interrupciones, como veis , no hay nada de código dentro del bucle, y hacemos lo mismo que cuando teníamos al microcontrolador ocupado en todo momento. En esta caso podemos poner ahí lo que queramos que el pic ejecute mientras estamos esperando a que salte la interrupción.
Como veis, dentro del codigo de la interrupcion no es necesario verificar que ha saltado la interrupción del temporizador 0 (TMR0IF), ya que es la única interrupción activada, pero si que es necesario resetear el flag de la interrupción ya que de no ser así, estaremos entrando ahí continuamente.
A continuación tenéis el código.


##------------------------------------------------------------
#include <p18F2550.h>


// Bits de configuración
#pragma config WDT=OFF
#pragma config FOSC=HS
#pragma config LVP=OFF
#pragma config MCLRE = OFF            


char i; //DECLARAMOS LA VARIABLE QUE HARÁ DE CONTADOR


// Declaración de la rutina de tratamiento interrupción de alta prioridad
void R_Int_Alta(void);


// Vectorización de las interrpciones de alta prioridad
#pragma code Vector_Int_Alta=0x08
void Int_Alta (void)
{
_asm GOTO R_Int_Alta _endasm // Cuando se produce una interrupción de alta 
} // Prioridad se ejecuta la función
#pragma code


#pragma interrupt R_Int_Alta
void R_Int_Alta (void)
{
switch(i){
case 1:
PORTB=0x52;
PORTC=0x01; //SEGUNDO CICLO
TMR0H=57723>>8;
TMR0L=57723; //CARGAMOS TEMPORIZACIÓN SEGUNDO CICLO(1s)
INTCONbits.TMR0IF=0; //BORRAMOS FLAG DE TMR0
i++;
break;

case 2:
PORTB=0x85;
PORTC=0x02; //TERCER CICLO
TMR0H=42098>>8;
TMR0L=42098; //CARGAMOS TEMPORIZACIÓN TERCER CICLO(3s)
INTCONbits.TMR0IF=0; //BORRAMOS FLAG DE TMR0
i++;
break;

case 3:
PORTB=0x89;
PORTC=0x02; //CUARTO CICLO
TMR0H=57723>>8;
TMR0L=57723; //CARGAMOS TEMPORIZACIÓN CUARTO CICLO(1s)
INTCONbits.TMR0IF=0; //BORRAMOS FLAG DE TMR0
i++;
break;

case 4:
PORTB=0x32; // PRIMER CICLO
PORTC=0x01; // PRIMER CICLO
TMR0H=26473>>8;
TMR0L=26473;    //CARGAMOS EL VALOR PARA EL PRIMER CICLO(5s)
INTCONbits.TMR0IF=0; //BORRAMOS FLAG DE TMR0
i=1;
}
}

void main (void)
{
//CONFIGURACIÓN PUERTOS
TRISB=0; //PUERTO C COMO SALIDA
TRISCbits.TRISC0=0; //BIT 0 PUERTO B COMO SALIDA
TRISCbits.TRISC1=0; //BIT 1 PUERTO B COMO SALIDA

//CONFIGURACIÓN TEMPORIZADOR
T0CON=0x87; //MODO 16 BITS,FUENTE OSCILADOR,PREES.256

//CONFIGURACION INTERRUPCIONES
INTCONbits.GIE=1; //HABILITAMOS LAS INTERRUPCIONES A NIVEL GLOBAL
INTCONbits.PEIE=1; //HABILITAMOS LAS INTERRUPCIONES DE PERIFERICOS
INTCONbits.TMR0IE=1; //HABILITAMOS LA INTERRUPCION DEL TEMPORIZADOR


PORTB=0x32; //INICIALIZAMOS EL PUERTO B PARA PRIMER CICLO
PORTC=0x01; //INICIALIZAMOS EL PUERTO C PARA PRIMER CICLO

TMR0H=26473>>8;
TMR0L=26473;    //CARGAMOS EL VALOR PARA EL PRIMER CICLO(5s)


i=1;//INICIALIZAMOS EL CONTADOR

while (1); // Bucle sin fin
}
##------------------------------------------------------------


Espero que os sea útil como siempre.
Un saludo
Descargas:

No hay comentarios:

Publicar un comentario