Autor Tema: Mover SERVO por puerto USB a través del ejemplo de RedPIC  (Leído 6291 veces)

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

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Mover SERVO por puerto USB a través del ejemplo de RedPIC
« en: 22 de Julio de 2006, 18:46:31 »
Hola a todos:

He mezclado el ejemplo de RedPIC de como mover un servo a través de un PIC y el RS232 y lo e intentado mejorar haciendolo por puerto USB pero resulta que no me entra nunca en la subrutina de interrupción ya que no se me enciende el LEDVerde

Haber si alguien le puede hechar un vistazo al código y me dice que le ocurre.

Creo que debe de ser algo de prioridad de interrupciones, ya que el puerto USB tambien usa interrupciones y debo de estar haciendo un conflicto...

Aqui os posteo el código con CCS, por cierto el cristal es de 12 MHz y las interrupciones las hago cada 10us, con la formulita de RedPIC:

    MiTIMER0 = 256 - (Time / (4/FOSC) )  (2)

donde MiTIMER0 es el valor a escribir en el Contador TIMER0, Time es el tiempo en segundos (S) que deseamos conseguir para RTCC y FOSC es la frecuencia de oscilación de nuestro cristal en Hercios (Hz)

Con lo que cargamos el TIMER0 con    set_TIMER0(/*e2h*/11100010);//226 -> 10 us


// servo_pwm_232

// Ejemplo con un servo FUTABA S3003
// Alimentación y pulsos a 5V
// Cuadro de Tiempos :
//    Periodo 20 ms (Frecuencia 50 Hz)
//    Ancho Pulso minimo 0.9 ms
//    Ancho pulso medio  1.5 ms
//    Ancho pulso maximo 2.1 ms
//    TMR0 a 1:16 -> 1 RTCC cada 2500 us
//                -> 1 Tick cada 10 us
//                -> 20 ms = 8 Servos
//    Ancho Pulso minimo 0.9 ms ->  90 ticks de TMR0 -> 900 us -> 0.9 ms
//    Ancho pulso medio  1.5 ms ->  150 ticks de TMR0 -> 1500 us -> 1.5 ms
//    Ancho pulso maximo 2.1 ms ->  210 ticks de TMR0 -> 2100 us -> 2.1 ms


#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=12000000)


/////////////////////////////////////////////////////////////////////////////
//
// CCS Library dynamic defines.  For dynamic configuration of the CCS Library
// for your application several defines need to be made.  See the comments
// at usb.h for more information
//
/////////////////////////////////////////////////////////////////////////////
#define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    8                 //size to allocate for the tx endpoint 1 buffer //Este es el original
#define USB_EP1_RX_SIZE    8                 //size to allocate for the rx endpoint 1 buffer //Este es el original, si lo cambio me da error


/////////////////////////////////////////////////////////////////////////////
//
// If you are using a USB connection sense pin, define it here.  If you are
// not using connection sense, comment out this line.  Without connection
// sense you will not know if the device gets disconnected.
//       (connection sense should look like this:
//                             100k
//            VBUS-----+----/\/\/\/\/\----- (I/O PIN ON PIC)
//                     |
//                     +----/\/\/\/\/\-----GND
//                             100k
//        (where VBUS is pin1 of the USB connector)
//
/////////////////////////////////////////////////////////////////////////////
//#define USB_CON_SENSE_PIN PIN_B2  //CCS 18F4550 development kit has optional conection sense pin

/////////////////////////////////////////////////////////////////////////////
//
// Include the CCS USB Libraries.  See the comments at the top of these
// files for more information
//
/////////////////////////////////////////////////////////////////////////////
#include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <driver_usb.h>         //Configuración del USB y los descriptores para este dispositivo
#include <usb.c>           //handles usb setup tokens and get descriptor reports
#include <stdlib.h>

#define SERVO   PIN_A2

#define LEDV    PIN_B6
#define LEDR    PIN_B7

#define LED_ON  output_high
#define LED_OFF output_low


const int ticks_PULSO_MINIMO  =  90;
const int ticks_PULSO_MEDIO   =  150;
const int ticks_PULSO_MAXIMO  =  210;

int1 flagRTCC     = 0;
int   contRTCC    = 0;
int1 flagSERVO1 = 0;
int   tSERVO1     = ticks_PULSO_MEDIO;

#int_RTCC
RTCC_isr(){
   ++contRTCC;
      LED_ON(LEDV);
      if(contRTCC==2000)//20ms
      {
      flagRTCC=1;
      contRTCC=0x00;
      }
}


//PROGRAMA PRINCIPAL
void main(void) {

   int recibe[2];                  //declaramos variables
   int8 out_data[2];

   int ValTIMER0;                   //del TIMER0

   LED_OFF(LEDV);                   //encendemos led rojo
   LED_ON(LEDR);

   usb_init();                      //inicializamos el USB

   usb_task();                      //habilita periferico usb e interrupciones
   usb_wait_for_enumeration();     //esperamos hasta que el USB sea configurado por el host

   LED_OFF(LEDR);
   LED_OFF(LEDV);                    //apagamos LEDs

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////Activamos las interrupciones despues de declarar todas la variables y lo que haga falta/////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
   //enable_interrupts(int_rda);
   enable_interrupts(global);

   set_TIMER0(/*e2h*/11100010);//226 -> 10 us
   enable_interrupts(INT_RTCC);


   while (TRUE)
   {
      if(usb_enumerated())          //si el PicUSB está configurado
      {
         if (usb_kbhit(1))          //si el endpoint de salida contiene datos del host
         {
            //RECOJEMOS DATO DEL SERVO
            usb_get_packet(1, recibe, 2);

            //Disparo del pulso PWM
               if(flagRTCC==1)
               {
                  flagRTCC=0;
                  output_high(SERVO);
                  flagSERVO1=1;
               }

            //Control del ancho del pulso
               if(flagSERVO1==1)
                  {
                     valTIMER0=get_TIMER0();
                     if(valTIMER0>tSERVO1)
                     {
                        flagSERVO1=0;
                        output_low(SERVO);
                     }
                  }

               if(recibe[0]==-3)
               {
                  tSERVO1=ticks_PULSO_MINIMO;
               }
               if(recibe[0]==0)
               {
                  tSERVO1=ticks_PULSO_MEDIO;
               }
               if(recibe[0]==3)
               {
                  tSERVO1=ticks_PULSO_MAXIMO;
               }
            }

            usb_put_packet(1, out_data, 2, USB_DTS_TOGGLE);//enviamos el paquete de tamaño 1byte del EP1 al PC
         }
      }
   }
}

La parte del USB funciona a la perfección ya que si he podido mover un servo a la bruto, es decir usando delays  :D :D :D :D :D :D :D :D

Haber si alguien se apunta y me dice que le pasa a esto, yo mientras tanto seguiré estudiando haber que le pasa a esto  :-) :-) :-) :-) :-) :-)

Gracias a todos chavales, sobre todo a la peña como RedPIC, Nocturno, etc... que hace de este foro más y más grande  :-/ :-/ :-/ :-/
« Última modificación: 22 de Julio de 2006, 18:50:12 por c4_esp_VR »

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Mover SERVO por puerto USB a través del ejemplo de RedPIC
« Respuesta #1 en: 22 de Julio de 2006, 18:57:33 »
Si usas contRTCC para contar 2000 interrupciones no puedes declararla como int ya que entonces solo contaras desde 0 hasta 255 y al incrementarla de nuevo volvera a empezar por lo que nunca alcanzará el valor de 2000. Debes declararla como long para poder contar de 0 a 65.535 .....

eso pa empezar  :D  :D  :D

Independiente de eso ... ¿para qué te hace falta una interrupción cada 10 us? ¿no es demasiado? Yo que tu la pondría cada mucho mas tiempo y contaba menos interrupciones ... creo. En mi programa original pongo 1 RTCC cada 4.096 ms y cuento solo 4 interrupciones y media para un periodo de 20ms de un servo como Dios manda ...  :mrgreen:  :mrgreen:  :mrgreen:

Edito I: Mas cosas ... Le he hechado una visual al Datasheet .... y veo que el Timer0 en el 18F2550 es un poco bastante distinto al del 16F876A para el que estaba hecho el programa original. Para empezar el registro de configuracion T0CON se inicializa al reset con todos los bits a 1 asi que te recomiento que investigues si esta inicializacion es compatible con lo que esperas de él.

Edito II: Para la serie 18F hecho en falta el  setup_timer_0(RTCC_INTERNAL); setup_timer_0(RTCC_8_BIT); o similar ...






« Última modificación: 22 de Julio de 2006, 19:18:36 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Mover SERVO por puerto USB a través del ejemplo de RedPIC
« Respuesta #2 en: 23 de Julio de 2006, 04:56:03 »
Lo primera gracias por contestar tan ràpidamente  :mrgreen: :mrgreen: :mrgreen: :mrgreen:

La verdad es que antes usé el TIMER0 de la forma que me estas diciendo y si que iva pera al ver que ya tenía el ejemplo tuyo pa que darle más vueltas, así que veo que tendré que darle más vueltas, lo intentaré hacer pa esta tarde y luego te cuento.

Que las interrupciones sean cada 10 us no es casualidad, sino resolución a la hora de darle una posición al servo con lo que me saldría una resolución de 1.5º del servo lo cual creo que ni el servo tiene dicha resolución, pero al menos nuestro sistema si  :D :D :D :D :D :D :D :D

Dentro de un par de horas te comento.

Gracias RedPic.

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Mover SERVO por puerto USB a través del ejemplo de RedPIC
« Respuesta #3 en: 23 de Julio de 2006, 12:57:58 »
Bueno llevo toda la tarde intentándolo y he conseguido avanzar un poquito.

He conseguido que realice las interrupciones a cambio de que la transmisión de datos del PC al PIC vaya a la velocidad del "pedo" y que el envío de datos del PIC al PC no funcione, así que mucho no es que haya conseguido  :8} :8} :8} :8} :8} :8} :8} :8} :8} :8} :8} :8}

Aqui os dejo el código, haber si me puedes decir que le pasa a esto RedPic  :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/


#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=12000000)


/////////////////////////////////////////////////////////////////////////////
//
// CCS Library dynamic defines.  For dynamic configuration of the CCS Library
// for your application several defines need to be made.  See the comments
// at usb.h for more information
//
/////////////////////////////////////////////////////////////////////////////
#define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    8                 //size to allocate for the tx endpoint 1 buffer //Este es el original
#define USB_EP1_RX_SIZE    8                 //size to allocate for the rx endpoint 1 buffer //Este es el original, si lo cambio me da error
/////////////////////////////////////////////////////////////////////////////
//
// If you are using a USB connection sense pin, define it here.  If you are
// not using connection sense, comment out this line.  Without connection
// sense you will not know if the device gets disconnected.
//       (connection sense should look like this:
//                             100k
//            VBUS-----+----/\/\/\/\/\----- (I/O PIN ON PIC)
//                     |
//                     +----/\/\/\/\/\-----GND
//                             100k
//        (where VBUS is pin1 of the USB connector)
//
/////////////////////////////////////////////////////////////////////////////
//#define USB_CON_SENSE_PIN PIN_B2  //CCS 18F4550 development kit has optional conection sense pin

/////////////////////////////////////////////////////////////////////////////
//
// Include the CCS USB Libraries.  See the comments at the top of these
// files for more information
//
/////////////////////////////////////////////////////////////////////////////
#include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <driver_usb.h>         //Configuración del USB y los descriptores para este dispositivo
#include <usb.c>           //handles usb setup tokens and get descriptor reports
#include <stdlib.h>

#define SERVO   PIN_A2

#define LEDV    PIN_B6
#define LEDR    PIN_B7

#define LED_ON  output_high
#define LED_OFF output_low

#define rx_servo recibe[0]

//#priority USB //Damos prioridad a las interrupciones del puerto usb

int contador=0;

#int_timer1
void isr_timer1(void)
{
   if(contador>0 && contador<4)
   {
      LED_ON(LEDV);

   }
   if(contador>5 && contador<9)
   {
      LED_OFF(LEDV);
      contador=0;

   }
      set_timer1(0);
}

//PROGRAMA PRINCIPAL
void main(void) {

   int recibe[2];                  //declaramos variables
   int8 out_data[2];

   LED_OFF(LEDV);                   //encendemos led rojo
   LED_ON(LEDR);

   usb_init();                      //inicializamos el USB

   setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 ); //Cada 0.68ms
   enable_interrupts(INT_TIMER1);
   
   usb_task();                      //habilita periferico usb e interrupciones globales
   usb_wait_for_enumeration();     //esperamos hasta que el USB sea configurado por el host
   
   set_timer1(0);      //reset TMR1
   
   LED_OFF(LEDR);
   LED_OFF(LEDV);                    //apagamos LEDs

   while (TRUE)
   {
      if(usb_enumerated())          //si el PicUSB está configurado
         {
            if (usb_kbhit(1))          //si el endpoint de salida contiene datos del host
            {                                       
               usb_get_packet(1, recibe, 2);

               if (rx_servo == 3) //Dato que enviamos desde el PC al PIC
               {                 
                  out_data[0]=(int8)3;
                  contador++;
               }

               //usb_put_packet(1, out_data, 2, USB_DTS_TOGGLE);//enviamos el paquete de tamaño 1byte del EP1 al PC
            }
      }

   }
}

Creo que esto tiene que ser debido a las interrupciones o algo extraño ya que creo que el programa está bien a no ser que envie un dato desde el PC al PIC y mientras se envie se ejecute la interrupción, ya que el puerto usb es una interrupcion llamada #int_usb la cual si se desactica durante más de 10ms el PC desconecta el dispositivo o por lo menos eso pone las librerias del USB.

Bueno espero vuestras respuestas, de todas formas yo sigo dándole al cayo  :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-)



Desconectado wqtrp

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 170
Re: Mover SERVO por puerto USB a través del ejemplo de RedPIC
« Respuesta #4 en: 23 de Julio de 2006, 13:27:41 »
a ver si entiendo, este prog. recibe paquetes de la PC
si reciibe un 3 en el primer byte incrementa el contador, lo cual hace q prenda el led
sigue recibiendo paquetes hasta q al recibir el sexto paquete apaga el led
es esto lo q hace?

igual hay cosas q no entiendo, pq incrementas el contador en el prog. principal?
para q quieres/usas las interrupcines?
como sabes q la velcidad es mala ?
el envio del PIC al PC esta cmentariado?

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Mover SERVO por puerto USB a través del ejemplo de RedPIC
« Respuesta #5 en: 23 de Julio de 2006, 14:54:38 »
Exactamente hace esto, hago eso porque es la forma más sencilla de ver si el programa entra en las interrupciones y de ver si el PC envía los paquetes de datos.

Incremento el contador para que cada vez que envie un dato se incremente 1 el contador, con lo que al enviar entre 0 y 4 paquetes de datos que contengan 3 el led se enciende, si por el contrario el contador está entre 5 y 9 el led se apaga y se inicia el contador.

Quiero usarlas para mover varios servos por puerto usb.

La velocidad es mala porque el programa que he exo con c++ va como el culo desde que he activado la interrupción del TIMER1 de exo tarda unos 7 segundos en apagar y encender el LED cuando casi ni se debería de ver y el programa va a tirones, no va fluido.

El envio del PIC al PC está comentado porque no funciona desde que tengo activada la interrupción del TIMER0.

Mas dudas... :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:

Me alegro que te interese el tema  :-/ :-/ :-/ :-/ :-/ :-/ porque así me ayudas de exo ya se porque el LED permanecía menos tiempo apagado que encendido  :D :D :D :D :D

#int_timer1
void isr_timer1(void)
{
   if(contador>0 && contador<4)
   {
      LED_ON(LEDV);

   }
   if(contador>5 && contador<9)
   {
      LED_OFF(LEDV);
     
      if (contador==8)//Sino ponemos esto el led se apaga sólo cuando llega a 5
      {
         contador=0;         
      }
   }
      set_timer1(0);
}

Desconectado wqtrp

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 170
Re: Mover SERVO por puerto USB a través del ejemplo de RedPIC
« Respuesta #6 en: 23 de Julio de 2006, 18:34:23 »
buen ,entnces el prg. hace l q quieres
me pa q el problema debe de estar por el lado del c++
pq no pruebas anular la INT y ver si ls tiempoos siguen iguales


#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=12000000)


/////////////////////////////////////////////////////////////////////////////
//
// CCS Library dynamic defines.  For dynamic configuration of the CCS Library
// for your application several defines need to be made.  See the comments
// at usb.h for more information
//
/////////////////////////////////////////////////////////////////////////////
#define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    8                 //size to allocate for the tx endpoint 1 buffer //Este es el original
#define USB_EP1_RX_SIZE    8                 //size to allocate for the rx endpoint 1 buffer //Este es el original, si lo cambio me da error
/////////////////////////////////////////////////////////////////////////////
//
// If you are using a USB connection sense pin, define it here.  If you are
// not using connection sense, comment out this line.  Without connection
// sense you will not know if the device gets disconnected.
//       (connection sense should look like this:
//                             100k
//            VBUS-----+----/\/\/\/\/\----- (I/O PIN ON PIC)
//                     |
//                     +----/\/\/\/\/\-----GND
//                             100k
//        (where VBUS is pin1 of the USB connector)
//
/////////////////////////////////////////////////////////////////////////////
//#define USB_CON_SENSE_PIN PIN_B2  //CCS 18F4550 development kit has optional conection sense pin

/////////////////////////////////////////////////////////////////////////////
//
// Include the CCS USB Libraries.  See the comments at the top of these
// files for more information
//
/////////////////////////////////////////////////////////////////////////////
#include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <driver_usb.h>         //Configuración del USB y los descriptores para este dispositivo
#include <usb.c>           //handles usb setup tokens and get descriptor reports
#include <stdlib.h>

#define SERVO   PIN_A2

#define LEDV    PIN_B6
#define LEDR    PIN_B7

#define LED_ON  output_high
#define LED_OFF output_low

#define rx_servo recibe[0]

//#priority USB //Damos prioridad a las interrupciones del puerto usb

int contador=0;

#int_timer1
void isr_timer1(void)
{
      set_timer1(0);
}

//PROGRAMA PRINCIPAL
void main(void) {

   int recibe[2];                  //declaramos variables
   int8 out_data[2];

   LED_OFF(LEDV);                   //encendemos led rojo
   LED_ON(LEDR);

   usb_init();                      //inicializamos el USB

   setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 ); //Cada 0.68ms
//   enable_interrupts(INT_TIMER1);
   
   usb_task();                      //habilita periferico usb e interrupciones globales
   usb_wait_for_enumeration();     //esperamos hasta que el USB sea configurado por el host
   
   set_timer1(0);      //reset TMR1
   
   LED_OFF(LEDR);
   LED_OFF(LEDV);                    //apagamos LEDs

   while (TRUE)
   {
      if(usb_enumerated())          //si el PicUSB está configurado
         {
            if (usb_kbhit(1))          //si el endpoint de salida contiene datos del host
            {                                       
               usb_get_packet(1, recibe, 2);

               if (rx_servo == 3) //Dato que enviamos desde el PC al PIC
               {                 
                  out_data[0]=(int8)3;
                  contador++;

   if(contador>0 && contador<4)
   {
      LED_ON(LEDV);

   }
   if(contador>5 && contador<9)
   {
      LED_OFF(LEDV);
      contador=0;

   }


               }

               //usb_put_packet(1, out_data, 2, USB_DTS_TOGGLE);//enviamos el paquete de tamaño 1byte del EP1 al PC
            }
      }

   }
}

ademas el       set_timer1(0); no crresponde alli, ya q solo se puso a 0 y solo l haces perder precicion

pueba con esto para ver si sigue tardando ?????

Suerte

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Mover SERVO por puerto USB a través del ejemplo de RedPIC
« Respuesta #7 en: 23 de Julio de 2006, 19:30:02 »
Ante todo gracias por lo que estas haciendo wqtrp  :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-)

Acabo de probar lo que me has dicho y funciona de la misma forma que la mia, lo que me parece extraño es porque te entra en la interrupción aún habiendo deshabilitado el TIMER1...al comentar //enable_interrupts(INT_TIMER1);  :shock: :shock: :shock: :shock: ya me contarás donde está el truco  :o :o :o :o :o :o :o :o :o o si has deshabilitado la interrupción porqué carajo va lento  :x :x :x :x :x :x :x

No se desde luego que el USB y las interrupciones por contador por separado me funionan ahora cuando las junto cruje todo...el problema de esto es que a partir de tu comentario puede que la parte incorrecta no sea del pic sino del C++ pero me parece extraño pues si no ponemos la interrupción funciona perfectamente...Haber si se nos ocurre algo...hasta mañana por la tarde no puedo volver a exarle el guante a esto así que por la noxe postearé y te contaré como ha ido, de todas formas si se te ocurren cosillas me las vas contando que veo que estas en la onda  :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ de los cracks  :-) :-) :-) :-) :-) :-) GRACIAS.

Desconectado wqtrp

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 170
Re: Mover SERVO por puerto USB a través del ejemplo de RedPIC
« Respuesta #8 en: 23 de Julio de 2006, 21:31:25 »
la idea era probar q pasaba sin interrupcion de timer1 en el PIC
y parece q sucede lo mismo con y sin interrupciones !!!!!
con lo cual deberias dejar de culparlas del problema
el problema esta en otro lado y yo me inclino pr el prog. en c++
trata de aislar los problemas de a uno q si estan varis combinados siempre es mayor el problema
si antes andaba, retrocede hasta donde andaba y avanza mas despacio.
Suerte y mira dentro del c++ si vos lo estas desarrollando.

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Mover SERVO por puerto USB a través del ejemplo de RedPIC
« Respuesta #9 en: 24 de Julio de 2006, 19:41:27 »
Ya lo he conseguido  :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/ :-/

El error estaba en el programa del PIC...ya me parecía a mi raro que me equivoque en C++  :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:

La función kbhit() activa y desactiva la interrupción del usb cuando le llega un paquete de datos con lo que se entremezclavan las dos interrupciones y daba muchos problemas así que si quitamos ponemos las instrucciones que implican incrementar la interrupción dentro de la función usb_enumerate va de lujo, quedado el programa de la siguiente forma:

....

#int_timer1
void isr_timer1(void)
{
   if (rx_servo == 3)
   {
      ++contador;
   }
      //set_timer1(0);//No hace falta restablecerlo, se restablece el sólo cuando termina la cuenta
}

//PROGRAMA PRINCIPAL
void main(void) {

   LED_OFF(LEDV);                   //encendemos led rojo
   LED_ON(LEDR);

   usb_init();                      //inicializamos el USB

   setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_1 ); //Cada 0.68ms
   enable_interrupts(INT_TIMER1);

   usb_task();                      //habilita periferico usb e interrupciones globales
   usb_wait_for_enumeration();     //esperamos hasta que el USB sea configurado por el host

   set_timer1(0);      //reset TMR1

   LED_OFF(LEDR);
   LED_OFF(LEDV);                    //apagamos LEDs

   while (TRUE)
   {
      if(usb_enumerated())          //si el PicUSB está configurado
         {
            if(contador==5)
               {
                  LED_ON(LEDV);
                  out_data[0]=(int8)1;
               }
            if(contador==10)
               {
                  LED_OFF(LEDV);
                  contador=0;
                  out_data[0]=(int8)0;
               }

            if (usb_kbhit(1))          //si el endpoint de salida contiene datos del host
            {
               usb_get_packet(1, recibe, 2);
               usb_put_packet(1, out_data, 2, USB_DTS_TOGGLE);//enviamos el paquete de tamaño 1byte del EP1 al PC
           }
      }
   }
}


Espero que os sirva de ayuda a todos para hacer chapucillas y gracias sobre todo a wqtrp sin el cual no me hubiese sido posible arreglar el programa, muchas gracias  :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-) :-)

See you.

I LOVE THIS OGAME.

Desconectado DSP

  • PIC10
  • *
  • Mensajes: 1
Re: Mover SERVO por puerto USB a través del ejemplo de RedPIC
« Respuesta #10 en: 21 de Noviembre de 2008, 21:56:31 »
Hola a todos:

He mezclado el ejemplo de RedPIC de como mover un servo a través de un PIC y el RS232 y lo e intentado mejorar haciendolo por puerto USB pero resulta que no me entra nunca en la subrutina de interrupción ya que no se me enciende el LEDVerde

Haber si alguien le puede hechar un vistazo al código y me dice que le ocurre.

Creo que debe de ser algo de prioridad de interrupciones, ya que el puerto USB tambien usa interrupciones y debo de estar haciendo un conflicto...

Aqui os posteo el código con CCS, por cierto el cristal es de 12 MHz y las interrupciones las hago cada 10us, con la formulita de RedPIC:

    MiTIMER0 = 256 - (Time / (4/FOSC) )  (2)

donde MiTIMER0 es el valor a escribir en el Contador TIMER0, Time es el tiempo en segundos (S) que deseamos conseguir para RTCC y FOSC es la frecuencia de oscilación de nuestro cristal en Hercios (Hz)

Con lo que cargamos el TIMER0 con    set_TIMER0(/*e2h*/11100010);//226 -> 10 us


// servo_pwm_232

// Ejemplo con un servo FUTABA S3003
// Alimentación y pulsos a 5V
// Cuadro de Tiempos :
//    Periodo 20 ms (Frecuencia 50 Hz)
//    Ancho Pulso minimo 0.9 ms
//    Ancho pulso medio  1.5 ms
//    Ancho pulso maximo 2.1 ms
//    TMR0 a 1:16 -> 1 RTCC cada 2500 us
//                -> 1 Tick cada 10 us
//                -> 20 ms = 8 Servos
//    Ancho Pulso minimo 0.9 ms ->  90 ticks de TMR0 -> 900 us -> 0.9 ms
//    Ancho pulso medio  1.5 ms ->  150 ticks de TMR0 -> 1500 us -> 1.5 ms
//    Ancho pulso maximo 2.1 ms ->  210 ticks de TMR0 -> 2100 us -> 2.1 ms


#include <18F2550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=12000000)


/////////////////////////////////////////////////////////////////////////////
//
// CCS Library dynamic defines.  For dynamic configuration of the CCS Library
// for your application several defines need to be made.  See the comments
// at usb.h for more information
//
/////////////////////////////////////////////////////////////////////////////
#define USB_HID_DEVICE     FALSE             //deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    8                 //size to allocate for the tx endpoint 1 buffer //Este es el original
#define USB_EP1_RX_SIZE    8                 //size to allocate for the rx endpoint 1 buffer //Este es el original, si lo cambio me da error


/////////////////////////////////////////////////////////////////////////////
//
// If you are using a USB connection sense pin, define it here.  If you are
// not using connection sense, comment out this line.  Without connection
// sense you will not know if the device gets disconnected.
//       (connection sense should look like this:
//                             100k
//            VBUS-----+----/\/\/\/\/\----- (I/O PIN ON PIC)
//                     |
//                     +----/\/\/\/\/\-----GND
//                             100k
//        (where VBUS is pin1 of the USB connector)
//
/////////////////////////////////////////////////////////////////////////////
//#define USB_CON_SENSE_PIN PIN_B2  //CCS 18F4550 development kit has optional conection sense pin

/////////////////////////////////////////////////////////////////////////////
//
// Include the CCS USB Libraries.  See the comments at the top of these
// files for more information
//
/////////////////////////////////////////////////////////////////////////////
#include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <driver_usb.h>         //Configuración del USB y los descriptores para este dispositivo
#include <usb.c>           //handles usb setup tokens and get descriptor reports
#include <stdlib.h>

#define SERVO   PIN_A2

#define LEDV    PIN_B6
#define LEDR    PIN_B7

#define LED_ON  output_high
#define LED_OFF output_low


const int ticks_PULSO_MINIMO  =  90;
const int ticks_PULSO_MEDIO   =  150;
const int ticks_PULSO_MAXIMO  =  210;

int1 flagRTCC     = 0;
int   contRTCC    = 0;
int1 flagSERVO1 = 0;
int   tSERVO1     = ticks_PULSO_MEDIO;

#int_RTCC
RTCC_isr(){
   ++contRTCC;
      LED_ON(LEDV);
      if(contRTCC==2000)//20ms
      {
      flagRTCC=1;
      contRTCC=0x00;
      }
}


//PROGRAMA PRINCIPAL
void main(void) {

   int recibe[2];                  //declaramos variables
   int8 out_data[2];

   int ValTIMER0;                   //del TIMER0

   LED_OFF(LEDV);                   //encendemos led rojo
   LED_ON(LEDR);

   usb_init();                      //inicializamos el USB

   usb_task();                      //habilita periferico usb e interrupciones
   usb_wait_for_enumeration();     //esperamos hasta que el USB sea configurado por el host

   LED_OFF(LEDR);
   LED_OFF(LEDV);                    //apagamos LEDs

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////Activamos las interrupciones despues de declarar todas la variables y lo que haga falta/////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
   setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
   //enable_interrupts(int_rda);
   enable_interrupts(global);

   set_TIMER0(/*e2h*/11100010);//226 -> 10 us
   enable_interrupts(INT_RTCC);


   while (TRUE)
   {
      if(usb_enumerated())          //si el PicUSB está configurado
      {
         if (usb_kbhit(1))          //si el endpoint de salida contiene datos del host
         {
            //RECOJEMOS DATO DEL SERVO
            usb_get_packet(1, recibe, 2);

            //Disparo del pulso PWM
               if(flagRTCC==1)
               {
                  flagRTCC=0;
                  output_high(SERVO);
                  flagSERVO1=1;
               }

            //Control del ancho del pulso
               if(flagSERVO1==1)
                  {
                     valTIMER0=get_TIMER0();
                     if(valTIMER0>tSERVO1)
                     {
                        flagSERVO1=0;
                        output_low(SERVO);
                     }
                  }

               if(recibe[0]==-3)
               {
                  tSERVO1=ticks_PULSO_MINIMO;
               }
               if(recibe[0]==0)
               {
                  tSERVO1=ticks_PULSO_MEDIO;
               }
               if(recibe[0]==3)
               {
                  tSERVO1=ticks_PULSO_MAXIMO;
               }
            }

            usb_put_packet(1, out_data, 2, USB_DTS_TOGGLE);//enviamos el paquete de tamaño 1byte del EP1 al PC
         }
      }
   }
}

La parte del USB funciona a la perfección ya que si he podido mover un servo a la bruto, es decir usando delays  :D :D :D :D :D :D :D :D

Haber si alguien se apunta y me dice que le pasa a esto, yo mientras tanto seguiré estudiando haber que le pasa a esto  :-) :-) :-) :-) :-) :-)

Gracias a todos chavales, sobre todo a la peña como RedPIC, Nocturno, etc... que hace de este foro más y más grande  :-/ :-/ :-/ :-/

Saludos a todos
Quizas sea muy basico el error que tengo pero necesito su ayuda . Utilizo el compilador CCS PCB,PCM y PCH 3.18 para los 18f452 y 252, y muchos mas. Cuando quize hacer una prueba con el 18F4550 me sale que no tengo el 18F4550.h. ¿Me podrían dar una mano para encontrarlo o solucionar the problem? Desde ya gracias


 

anything