Professional Documents
Culture Documents
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
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)
10.
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:
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. }
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
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);
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
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:
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