TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ferorts en 14 de Febrero de 2011, 09:34:05

Título: PIC16F886 PWM
Publicado por: ferorts en 14 de Febrero de 2011, 09:34:05
Hola a todos estoy trabajando con un PIC16F886 y con el CCS C,he hecho un programita que recibe 2 datos por I2C los pasa a una variable de 16bits y luego ese valor recibido en Hexadecimal lo utiliza para calular el valor del registro TR2 del Modulo PWM.

Ahora bien el programa funciona pero no todo lo bien que deberia...xD
En primer lugar simulo con proteus y me muestra por el compim conectado virtualmente con el Hiperterminal me muestra en pantalla todo el rato el valor del registro TR2. Ahora cuando lo flaseo en la demo board con el pickit2. el mismo Hiperterminal pero con un puerto diferente(utilizo un conversor USB-RS232 con un MAX232) pues me aparecen caracteres extraños  ilegibles en vez la primera linea cuando conecto la alimentacion de "Esperando Dato" me aparecen caracteres ilegibles.

Y el otro gran problema es  que cuando recibo los 2 datos Hex por I2C lo hago 1 de 16 bits con la instruccion make16, y utilizo ese valor para hacer el calculo del registro TR2 ,ese valor recibido y guardado en la variable X, no puedo pasarlo a una variable de tipo float, ya que me interesa que ese numero tenga decimales ,para poder tener mas precision a la hora del calculo del valor TR2.Ya que aunque TR2 vaya del 0 al 255 si tengo decimales en el variable X podre redondear hacia arriba o abajo.(Esa es la mejor Idea que se me ha ocurrido, agradezco otras posibilidades para poder generar un tren de pulsos a partir de un valor Hex recibido por I2C)

Aqui os dejo el programita

#include <16F886.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES RC                       //Resistor/Capacitor Osc with 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 NOWRT                    //Program memory not write protected
#FUSES BORV40                   //Brownout reset at 4.0V

#use delay(clock=2000000)
#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) //Configuracion de Rs232

#use I2C(SLAVE, SDA=PIN_C4 ,SLOW, SCL=PIN_C3, ADDRESS=0xA0, NOFORCE_SW)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int dato1;
int dato3;
int dato2;
char esperando;

int16 x;
int16 dos_dec;
void Frecuencias_bajas(int valor_pr2,int16 dutty);
void Frecuencias_medias(int valor_pr2,int16 dutty);

int valor_pr2;
int16 dutty;


#int_SSP
void RDA_isr()
{
do{

if(i2c_poll()) {
         dato1=i2c_read();  //Recibe direccion de esclavo "0xa0"
         dato2=i2c_read(); //Recibe 1 dato 8 bits
         dato3=i2c_read(); //Recibe 2 dato 8 bits
         
         x = make16(dato2,dato3);
       
       
               
        printf("\n\r Dato2: %x",dato2);
        printf("\n\r Dato3: %x",dato3);
        printf("\n\r Make16: %Lx",x);
        printf("\n\r Make16: %Ld",x);
       


   
if((x>=0x82)&(x<0x1FF))
{
 dos_dec=((64)*(x));
 printf("\n\rFrec desde 130 a 511");
 valor_pr2=((2000000/(dos_dec))-1);

 delay_ms(1);
 dutty=(((valor_pr2)*2)+1);

 Frecuencias_bajas(valor_pr2,dutty);

}
else
   {
   if((x>0x1FE)&&(x<0x7D1))
   {
   dos_dec=((16)*(x));
   printf("\n\rFrec desde 510 a 2000");
   
      valor_pr2=((2000000/(dos_dec))-1);
      delay_ms(1);
      dutty=(((valor_pr2)*2)+1);
 
   Frecuencias_medias(valor_pr2,dutty);
   }
   else
   {
   printf("\r\n Frecuencia Fuera de Rango: ^[130...2000]Hz");;
   }
   }
 

         }
   }
while(true);

}


void main()
{
 
   setup_timer_2(T2_DIV_BY_4,189,1);
   setup_ccp1(CCP_PWM);
   set_pwm1_duty(512);
   enable_interrupts(INT_SSP);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   strcpy (esperando, "Hi There");


   
   printf("\r\n Esperando Dato.....:");
   puts(esperando);
   //Frecuencias_bajas(valor_pr2,dutty);
   while(true);
}


void Frecuencias_bajas(int valor_pr2,int16 dutty)
{
      printf("\n\r Dentro de Frecuencias Bajas");
      printf("\n\r valor PR2: %u  ",valor_pr2);
      printf("\n\r dutty : %Lu  ",dutty);
      setup_timer_2(T2_DIV_BY_16,valor_pr2,1);
      setup_ccp1(CCP_PWM);
      set_pwm1_duty(dutty);
      setup_oscillator(OSC_2MHZ);
}
void Frecuencias_medias(int valor_pr2,int16 dutty)
{
      printf("\n\r Dentro de Frecuencias Medias");
      printf("\n\r valor PR2: %u  ",valor_pr2);
      printf("\n\r dutty : %Lu  ",dutty);
      setup_timer_2(T2_DIV_BY_4,valor_pr2,1);
      setup_ccp1(CCP_PWM);
      set_pwm1_duty(dutty);
      setup_oscillator(OSC_2MHZ);
}


Gracias...