#include <p18f452.h>
#include <timers.h>
#include <delays.h>
#pragma config WDT=OFF, LVP=OFF, OSC=HS
void inter (void); // declaracion de la funcion
#pragma code high_vector=0x08 //para que coloque este codigo en la
//direccion a la que apunta el vector de interrupcion
void interrupt_at_high_vector(void)
{
_asm GOTO inter _endasm
}
#pragma code // vuelvo a colocar el codigo en el sitio normal
#define servo1 PORTDbits.RD0
#define servo_max 2186
#define servo_min 474
#define servo_centro 1330
unsigned int duty1=servo_centro;
enum {D1, NO_D1, RESTO} estado;
#pragma interrupt inter
void inter(void)
{
INTCONbits.TMR0IF=0; //bajo el flag de la interrupcion
switch (estado)
{
case RESTO:
servo1=1;
WriteTimer0(0xffff-duty1);
estado=D1;
break;
case D1:
servo1=0;
WriteTimer0(0xffff-20000+duty1);
estado=RESTO;
}
}
void main(void)
{
char matriz [16][16];
OpenTimer0( TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_1 );
// inicializo el timer0 como timer de 16 bits, preesc 1:1 y
// habilitando la interrupción
INTCONbits.PEIE=1; // habilito interrupcion de perifericos
INTCONbits.GIE=1; // habilito interrupciones globales
TRISD = 0b11111100; // pongo RD0 y RD1 como salidas
servo1=1; // inicializo las salidas
estado=D1; // inicializo el estado
WriteTimer0(0xffff-duty1);
while (1) // bucle infinito
{
}
}