# Problemas PIC16F1939 y CCS



## Derneilkel (Nov 3, 2014)

Buenas. Recién me estoy aventurando con este compilador por su facilidad con c, pero me está dando dolores de cabeza, algunas situaciones por ejemplo: delay_ms().
En mi caso me encuentro con que no efectúa el delay el tiempo que impongo sino que lo hace por alguna constante, en mi pc 40 veces mas lento, en la de un compañero 6.5 veces más lento.

En fin, el problema en concreto parece evidente: un problema o con el compilador o con las librerías del pic especificado en este tema.

Quería saber si alguien de ustedes que esté más familiarizado con las librerías o el compilador sabría darme alguna solución, porque necesito emplear los conversores A/D que tiene para un proyecto, y esto me está retrasando.

Les dejo el código del ejemplo de un blinker con dos leds que funciona pero con retardos más largos.

Aquí el .c


```
#include "C:\Users\Administrator\Desktop\Cursando\TDI2\Proyecto Final\ejled\led.h"


void main()
{

   setup_spi(SPI_SS_DISABLED);
   setup_lcd(LCD_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

   
       set_tris_a(0x00);   
       set_tris_b(0x00);//portb como salida(RB0,las demas desactivadas)
      disable_interrupts(GLOBAL);        //todas las interrupciones desactivadas  
        
      do{ 
        output_high(PIN_A0);        //Led on  
         output_low(PIN_B5);
         delay_ms(250/40);
          output_high(PIN_B5);
          output_low(PIN_A0);            //Led off
          delay_ms(250/40);                  
            
      }while(true) ; 

}
```
Aquí el .h

```
#include <16F1939.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES ECH                      //External clock with CLKOUT(PIC18), high power
#FUSES WDT_SW                   //No Watch Dog Timer, enabled in Software
#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 NOBROWNOUT               //No brownout reset
#FUSES NOCLKOUT                 //I/O function on OSC2
#FUSES IESO                     //Internal External Switch Over mode enabled
#FUSES FCMEN                    //Fail-safe clock monitor enabled
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOVCAP                   //VCAP pin disabled
#FUSES PLL                      //4X HW PLL enabled
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES BORV19                   //Brownout reset at 1.9V
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
```
Desde ya, muchas gracias, espero puedan darme un mano.
Saludos.


----------



## Miembro eliminado 356005 (Nov 3, 2014)

Ten en cuenta que no es lo mismo verlo en el simulador que en microcontrolador real. 

Aún teniendo un PC muy rápido, no está garantizado que sea fiel en velocidad al microcontrolador.

Si el simulador tiene una barra de tiempos, ahí sí que debería indicar el tiempo transcurrido, en virtud de los ciclos de máquina consumidos y la frecuencia de trabajo del microcontrolador (veo que pone 20 Mhz).


----------



## Derneilkel (Nov 3, 2014)

Si, mis disculpas olvide aclarar que lo queme al PIC on el Pickit 3 y el error persiste en carne y hueso :O . La verdad. Si es un problema con el clock del timer0 reflejado en los delay deberia haber manera de corregirlo? O tendre q*ue* emplear otras velocidades?


----------



## D@rkbytes (Nov 4, 2014)

Derneilkel dijo:


> Buenas. Recién me estoy aventurando con este compilador por su facilidad con c, pero me está dando dolores de cabeza, algunas situaciones por ejemplo: delay_ms().
> En mi caso me encuentro con que no efectúa el delay el tiempo que impongo sino que lo hace por alguna constante, en mi pc 40 veces mas lento, en la de un compañero 6.5 veces más lento.
> 
> En fin, el problema en concreto parece evidente: un problema o con el compilador o con las librerías del pic especificado en este tema.
> ...


Seguramente debe ser por el tipo de palabra de configuración que estás usando.
Con este compilador no es necesario definir tantas cosas para llegar al mismo objetivo.

En la palabra de configuración (Fuses) tienes definido que usarás un oscilador externo "*ECH*"
O sea que el microcontrolador deberá tomar la frecuencia de reloj de un oscilador externo. (Hasta 32MHz.)
Como no envías el diagrama, no se puede saber que tipo de oscilador estás usando.
Si usas un oscilador externo, entonces debe entregar 20MHz. Que es la frecuencia que definiste.
Y si usas un cristal, entonces no funcionará, pues la palabra usada no es la correcta.
En este caso lo que ocurrirá, es que entrará en operación el sistema de falla del oscilador principal y se activará el oscilador interno.
Este sistema se llama "*Fail Safe Clock Monitor*" y se activa por medio del fuse "*FCMEN*"
La frecuencia de operación del oscilador interno, se configura en el registro *OSCCON* y en este PIC puede llegar hasta 32MHz, activando el *PLL*.
En este compilador se usa la instrucción *setup_oscillator (FOSC, [Optional Parameters])* para definir la frecuencia de operación.
Por defecto la frecuencia de operación del oscilador interno en un "*Power On Reset*" para este PIC es de *500KHz.* (Ver hoja de datos)

Así que, sin más información, esto es lo que te puedo decir acerca del mal funcionamiento de tu PIC.
También es importante definir la frecuencia de trabajo del PIC en la simulación.

Prueba este simple código. No tengo ese PIC, pero muy seguramente debe funcionar usando el oscilador interno a 4MHz.

```
#include <16F1939.h>
#fuses nofcmen, noieso, nobrownout
#use     delay(internal = 4MHz)


void main (void)
{
   output_high(pin_b5);
   delay_ms(500);
   
   while (true)
   {
      output_toggle(pin_b5);
      delay_ms(500);
   }
}
```
Muchas configuraciones son hechas automáticamente por el compilador, por lo tanto, no es necesario configurar tantas cosas.
En este código se usa el pin RB5 que tiene a *AN13* y puede ser análogo, pero el registro "*ANSELB*" es puesto a 0 por el compilador para hacer (*RB<5:0>*) Digital I/O y que por defecto su valor en el Power On Reset es de *XX111111* (Los bits en 1 serían análogos.)

Saludos.


----------



## Derneilkel (Nov 4, 2014)

Muchas gracias, si evidentemente el compilador introduce muchos seteos de forma predeterminada, al parecer resulta conveniente solo poner lo necesario y no emplear el Wizard que propone CCS.

Que puedo hacer a la hora de emplear un LCD? Alguien conoce algun link dentro de este dominio? Porque este PIC tiene para manjear LCD por hardware pero por lo visto emplea salidas en paralelo. Existe un libreria flex_lcd.h pero nuevamente se vuelven a presentar algunos conflictos por la nomenclatura de los puertos. En mi caso es un display de 16x2 de comun. serie.


----------



## D@rkbytes (Nov 5, 2014)

Derneilkel dijo:


> ¿Qué puedo hacer a la hora de emplear un LCD?
> ¿Alguien conoce algún link dentro de este dominio? Porque este PIC tiene para manejar LCD por hardware pero por lo visto emplea salidas en paralelo.
> Existe un librería flex_lcd.h pero nuevamente se vuelven a presentar algunos conflictos por la nomenclatura de los puertos. En mi caso es un display de 16x2 de común. Serie.


Si se trata de una pantalla normal 16x2 compatible con el controlador  HD44780, puedes usar la librería LCD.C
En esta librería se pueden configurar el puerto de datos a usar y también los pines de control.

Si es una pantalla LCD 20x4, puedes usar la librería LCD420.C, pero está diseñada para usarla por el puerto B, aunque se puede modificar.
Ambas librerías vienen incluidas con el compilador de CCS.

Si se trata de una pantalla LCD serial 16x2 del tipo Milford, _puedes ver este ejemplo_, posiblemente te sirva.

Y si existen varios temas sobre el uso de pantallas LCD en el Foro.


----------

