# Programacion en C de PICs.



## ESGUIL (Mar 26, 2012)

Hola, Soy nuevo en el foro, y necesito ayuda.

En breve tengo que empezar a programar PICS en lenguaje C para una compañia.

Tengo un nivel alto de programación en ensamblador para PICS, y tambien en C aunque no para pics.

Mi duda es: No tengo ni idea de por donde empezar. O sea, no se desde que programa se programan, ?¿?¿MPLAB?¿?¿ que librerias son necesarias, si cada LCD que quiera conectar tendra su propia libreria, que comandos son especiales...

De momento me conformaria con un saber realizar un programa que lea el estado de unas entradas digitales para activar otras salidas conectadas a LEDS.

Necesito un tutorial para tontos o algo por el estilo. 

No se que encabezamiento hay que usar, no se si los delays vienen incluidos en librerias ni cuales son... no se nada. No se ni el programa que se usa.

Gracias de antemano y espero que podais ayudarme.


----------



## Basalto (Mar 26, 2012)

Hola, yo te recomendaría para pic de la serie 12 y 16 el HI-TECH. Es el mejor compilador en optimización de memoria. Para la serie 18 el C18, después el C24 y C32 para los de 32 bits. Para estos compiladores tienes librerías de lo que quieras en la pagina de microchip y los puedes utilizar en el MPLAB, tienes versiones gratuitas que no te optimiza el código, pero esto no creo que sea mucho problema, por que también puedes pagar 500€ para la versión completa y que pase de ocupar 18% a un 16% en memoria. 
Tambien tienes el CSS que utiliza mucha gente en el foro. Tu eliges.


----------



## ESGUIL (Mar 26, 2012)

ejemplo de rotacion a dcha o izqu de un bit del puerto B, dependiendo de la lectura de un pin del puerto A
#include <16F876.h>
#use delay(clock=4000000,RESTART_WDT)
#byte port_b=6                                         <==== PARA QUE ES ESTO ??
#org 0x1F00, 0x1FFF {}//para proteger          <==== NO LO ENTIENDO MUY BIEN. 
main()
{
port_b=1;                                     <=== DEL PORTB. ¿QUE BIT DE LOS 8 PONE A 1 ?
set_tris_b(0x00); // todo el puerto B como salida
while(1)
{
if(input(PIN_A0))
rotate_left(&port_b,1);
else
rotate_right(&port_b,1);
delay_ms(100);
}
}


----------



## Basalto (Mar 26, 2012)

ESGUIL dijo:


> port_b=1;                                     <=== DEL PORTB. ¿QUE BIT DE LOS 8 PONE A 1 ?
> }



Eso es CSS. Pone un 1 en decimal en el puerto, si lo pasas a binario es "00000001", lo que pone el primer bit a 1. Si pones un port_b=15 es "00001111" pone los 4 primeros bits a 1. 
Nunca programé en CSS en el resto no te puedo ayudar.


----------



## incubadora (Mar 26, 2012)

ESGUIL dijo:


> #org 0x1F00, 0x1FFF {}//para proteger      <==== NO LO ENTIENDO MUY BIEN.


Esto es para proteger el bootloader. El bootloader es un programilla dentro del PIC que sirve para programarlo via serial RS232 (sin programador externo.) Si no usaras dicha sentencia, el bootloader podría ser borrado cuando vuelvas a programar el PIC.


ESGUIL dijo:


> #byte port_b=6 <==== PARA QUE ES ESTO ??


Si ves el datasheet de la serie PIC16F876, en el registro 06H esta el puerto B.
Luego esa sentencia es equivalente a decir en assembler


> port_b equ 06H



Espero te sirva.


----------



## Meta (Mar 26, 2012)

En C estoy empezzando un poco con este libro con el CCS. Los hay mejores y por Internet.

Índice.
http://www.creacionescopyright.com/documentoscc/978-84-92779-98-7.pdf

Saludo.


----------



## ESGUIL (Mar 27, 2012)

Muchas gracias por todo, ahora lo voy viendo mas claro.

Pensaba que no habria que generar etiquetas para indicar donde se encuentra el puerto B, pensaba que si metias la libreria, aqui dentro apareceria todo.

Por lo tanto, cada vez que me quiera mover por registros, tengo que definirlos ?? es decir, ADCON, PORTB, PORTA, TMR0, TMR1 .... y poner en que posicion se encuentran ???



Otra pregunta por favor. he visto codigos de MIKROC pro, son mas intuitivos y parecidos al ensamblador.

Que diferencias hay con otros como el CCS ??

Esque no he encontrado ningun tutorial en el que te venga todas las instrucciones para programar en CSS.


----------



## electroconico (Mar 27, 2012)

Revisa este foro,tiene un tutorial excelente y muy completo.

Estos los temas que se ven

```
1. Parpadeo de un led cada 0,5s        
        2. Parpadeo de un led cada 0,5s 16F628A      
        3. Parpadeo de tres led"s cada 0,5s       
        4. Parpadeo de cuatro led"s cada 0,5s      
        5. Coche Fantastico v.I        
        6. Coche Fantastico v.II funcion rotar      
        7. Coche Fantastico v.III bucle while        
        8. Coche Fantastico vIV bucle for       
        8. Juego de luces         
       10. Luces. Como realizar una libreria        
       11. Contador ascendente 0a9   (7seg)         
       12. Contador descendente 9a0 (7seg)        
       13. Contador reversible 0a9 con switch (7seg)         
       14. Contador 00a99. (7seg) uso del TMR0         
       15. Contador 00a99 automatico (7seg)         
       16. Contador 0a9 BCD&Boton        
       17. Contador 0a9 BCD 2pulsadores(1.Inc  2.Decr)        
       18. Super contador 0000a9999 (7seg)         
       19. BETI parpadeo (7seg)         
       20. AUPA DEPO (7seg)       
       21. HOLA rotar hacia izquierda (7seg)     
       22. Animacion limites (7seg)       
       23. Dado digital (7seg)        
       24. Hola mundo (LCD)         
       25. Hola mundo ahorrando 1 pin (LCD)      
       26. Abecedario (LCD)       
       27. Mover palabra por pantalla LCD        
       28. Limites LCD       
       29. Escribir&Leer eeprom interna del pic (LCD)      
       30. Contador 0a9 buzzer&boton (LCD)       
       31. Escribir&Leer eeprom 24LC256 (LCD)       
       32. Dado digital (LCD)        
       33. Reloj-Calendario DS1302 (LCD)        
       34. RS232: PIC->PC         
       35. Reloj-Calendario RS232       
       36. RS232 & teclado 3x4      
       37. LCD & Teclado 3x4         
       38. Clave (LCD&Teclado 4x4)         
       39. RS232: PC->PIC         
       40. Manejo INT/RB0 interrupcion externa       
       41. Manejo ccp1 mod.comparacion flanco asc/des genera int      
       42. Animacion bateria lcd2x16      
       43. Animacion come-cocos RS232->lcd 2x16       
       44. Temperatura con ds1620 BETA         
       45. Manejo del periferico CCP1 modo PWM        
       46. CCP1 modo PWM al 50% y 75% utilizacion y creacion .h     
       47. C & ASM         
       48. Interrupcion de los pines <4:7> portb       
       49. Abecedario(1 Matriz de led"s 5x7)      
       50. Reloj digital(display"s 7seg)         
       51. Interrupcion RS-232. Lectura/Escritura eeprom interna       
       52. Interrupcion RS-232. Lectura/Escritura eeprom 24LC256    
       53. SAA1064 modo DINAMICO       
       54. SAA1064 modo ESTATICO       
       55. PCF8591 modo D/A         
       56. PCF8591 modo A/D         
       57. Manejo 16 display's 7seg con dos pines del micro (4 SAA1064 en bus i2c)    
       58. Termometro digital con ds1620
```


----------



## Meta (Mar 27, 2012)

Mejor poner los enlaces directos.

_*INDICE:* _  

        1. Parpadeo de un led cada 0,5s 
        2. Parpadeo de un led cada 0,5s 16F628A 
        3. Parpadeo de tres led"s cada 0,5s 
        4. Parpadeo de cuatro led"s cada 0,5s 
        5. Coche Fantastico v.I 
        6. Coche Fantastico v.II funcion rotar 
        7. Coche Fantastico v.III bucle while 
        8. Coche Fantastico vIV bucle for 
        8. Juego de luces 
       10. Luces. Como realizar una libreria 
       11. Contador ascendente 0a9   (7seg) 
       12. Contador descendente 9a0 (7seg) 
       13. Contador reversible 0a9 con switch (7seg) 
       14. Contador 00a99. (7seg) uso del TMR0 
       15. Contador 00a99 automatico (7seg) 
       16. Contador 0a9 BCD&Boton 
       17. Contador 0a9 BCD 2pulsadores(1.Inc  2.Decr) 
       18. Super contador 0000a9999 (7seg) 
       19. BETI parpadeo (7seg) 
       20. AUPA DEPO (7seg) 
       21. HOLA rotar hacia izquierda (7seg) 
       22. Animacion limites (7seg) 
       23. Dado digital (7seg) 
       24. Hola mundo (LCD) 
       25. Hola mundo ahorrando 1 pin (LCD) 
       26. Abecedario (LCD) 
       27. Mover palabra por pantalla LCD 
       28. Limites LCD 
       29. Escribir&Leer eeprom interna del pic (LCD) 
       30. Contador 0a9 buzzer&boton (LCD) 
       31. Escribir&Leer eeprom 24LC256 (LCD) 
       32. Dado digital (LCD) 
       33. Reloj-Calendario DS1302 (LCD) 
       34. RS232: PIC->PC 
       35. Reloj-Calendario RS232  
       36. RS232 & teclado 3x4 
       37. LCD & Teclado 3x4  
       38. Clave (LCD&Teclado 4x4) 
       39. RS232: PC->PIC  
       40. Manejo INT/RB0 interrupcion externa 
       41. Manejo ccp1 mod.comparacion flanco asc/des genera int 
       42. Animacion bateria lcd2x16 
       43. Animacion come-cocos RS232->lcd 2x16 
       44. Temperatura con ds1620 BETA 
       45. Manejo del periferico CCP1 modo PWM 
       46. CCP1 modo PWM al 50% y 75% utilizacion y creacion .h 
       47. C & ASM 
       48. Interrupcion de los pines <4:7> portb 
       49. Abecedario(1 Matriz de led"s 5x7) 
       50. Reloj digital(display"s 7seg) 
       51. Interrupcion RS-232. Lectura/Escritura eeprom interna 
       52. Interrupcion RS-232. Lectura/Escritura eeprom 24LC256 
       53. SAA1064 modo DINAMICO 
       54. SAA1064 modo ESTATICO 
       55. PCF8591 modo D/A 
       56. PCF8591 modo A/D 
       57. Manejo 16 display's 7seg con dos pines del micro (4 SAA1064 en bus i2c) 
       58. Termometro digital con ds1620  

HERRAMIENTAS:  

MPlab IDE  -> Entorno de trabajo
CCS Plug-in MPlab -> Integrar nuestro compilador CCS al entrono MPlab
CCS Demo -> Una version demo de nuestro compilador
Como integrar CCS en Proteus -> CCS en PROTEUS
Como simular CCS en Proteus -> Debug con codigo .c
CCS manual -> Manual CCS en ingles(ultima version)
Manual CCS -> Manual de nuestro compilador en español
7Seg -> Programa que genera el codigo de display"s 7segmentos(ac & cc)
LCD 5x7 -> Programa que genera codigo para caracteres cgram LCD 5x7
ASCII & RCC -> Programas para obtener codigo ASCII y RCC para colores resistor


REVISIONES:  

        1. El programa 51 es la revision del programa 29
        2. El programa 52 es la revision del programa 31


La gente tiene la manía de usar C para los PIC16F, esos son para programarlo en ASM, sino la RAM no te dura para nada. En cuanto a l anueva gama 16F1 ese está algo optimizado para C, lo se porque microchip lo dijo en sus noticias cuando salió esos PIC nuevos.

El C es más bien para los 18F, PIC de 8 bitas alta gama.

Saludo.


----------



## electroconico (Mar 27, 2012)

Meta dijo:


> *Mejor poner los enlaces directos.*
> 
> La gente tiene la manía de usar C para los PIC16F, esos son para programarlo en ASM, sino la RAM no te dura para nada. En cuanto a l anueva gama 16F1 ese está algo optimizado para C, lo se porque microchip lo dijo en sus noticias cuando salió esos PIC nuevos.
> 
> El C es más bien para los 18F, PIC de 8 bitas alta gama.



1.-Mejor Revisas el link que puse y escribes algo que ayude y no un copy&paste 
2.-Los uC son para programarlos con lo que uno sabe y se acomode,si uno no sabe programar igual te bancas toda la RAM con C,ASM u origami.
Lo se porque trabajo como diseñador electrónico y utilizo varias familias de µC a como me convenga resolver o se pida en la aplicación.

Buen día!


----------



## incubadora (Mar 27, 2012)

Yo he trabajado con el PIC 16F873A en lenguaje C con CCS, y nunca tuve problemas de RAM.
Saludos.


----------



## Meta (Mar 27, 2012)

Porque no has usado mucho programación para ella. Mucha gente se queja y con el 18F, está más optimizado.

A mi se me ha llenado cuando uso muchos periféricos, luego para resolver, tuve que añadirle etiquetas de ASM dentro de C, lo mejor, usar más PIC de más capacidad.


----------



## gilmar gonzalez (May 14, 2013)

alguien que me explique por que esta instrucción :

printf(lcd_putc,"%3U",j);

permite   visualizar en un lcd 16x2 una variable numérica.

estaba realizando un contador de pulsos con un  pulsador  y un lcd .

me guié de  varios ejemplos  en la web pero una de las  grandes desventajas de investigar a la deriva es que  quedan  cosas que uno  no entiende.

el código lo probé  y simule el circuito  y  todo anda  bien el código quedo asi :

#include <main.h>
#use delay(clock=4M)
#include <lcd.c>
void main()
{  
int i;
int j=0;

lcd_init();
   while(TRUE)
   {  lcd_gotoxy(1,1);
      printf(LCD_PUTC, "# de envases");
      if  (input (pin_a0)) {
      lcd_gotoxy(1,2);
      printf(lcd_putc,"%3U",j);
      delay_ms(500);
       j++;
      }
   }


gracias  hasta pronto.


----------

