Autor Tema: Problemas con un PIC18F4550  (Leído 2239 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado alxcb

  • PIC10
  • *
  • Mensajes: 10
Problemas con un PIC18F4550
« en: 19 de Agosto de 2012, 21:23:37 »
Hola, tengo un problema utilizando un PIC18F4550: estoy intentando controlar un servo con él, y tengo configuradas mediante un programa que he escrito (que también hace otras cosas, aunque ahora me estaba centrando en esta función) dos patillas como inputs para incrementar o reducir los anchos de pulso de la señal que es enviada al susodicho servo para que se disponga en un ángulo u otro. El problema se presenta cuando intento detectar estas señales, ya que son digitales activadas por nivel alto, pero por algún motivo hay en estas patillas por defecto (como en la mayoría de las otras) ya un nivel alto de voltaje, que me imagino que se está dando como output por algún motivo, pero el PIC me lo detecta como input también, con lo cual ambas señales son entendidas por el microcontrolador como '1' lógico durante toda la ejecución del programa. He probado a conectarlas a tierra y entonces el programa funciona correctamente (el servo se mantiene en el centro), y si desconecto alguna de ellas de tierra, vuelve al nivel alto de voltaje y el servo gira como si lo activase mediante un interruptor (lo cual era mi idea inicial), con lo que puedo conseguir trabajar con él, pero me gustaría entender por qué pasa esto: por qué en las patillas de entrada tengo por defecto un nivel alto de voltaje.
Supongo que sobra decir que en una simulación de Proteus funciona a la perfección.
Adjunto a continuación en dos mensajes los códigos del main.c y el main.h, respectivamente (el programa lo he escrito con el entorno PIC C Compiler, y he utilizado el asistente de creación de proyectos que incluye para ello, no sé si el problema tendrá que ver con eso, ya que soy novato en la programación de microcontroladores y no sé para que sirven muchas de las opciones del asistente, aunque lo intuya vagamente).

Muchas gracias de antemano por todo, y espero no estar preguntando una obviedad.

Desconectado alxcb

  • PIC10
  • *
  • Mensajes: 10
Re: Problemas con un PIC18F4550
« Respuesta #1 en: 19 de Agosto de 2012, 21:26:29 »
main.c:
Código: C
  1. #include "C:\Users\Usuario\Documents\PIC\Servos\main.h"
  2.  
  3. #define serv1 pin_a0
  4. #define serv2 pin_a1
  5. #define camara pin_a2
  6. #define ctrl_izq pin_a3
  7. #define ctrl_der pin_a4
  8. #define ctrl_arr pin_a5
  9. #define ctrl_aba pin_b6
  10. #define motor_i pin_c1
  11. #define mot1_del pin_b0
  12. #define mot1_atr pin_b1
  13. #define mot2_del pin_b2
  14. #define mot2_atr pin_b3
  15. #define luces_i pin_b4
  16. #define luces_o pin_b5
  17.  
  18. #define led pin_c0
  19.  
  20. #define pulso_min 900 //Anchos de pulso límites para los servos (en us). Estoy suponiendo que sean estos, pero según la web hay que ir tanteando para buscar los límites de giro, no te los dan.
  21. #define pulso_max 2100
  22. #define retardo 10 //Se supone que, para el control de los servos, entre un pulso y el siguiente tienen que pasar entre 10 y 20 ms.
  23. #define vel 4 //Variación en us.
  24.  
  25. void cam(int32 *pulso)
  26. {
  27.    output_high(led); //Led para indicar que se está trabajando con los servos que moverán la cámara.
  28.    do
  29.    {
  30.       if(input(ctrl_izq) && (*pulso>=(pulso_min+vel)))
  31.          *pulso-=vel; //Estoy suponiendo que a menor ancho de pulso, gira hacia la izquierda, pero podría ir en el otro sentido. También estoy asignando así la velocidad de giro, que modifica el ángulo de la cámara en el valor correspondiente a un cambio de vel ms en el ancho de pulso.
  32.       else if(input(ctrl_der) && (*pulso<=(pulso_max-vel)))
  33.          *pulso+=vel;
  34.       if(input(ctrl_aba) && (*(pulso+1)>=(pulso_min+vel)))
  35.          *(pulso+1)-=vel; //Aquí también supongo que a menor ancho de pulso gira hacia abajo.
  36.       else if(input(ctrl_arr) && (*(pulso+1)<=(pulso_max-vel)))
  37.          *(pulso+1)+=vel;
  38.       output_high(serv1);
  39.       delay_us((*pulso)-15);
  40.       output_low(serv1);
  41.       output_high(serv2);
  42.       delay_us(*(pulso+1)-17);
  43.       output_low(serv2);
  44.       delay_ms(retardo);
  45.    }while(input(camara)); //Así está pensado para tener un interruptor de dos posiciones (no para un sistema de pulsos/botón) que, cuando está en ON, pase al modo "controlar cámara". Este interruptor también tendría que controlar la alimentación de los servos.
  46.    output_low(led);
  47. }
  48.  
  49. void luz(int *l)
  50. {
  51.    if(*l)
  52.    {
  53.       output_low(luces_o);
  54.       *l=0;
  55.    }
  56.    else
  57.    {
  58.       output_high(luces_o);
  59.       *l=1;
  60.    }
  61. }
  62.  
  63. void avanzar()
  64. {
  65.    output_high(mot1_del);
  66.    output_high(mot2_del);
  67.    output_low(mot1_atr);
  68.    output_low(mot2_atr);
  69. }
  70.  
  71. void retroceder()
  72. {
  73.    output_low(mot1_del);
  74.    output_low(mot2_del);
  75.    output_high(mot1_atr);
  76.    output_high(mot2_atr);
  77. }
  78.  
  79. void girar_der()
  80. {
  81.    output_high(mot1_del);
  82.    output_low(mot2_del);
  83.    output_low(mot1_atr);
  84.    output_high(mot2_atr);
  85. }
  86.  
  87. void girar_izq()
  88. {
  89.    output_low(mot1_del);
  90.    output_high(mot2_del);
  91.    output_high(mot1_atr);
  92.    output_low(mot2_atr);
  93. }
  94.  
  95. void frenar()
  96. {
  97.    output_high(mot1_del);
  98.    output_high(mot2_del);
  99.    output_high(mot1_atr);
  100.    output_high(mot2_atr);
  101. }
  102.  
  103. void motor()
  104. {
  105.    do
  106.    {
  107.    if(input(ctrl_arr) && input(ctrl_aba))
  108.       frenar();
  109.    else if(input(ctrl_arr))
  110.       avanzar();
  111.    else if(input(ctrl_aba))
  112.       retroceder();
  113.    else if(input(ctrl_der))
  114.       girar_der();
  115.    else if(input(ctrl_izq))
  116.       girar_izq();
  117.    else
  118.    {
  119.       output_low(mot1_del);
  120.       output_low(mot1_atr);
  121.       output_low(mot2_del);
  122.       output_low(mot2_atr);
  123.    }
  124.    }while(input(motor_i));
  125. }
  126.  
  127.  
  128.  
  129.  
  130. void main()
  131. {
  132.  
  133.    setup_adc_ports(NO_ANALOGS|VSS_VDD);
  134.    setup_adc(ADC_CLOCK_DIV_2);
  135.    setup_psp(PSP_DISABLED);
  136.    setup_spi(SPI_SS_DISABLED);
  137.    setup_wdt(WDT_OFF);
  138.    setup_timer_0(RTCC_INTERNAL);
  139.    setup_timer_1(T1_DISABLED);
  140.    setup_timer_2(T2_DISABLED,0,1);
  141.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  142.    setup_comparator(NC_NC_NC_NC);
  143.    setup_vref(FALSE);
  144.    setup_oscillator(OSC_8MHZ|OSC_NORMAL|OSC_31250|OSC_PLL_OFF);
  145.  
  146.    // TODO: USER CODE!!
  147.    
  148.    int32 pulso[2];
  149.    int l=0;
  150.    pulso[0]=1500;
  151.    pulso[1]=1500;
  152.    do
  153.    {
  154.    if(input(camara))
  155.       cam(pulso);
  156.    if(input(motor_i))
  157.       motor();
  158.    if(input(luces_i))
  159.       luz(&l);
  160.    }while(TRUE);
  161.  
  162. }

Desconectado alxcb

  • PIC10
  • *
  • Mensajes: 10
Re: Problemas con un PIC18F4550
« Respuesta #2 en: 19 de Agosto de 2012, 21:28:46 »
main.c:
Código: C
  1. #include <18F4550.h>
  2. #device adc=8
  3.  
  4. #FUSES NOWDT                    //No Watch Dog Timer
  5. #FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
  6. #FUSES INTRC                    //Internal RC Osc
  7. #FUSES NOPROTECT                //Code not protected from reading
  8. #FUSES NOBROWNOUT               //No brownout reset
  9. #FUSES BORV20                   //Brownout reset at 2.0V
  10. #FUSES NOPUT                    //No Power Up Timer
  11. #FUSES NOCPD                    //No EE protection
  12. #FUSES STVREN                   //Stack full/underflow will cause reset
  13. #FUSES NODEBUG                  //No Debug mode for ICD
  14. #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
  15. #FUSES NOWRT                    //Program memory not write protected
  16. #FUSES NOWRTD                   //Data EEPROM not write protected
  17. #FUSES IESO                     //Internal External Switch Over mode enabled
  18. #FUSES FCMEN                    //Fail-safe clock monitor enabled
  19. #FUSES PBADEN                   //PORTB pins are configured as analog input channels on RESET
  20. #FUSES NOWRTC                   //configuration not registers write protected
  21. #FUSES NOWRTB                   //Boot block not write protected
  22. #FUSES NOEBTR                   //Memory not protected from table reads
  23. #FUSES NOEBTRB                  //Boot block not protected from table reads
  24. #FUSES NOCPB                    //No Boot Block code protection
  25. #FUSES MCLR                     //Master Clear pin enabled
  26. #FUSES LPT1OSC                  //Timer1 configured for low-power operation
  27. #FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
  28. #FUSES PLL12                    //Divide By 12(48MHz oscillator input)
  29. #FUSES CPUDIV4                  //System Clock by 4
  30. #FUSES USBDIV                   //USB clock source comes from PLL divide by 2
  31. #FUSES VREGEN                   //USB voltage regulator enabled
  32. #FUSES ICPRT                    //ICPRT enabled
  33.  
  34. #use delay(clock=8000000)
  35. #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

Según creo, lo he configurado para trabajar con un oscilador interno a 8MHz.
Podría subir la hoja con el diseño de Proteus si sirve de algo.

Desconectado pajaro

  • PIC24H
  • ******
  • Mensajes: 1121
Re: Problemas con un PIC18F4550
« Respuesta #3 en: 20 de Agosto de 2012, 12:03:55 »
Hola compañero

Verifica si las configuraste como salida o como entrada,
si las configuraste como salida estaran con nivel alto.

intenta usar set_tris_x(); x es el puerto.

con ello puedes setear si son entrada o salida.

ya nos contaras...

Desconectado alxcb

  • PIC10
  • *
  • Mensajes: 10
Re: Problemas con un PIC18F4550
« Respuesta #4 en: 21 de Agosto de 2012, 08:18:01 »
Muchas gracias por el consejo. Lo probaré en cuanto nos reunamos los integrantes del proyecto (yo no dispongo personalmente de todo el material) y ya comentaré como ha ido la cosa en cuanto lo haya hecho. Es que con el asistente de proyecto había configurado los puertos como entrada o salida correctamente, pero no se modificaba el código respecto a como estaba antes de hacerlo, y eso ya me resultó extraño (supuse que se podrían usar como ambos al mismo tiempo y que por eso no cambiaba el código).

Desconectado alxcb

  • PIC10
  • *
  • Mensajes: 10
Re: Problemas con un PIC18F4550
« Respuesta #5 en: 28 de Agosto de 2012, 15:06:22 »
He probado a utilizar el comando que comentas y no me ha funcionado. Lo he intentado pasándole los argumentos a la función tanto en hexadecimal como en binario pero no hay manera, sigo teniendo el mismo problema... ¿Alguna idea más? Es que nos hemos quedado un poco estancados con esto. Gracias. :)