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
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