#include <18F2550.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV20 //Brownout reset at 2.0V
#FUSES NOPUT //No Power Up Timer
#FUSES NOCPD //No EE protection
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOPBADEN //PORTB pins are configured as digital I/O on RESET
#FUSES NOWRTC //configuration not registers write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOEBTR //Memory not protected from table reads
#FUSES NOEBTRB //Boot block not protected from table reads
#FUSES NOCPB //No Boot Block code protection
#FUSES MCLR //Master Clear pin enabled
#FUSES LPT1OSC //Timer1 configured for low-power operation
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL12 //Divide By 12(48MHz oscillator input)
#FUSES CPUDIV4 //System Clock by 4
#FUSES USBDIV //USB clock source comes from PLL divide by 2
#FUSES VREGEN //USB voltage regulator enabled
//timer 0
/*
#DEFINE T0CON 0xFD5 // timer0
#DEFINE T1CON 0xFCD // timert1
#BIT TMR0ON = T0CON.7 // valor enable del timer0 1=on, 0=Off
#BIT RD16 = T1CON.7 // valor enable del timer0 1=on, 0=Off
#define TIMER1_ON RD16
*/
// --- esclavos --------------------------------
#define S1 0xB0
#define S2 0xB2
#define S4 0xB4
#define S6 0xB6
#define S8 0xB8
// ----- define los servos ----------------------
#define sv_0 PIN_B7
#define sv_1 PIN_B6
#define sv_2 PIN_C1
#define sv_3 PIN_C2
#define sv_4 PIN_C0
/*
#define sv_5 PIN_B7
#define sv_6 PIN_B6
#define sv_7 PIN_B5
#define sv_8 PIN_B4
#define sv_9 PIN_B3
*/
// TIMER 2 exp 16 bit : 65536 tick 0.2us -->13107.2us 1 INT
// ---- perido de 20 ms 20000us -------------------------------
// 1 tick ........ 0.2us
// 5 tick ........ 1 us
// ----- ventana o cambio motor -------------------------------
// Tick para us en on
//const int16 ventana = 60536; // 65536 - 5000 = 1ms 1000us
const int16 ventana = 55536; // 65536 - 10000 = 2ms 2000us
//const int16 ventana = 50536; // 65536 - 15000 = 3ms 3000us
//const int16 ventana = 45536; // 65536 - 20000 = 4ms 4000us
//const int16 ventana = 40536; // 65536 - 25000 = 5ms 5000us
//const int16 ventana = 15536; // 65536 - 50000 = 10ms 10000us
#define max_v 10 /maxima ventana
//1 tick -------- 0.2us
//x tick -------- y us
// ----- tick para tiempo en ON -------------------------------
// --- generico ---------------------
//const int16 g_0 = 63036; //65536 - 2500 0.5ms 500us
//const int16 g_90 = 58036; //65536 - 7500 1.5ms 1500us
//const int16 g_180 = 53036; //65536 - 12500 2.5ms 2500us
//-------------------------------------------------------------
// --- mis tick ---------------------
//conts inr16 g_1 = .....; //65536 - ..... .....ms ...us
const int16 g_0 = 64936; //65536 - 600 0.120ms 120us
const int16 g_90 = 63661; //65536 - 1875 0.375ms 375us
const int16 g_180 = 62386; //65536 - 3150 0.630ms 630us
//-----------------------------------------------------------------------
// calculos con todos lo decimales y 65536 resta de tick solo parte entera
// 375us -120us = 255us
// 255us ---<> 90 grados 255 /90 = 2.833333(periodo) cada grado
// 2.8us grado --->> 14 tick por grado(con error de 0.3333)
//------------------------------------------------------------------------
// opero por angulos conocidos
// 5tick = 1us ---<> Tus x5 = Ttick
//------------------------------------------------------------------------
// referencia de 120 us por ser superior a 0 grados
//const int16 g_0 = 64936; //65536 - 600 0.120ms 120us
const int16 g_15 = 64724; //65536 - 812 255us/6 = 42us +120us = 162us
const int16 g_30 = 64511; //65536 - 1025 255us/3 = 85us +120us = 205us
const int16 g_45 = 64299; //65536 - 1237 255us/2 = 127us +120us = 247us
const int16 g_60 = 64086; //65536 - 1450 255us/3 = 85us*2+120us = 290us
const int16 g_75 = 63874; //65536 - 1662 255us/6 = 42us*5+120us = 332us
// referecnia de 375us por ser superior a 90 grados
//const int16 g_90 = 63661; //65536 - 1875 0.375ms 375us
const int16 g_105 = 63449; //65536 - 2087 255us/6 = 42us +375us = 417us
const int16 g_120 = 63236; //65536 - 2300 255us/3 = 85us +375us = 460us
const int16 g_135 = 63024; //63536 - 2512 255us/6 = 42us*3+375us = 502us
const int16 g_150 = 62811; //65536 - 2725 255us/3 = 85us*2+375us = 545us
const int16 g_165 = 62599; //65536 - 2937 255us/6 = 42us*5+375us = 587us
//const int16 g_180 = 62386; //65536 - 3150 0.630ms 630us
// --- vector inicializacion y angulos servos ----------------------
static int16 valor_PWM[]={g_0, g_45, g_60, g_90, g_120, g_135, g_180};
static int16 ini_PWM[]={g_90, g_90, g_90, g_90,0,0,0,0}; //8 servos
#define Pide_Dato1 2
#define Pide_Dato2 3
#define dato1 4
#define dato2 5
#use delay(clock=20000000)
//#define I2C_SCL PIN_B7
//#define I2C_SDA PIN_C4
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use i2c(Slave,Slow,sda=PIN_B0,scl=PIN_B1,address=0xB0)
//#include "milib.c"
//--------- milib.c-------------
//convierte us en tick de reloj
// 1us ---> 5tick
// xus ---> y tick
int16 t_on(int16 us_on){
int16 tick_on;
tick_on= 65536 - (us_on * 5);
return tick_on;
}