Programacion en C de PICs.

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.
 
Última edición por un moderador:
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. :LOL:
Tambien tienes el CSS que utiliza mucha gente en el foro. Tu eliges.
 
Última edición:
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);
}
}
 
#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.
#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

Espero te sirva.
 
Última edición:
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.
 
Última edición:
Revisa este foro,tiene un tutorial excelente y muy completo.

Estos los temas que se ven
Código:
        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
 
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.
 
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 :aplauso:
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.(y)

Buen día!
 
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.
 
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.
 
Atrás
Arriba