Autor Tema: Controlando un servo en C18  (Leído 2595 veces)

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

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Controlando un servo en C18
« 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.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Controlando un servo en C18
« Respuesta #1 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.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Controlando un servo en C18
« Respuesta #2 en: 27 de Noviembre de 2011, 08:50:46 »
Gracias MerLiNz por tu respuesta ¿Cual seria la manera correcta de crear la funcion?

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

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Controlando un servo en C18
« Respuesta #3 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.
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Controlando un servo en C18
« Respuesta #4 en: 27 de Noviembre de 2011, 15:30:59 »
No funciona como deberia seguire probando  :5]
« Última modificación: 27 de Noviembre de 2011, 18:00:56 por Miquel_S »
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Controlando un servo en C18
« Respuesta #5 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!
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.


 

anything