#include <18F14K50.h>
#device adc=8 //8 bts 256 cuentas
#FUSES INTRC_IO //High Speed Crystal/Resonator with PLL enabled
#FUSES CPUDIV2
#FUSES MCLR //Master Clear pin enabled
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOLVP //No utilizamos el modo de programación con bajo voltaje, B5(PIC18) used for I/O
#FUSES NODEBUG //No usamos codigo para debuguear
#use delay(clock=8MHz)
#define VMAX 255.00
#define AN1M 127.00
#define AN2M 127.00
#define AN_DERECHA 128
#define AN_IZQUIERDA 127
#define AN_ADELANTE 128
#define AN_ATRAS 127
#define SS PIN_B7
int8 AN1=0, AN2=0, V1, V2, direccion=0; // para atras 1
int1 adq=0;
float Vo1, Vd1, Vi1;
float Vo2, Vd2, Vi2;
////////////////////////////////////////////////////////////////////////////////
////////// INTERRUPCIONES //////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
#int_TIMER0
void TIMER0_isr(void)
{
set_timer0(15536); // 50ms
adq=1;
output_toggle(PIN_C1); // solo para chequeo en simulacion u operación
}
////////////////////////////////////////////////////////////////////////////////
////////// FUNCIONES ///////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void adq_pote(void)
{
set_adc_channel(7); // desplazamiento longitudinal
delay_us(10);
AN1 = read_adc();
set_adc_channel(8); // desplazamiento lateral
delay_us(10);
AN2 = read_adc();
}
void calc_vel(void)
{
}
void send(void)
{
output_low(SS);
spi_write(V1);
delay_us(10);
spi_write(V2);
delay_us(10);
spi_write(direccion);
delay_us(10);
output_high(SS);
}
////////////////////////////////////////////////////////////////////////////////
////////// PROGRAMA PRINCIPAL //////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void main()
{
set_tris_b(0b00011111);
set_tris_c(0b01001101);
setup_adc_ports(sAN7|sAN8|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
setup_spi(SPI_MASTER|SPI_CLK_DIV_16|SPI_XMIT_H_TO_L|SPI_SCK_IDLE_LOW);
setup_timer_0(T0_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
set_timer0(0);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
output_high(PIN_C2);
output_high(PIN_B5);
output_high(SS);
while(TRUE)
{
if(adq==1) // se genero la interrupcion teporizada
{
disable_interrupts(GLOBAL);
adq_pote();
calc_vel();
send(); // se envian los valores de Vel al esclavo
adq=0;
enable_interrupts(GLOBAL);
}
}
}