# Generar señal pwm en pic18f4550



## jpgs21 (Jun 5, 2008)

hola a todos 
tengo que crear una señal pwm que salga del micro para controlar un puente h. si me pueden ayudar es que no tengo idea de como hacerlo
gracias


----------



## Airoa Airon (Jun 5, 2008)

Primero que nada hay que saber en que lenguaje lo necesitas? en ensamblador o en c

en C lo hago asi

  setup_ccp1(CCP_PWM); ///esto al principio del programa

al modificar x modifico la frecuencia
al modificar time ajusto el tiempo de encendido
duty lo utilizo para modificar el ancho de pulso

void pulso(int x, long time,int duty)
{  
   setup_timer_2(T2_DIV_BY_16, x, 1);
   set_pwm1_duty(duty);
   delay_ms(time);
   set_pwm1_duty(0);
}

la formula para obtener el valor que va en x es

x=[1/(frecuencia*4*Tosc*16)]  -1 el numero 16 es el valor que se le da al timer 2 puede ser 16, 4 o 1.

Tosc es igual a  1/ (valor del oscilador)


----------



## jpgs21 (Jun 6, 2008)

hola gracias por responderme, pero me lo puedes decir en lenguaje assembler. es que yo solo trabajo en assembler jeje
gracias


----------



## Airoa Airon (Jun 6, 2008)

Es algo mas complicado en ensamblador. 
Primero que nada ten en mente que frecuencias vas a utilizar, 
y el tiempo de encendido (duty cycle), de cuanto es tu oscilador
y ve por cuanto mas o menos tendrias que dividir el timer 2(tabla en la hoja de datos)
luego con la formula de PR2 sacas el valor y ya lo que queda es seguir los pasos


Esto lo saque de la hoja de datos. Busca en la seccion PWM.

15.4.4 SETUP FOR PWM OPERATION

The following steps should be taken when configuring
the CCP module for PWM operation:
1. Para ajustar el periodo de PWM tienes que cargarle un valor al registro PR2 del pic
2. Luego para ajustar el ciclo de encendido escribes en los registros
CCPRxL y CCPxCON<5:4> 
3. Tienes que poner algun pin de CCPx como salida, borrando algun TRIS bit(ponerlo a 0) yo he usado RC2

4. Le asignas un valor para iniciar el TMR2 
Luego un valor de preescale(division + o -) a los bits (T2CKPS1:T2CKPS0)
00 = Prescaler is 1
01 = Prescaler is 4
1x = Prescaler is 16

TMR2ON: Timer2 On bit
1 = Timer2 is on
0 = Timer2 is off

5. Configura el registro CCPx para operar como  PWM.
Registro :
CCPxCON
Bits:
CCPxM3:CCPxM0: CCPx Module Mode Select bits
11xx = PWM mode




Frecuencia = 1/periodo

PWM Period = [(PR2) + 1] • 4 • TOSC •             F
(TMR2 Prescale Value)

O si quieres Sacar el valor de PR2

PR2=[1/(frecuencia*4*Tosc*16)] -1


Vere si puedo conseguir un ejemplo luego, mientras intenta con esto.


----------



## karl87 (Sep 14, 2009)

hola soy nuevo en los pics,,, me interesaria saber como puedo generar tres señales senoidales,,, de distitntas frecuencia,,, utilizando el pic 18f4550,, epsero me puedan ayudar,,, la amplitud debe ser mayor a un volt me inteesa manejar distintas frecuencias,,, hablamos de 12kh,, 80kh.,, y una superior a los 120kh,, espero me ayuden gracias


----------



## havat (May 4, 2010)

Airoa Airon dijo:


> Es algo mas complicado en ensamblador.
> Primero que nada ten en mente que frecuencias vas a utilizar,
> y el tiempo de encendido (duty cycle), de cuanto es tu oscilador
> y ve por cuanto mas o menos tendrias que dividir el timer 2(tabla en la hoja de datos)
> ...


hola Airoa Airon...me interasa mucho esa respuesta que dejaste en lenguaje c, estaria muy agradacido si pudieras explicar un poco mas lo de variar el duty y la frecuencia... pues exactamente es lo que tengo que hacer con un teclado matricial.....de antemno muchas gracias....


----------



## manolete (May 11, 2010)

Hola a todos he visto este trozo de programa y si podéis ayudarme estaría muy agradecido, necesito hacer un programa en mplab en c para generar PWM con el dsPIC30F4013, si me podeis ayudar os lo agradecería.
Un saludo GRACIAS


----------



## EGIST (Abr 12, 2011)

que tal, como seria la configuracion inicial, si uso un pic18f4550 y en donde dice (duty) no te entiendo que va ahi?




Airoa Airon dijo:


> Primero que nada hay que saber en que lenguaje lo necesitas? en ensamblador o en c
> 
> en C lo hago asi
> 
> ...


----------



## Basalto (Abr 13, 2011)

Haber si alguien me puede ayudar. Tengo que generar una señal cuadrada de 7 Khz con el 18f4620, pero tengo que hacer 10 mediciones en 1 segundo cuando la señal este en la metad del ciclo positivo y desacupando lo maximo el micro. Lo intente solucionar simplemente con un timer, que divide cada ciclo en 4 partes y con un contador hago la conversión en un determinado instante. Pero la cresta de la señal tiene una pendiente y me acupa muchos ciclos maquina. ¿Hay alguna manera mas efectiva de hacerlo?


----------



## ivandeadlocked (Jun 1, 2011)

Duty es la carga, osease el valor del pwm ya sean 8 o 10 bits (255 o 1024 en decimal) es lo que le puedes poner al pwm, digamos que el 1024( si se maneja por bits y no por % ) seria un 100%,
512 un 50%, 0 un 0%.


----------



## yazmaniramboyaz (Sep 30, 2011)

Saludos!!

Quisiera preguntar si alguien sabe como puedo generar pwm digital automático con el pic. 

Explico:

Tengo que controlar la velocidad de un motor desde 0% hasta el 100%., pero no debo de controlarlo yo con un potenciometro externo, sino que cuando presione un solo botón que estará conectado al pic, se active el pwm hacia el motor, y que a intervalos de tiempo determinados, el pic incremente el ciclo util automáticamente digamos de 5% en 5% hasta llegar al 100%.

El punto clave es que necesito que el motor inicie detenido, y que cuando oprima el boton comience a incrementar su giro hasta llegar al 100%, de esta manera, el pwm esta restringido a terminar en un periodo de tiempo especifico.

Y bueno tambien referente a esto, pues quisiera saber si se pueden controlar dos motores conectados al pic, utilizando la tecnica que describi anteriormente.

Gracias


----------



## caro0126 (Abr 6, 2013)

Hola 
Estoy tratando de controlar un motor DC con el modulo PWM (librerias). Y no se por que no se detiene cuando pongo la intruccion ClosePWM1(); trato tambien de contarlo con el encoder que en dos vueltas se detenga y tampoco AYUDA!! 
Gracias de Antemano


----------



## isaac94 (May 22, 2013)

Hola, como puedo controlar la velocidad de un motor CD con el pwm. en lenguaje C.
Tengo este programa pero aun no logro hacerlo funcionar


```
#include <18F4550.h>
#device adc=8                    
#fuses hs,nowdt,noprotect,nolvp  
#use delay(clock=20000000)       
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)

byte velocidad;


void inicializar()
{
setup_ccp2(CCP_PWM);                   
setup_timer_2(T2_DIV_BY_4, 127, 1);    
                                      
                                       
set_tris_b(0x00);
set_tris_a(0x01);                 
setup_adc(ADC_clock_internal); 
setup_adc_ports(AN0);         
set_adc_channel(0);           
velocidad=0;                 
}

void main(){
inicializar();
while(1){

velocidad=read_adc();    

set_pwm2_duty(velocidad);  
}
}
```


----------



## D@rkbytes (May 23, 2013)

Saludos.

Prueba ahora así...

```
#include <18F4550.h>
#device adc=8
#fuses hs,nowdt,noprotect,nolvp
#use delay(clock=20000000)
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)

unsigned int8 velocidad;


void inicializar()
{
   setup_ccp2(CCP_PWM);
   setup_timer_2(T2_DIV_BY_4, 127, 1);

   set_tris_c(0xFD);
   set_tris_a(0x01);
   setup_adc(adc_clock_internal);
   delay_us(12);
   setup_adc_ports(AN0);
   set_adc_channel(0);

   velocidad=0;
}

void main(){
   inicializar();
   
   while(true){

   velocidad=read_adc();
   delay_us(12);

   set_pwm2_duty(velocidad/2);
   }
}
```
Suerte.


----------



## fabian6328 (May 26, 2013)

hola necesito ayuda para lo mismo intento reducir la velocidad en un motor de dc para una silla de ruedas me urge ... espero qe me puedan colaborar


----------



## pelado05 (May 29, 2013)

isaac94 dijo:


> Hola, como puedo controlar la velocidad de un motor CD con el pwm. en lenguaje C.





proba con esto

```
void main()
{

   setup_adc_ports(AN0_TO_AN1|VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DIV_BY_1,99,1);
   setup_ccp1(CCP_PWM_FULL_BRIDGE|CCP_SHUTDOWN_AC_L|CCP_SHUTDOWN_BD_L);
   setup_ccp2(CCP_PWM);
   set_pwm1_duty(0);
   set_pwm2_duty(0);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_oscillator(OSC_4MHZ|OSC_TIMER1|OSC_31250|OSC_PLL_OFF);
{
   long duty=0;
  
   set_adc_channel(0);  //selecciona el canal del adc
   
   while (1)
            {
      duty=read_adc()/3; //leemos el valor el adc y lo dividimos en 2
      delay_us(20);  //esperamos 20us para el adc
      set_pwm1_duty(duty);  // ajustamos el pwm con el ciclo de trabajo q nos da el adc/2
     
      }
   }
```


también depende con que programa lo compiles...yo uso CCS


----------



## isaac94 (May 31, 2013)

pelado05 dijo:


> proba con esto
> 
> ```
> void main()
> ...


-------------------

Hola gracias, la verdad no probé tu modificación pero tenias razón acerca de que podría ser el compilador que utilizo. probé con el Dev-C y si me fundió el original.


----------



## pelado05 (May 31, 2013)

Bueno gente, después de dos días de buscar información y poder generar dos pwm,
pude generar los dos pwm y resolviendo el problema que tenia.
Este ejemplo genero dos pwm, donde el ciclo de trabajo (duty) lo vario con dos potenciómetros conectados a las puertas del conversor.
Cada pwm es diferente uno del otro, solo que estan a la misma frecuencia. 

```
#include <18F4550.h>
#device adc=10


#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES INTHS                    //Internal Oscillator, HS used by USB
#FUSES NOPROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES BORV43                   //Brownout reset at 4.3V
#FUSES PUT                      //Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads
#FUSES NOCPB                    //No Boot Block code protection
#FUSES MCLR                     //Master Clear pin enabled
#FUSES LPT1OSC                  //Timer1 configured for low-power operation
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES PLL1                     //No PLL PreScaler

#use delay(internal=8000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
void main(){ 
       
   setup_adc_ports(AN0_TO_AN1|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_8);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32);
   setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1);
   setup_timer_2(T2_DIV_BY_1,99,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   //setup_ccp1(CCP_PWM_FULL_BRIDGE|CCP_SHUTDOWN_AC_L|CCP_SHUTDOWN_BD_L); aca era el problema que tenia;
   setup_ccp1(ccp_pwm);
   setup_ccp2(ccp_pwm);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INT_EXT);
   enable_interrupts(INT_EXT1);
   enable_interrupts(INT_EXT2);
   enable_interrupts(GLOBAL);
   setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF);
 
   // TODO: USER CODE!!
   {
      long duty=0;
      long duty1=0;
                 
   while (TRUE) {
            set_adc_channel(0);  //selecciona el canal 1 del adc
            delay_us(10);
            duty=read_adc()/3; //leemos el valor el adc y lo dividimos en 3
            delay_us(20);  //esperamos 20us para el adc
            set_pwm1_duty(duty);  // ajustamos el pwm con el ciclo de trabajo q nos da el adc/3
      set_adc_channel(1);//selecciona el canal 2 del adc
            delay_us(10); //esperamos
            duty1=read_adc()/3;//leemos el valor el adc y lo dividimos en 3
            delay_us(20); //esperamos
            set_pwm2_duty(duty1);//salida del pwm2
                           
            }
   }  
         
}
```


----------



## johames (Ago 18, 2013)

soy nuevo en el tema de los micro y muy poco se sobre el tema... estoy buscando información de como genera un señal pwm con el pic 16f877a con dos pulsadores  uno que incremente la señal y otro que disminuya.


----------



## dinoelectro (Ago 21, 2013)

Basalto dijo:


> Haber si alguien me puede ayudar. Tengo que generar una señal cuadrada de 7 Khz con el 18f4620, pero tengo que hacer 10 mediciones en 1 segundo cuando la señal este en la metad del ciclo positivo y desacupando lo maximo el micro. Lo intente solucionar simplemente con un timer, que divide cada ciclo en 4 partes y con un contador hago la conversión en un determinado instante. Pero la cresta de la señal tiene una pendiente y me acupa muchos ciclos maquina. ¿Hay alguna manera mas efectiva de hacerlo?



Tal vez tu problema se deba a que estas generando la senal PWM por software, si ocupas el modulo CCP integrado, el microcontrolador estará entero para realizar otras acciones... saludos!


----------



## D@rkbytes (Ago 22, 2013)

johames dijo:


> soy nuevo en el tema de los micro y muy poco se sobre el tema... estoy buscando información de como genera un señal pwm con el pic 16f877a con dos pulsadores  uno que incremente la señal y otro que disminuya.


Mira los ejemplos que adjunto, uno es sencillo con sólo los push buttons y el otro con una pantalla.
La pantalla la usé únicamente para mostrar el valor del ciclo activo.
El programa fue probado con un LED y se realizó para controlar el brillo en 20 pasos.
Puedes modificarlo para otros pasos cambiando el factor de división basado en 512.

Suerte.


----------



## xllF0rC3llx (Jul 29, 2014)

D@rkbytes.
Quisiera saber como modificar tu programa para con el pulsador de incremento, sin soltar, encienda el led pero poco a poco, y con el decremento, sin soltar, se vaya apagando poco a poco.
Cuando pruebo tu circuito y conecto un led a la salida, el led enciende y se apaga tan rápido, pero el pulso del pwm aparece en el osciloscopio un momento y luego se va. ¿Qué tengo q*ue* modificar?

Gra*c*ias *por *tu aporte.


----------



## D@rkbytes (Jul 29, 2014)

xllF0rC3llx dijo:


> D@rkbytes.
> Quisiera saber como modificar tu programa para con el pulsador de incremento, sin soltar, encienda el led pero poco a poco, y con el decremento, sin soltar, se vaya apagando poco a poco.
> Cuando pruebo tu circuito y conecto un led a la salida, el led enciende y se apaga tan rápido, pero el pulso del pwm aparece en el osciloscopio un momento y luego se va. ¿Qué tengo q*ue* modificar?
> 
> Gra*c*ias *por *tu aporte.


Eso es normal en la simulación porque trabajar con PWM consume muchos recursos en ISIS.
Si pruebas el circuito físicamente verás que funciona bien en 20 pasos y en el osciloscopio no se pierde la señal.
En esos ejemplos el ciclo activo está inicialmente a la mitad para que el LED tenga media iluminación.

Si quieres que el LED empiece apagado y tenga una iluminación uniforme conforme se va incrementando el ciclo activo, está es la modificación.
Si no quieres usar la pantalla, tan sólo elimina las instrucciones para ella.

```
#include <16f877a.h>
#use delay(crystal = 4MHz)
#include <lcd.c>

void main(void){
int16 duty = 0;

   setup_ccp1(ccp_pwm);                   // Módulo CCP1 en modo PWM
   setup_timer_2(T2_DIV_BY_1,127,1);      // Configurar el TMR2
   lcd_init();                            // Inicializar la pantalla
   lcd_putc("\fPWM con Push Btn\nValor:"); // 
   
   while(true){

      if(!input(pin_a1)){
      delay_ms(50);
      duty -=1;                           // Decrementar el ciclo activo
      if(duty > 512){duty = 0;}           // No permitir que de <0 pase a 65535
      }
      
      if(!input(pin_a0)){
      delay_ms(50);
      duty +=1;                           // Incrementar el ciclo activo
      if(duty > 512){duty = 512;}         // No permitir que suba a más de 512
      }
      lcd_gotoxy(8,2);                    // Ir a la posición 8 de la línea 2 
      printf(lcd_putc,"%04lu",duty);      // Mostrar el valor del ciclo activo
      
      set_pwm1_duty(duty);                // Establecer el ciclo ativo del PWM
   }
}
```
Suerte.


----------



## christian lopez (May 16, 2016)

Buenos días. Estoy realizando un proyecto y debo variar el ciclo de trabajo con una frecuencia fija por medio del PIC18F4550 y mostrar en LCD los datos de la variación.
Hasta ahora pude realizar lo de la configuración del puerto serial con unos archivos que me brindaron en pdf.

No sé que más puedo hacer, porque lo compilo en proteus y no me hace nada .

```
#include <18f4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,
#fuses NOLVP,NODEBUG, NOBROWNOUT
#fuses USBDIV,PLL5,CPUDIV1,VREGEN,
#fuses PUT,MCLR
#use delay(clock = 48M)
#define use_portd_lcd_TRUE
#include <lcd.c>
#include "sfr_4550.h"
#include <stdlib.h>
//#include "usb_bootlloader.h"
#use rs232(BAUD=1200,XMIT=PIN_C6,RCV=PIN_C7,BITS=8,PARITY=n)

#define enter 0x0d
#define null 0x00
#bit led1=latb.0
#bit led2=latb.1
//pr2=74
//frecuencia =10khz
int x; //ccpr1l
int porcentaje;
int1 Datos_listos;
int8 i,opcion,dato,pwm; // indice del buffer
char buffer[5];
int16 valor;
void main(){
trisb=0b00000000;
trisc=0b11111011;
 lcd_init(); //Configuración de LCD
 setup_timer_2(t2_div_by_16,74,1); //Configuración de Timer
 setup_ccp1(ccp_pwm); //Configuración PWM
 set_pwm1_duty(x);
 //Configuración de Puertos
//Configuración de USB

  x=porcentaje*(74+1)/100; //Inicialización de Variables
  i = 0; // índice o puntero igual a cero
   Datos_listos = 0; // buffer lleno

 while(true){
 // Lectura de datos por el puerto Serial
  if( kbhit() ){ // hay datos recibidos?
 dato = getc();
  if(dato == enter){
 buffer[i] = null;

 Datos_listos = 1;
 }

 else{
 buffer[i] = dato;
 i++;
 putc(dato); // envía el dato de nuevo (eco).
 }
 }
 //Reconocimiento de opciones y Valores
 if (Datos_Listos == 1){
 // lee opiones y valores enviados por el usuario
 pwm = Buffer[0];
 porcentaje = atoi(buffer+1);

 Datos_listos = 0;

 i = 0;
 } 
 //Aquí se escribe el código de cada ejercicio
if (x>70){
led1=1;
}
else {
led1=0;
 }
 if(x<30){
 led2=1;
 }else{
 led2=0;
 }
 
 
 // finwhile
 }
}//Fin Main
```


----------



## TRILO-BYTE (May 16, 2016)

¿ya revisaste el circuito real?

por que proteus no es magico


----------



## D@rkbytes (May 16, 2016)

christian lopez dijo:


> Hasta ahora pude realizar lo de la configuración del puerto serial con unos archivos que me brindaron en pdf.


A 48 MHz. del oscilador principal, 1200 Bps es un baudrate muy bajo.
Con esa frecuencia puedes usar un baurate más alto, que será más conveniente.
Para configurar el módulo EUSART, lo puedes hacer de forma muy sencilla:
Por ejemplo, para configurarlo a 9600 Bps. (Por defecto):
*#use RS232 (UART1)*
Con tan sólo declarar eso, ya tendrás configurado el módulo EUSART a; 9600 Bps, 8 Bits, Sin paridad, y 1 Bit de parada.

Se usarán los pines Tx y Rx correspondientes al módulo, sin necesidad de declararlos.
Para otros baudrates, sería así:
*#use RS232 (UART1, BAUD = XXXX)*
Y puedes agregar opciones extra, que encontrarás en el documento de ayuda del compilador.

La palabra de configuración para que el oscilador principal funcione a 48 MHz, no es correcta.
Para que funcione a 48 MHz, puedes también configurarlo de forma sencilla. (Sin declarar tantos FUSES)
*#fuses   NOFCMEN
#use     delay(crystal = 4MHz, clock = 48MHz)
*Con esas declaraciones el oscilador funcionará a 48 MHz, usando un cristal de 4 MHz.


christian lopez dijo:


> No sé que más puedo hacer, porque lo compilo en proteus y no me hace nada .


Revisa bien tu programa y verás por qué no funciona. (Parte referente al PWM)
Asignas un valor para el registro PR2, de 74. (Ciclo activo al 100 % Frec. = 10 KHz. Fosc = 48 MHz.)
Pero usas la variable "x" para asignar el ciclo activo, la cual tiene un valor de 0, ya que no está inicializada.
La variable "x" toma un valor después, en: (x=porcentaje*(74+1)/100; //Inicialización de Variables)
Por lo tanto, el módulo CCP1, no mostrará señal de salida alguna, aunque esté configurado.

Algo más:
No es necesario que uses un archivo con los registros FSR declarados, ya que PIC C Compiler tiene instrucciones nativas con las que puedes controlar los puertos y otras funciones del PIC.
Lo que te hace falta es estudiar más el compilador y tener en cuenta la sucesión de eventos.

Nota:
Simular a 48 MHz, produce una carga excesiva para el simulador.
Para simular, usa frecuencias bajas. Con 1MHz, 4 MHz u 8 MHz. Te irá bien la simulación.
Puedes crear rutinas para el modo de simulación y modo físico, que puedes separar y ejecutar por medio de sentencias. (Por ejemplo: *#IFDEF*)


----------



## gonzaloz17 (Jun 7, 2016)

D@rkbytes dijo:


> Saludos.
> 
> Prueba ahora así...
> 
> ...


que debo cambiar en ese codigo para que funcione a 10 bits ???


----------



## D@rkbytes (Jun 7, 2016)

Cambiar *#device adc = 8*
Por *#device adc = 10

*Usar una variable de 16 bits;* int16 *para la lectura del ADC y cambiar la configuración del Timer 2.


----------

