Hola a todos, ya que he estado mareando unos pocos meses me parece lo mas justo y correcto que comparta mi programa con vosotros,(por si le sirve a alguien) ya que sin vuestra ayuda no habria podido hacerlo.
Gracias.
Este Programa tiene que recibir unos comandos por Rs232 y debe:
-Poder controlar la carga o puesta en marcha de un dispositivo mediante Reles.
-Suministrarle al dispositivo una señal de triger de {120..2000]Hz.
-Suministrarle al dispositivo un pulso de ON/OFF de 500ms.
-Poder seleccionar entre un Triger Int/Ext.
-Controlar por I2c un DAC.
PD-El programa esta funcional 100% lo mas seguro es que le añada un detector de carga de bateria utilizando un ADC, pero bueno ya os dire....NO seais muy duros conmigo que soy un aprendiz de programador y como tal me imagino que se podran mejorar muchas cosas.....aun tendre que optimizar un poco el programa.
#include <16F886.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES BROWNOUT //Reset when brownout detected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BORV40 //Brownout reset at 4.0V
#include <string.h>
#include <stdlib.h>
//#use delay(clock=4000000) //Osc Interno a 4 Mhz
#use delay(clock=2000000) //Osc Interno a 2 Mhz
#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) //Configuracion de Rs232
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3) //Configuracion I2c
#use fast_io(b)
void char pulso_laser();
void char Frecuencia0();
void char mode_standby();
void char mode_carga();
void char mode_laser();
void char triger_interno();
void char triger_externo();
void char atenuacion();
void Frecuencia_presc_1(int valor_pr2,int16 dutty);
void Frecuencia_presc_4(int valor_pr2,int16 dutty);
void Frecuencia_presc_16(int valor_pr2,int16 dutty);
char *opcion="frecuencia";
char *opcion2="mode_carga";
char *opcion3="mode_standby";
char *opcion5="mode_laser";
char *opcion6="pulso_laser";
char *opcion7="triger_int";
char *opcion9="frecuencia0";
char *opcion10="triger_ext";
char *opcion12="atenuacion";
char adac_msb;
char adac_lsb;
char s2[10]; //Creamos una varible de intercambio para las Opciones
char s1[3];
//char postscaler[3]; //Creamos una varible de intercambio para la Frecuencia
int16 xdac;
float dos_dec;
float resto_dec;
int16 valor_pr2; //Valor del Registro PR2
float valor_pr2_dec;
int post;
int16 dutty;
#int_RDA
void RDA_isr()
{
printf("\f");
do{
printf("\r\n Comando :");
fgets(s2);
printf("\r\n Comando introducido es ");
puts(s2);
xdac = atol(s1);
delay_ms(1);
if(strncmp(s2,opcion,8)==0)
{
if((xdac>=120)&(xdac<511))
{
dos_dec=((64)*(xdac));
}
else
{
if((xdac>510))
{
dos_dec=((16)*(xdac));
}
else
{
printf("\r\n Vuelva A Introducir comando:");;
}
}
valor_pr2_dec=((2000000/(dos_dec))-1);
delay_ms(1);
valor_pr2=valor_pr2_dec;
resto_dec=(valor_pr2_dec-valor_pr2);
if(resto_dec>0.5)
valor_pr2++;
delay_ms(1);
dutty=(((valor_pr2)*2)+1);
if((xdac>0)&(xdac<511))
{
Frecuencia_presc_16(valor_pr2,dutty);
}
if((xdac>511)) //&(xdac<2001)) !!Para acotar a 2000Hz !!
{
Frecuencia_presc_4(valor_pr2,dutty);
}
}
if(strncmp(s2,opcion2,9)==0)
mode_carga();
if(strncmp(s2,opcion3,9)==0)
mode_standby();
if(strcmp(s2,opcion5)==0)
mode_laser();
if(strncmp(s2,opcion6,10)==0)
pulso_laser();
if(strcmp(s2,opcion7)==0)
triger_interno();
if(strcmp(s2,opcion9)==0)
Frecuencia0();
if(strcmp(s2,opcion10)==0)
triger_externo();
if(strncmp(s2,opcion12,9)==0)
{
if(xdac==0)
{
adac_msb=0x00;
adac_lsb=0x00;
}
if(xdac==10)
{
adac_msb=0x01;
adac_lsb=0x9A;
}
if(xdac==20)
{
adac_msb=0x03;
adac_lsb=0x33;
}
if(xdac==30)
{
adac_msb=0x04;
adac_lsb=0xCD;
}
if(xdac==40)
{
adac_msb=0x06;
adac_lsb=0x66;
}
if(xdac==50)
{
adac_msb=0x08;
adac_lsb=0x00;
}
if(xdac==60)
{
adac_msb=0x09;
adac_lsb=0xF3;
}
if(xdac==70)
{
adac_msb=0x0B;
adac_lsb=0x33;
}
if(xdac==80)
{
adac_msb=0x0C;
adac_lsb=0xCC;
}
if(xdac==90)
{
adac_msb=0x0E;
adac_lsb=0x66;
}
if(xdac==100)
{
adac_msb=0x0F;
adac_lsb=0xFF;
}
i2c_start();
i2c_write(0xC0);
i2c_write(adac_msb);
i2c_write(adac_lsb);
i2c_stop();
delay_ms(10);
}
}
while(1);
}
void main()
{
output_bit( PIN_B0, 0);
output_bit( PIN_B1, 0);
output_bit( PIN_B2, 0);
output_bit( PIN_B3, 0);
output_bit( PIN_B4, 0);
output_bit( PIN_B5, 0);
output_bit( PIN_B6, 0);
output_bit( PIN_B7, 0);
set_tris_b(0x0D); //puerto B como salida
enable_interrupts(INT_SSP);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
while(1);
}
void char pulso_laser()
{
printf("\r\n Pulso On/Off del Laser");
delay_us(100);
output_high(pin_B7);
delay_ms(500);
output_low(pin_B7);
}
void char mode_standby()
{
output_bit( PIN_B5, 1);
delay_ms(2);
output_bit( PIN_B6, 0);
printf("\n\r Rele 1 en Posicion NA \n\r");
}
void int mode_carga()
{
output_bit( PIN_B5, 0);
output_bit( PIN_B6, 0);
printf("\n\r Modo Carga \n\r");
}
void char mode_laser()
{
output_bit( PIN_B5, 1);
delay_ms(2);
output_bit( PIN_B6, 1);
printf("\n\r Modo Laser Activado \n\r");
}
void char triger_interno()
{
output_bit(Pin_A3,0);
delay_ms(10);
output_bit( PIN_A4, 1);
printf("\n\r Seleccion de Triger Interno Activado \n\r");
}
void char Frecuencia0()
{
set_pwm1_duty(0);
delay_ms(10);
setup_timer_2(T2_DISABLED,0,1);
set_pwm1_duty(0);
delay_ms(10);
output_bit( PIN_A4, 0);
output_low(pin_c2);
printf("\n\r Señal PWM Apagada PIN_C2 \n\r");
}
void char triger_externo()
{
output_bit(Pin_A4,0);
delay_ms(10);
output_bit( PIN_A3, 1);
printf("\n\r Seleccion de Triger Externo Activado \n\r");
}
void Frecuencia_presc_16(int valor_pr2,int16 dutty)
{
setup_timer_2(T2_DIV_BY_16,valor_pr2,post);
setup_ccp1(CCP_PWM);
set_pwm1_duty(dutty);
setup_oscillator(OSC_2MHZ);
}
void Frecuencia_presc_4(int valor_pr2,int16 dutty)
{
setup_timer_2(T2_DIV_BY_4,valor_pr2,post);
setup_ccp1(CCP_PWM);
set_pwm1_duty(dutty);
setup_oscillator(OSC_2MHZ);
}