sbit lon at portc.b7; // led indicador de encendido y programa corriendo
//****************** para servo
sbit pruebas at portb.b0; // botón para probar el servo
sbit servo at portd.b4; // salida para servo
unsigned short onoffs = 0; // variable para controlar el on y off de prueba del servo
unsigned int cuenta;
unsigned short tl, stop;
const unsigned short ciclos = 50; // con esto da 41.2us aprox de tiempo
//****************** para servo fin
// ************ sub rutinas *********
void interrupt()
{
if (INTCON.T0IF)
{
cuenta++;
if (cuenta <= tl)
{
servo = 1;
}// if cuenta
else
{
servo = 0;
}// else cuenta t1
if (cuenta > 412) //485 teorico
{
cuenta = 0;
servo = 1;
} // cuenta 485
tmr0 = ciclos; // con este valor la int es cada 10us
INTCON.T0IF = 0;
}
} // interrupt
// ********************************** Fin función para las interrupciones *********
void main() {
//osccon = 0x71;
// OSC externo 20MHz
//Inicialización puerto A
porta = 0;
ansel = 0;
trisa = 0x0F; // puerto de A0 - A5 1 entrada 0 salida xxDD DDDD
//Inicialización puerto B
portb = 0;
anselh = 0;
wpub = 0xff; // habilita todas las pull - up
trisb = 0xFF; // puerto todo de entrada
OPTION_REG.b7 = 0; // habilitación general de las pull - ups
//Inicialización puerto C
portc = 0;
trisc = 0x50; // RC4 SDI, RC5 SDO, RC3 SCK, RC6 IRQ, RC1 CE, RC2 CSN, RC7 Lon, restante salida
//Inicialización puerto D
portd = 0;
trisd = 0x00; // salida
//Inicialización puerto E
porte = 0;
trise = 0x03; // RE0 - RE2, xxxx xDDD RE0 in, RE1 in, RE2 out
// configuración de las pull-up (otra vez), interrupciones y timer
option_reg = 0x08; //tim0 fosc/4, etc...
intcon = 0x60;
tmr0 = ciclos; // con este valor la int es cada 41.2us
tl = 30; // teorico: valor pos izq = 24, central 36, der 48
cuenta = 0;
intcon.B7 = 1; // habilita interrupciones
// ******************** fin de la configuración del micro *********************
lon = 1;
while (1) // ciclo infinito
{
if (pruebas == 0) // botón para probar servo
{
delay_ms(30);
while (pruebas == 0)
{
if (onoffs == 0)
{
if (tl < 40) // 48 limite derecho teorico
{
tl++; // teorico: valor pos izq = 24, central 36, der 48
} // if tl
delay_ms(20);
}
else
{
if (tl > 20) //24 limite izquierdo teorico
{
tl--; // teorico: valor pos izq = 24, central 36, der 48
} // if tl
delay_ms(20);
} // if onoffs
} // del while pruebas
delay_ms(20);
onoffs = ~ onoffs;
} // if pruebas
} // del while 1
} // del main