Autor Tema: pwm con 16f88  (Leído 4963 veces)

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

Desconectado kikecon

  • PIC10
  • *
  • Mensajes: 35
pwm con 16f88
« en: 18 de Noviembre de 2008, 22:55:27 »
hola foreros nuevamente con problemas cn el 16f88  :? estoy queriendo hacer un pwm el programa me sale como satisfactorio pero no lo puedo simular.... aun sigo usando sourceboost ojala me puedan ayudar aki les dejo lo que he avanzado lo he hecho en el 16f873a y si me sale aunq aun no lo he grabado en el pic pero la simulacion todo ok en el 16f88 no lo puedo simular

Código: C#
  1. #include "control_pwm.h"
  2.  
  3.  
  4. void main()
  5. {
  6.  unsigned short pot1,pot2;
  7.   init();
  8.   pwm_init();
  9.   while(1)
  10.   {
  11.         pot1=adc_measure(0);
  12.         pot2=adc_measure(3);
  13.         set_pwm(1,pot1);        //muestra la modulacion de channel Ra0
  14.         delay_ms(10);
  15.   }
  16.  
  17. }
  18.  
  19. //////////////////////////////////pwm 16f88///////////////////////////////////
  20. void pwm_init(void)
  21. {
  22.   t2con=0000100b;
  23.   pr2=11111111b;
  24.   adc_init();
  25. }
  26.  
  27. void set_pwm(char channel,unsigned short pwm_val)
  28. {
  29.   char lastbits;
  30.   union
  31.         {
  32.                 unsigned short sht;
  33.                 char ch[2];
  34.         }temp;
  35.   temp.sht      =pwm_val;
  36.   lastbits      =(temp.ch[0]&0x03)<<4;
  37.   temp.sht      =temp.sht>>2;
  38.  
  39.   if(channel==1)
  40.   {
  41.         ccpr1l   =temp.ch[0];
  42.         ccp1con &=00001100b;
  43.         ccp1con |=lastbits;
  44.   }
  45. }
  46.  
  47. void init(void)
  48. {
  49.         adcon0=00000000b;
  50.         adcon1=10000000b;
  51.         ansel=11111111b;       
  52.         trisa=11111111b;       
  53.         trisb=00000000b;
  54.  
  55.         porta=0;
  56.         portb=0;
  57.  
  58.         adc_init();
  59. }
  60.  
  61. //*****configuracion de adc para el 16F88*****//
  62. void adc_init(void)
  63. {
  64.         adcon0.ADCS1=1; // Select Tad = 32 * Tosc  
  65.         adcon0.ADCS0=0; // (esto depende del X-tal aquí 10 MHz, deben trabajar hasta 20 MHz)
  66.  
  67.         adcon0.ADON =1; // Activa el modulo ADC
  68. }
  69.  
  70. short adc_measure(char channel)
  71. {
  72.         // Clear channel selection in adcon0
  73.         adcon0 &= 11000111b;
  74.  
  75.         // Shift channel value to appropriate position
  76.         channel = (channel & 0x07) << 3;
  77.  
  78.         // Move it to appropriate position in adcon0
  79.         adcon0 |= channel;
  80.  
  81.         // Wait required acquisition time (see datasheet)
  82.         delay_10us(4);
  83.  
  84.         // Startconversion
  85.         adcon0.GO = 1;
  86.  
  87.         // Wait until done
  88. #ifndef DEBUG
  89.         while (adc_go) ;
  90. #endif
  91. #ifndef DEBUG
  92.         delay_10us(4);
  93. #endif
  94.         adcon0.GO = 0;
  95.                        short retval;
  96.         retval  = (short)adresh;
  97.         retval  = retval << 8;
  98.         retval |= adresl;
  99.  
  100.         return retval;
  101. }

gracias de antemano kikecon
« Última modificación: 19 de Noviembre de 2008, 21:09:49 por un Moderador »
Enrique Contreras R.

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: pwm con 16f88
« Respuesta #1 en: 19 de Noviembre de 2008, 21:05:32 »
Qué tal. Disculpa que te pregunte, pero tengo curiosidad... por qué es que no lo puedes simular? Qué programa estás usando?
Con el Isis de Proteus aparece ese micro, es la versión 7.2... cuál soft es el tuyo?
Saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado kikecon

  • PIC10
  • *
  • Mensajes: 35
Re: pwm con 16f88
« Respuesta #2 en: 22 de Noviembre de 2008, 20:23:41 »
hola firepic estoy usando el sourceboost c este programa es libre y creo que la unica ventaja que trae es la simulacion.el pwm que he hecho lo logre realizar pero en el 16f873a aun sigo trabajando en el 16f88 es algo complejola parte de a/d
no uso proteus puesto que no me he metido a averiguar sobre este programa, volviendo con mi problema en el 16f88 creo tener la solucion pero aun no se si es posible ver la simulacion aun tengo q grabar el pic segun eso te comunico ;) hablaos
Enrique Contreras R.

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: pwm con 16f88
« Respuesta #3 en: 23 de Noviembre de 2008, 00:07:06 »
El proteus es una gran ayuda para depurar muchos errores de programación. La gran mayoría en el foro lo usamos. No tiene nada del otro mundo, es muy sencillo. Si has usado Orcad u otro simulador de circuitos anteriormente, te será pan comido.
Pero me parece muy bien tu decisión, así que entonces no olvides comunicar tus avances.
Saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado kikecon

  • PIC10
  • *
  • Mensajes: 35
Re: pwm con 16f88
« Respuesta #4 en: 06 de Diciembre de 2008, 04:22:24 »
hola foreros ahora vengo con la solucion a mi problema con el 16f88 y sourceboost se que muchos usan en el foro el ccs y como simulador proteus (como bien lo dijo firepic) wno io uso sourceboost aunq ya pienso en dejarlo un poco de lado puesto que tiene muchas desventajas si alguien me puede decir si ccs tiene una version libre les agradeceria mucho
bueno siguiendo con lo mio aki les dejo el programa y algunas explicaciones del mismo en sourceboost:

#include "control_pwm.h"

#pragma DATA _CONFIG , _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _MCLR_ON & _INTRC_IO

void main()
{
unsigned short pot1,pot2;

  init();
  pwm_init();

  while(1)
  {
   pot1=adc_measure(0);
   pwm_send(1,pot1);   //muestra la modulacion de channel Ra0
   delay_ms(10);
  }
}

//////////////////////////////////pwm 16f88///////////////////////////////////
void pwm_init()
{
  t2con=0000100b;
  pr2=11111111b;
}

void pwm_send(char channel,unsigned short prom_val)
{
  if (channel==1)
  {
    ccpr1l=prom_val>>2;
    ccp1con=(prom_val & 0x03)<<4|0x0F;
  }
}

void interrupt(void)
{

}

void init(void)
{
   trisa=10000001b;   
   trisb=00000000b;

   porta=0;
   portb=0;

   adc_init();
}

//*****configuracion de adc para el 16F88*****//

void adc_init(void)
{
   //Oscillator configuration -------------------------------------------------
   osctune    = OscTConfig;
   osccon     = OscCConfig;

   //Port configuration -------------------------------------------------------
   option_reg = OptConfig;

   ansel=11111111b;
   adcon1=10000000b;

   adcon0.5=0;
   adcon0.4=0;
   adcon0.3=0;
   adcon0.ADCS1=1;   // Select Tad = 32 * Tosc 
   adcon0.ADCS0=1;   // (esto depende del X-tal aquí 10 MHz, deben trabajar hasta 20 MHz
   adcon0.ADON =1;   // Activa el modulo ADC
   adcon0.1=0;
   adcon0.2=1;
}

short adc_measure(char channel)
{
   // Clear channel selection in adcon0
   adcon0 &= 11000111b;

   // Shift channel value to appropriate position
   channel = (channel & 0x07) << 3;

   // Move it to appropriate position in adcon0
   adcon0 |= channel;

   // Wait required acquisition time (see datasheet)
   delay_10us(4);

   // Startconversion
   adcon0.GO = 1;

   // Wait until done
#ifndef   DEBUG
   while (adc_go) ;
#endif
#ifndef   DEBUG
   delay_10us(4);
#endif
   adcon0.GO = 0;
             short retval;
   retval  = (short)adresh;
   retval  = retval << 8;
   retval |= adresl;

   return retval;
}

como ven he agregado la funcion interrupt siempre es necesaria en sourceboost tmb cambie el set_pwm por pwm_send; mmm la funcion es la misma solo que se reduce considerablemente en comparacion a la otra como ven son los registros de pwm del 16f88 y en la parte del adc en el programa anterior la configuracion de los puertos era buena solo se debia agregar el option_reg y tmb hay que configurar los osciladores: osctune y osccon con esta confiuracion basta y hay que tener en cuenta q los pines que son usados como entradas y no estan concetado es recomendable mandarlos a tierra es algo que es bueno repètirlo aunque mucho ya lo saben :) bueno foreros creo que este es mi primer aporte en el foro.... una cosa mas que quisiera agregar a titulo personal: 16f88 es el pic mas comodo que existe ahora pues tiene muchas cosas q el 16f873a tiene y posee oscilador interno :) bueno espero les sirva y si quieren algun otro detalle me avisan :); no olviden mi pregunta gente hablaos

Enrique Contreras R.