TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Miquel_S en 27 de Noviembre de 2011, 07:36:20

Título: Controlando un servo en C18
Publicado por: Miquel_S en 27 de Noviembre de 2011, 07:36:20
Hola de nuevo, como dice el tema estoy intentando controlar un servo en C18, pero me tira un error en relacion a una funcion concretamente void Temp_2_5_ms();
C:\Archivos de programa\Microchip\MPASM Suite\Terminator\Timer0.c:93:Error [1204] too many arguments in function call

y aunque he leido sobre funciones no encuentro la manera de solucionarlo, si fuerais tan amables de enseñarme como os lo agradeceria.
Código: [Seleccionar]
/* ** Archivo con definicion de registros y bits del microcontrolador elegido ** */

#include <p18f4550.h>

/* ** Archivo con definicion de registros para uso del Timer ** */

#include <timers.h>

/* ** Configuracion de los fuses del Microcontrolador ** */

    #pragma config PLLDIV   = 5         // (20 MHz crystal )
    #pragma config CPUDIV   = OSC1_PLL2 
    #pragma config USBDIV   = 2         // Clock source from 96MHz PLL/2
    #pragma config FOSC     = HSPLL_HS
    #pragma config FCMEN    = OFF
    #pragma config IESO     = OFF
    #pragma config PWRT     = OFF
    #pragma config BOR      = ON
    #pragma config BORV     = 3
    #pragma config VREGEN   = ON      //USB Voltage Regulator
    #pragma config WDT      = OFF
    #pragma config WDTPS    = 32768
    #pragma config MCLRE    = ON
    #pragma config LPT1OSC  = OFF
    #pragma config PBADEN   = OFF
//  #pragma config CCP2MX   = ON
    #pragma config STVREN   = ON
    #pragma config LVP      = OFF
//  #pragma config ICPRT    = OFF       // Dedicated In-Circuit Debug/Programming
    #pragma config XINST    = OFF       // Extended Instruction Set
    #pragma config CP0      = OFF
    #pragma config CP1      = OFF
//  #pragma config CP2      = OFF
//  #pragma config CP3      = OFF
    #pragma config CPB      = OFF
//  #pragma config CPD      = OFF
    #pragma config WRT0     = OFF
    #pragma config WRT1     = OFF
//  #pragma config WRT2     = OFF
//  #pragma config WRT3     = OFF
    #pragma config WRTB     = OFF       // Boot Block Write Protection
    #pragma config WRTC     = OFF
//  #pragma config WRTD     = OFF
    #pragma config EBTR0    = OFF
    #pragma config EBTR1    = OFF
//  #pragma config EBTR2    = OFF
//  #pragma config EBTR3    = OFF
    #pragma config EBTRB    = OFF

/* ** Declaracion de constantes ** */

#define ticks 15006 // Anchura en ticks de la ventana de (2,5ms).-
#define time_2_5ms 0xC568 // Valor del timer para una pausa de 2,5ms.-

/* ** Declaracion de funciones ** */

void Temp_2_5_ms();
void main(void);
void Pos_Servo(int Pos);

/* ** Funcion usada para temporizar 2,5ms ** */

void Temp_2_5_ms()
{
WriteTimer0(time_2_5ms); // Cargamos 50536 en hexadecimal para conseguir 2.5ms.-
INTCONbits.TMR0IF=0; // Borro el flag de overflow.-
while(INTCONbits.TMR0IF == 0);
}

/* ** Funcion para llevar el servo a la posicion indicada (en grados) ** */

void Pos_Servo(int Pos)
{
unsigned int ciclos;
unsigned int i;
char Ton;

Ton = (78*Pos)/90+102; // Calculamos el tiempo que debe estar activa la señal
// PWM para alcanzar esta posicion.-
for(ciclos=0; ciclos<100; ciclos++)
{
LATB = 0x01; // Ponemos la señal a 1.-
Temp_2_5_ms(65535-Ton); // Esperamos tiempo igual a Ton.-
LATB = 0x00; // Ponemos la señal a 0.-
Temp_2_5_ms(65535-ticks+Ton); // Esperamos tiempo igual a Toff.-
for(i=0; i<7; i++){ // Espera un tiempo igual a 2,5ms para cada una de las 7 ventanas restantes.-
Temp_2_5_ms(time_2_5ms);
}
    }
}

/* ** Main ** */
 
void main(void)
{
TRISB = 0; // Configuramos puerto B como salidas.-
LATB = 0; // bit RB0 a 0.-

ADCON1 = 0x0F; // Configuramos I/O digitales.-

 /* Configuramos el Timer0 */
OpenTimer0( TIMER_INT_OFF &
T0_16BIT &
T0_SOURCE_INT &
T0_PS_1_2 );
while (1)
{
Pos_Servo(-90); // Llevar servo a un extremo.-
Pos_Servo(0); // Llevar servo al centro.-
Pos_Servo(90); // Llevar servo al otro extremo.-

}

CloseTimer0(); // Fin de la funcion del Timer0.-
}
Gracias de nuevo.
Saludos.
Título: Re: Controlando un servo en C18
Publicado por: MerLiNz en 27 de Noviembre de 2011, 08:09:19
si creas una funcion sin parametros
void Temp_2_5_ms()

y luego le pones parametros
Temp_2_5_ms(65535-Ton);

es logico que te de error, la funcion la has creado con 0 parametros, y tu la estas llamando con 1 parametro, por eso te dice que hay exceso de parametros al llamar la funcion.
Título: Re: Controlando un servo en C18
Publicado por: Miquel_S en 27 de Noviembre de 2011, 08:50:46
Gracias MerLiNz por tu respuesta ¿Cual seria la manera correcta de crear la funcion?

Saludos.
Título: Re: Controlando un servo en C18
Publicado por: Miquel_S en 27 de Noviembre de 2011, 15:01:43
Ya lo tengo bastante resuelto, o sea sin errores, solo falta probar si funciona en la realidad.

Gracias.
Título: Re: Controlando un servo en C18
Publicado por: Miquel_S en 27 de Noviembre de 2011, 15:30:59
No funciona como deberia seguire probando  :5]
Título: Re: Controlando un servo en C18
Publicado por: Miquel_S en 08 de Febrero de 2012, 05:51:38
Hola de nuevo, esta claro que hay que empezar por lo facil. Por si le sirve a alguien posteo el codigo para posicionar un servo a 90º con Interrupcion por timer0 a 48MHz.
Código: C
  1. /* ** Archivo con definicion de registros y bits del microcontrolador elegido ** */
  2.  
  3. #include <p18f4550.h>
  4.  
  5. /* ** Archivo con definicion de registros para uso del timer ** */
  6.  
  7. #include <timers.h>
  8.  
  9. /* ** Configuracion de los fuses del Microcontrolador ** */
  10.  
  11.     #pragma config PLLDIV   = 5         // (20 MHz crystal )
  12.     #pragma config CPUDIV   = OSC1_PLL2  
  13.     #pragma config USBDIV   = 2         // Clock source from 96MHz PLL/2
  14.     #pragma config FOSC     = HSPLL_HS
  15.     #pragma config FCMEN    = OFF
  16.     #pragma config IESO     = OFF
  17.     #pragma config PWRT     = OFF
  18.     #pragma config BOR      = ON
  19.     #pragma config BORV     = 3
  20.     #pragma config VREGEN   = ON      //USB Voltage Regulator
  21.     #pragma config WDT      = OFF
  22.     #pragma config WDTPS    = 32768
  23.     #pragma config MCLRE    = ON
  24.     #pragma config LPT1OSC  = OFF
  25.     #pragma config PBADEN   = OFF
  26. //  #pragma config CCP2MX   = ON
  27.     #pragma config STVREN   = ON
  28.     #pragma config LVP      = OFF
  29. //  #pragma config ICPRT    = OFF       // Dedicated In-Circuit Debug/Programming
  30.     #pragma config XINST    = OFF       // Extended Instruction Set
  31.     #pragma config CP0      = OFF
  32.     #pragma config CP1      = OFF
  33. //  #pragma config CP2      = OFF
  34. //  #pragma config CP3      = OFF
  35.     #pragma config CPB      = OFF
  36. //  #pragma config CPD      = OFF
  37.     #pragma config WRT0     = OFF
  38.     #pragma config WRT1     = OFF
  39. //  #pragma config WRT2     = OFF
  40. //  #pragma config WRT3     = OFF
  41.     #pragma config WRTB     = OFF       // Boot Block Write Protection
  42.     #pragma config WRTC     = OFF
  43. //  #pragma config WRTD     = OFF
  44.     #pragma config EBTR0    = OFF
  45.     #pragma config EBTR1    = OFF
  46. //  #pragma config EBTR2    = OFF
  47. //  #pragma config EBTR3    = OFF
  48.     #pragma config EBTRB    = OFF
  49.  
  50. //--------------------------------------------------------------
  51.  
  52. void main (void);
  53. void InterruptHandlerHigh (void);
  54.  
  55. unsigned char FlagTMR0 = 0;
  56. unsigned char countTMR0 = 0;
  57. unsigned char FlagSERVO1 = 0;
  58. //--------------------------------------------------------------
  59.  
  60. /* ** Main Routine ** */
  61.  
  62. void main ()
  63. {
  64.         unsigned char valorTIMER0,
  65.  
  66.         ADCON1 = 0x0F;
  67.         TRISE = 0x00;
  68.         INTCON = 0x20;
  69.         INTCON2 = 0x84;
  70.         RCONbits.IPEN = 1;
  71.         OpenTimer0( TIMER_INT_ON &
  72.                                 T0_8BIT &
  73.                                 T0_SOURCE_INT &
  74.                                 T0_PS_1_256 );
  75.         WriteTimer0(82);
  76.         INTCONbits.GIEH = 1;
  77.         LATE = 0x00;
  78.  
  79.         do
  80.         {
  81.                 if(FlagTMR0 == 1)
  82.                 {
  83.                         FlagTMR0 = 0;
  84.                         LATE = 0x01;
  85.                         FlagSERVO1 = 1;
  86.                 }
  87.                 if(FlagSERVO1 == 1)
  88.                 {
  89.                         valorTIMER0 = ReadTimer0();
  90.                         if(valorTIMER0 > 117)
  91.                         {
  92.                                 FlagSERVO1 = 0;
  93.                                 LATE = 0x00;
  94.                         }
  95.                 }
  96.  
  97.         }while(1);
  98. }
  99.  
  100. //--------------------------------------------------------------
  101.  
  102. /* ** High priority interrupt vector ** */
  103.  
  104. #pragma code InterruptVectorHigh = 0x08
  105. void InterruptVectorHigh(void)
  106. {
  107.         _asm goto InterruptHandlerHigh _endasm
  108. }
  109.  
  110. //--------------------------------------------------------------
  111.  
  112. /* ** High priority interrupt routine ** */
  113.  
  114. #pragma code
  115. #pragma interrupt InterruptHandlerHigh
  116.  
  117. void InterruptHandlerHigh ()
  118. {
  119.         if (INTCONbits.TMR0IF)
  120.         {
  121.                 INTCONbits.TMR0IF = 0;
  122.                 ++countTMR0;
  123.                 if(countTMR0 == 3)
  124.                 {
  125.                         WriteTimer0(82);
  126.                 }
  127.                         if(countTMR0 == 4)
  128.                         {
  129.                                 FlagTMR0 = 1;
  130.                                 countTMR0 = 0;
  131.                         }
  132.         }
  133. }
  134.  
  135. //--------------------------------------------------------------

Ahora toca controlarlo por puerto serie con la PC.

Saludos!