Autor Tema: Controlando un Servo en C18  (Leído 2657 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Controlando un Servo en C18
« en: 30 de Mayo de 2011, 17:29:31 »
Hola de nuevo, sigo con los intentos de aprender C18, he intentado adaptar un codigo de RedPic al C18, y despues de mucho tiempo intentando entender lo que hace cada instruccion he conseguido hacerlo funcionar a medias y por mucho que repaso el codigo no consigo pillar el error.
Agradeceria a los MAESTROS un poco de su ayuda  :(
Código: CSS
  1. //********************************************************************************
  2. /* ** Programa para generar una Interrupcion cada 4,096ms usando el TIMER0 ** */
  3. /* ** Con Interrupcion de Baja Prioridad ** */
  4.  
  5. /* ** Ejemplo con un servo FUTABA S3003 ** */
  6. /* ** Alimentación y pulsos a 5V ** */
  7. /* ** Cuadro de Tiempos : ** */
  8. /* ** Periodo 20 ms (Frecuencia 50 Hz) ** */
  9. /* ** Ancho Pulso minimo 0.5 ms ** */
  10. /* ** Ancho pulso medio 1.5 ms ** */
  11. /* ** Ancho pulso maximo 2.5 ms ** */
  12. /* ** TMR0 a 1:16 -> 1 RTCC cada 4.096 ms ** */
  13. /* ** -> 1 Tick cada 0.096 / 256 = 0.016 ms ** */
  14. /* ** -> 20 ms = (4 x RTCC completas) + (1 * RTCC - 31 ticks) ** */
  15. /* ** Ancho Pulso minimo 0.5 ms -> 37 ticks de TMR0 ** */
  16. /* ** Ancho pulso medio 1.5 ms -> 99 ticks de TMR0 ** */
  17. /* ** Ancho pulso maximo 2.5 ms -> 161 ticks de TMR0 ** */
  18. //********************************************************************************
  19.  
  20.  
  21. /* ** Archivo con definicion de registros y bits del microcontrolador elegido ** */
  22.  
  23. #include <p18f4550.h>
  24.  
  25. /* ** Include para el USART ** */
  26.  
  27. #include <usart.h>
  28.  
  29. /* ** Include para Timer0 ** */
  30.  
  31. #include <timers.h>
  32.  
  33. /* **  ** */
  34.  
  35. #include <stdio.h>
  36.  
  37. /* ** Configuracion de los Fuses del microcontrolador ** */
  38.  
  39. #pragma config FOSC = XT_XT,FCMEN = OFF,IESO = OFF,CPUDIV = OSC1_PLL2
  40. #pragma config PWRT = ON,BOR = OFF,BORV =0,WDT = OFF
  41. #pragma config WDTPS = 32768,CCP2MX = OFF,PBADEN = OFF,LPT1OSC = OFF
  42. #pragma config MCLRE = OFF,STVREN = OFF,LVP = OFF,ICPRT = OFF
  43. #pragma config XINST = OFF,DEBUG = OFF,CP0 = OFF,CP1 = OFF
  44. #pragma config CP2 = OFF,CP3 = OFF,CPB = OFF,CPD = OFF
  45. #pragma config WRT0 = OFF,WRT1 = OFF,WRT2 = OFF,WRT3 = OFF
  46. #pragma config WRTC = OFF,WRTB = OFF,WRTD = OFF,EBTR0 = OFF
  47. #pragma config EBTR1 = OFF,EBTR2 = OFF,EBTR3 = OFF,EBTRB = OFF
  48.  
  49. /* ** Directivas de Preprocesador ** */
  50.  
  51. #define SERVO1          LATBbits.LATB0
  52.  
  53. /* ** Declaracion de Constantes ** */
  54.  
  55. const int AJUSTE_FINO = 31;
  56. const int ticks_PULSO_MEDIO = 99;
  57. const int ticks_PULSO_MINIMO = 37;
  58. const int ticks_PULSO_MAXIMO = 161;
  59.  
  60. /* ** Declaracion de Funciones a utilizar ** */
  61.  
  62. void ISRBajaPrioridad(void);
  63. void Ajuste_del_Servo(void);
  64. void eco_servos (void);
  65.  
  66. /* ** Variables de uso General ** */
  67.  
  68. volatile int Cont = 0;
  69. int FlagRTCC=0;
  70. int FlagSERVO1=0;
  71. int ValorTIMER0;
  72. int PosSERVO1=99;
  73. char Keypress=0x00;
  74.  
  75. /* ** Seccion de codigo a partir de la direccion 0x0018 ** */
  76.  
  77. #pragma code BajaPrioridad = 0x18
  78. void VectorPrioridadBaja(void)
  79. {
  80.         _asm goto ISRBajaPrioridad _endasm
  81. }
  82. #pragma code    // Cerramos seccion.-
  83.  
  84. /* ** Rutina de Interrupcion ** */
  85.  
  86. #pragma interrupt ISRBajaPrioridad
  87. void ISRBajaPrioridad(void)
  88. {
  89.         if(INTCONbits.TMR0IF==1){
  90.                 Cont++;
  91.                         if(Cont==4){
  92.                                 WriteTimer0(AJUSTE_FINO);
  93.                         }
  94.                         if(Cont==5){
  95.                                 FlagRTCC=1;
  96.                                 Cont=0;
  97.                         }
  98.                 INTCONbits.TMR0IF=0;
  99.         }
  100. }
  101.  
  102. /* ** Main ** */
  103.  
  104. void main(void)
  105. {
  106.  
  107. ADCON1 = 0X0F;
  108. TRISB = 0X00;
  109. PORTB = 0X00;
  110. OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT &
  111.                   USART_CONT_RX & USART_BRGH_HIGH,25); 
  112. OpenTimer0(TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_16);        // Config.Timer0.-
  113. INTCON2bits.TMR0IP = 0;         // Prioridad baja.-
  114. RCONbits.IPEN = 1;              // Habilitamos nivel de Prioridad.-
  115. INTCON = 0xE0;                  // Habilitamos todas las Interrupt de baja prioridad.-
  116.                                                 // Permite todas las interrupt de alta Prioridad.-
  117.                                                 // Habilitamos Interrupt por overflow .-
  118. WriteTimer0(0);                 // Inicializamos el Timer0.-
  119.        
  120. do{
  121. /* ** Disparo del Pulso ** */
  122.  
  123.         if(FlagRTCC==1){
  124.                 FlagRTCC=0;
  125.                 SERVO1=1;
  126.                 FlagSERVO1=1;
  127.         }
  128. /* ** Control del ancho del Pulso ** */
  129.  
  130.         if(FlagSERVO1==1){
  131.                 ValorTIMER0 = ReadTimer0();
  132.         if(ValorTIMER0>PosSERVO1){
  133.                 FlagSERVO1=0;
  134.                 SERVO1=0;
  135.         }
  136.         }
  137. /* ** Control del Servo con PC ** */
  138.  
  139.         if(Keypress!=0x00)
  140.         {
  141.                 Ajuste_del_Servo();
  142.                 Keypress=0x00;
  143.         }              
  144. } while (1);
  145. }
  146.  
  147. void Ajuste_del_Servo(void)
  148. {
  149.         switch(Keypress)
  150.         {
  151.                 case '1' : PosSERVO1=ticks_PULSO_MINIMO;
  152.                         break;
  153.  
  154.                 case '2' : PosSERVO1=ticks_PULSO_MEDIO;
  155.                         break;
  156.  
  157.                 case '3' : PosSERVO1=ticks_PULSO_MAXIMO;
  158.                         break;
  159.  
  160.                 case '+' : if(++PosSERVO1>ticks_PULSO_MAXIMO)
  161.                                         {      
  162.                                                 PosSERVO1=ticks_PULSO_MAXIMO;
  163.                                         }
  164.                         break;
  165.  
  166.                 case '-' : if(--PosSERVO1<ticks_PULSO_MINIMO)
  167.                                         {
  168.                                                 PosSERVO1=ticks_PULSO_MINIMO;
  169.                                         }
  170.                         break;
  171.  
  172. /* ** Posicion del Servo ** */
  173.      
  174.         case 'r' : eco_servos();
  175.                         break;
  176.         }
  177. }
  178.  
  179. void eco_servos(void)
  180. {
  181.         printf("S=%u\r\n",PosSERVO1);
  182. }

 Gracias
Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Controlando un Servo en C18
« Respuesta #1 en: 30 de Mayo de 2011, 17:55:51 »
Detalla por que comentas que funciona a medias  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Controlando un Servo en C18
« Respuesta #2 en: 30 de Mayo de 2011, 18:50:25 »
Hola Suky te comento, cuando arranco la simulacion se situa por defecto en la posicion medio, esto es correcto, pero cuando le mando una orden desde la pc se me para la simulacion.

Saludos
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Controlando un Servo en C18
« Respuesta #3 en: 30 de Mayo de 2011, 19:03:42 »
Y donde recibís el dato desde la PC? Porque habilitas la interrupción, y si envias un dato se activa la bandera, que nunca la borras, entonces queda ejecutando continuamente la interrupción  :?


Saludos!
No contesto mensajes privados, las consultas en el foro