si ok,este es
****************************************************************
/// duty cycle 0.01ms @ 1khz
// T1=10us
// T2=990us
// TIMER0 a 1:2 _____ 1 rtcc cada 512us
// T1________________ 1 rtcc = Tcm *prescaler (256-251)= 10us
// T2________________ 2 rtcc = 1 rtcc + Tcm*prescaler(256-12)= 1ms
// 1 tiks 2us
// 5 ticks 10us
// AJUSTE DE PULSO
Ancho Pulso minimo 6us
// Ancho pulso medio 5us
// Ancho pulso maximo 100us
// TMR0 a 1:2 -> 1 RTCC cada 512 us
// -> 1 Tick cada 512/ 256 = 2us
// -> 1 ms = (1 x RTCC completas) + (1 * RTCC - 12 ticks)
//
*/
#include <16f628a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use standard_io(b)
#use rs232(baud=9600, xmit=PIN_B1, rcv=PIN_B2)
#define PIN_SERVO1 PIN_B0
const int AJUSTE_FINO_DE_RTCC = 12; // 256 - 12= 1 RTCC
//AJUSTE PMW
const int ticks_PULSO_MINIMO = 3; //6us
const int ticks_PULSO_MEDIO = 5; //10 us
const int ticks_PULSO_MAXIMO = 50; //100us
int1 flagRTCC = 0; // activo c/ 1 rtc completas
int contRTCC = 0;
int1 flagSERVO1 = 0; // marca cuando flag RTCC SE ACTIVO
//pin se activo
int tSERVO1 = ticks_PULSO_MEDIO;
char Keypress=0x00;
void eco_servos(void);
#int_rda
void rda_isr() {
Keypress=0x00;
if(kbhit()){
Keypress=getc();
}
}
#int_RTCC
RTCC_isr(){
++contRTCC;
if(contRTCC==1){
set_TIMER0(AJUSTE_FINO_DE_RTCC);
}
if(contRTCC==2){
flagRTCC=1;
contRTCC=0x00;
}
}
void eco_servos(void){
printf("S=%u\r\n",tSERVO1);
}
void main() {
int ValTIMER0;
setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
enable_interrupts(int_rda);
enable_interrupts(global);
printf("\r\n\COMANDO PMW \r\n\r\n");
eco_servos();
set_TIMER0(0);
enable_interrupts(INT_RTCC);
do {
// DISPARO DEL PULSO PWM
if(flagRTCC==1){
flagRTCC=0;
output_high(PIN_SERVO1);
flagSERVO1=1;
}
// CONTROL DE ANCHO DEL PULSO PWM
if(flagSERVO1==1){
valTIMER0 = get_TIMER0();
if(valTIMER0>tSERVO1){
flagSERVO1=0;
output_low(PIN_SERVO1);
}
}
// CONTROL DESDE LA RS-232
if(Keypress!=0x00){
switch(Keypress){
// Periodos Prefijados
case '1': tSERVO1=ticks_PULSO_MINIMO;
break;
case '2': tSERVO1=ticks_PULSO_MEDIO;
break;
case '3': tSERVO1=ticks_PULSO_MAXIMO;
break;
case '+': if(++tSERVO1>ticks_PULSO_MAXIMO){
tSERVO1=ticks_PULSO_MAXIMO;
}
break;
case '-': if(--tSERVO1<ticks_PULSO_MINIMO){
tSERVO1=ticks_PULSO_MINIMO;
}
break;
case 'r': eco_servos();
break;
}
Keypress=0x00;
}
} while (TRUE);
}