Autor Tema: proyecto con DEMO09s08LC60, dudas  (Leído 2134 veces)

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

Desconectado kichijiro

  • PIC10
  • *
  • Mensajes: 3
proyecto con DEMO09s08LC60, dudas
« en: 06 de Marzo de 2010, 15:52:36 »
wenas. soy un estudiante de ing. y estoy realizando un proyecto de medir la velocidad de un motor y segun sea la velocidad de este apagarlo o conectarlo de nuevo, para el proyecto estoy usando un Demo09s08lc60. He estado aprendiendo por mi cuenta a programar en c entonces tengo ciertas dudas.
para medir la velocidad, usare un sensor que cada vez que da una vuelta el motor el sensor envia un pulso,  creo que tengo que usar el modulo INPUT CAPTURE, lo que he echo es configurarlo por flancos de subida entonces cada vez que llega un pulso por el  ptc2 se produce una interrupcion al cambiar el CH0F. En la interrupcion incremento la variable RPS para que me haga de contador. tambien configuro el TPM para que cuando pase un segundo cambie el TOF y se produzca una interrupcion, entonces multiplico la variable RPS * 60 para obtener las RPM variable vueltasmin.
Lo que no consigo en este punto es mostrar la variable vueltasmin en pantalla no se que instruccion tengo que poner o como la tengo que poner para que aparezca en decimal el numero de vueltas a las que va el motor, use el printf y no me la acepta por eso uso el PrintString pero con el solo he conseguido escribir en al pantalla lo que escribo pero no lo que hay guardado en la variable. Si pongo PrintString (vueltasmin) en pantalla me sale vueltasmin cuando yo lo que querria es que me pusiera por ejemplo 1500
si me pudieran ayudar con mis dudas les estaria agradecido. aki les dejo lo que he programado hasta ahora

Citar
/////////////////////////////////////////////////////////////////////////
//         control de velocidad                                                          //
//-------------------------------------------------------------------- //
/////////////////////////////////////////////////////////////////////////

#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#include "lcd.h"
#include "math.h"

unsigned short RPS=0; //inicializacion de variable
unsigned int vueltasmin=0; //inicializacion variable


/////////////////////////////////////////////////////////////////////////
// Inicializacion de los perifericos y registros                                  //
//---------------------------------------------------------------------//
// los pines que no utilicemos estaran configurados como salida para   //
//que por ellos no entre ruido al micro                                   //
/////////////////////////////////////////////////////////////////////////
 void PeriphInit(void)
 {
 // desactivar COP, habilitar los pines de RESET y BKGD
SOPT1=0x13;

#if!CLOCK
//Seleccion del modo FEE para fBUS=8MHz
//Uso del rango bajo del cristal oscilador.FLL prescaler factor(P)=64
ICGC1=0x38;
// Sets MFD multiplication factor(N)to 4 and RFD divisor(R)to 1
ICGC2=0x20;
//Waita until FLL frequency is locked
while(!(ICGS1 & 0x08));

 #else
// Selects FEI mode
// Sets trimming for fBUS about 8 MHz
ICGTRM = NVICGTRM;
// Using internal reference clock. FLL prescaler factor (P) = 64
ICGC1 = 0x28;
// Sets MFD multiplication factor (N) to 14 and RFD divisor (R) to 2
ICGC2 = 0x51;
// Waits until FLL frequency is locked
while (!(ICGS1 & 0x08))
;
   #endif

// configurar puertos
   
    // PTA[7..0]  output
  PTAD = 0x00;
  PTADD = 0xFF;
 
  // PTB[7..0]  output
  PTBD = 0x00;
  PTBDD  = 0xFF;
 
   // PTC output   menos el ptc2  entrada del sensor de velocidad
  PTCD = 0x00;
  PTCDD = 0xFB;
  //PTC2 PULL UP
  PTCPE=0x04;
 
  //////////////////////////////////////////////////////////////////////////////////////////////////////
  // configuración del TPM                                                                            //
  // TPM1SC: selección del XCLK, Prescale 128                                                         //
  // config. del MOD a 1 segundo con clock de 8MHz. Necesitaremos  62500 ciclos para obtener 1 segundo//
  // asi que 16 bits F828                                                                             //
  //                                                                                                           //
  // configuracion del TPM para medicion de 1 mseg para el delay del deslizamiento de la pantalla      //
  //////////////////////////////////////////////////////////////////////////////////////////////////////
 
  TPM1SC=0x57; //registros de control
  TPM1MODH=0xF8;     
  TPM1MODL=0x28;
  TPM1C0SC=0x44;//configuración flancos de subida
 
   // Contador en el tpm2 de 1ms
  TPM2MOD = 8000;
  // Stop timer y seleccion de 1 como prescaler divisor
  TPM2SC = 0x00;
 
  // Initializes LCD Driver Peripheral
 LCDInit();   
 LCDOnOffState();
 }
/////////////////////////////////////////////////////////////////////////
// RUTINA DE ATENCION A LA INTERRUPCION DEL CANAL 0 DEL TPM1 (TPM1CH0) //
//       SE EJECUTA CADA VEZ QUE HAY UNA VARIACION EN EL PTC2 DE 0->1  //
//                 LO QUE HACE QEU SE PONGA A 1 EL CHOF                //
/////////////////////////////////////////////////////////////////////////
interrupt 5 void Vtpm1Ch0(void)
{
    RPS++;     //incremento de la variable
   
  // limpia el flag de interrupcion CHOF
TPM1C0SC_CH0F=0;
}
 
//////////////////////////////////////////////////////////////////////////
// RUTINA DE ATENCION A LA INTERRUPCION DEL TPM AL TRANSCURRIR 1 SEGUNGO//
//                                                                      //
//////////////////////////////////////////////////////////////////////////
interrupt 7 void Vtpm1tovf(void)
{
vueltasmin=RPS*60;

// aqui seria donde vendria el codigo para mostrar las vueltas



////////////////////// ///// //////////
// no esta hecho aun qeu hacer cuando esta a 1500, o 500//
/////////////////////////////////////////   
///if(vueltasmin>1500)
 //             LCDWriteSegment(ALARM,0);
 //                    // desconectar
//
//if(vueltasmin<500)
//
//                      //conectar
//
 ///if(vueltasmin==0)
//
//                  //estado de reposo
 //                 //viene a apagar
///////////////////////////////////////////////////////   


//limpiar el RPS

RPS=0;
vueltasmin=0;

//limpia el flag de interrupcion T0F
TPM1SC_TOF=0;

}

/////////////////////////////////////////////////////////////////////////////////////////
// Delay
// --------------------------------------------------------------------------------------
// Delay of multiples of 1ms
/////////////////////////////////////////////////////////////////////////////////////////
void Delay(unsigned char del)
{
  // Selcts fBUS as timer clock source and starts the timer
  TPM2SC = 0x08;
  while(del)
    if(TPM2SC&0x80)
    {
      del--;
      // Clears TOF flag
      TPM2SC &= ~0x80;
    }
  // Stops the timer 
  TPM2SC = 0x00;
}


/////////////////////////////////////////////////////////////////////////////////////////
// PrintString
// --------------------------------------------------------------------------------------
// MUESTRA DATOS EN LA LCD
/////////////////////////////////////////////////////////////////////////////////////////
void PrintString(unsigned char *str)
{
  unsigned char i;

  LCDClear();
  for(i = 0; str != 0; i++)
    LCDPutChar(str, i+1);
   
}

/////////////////////////////////////////////////////////////////////////////////////////
// SlideString
// --------------------------------------------------------------------------------------
// DESLIZA LAS PALABRAS POR LA LCD
/////////////////////////////////////////////////////////////////////////////////////////
void SlideString(unsigned char *str, unsigned char d)
{

  unsigned char i, j, start;

  for(i = 0; str != 0; i++)
  {
    Delay(d);
    LCDClear();
    if(i < NUM_DIGITS)
      start = 0;
    else 
      start = i-NUM_DIGITS+1;
    for(j = start; j <= i; j++)
      LCDPutChar(str[j], NUM_DIGITS-i+j);
  }
 
}

void main(void)
 {

  EnableInterrupts; /* enable interrupts */
  /* include your code here */
  PeriphInit();
  EnableInterrupts;
  //mensage de bienvenida
 SlideString(" MOTOR", 200);
   

  for(;;) {
    __RESET_WATCHDOG(); /* feeds the dog */
  } /* loop forever */
  /* please make sure that you never leave main */
}

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: proyecto con DEMO09s08LC60, dudas
« Respuesta #1 en: 06 de Marzo de 2010, 20:01:20 »
Hola, la función PrintString recibe como parametro una cadena de caracteres, para poder visualizar debes primero convertir el valor de tu variable a una cadena de caracteres usando la función itoa.

Saludos !

Desconectado kichijiro

  • PIC10
  • *
  • Mensajes: 3
Re: proyecto con DEMO09s08LC60, dudas
« Respuesta #2 en: 08 de Marzo de 2010, 19:07:44 »
muchas gracias por contestar tan rapido, he probado tu sugerencia de usar la funcion itoa, pero no me la reconoce, estoy usando el codewarrior, puede ser por ser esa funcion de C++? estoy usando C. o eso o lo que es mas posible es que no la se usar seguire intentando a ver si lo consigo. muchas gracias

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
Re: proyecto con DEMO09s08LC60, dudas
« Respuesta #3 en: 08 de Marzo de 2010, 20:09:58 »
incluiste el archivo de cabecera que contiene esa funcion? saludos
yo en lo particular, lo pongo directamente la funcion itoa en mi main

Código: [Seleccionar]
/* itoa:  convert n to characters in s */
void itoa(int n, char s[])
{
    int i, sign;

    if ((sign = n) < 0)  /* record sign */
        n = -n;          /* make n positive */
    i = 0;
    do {       /* generate digits in reverse order */
        s[i++] = n % 10 + '0';   /* get next digit */
    } while ((n /= 10) > 0);     /* delete it */
    if (sign < 0)
        s[i++] = '-';
    s[i] = '\0';
    reverse(s);
}

o tambien utilizo esta funcion

Código: [Seleccionar]
void bin_to_string(unsigned int value, char *str)
{
  char aux;
  unsigned int unit;
  aux = 0;
  str[0] = str[1] = str[2] = str[3] = str[4] = '0';
  str[5] = 0;
  unit = 10000;
  while (value)
  {
    if (value>=unit)
    {
      value -= unit;
      str[aux]++;
    } else
    {
      aux++;
      unit /= 10;
    }   
  }
  while (str[0]=='0')
  {
    for (aux=0; aux<=4; aux++) str[aux]=str[aux+1];
  }
}


NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado kichijiro

  • PIC10
  • *
  • Mensajes: 3
Re: proyecto con DEMO09s08LC60, dudas
« Respuesta #4 en: 11 de Marzo de 2010, 17:16:27 »
muchas gracias, tu aportacion me a servido de mucho. ya os comentare como va evolucionando mi proyecto


 

anything