Вы находитесь на странице: 1из 5

Programa con Cuatro Interrupciones con ambos Niveles de Prioridad

Se program en lenguaje C para tener cuatro fuentes de interrupcin en el PIC18F4550, segn


se resume en la tabla dada a continuacin. Prctica 3.
Fuente
Int externa0 <RB0>
Int puerto B <7:4>
Timer 0
Timer 1

Elemento
L1 led
L2 led
L5 led
buzz bocina

Prioridad
Alta
Alta
Baja
Baja

Terminal
Lata4 (RA4)
Lata5 (RA5)
Lata3 (RA3)
Lata2 (RA2)

Usar MPLAB 8.83 para compilar el mdulo:


/*********************************************************************
*
Example User Program to be used with resident Bootloader
*********************************************************************
* FileName:
main.c
* Dependencies:
* Processor:
PIC18
* Compiler:
C18
* Company:
* Autor:
*
*
Plantilla Generica para hacer un Programa en C18
*
utilizando el Bootloader con el PIC18F4550
*********************************************************************/
#include <p18cxxx.h>
/**************** Bits
#pragma config PLLDIV
#pragma config CPUDIV
#pragma config USBDIV
#pragma config FOSC
#pragma config FCMEN
#pragma config IESO
#pragma config PWRT
#pragma config BOR
#pragma config BORV
#pragma config VREGEN
#pragma config WDT
#pragma config WDTPS
#pragma config MCLRE
#pragma config LPT1OSC
#pragma config PBADEN
#pragma config CCP2MX
#pragma config STVREN
#pragma config LVP
#pragma config ICPRT
#pragma config XINST
#pragma config CP0
#pragma config CP1
#pragma config CP2
#pragma config CP3
#pragma config CPB
#pragma config CPD

Prof. S. Saucedo

de Configuracion *******************************/
= 5
// (20 MHz crystal on PICDEM FS USB board)
= OSC1_PLL2
= 2
// Clock source from 96MHz PLL/2
= HSPLL_HS
= OFF
= OFF
= OFF
= ON
= 3
= ON
//USB Voltage Regulator
= OFF
= 32768
= ON
= OFF
= OFF
= ON
= ON
= OFF
= OFF
// Dedicated In-Circuit Debug/Programming
= OFF
// Extended Instruction Set
= OFF
= OFF
= OFF
= OFF
= OFF
= OFF

Gpo 6CM9_2013

#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma
#pragma

config
config
config
config
config
config
config
config
config
config
config
config

WRT0
WRT1
WRT2
WRT3
WRTB
WRTC
WRTD
EBTR0
EBTR1
EBTR2
EBTR3
EBTRB

=
=
=
=
=
=
=
=
=
=
=
=

OFF
OFF
OFF
OFF
ON
OFF
OFF
OFF
OFF
OFF
OFF
OFF

// Boot Block Write Protection

//*Este programa prueba el hardware de la tarjeta con el bootloader


#define
#define
#define
#define
#define
#define

L1
L2
L5
buzz
L3
L4

LATAbits.LATA4
LATAbits.LATA5
LATAbits.LATA3
LATAbits.LATA2
LATCbits.LATC0
LATCbits.LATC1

/** ************ Entradas Digitales *************************************/


#define mInitAllSwitches() TRISBbits.TRISB4=1;TRISBbits.TRISB5=1;
#define mInitSwitch2()
TRISBbits.TRISB4=1;
#define mInitSwitch3()
TRISBbits.TRISB5=1;
#define sw2
PORTBbits.RB5
#define sw3
PORTBbits.RB4
//************************************************************************
/** V A R I A B L E S ****************************************************/
#pragma udata
char cuenta;
char copia;
//************** DEFINICION DE ALGUNAS CONSTANTES **************************
#define TIMER0L_VAL
0xE5 // para lapso de 1.0seg
#define TIMER0H_VAL
0x48
#define TIMER1L_VAL
0x98 // para lapso de 2.27ms
#define TIMER1H_VAL
0x95
//***********************************************************************
/************* DECLARACION DE LOS PROTOTIPOS ***************************/
void YourHighPriorityISRCode(void);
void YourLowPriorityISRCode(void);
void configTemp0(void);
void configPortb(void);
void configTemp1(void);
//void Mi_delay(void);
void EEPROM_Write(unsigned char address,unsigned char databyte);
//*************************************************************************
/******************** VECTOR REMAPPING *********************************/
#define REMAPPED_RESET_VECTOR_ADDRESS
0x1000
#define REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS 0x1008
#define REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS 0x1020
/*************************************************************************/
extern void _startup (void);
// See c018i.c in your C18 compiler dir

Prof. S. Saucedo

Gpo 6CM9_2013

#pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS


void _reset (void)
{
_asm goto _startup _endasm
}
/*************************************************************************/
#pragma code REMAPPED_HIGH_INTERRUPT_VECTOR =
REMAPPED_HIGH_INTERRUPT_VECTOR_ADDRESS
void Remapped_High_ISR (void)
{
_asm goto YourHighPriorityISRCode _endasm
}
/*************************************************************************/
#pragma code REMAPPED_LOW_INTERRUPT_VECTOR =
REMAPPED_LOW_INTERRUPT_VECTOR_ADDRESS
void Remapped_Low_ISR (void)
{
_asm goto YourLowPriorityISRCode _endasm
}
/*************************************************************************/
/*************************************************************************/
#pragma code
//***************** VECTOR DE ALTA PRIORIDAD ****************************
#pragma interrupt YourHighPriorityISRCode
void YourHighPriorityISRCode()
{
if (INTCONbits.INT0IF==1)
{
L1^=1;
INTCONbits.INT0IF=0;
}
else if(INTCONbits.RBIF==1)
{
L2 ^=1;
INTCONbits.RBIF=0;
}
//AGREGAR CODIGO
}
//This return will be a "retfie fast", since this is in a #pragma
// interrupt section
//************************************************************************
//************** VECTOR DE INTERRUPCION BAJA PRORIDAD
#pragma interruptlow YourLowPriorityISRCode
void YourLowPriorityISRCode()
{
//AGREGAR CODIGO
if(INTCONbits.TMR0IF == 1){
//AGREGAR CODIGO
L5 ^= 1;
INTCONbits.TMR0IF = 0;
TMR0H = TIMER0H_VAL;
TMR0L = TIMER0L_VAL;
INTCONbits.TMR0IF = 0;
}
else if(PIR1bits.TMR1IF == 1) {
cuenta++;

Prof. S. Saucedo

******************

Gpo 6CM9_2013

PIR1bits.TMR1IF = 0;
TMR1H = TIMER1H_VAL;
TMR1L = TIMER1L_VAL;
}
}
//**************************************************************************
void ConfigPuertos(void)
{
ADCON1 |= 0x0F;

// Default all pins to digital

TRISA=0B00000000;
LATA = 0x20;
TRISB = 0xFF;
}
void ConfigINT0(void)
{
INTCON2bits.INTEDG0 = 0; // activada por flanco descendente
INTCON2bits.RBPU = 0;
// activa las resistencias de subida
INTCON |= 0B10010000;
// Habilita INT0
}
/************************ PROGRAMA PRINCIPAL ***************************/
/************************************************************************/
void main (void)
{
ConfigPuertos();
RCONbits.IPEN=1; // habilita prioridades de interr
INTCON2bits.TMR0IP=0;
//mInitAllSwitches();
ConfigINT0();
configTemp0();
configPortb();
configTemp1();
cuenta = 0;
while (1)
{
copia = cuenta;
buzz = (copia&&17 == 17);
}
}
//************************************************************************
void configTemp0(void)
{
INTCONbits.TMR0IF = 0;
TMR0H = TIMER0H_VAL;
TMR0L = TIMER0L_VAL;
T0CON = 0b10000111; //0x87 o 0x97
INTCON |= 0x60;
}
void configTemp1(void)
{
PIR1bits.TMR1IF = 0; // limpia bit de interr.
TMR1H = TIMER1H_VAL;
TMR1L = TIMER1L_VAL;
T1CON = 0b00001101; //0x0D
PIE1bits.TMR1IE = 1;

Prof. S. Saucedo

Gpo 6CM9_2013

IPR1bits.TMR1IP = 0; // baja prioridad


}
void configPortb(void)
{
INTCON |= 0x88;
}
/************************************************************************/
void EEPROM_Write(unsigned char address,unsigned char databyte) //Funcin para
escribir un databyte
{
//en la localidad address de la EPROM
EECON1bits.EEPGD=0;
EECON1bits.CFGS=0;
EEDATA=databyte;
EEADR=address;
EECON1bits.WREN=1;
EECON2=0x55;
EECON2=0xAA;
EECON1bits.WR=1;
while(EECON1bits.WR==1);
EECON1bits.WREN=0;
}

Prof. S. Saucedo

Gpo 6CM9_2013

Вам также может понравиться