Autor Tema: Programa Comandos RS232  (Leído 1526 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
Programa Comandos RS232
« en: 25 de Enero de 2011, 09:10:12 »
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);
     
}


 

anything