You are on page 1of 6

Programacin Basica De Microcontroladores PIC En C

El motivo de este hilo es mostrar e intentar ayudar a la gente sobre como programar en C los Pic, siendo el pic utilizado el 16f876. La eleccion de este tipo de micrcontroladores se debe a su amplia utilizacin por parte de los aficionados a la electronica, motivada por su buena relacion calidad/precio, siempre se dice que son poco potentes, pero si Microchip es la segunda empresa a nivel mundial en venta de microcontroladores sera por algo; ademas cabe destacar que pese a estos comentarios han demostrado ser tremendamente utiles. Otro aspecto es el hecho de que Microchip ha sabido evolucionar para seguir siendo competente, sacando su gama alta PIC18 y posteriormente los dsPIC fusion de microcontroladores de 16 bits y un dsp (Digital signal processor o Procesador digital de seal), asi podemos tener a un precio mas que adsequible un dsp. La opcin de programar en C se debe al hecho de que los micrcontroladores y dsPic se disean con un repetorio de instrucciones optimizado para su programacion en C, y la facilidad en el desarrollo de programas mas complejos. Durante mucho tiempo, la programacion en C cargaba con el lastre de la optimizacion y necesidad de memoria, pero los compiladores han ido evolucionando hacia una mayor optimizacion que junto con el aumento de memoria de los pic permite de sobra en la mayoria de los casso la programacion en C. El compilador empleado sera el CCS, del que se puede adquirir una demo con limitaciones o buscar el programa por los medios habituales, la pagina: CCS Tambien comentar que podreis encontrar la guia para el uso del compilador en la seccion del documento tecnicos, ademas de en su propia web El pic elegido sera el 16f876 que cuenta con numerosos perifericos y suele ser facil de encontrar. Los ejemplos aportados buscaran partir de ejemplos sencillos para adaptarse al lenguajes y posteriormente al uso de perifericos que pueden ser muy utiles de cara a su aplicacion en robotica, despues hacer programnas mas complejos sera cosa de combinar distintos codigos.Dicho esto, animo a cada uno a participar aportando sus conocimientos y codigos para entre todos tener una buena "biblioteca de codigos". Para que este hilo sirva como documentacion y que sean codigo finales permanecer cerrado, para cualquier tipo de dudas podeis abrir un hilo aparte en este mismo foro, y si quereis aportar informacion tambien podeis abrir un hilo aparte y nos encargaremos de ponerlo en este hilo o poideis mandarlo por privado

Respuesta: Programacin Basica De Microcontroladores PIC En


Bueno ,y hechas las presentaciones, vamos con el ejemplo mitico con el que todos empezamos, y aqui va el codigo:

Cdigo: [Descargar] [Ocultar]

1. 2. 3. 4. 5. 6. 7. 8. 9.

#include <16f876a> #fuses XT,NOWDT,NOPROTECT,PUT #use delay (clock=4000000) #use fast_io(b) ///PROGRAMA void main(void) { set_tris_b(0x00); desactivadas)

//pic a utilizar //ordenes para el programador //Fosc=4Mhz

//portb como salida(RB0,las demas

10.

disable_interrupts(GLOBAL); desactivadas do{ output_low(PIN_B0); delay_ms(500); output_high(PIN_B0); delay_ms(500); }while(TRUE);

//todas las interrupciones

11. 12. 13. 14. 15. 16. 17. 18. }

//Led off //Led on //bucle infinito

Y aqui podemos ver el diagrama de conexionado:

Respuesta: Programacin Basica De Microcontroladores PIC En


El siguiente programa no es nada del otro mundo, pero en el podemos ver como utilizar las lines de E/S del microcontrolador, en este caso al activar el pulsador se encendera la luz correspondiente, en lugar de eso podemos llamar a una funcion y realizar una tarea deseada:
Cdigo: [Descargar] [Ocultar]

1. #include <16f876a> 2. #fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT 3. #use delay(clock=4000000) 4. #use standard_io(b) 5. //mirar sin usar tris 6. void main() { 7. set_tris_a(011011); //porta como entrada 8. set_tris_b(0x00); 9. do{ 10. output_b(0x00); 11. if (input(pin_a0)){ 12. output_high(pin_b0); 13. } 14. if (input(pin_a1)){ 15. output_high(pin_b1); 16. } 17. if (input(pin_a3)){ 18. output_high(pin_b3); 19. } 20. if (input(pin_a4)){ 21. output_high(pin_b4); 22. } 23. }while(true);//Bucle infinito 24. }

Y el diagrama correspondiente:

Respuesta: Programacin Basica De Microcontroladores PIC En


Bien, para seguir y empezar a tocar algunos perifericos del microcontrolador volveremos a realizar el ejemplo primero pero en este caso empleando el temporizador 0, timer0, del pic, asi mismo se gestionara el timer0 por interrupciones. En este caso se emplea un divisor de reloj de 16, tal que 16x256=4,096 ms y contando el numero de interrupciones alcanzamos aproximadamente el segundo (4,096 ms x 250); me he pasado bastante, es cosa de afinar el calculo solo pretende servir de ejemplo.

Cdigo: [Descargar] [Ocultar]

1. //intermitente por interrupcion rtcc 2. #include <16f876a> 3. #fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT 4. #use delay(clock=4000000) 5. #use standard_io(b) 6. #byte PORTB=6// para poder acceder a portb con ese nombre,otra?? 7. int contRTCC = 0; 8. 9. #int_RTCC 10. RTCC_isr(){ 11. output_high(pin_b3);//indicador 12. ++contRTCC; 13. if(contRTCC==250)//complementa el estado de la salida 14. { 15. contRTCC=0x00; 16. if (bit_test(PORTB,0)){ 17. output_low(pin_b0); 18. } 19. else{ 20. output_high(pin_b0); 21. } 22. } 23. } 24. 25. void main() { 26. 27. setup_counters(RTCC_INTERNAL,RTCC_DIV_16);//configura timer0 28. 29. enable_interrupts(INT_RTCC);//interrupciones del timer y general 30. enable_interrupts(global); 31. output_high(pin_b1);//indicador 32. 33. do{ 34. output_high(pin_b2);//indicador 35. } while (TRUE); 36. }

Y el diagrama de conexionado sera igual al del primer ejemplo

Respuesta: Programacin Basica De Microcontroladores PIC En


Ahora vamos con el uso del convertido analogico-digital del pic, el conversor ADC tiene 10 bits de resolucion, ya que no suele ser necesaria una resolucion tan alta (5/1024=4'8mV) siempre utilizo una resolucion de 8bit (5/256=19'5mV), principlamente por dos motivos se mejora la respuesta ante el ruido y ademas tenemos un dato de 8bits que es el dato nativo del pic, con lo que las rutinas para su procesado seran mas sencillas y rapidas de ejecutar; por ello se emplea la directiva ADC=8. En el ejemplo simplemente se saca por el puerto b el valor de la conversion, se ha realizado una funcion la cual es llamada por el programa principal, los delays estan exagerados valdra con mas de 20 microsegundos.Y aqui va el programa:

Cdigo: [Descargar] [Ocultar]

1. #include <16f876a> 2. #device ADC=8

3. #fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT 4. #use delay(clock=4000000) 5. #use standard_io(b) 6. 7. 8. int valor=0x00; 9. 10. void toma_adc(void){ 11. 12. // Lectura del canal 0 13. set_adc_channel(0); 14. delay_ms(1); 15. valor=read_adc(); 16. delay_ms(1); //para que se estabilice 17. } 18. 19. void main() { 20. 21. setup_adc(ADC_CLOCK_INTERNAL); //configura el converso 22. setup_adc_ports(RA0_analog); //entrada 0 como analogica 23. do { 24. toma_adc(); 25. output_b(valor); 26. }while(true); 27. }

Y el diagrama

Respuesta: Programacin Basica De Microcontroladores PIC En


En este ejemplo, se hace uso tanto del conversor del pic como del modulo pwm para el control de potencia, asi en funcion del valor de la seal de entrada se obtendra la seal de salida; esto puede ser tremendamente util, en robotica podemos hacer que nuestro robot se mueva en funcion de parametros analogicos como luz o temperatura e incluso lo podemos aplicar para otros sistemas de control, aunque es un controlador un poco basico.

Cdigo: [Descargar] [Ocultar]

1. #include <16f876a> 2. #device ADC=8 3. #fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT 4. #use delay(clock=4000000) 5. #use standard_io(b) 6. #use standard_io(c) 7. 8. int duty; 9. int tempo; 10. 11. void toma_adc_y_transmite(void){ 12. 13. // Lectura del canal 0 14. set_adc_channel(0); 15. delay_ms(1); 16. duty=read_adc(); 17. delay_ms(1); 18. } 19. 20. void main() { 21. 22. tempo=0xFF; 23. 24. setup_adc(ADC_CLOCK_INTERNAL);

25. 26. 27. 28. 29. 30. 31. 32.

setup_adc_ports(RA0_analog); setup_ccp1(CCP_PWM); // Configura CCP1 como PWM setup_timer_2(T2_DIV_BY_1,tempo,1); // f do { toma_adc_y_transmite(); set_pwm1_duty(duty); // Determina tiempo en alto }while(true); }

Y aqui va el diagrama

Respuesta: Programacin Basica De Microcontroladores PIC En


Bueno, vamos ahora con un ejemplo en el que se utiliza la usart del pic, el mejemplo es algo basico con un pic mando cada segundo un dato numerico y con el otro cuando recibo un dato lo saco por el puerto b y lo mantengo hasta que llegue un dato nuevo. El emisor:

Cdigo: [Descargar] [Ocultar]

1. #include <16f876a> 2. #fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT 3. #use delay(clock=4000000) 4. #use standard_io(b) 5. #use rs232(baud=2400, xmit=PIN_C6, rcv=PIN_C7) 6. 7. void main() { 8. 9. do{ 10. delay_ms(1000); 11. putc(0x37); 12. delay_ms(1000); 13. putc(0x81); 14. }while(true); 15. }

Y el receptor:

Cdigo: [Descargar] [Ocultar]

1. #include <16f876a> 2. #fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT 3. #use delay(clock=4000000) 4. #use standard_io(b) 5. #use rs232(baud=2400, xmit=PIN_C6, rcv=PIN_C7) 6. 7. int dato=0x00; 8. 9. #int_rda 10. void rda_isr() { 11. 12. dato=0x00; 13. if(kbhit()){ 14. dato=getc(); 15. output_b(dato); 16. }

17. } 18. 19. void main() { 20. 21. 22. enable_interrupts(int_rda); 23. enable_interrupts(global); 24. 25. do{ 26. }while(true); 27. }

Para la conexion se deberan unir la linea C6 de un pic con la C7 del otro pic, y en el pic receptor conectar los 8 Led con sus resistencias al puertoB. La recepcion se gestiona por interrupciones; este es uno de los ejemplos mas claros de manejabilidad y facilidad de desarrollo de C frente a ensamblador, estos mismo ejemplos bien hechos con deteccion de errores los realice y me ocuparon unos 7 folios de codigo entre los dos y me parece que redondeo por abajo

You might also like