Bueno este es el code que pude armar para lo que quiero, lo raro es que cuando intento debuggearlo con el CCS me tira errores en cualquier cosa como por ejemplo:
Error 45 "cortinas.c" Line 59 (35,36) Subscript out of range
Error 43 "cortinas.c" Line 59 (36,37) Expecting a declaration
y varios asi..
APLICATION_HID.h
// Definición de constantes y funciones:
// Constantes varias:
#define USB_CONFIG_HID_TX_SIZE 32 // Definimos el tamaño del endpoint de salida.
#define USB_CONFIG_HID_RX_SIZE 32 // Definimos el tamaño del endpoint de entrada.
// Comandos de entrada.
#define SUBIR 0x0A
#define BAJAR 0x0B
#define PARAR 0x0C
#define MOTOR1 0x10
#define MOTOR2 0x20
// Definición de funciones:
void USB_debug();
void config_adcon2(void);
cortina.c
#include <18F2550.h> // Definición de registros internos del PIC18F2550.
//#DEVICE ADC=8 // CAD a 8 bits, justificación a a la derecha.
#DEVICE ADC=10 // CAD a 10 bits, justificación a a la derecha.
//#DEVICE ADC=16 // CAD a 10 bits, justificación a a la izquierda.
#fuses NOMCLR,HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN,NOPBADEN
// NOMCLR: No vamos ha usar el PIN MCLR, el reset se hará por software.
// HSPLL: Utilizaremos un cristal de alta velocidad en conjunto con el PLL.
// NOWDT: No vamos a usar el perro guardian.
// NOPROTECT: Memoria no protejida contra lecturas.
// NOLVP: No utilizamos el modo de programación con bajo voltaje.
// NODEBUG: No utilizamos código para debugear.
// USBDIV: signfica que el clock del usb se tomará del PLL/2 = 96Mhz/2 = 48Mhz.
// PLL1: significa que el PLL prescaler dividirá la frecuencia del cristal. para HS = 20Mhz, PLL = 5.
// con esto se obtiene: 20Mhz/5 = 4Mhz.
// CPUDIV1: El PLL postscaler decide la división en 2 de la frecuencia de salida del PLL de 96MHZ, si queremos 48MHZ, lo dejamos como está.
// VREGEN: habilita el regulador de 3.3 volts que usa el módulo USB.
// NOPBADEN: Todo el Puerto B como I/O digitales.
// Usamos una frecuencia de trabajo de 48Mhz.
#use delay(clock=48000000)
//===========================================================================
//========================================================================================================
// Incluimos librerías utilizadas por la aplicación.
#include <pic18_usb.h> // Drivers's USB del PIC18F2550.
#include "C:\Users\Javier\Desktop\Cortina\Pro\APLICACION_HID.h" // Definición de funciones y hardware utilizado en el programa.
#include "C:\Users\Javier\Desktop\Cortina\Pro\Descriptor_easyHID.h" // Descriptores HID del proyecto.
#include <USB.c> // Funciones del USB.
// Usamos fast_io, en los puertos B
#use fast_io(b)
void USB_debug(){
//No puse ningun led en el circuito para ver si inicio todo bien :/
usb_wait_for_enumeration(); // Espera a ser enumerado por el host.
}
void config_adcon2(void) {
#asm
movlw 0b10111110
iorwf 0xFC0,1
#endasm
}
//===========================================================================================================
void main(void) // Función Principal.
{
// Variables globales.
int8 recibe[USB_EP1_RX_SIZE]; // Declaramos la variable recibe de 32 bytes.
int8 envia[USB_EP1_TX_SIZE]; // Declaramos la variable envía de 32 bytes.
int8 valorPWM1_H=0; // Valor del semiperiodo alto del PWM1.
int8 MotorR=0;
int8 Estado[2];
int16 Vueltas[2];
int16 Recorrido[2];
int8 Paso[2];
const int8 PasosMotor[8] = {0, 3, 2, 1, 4, 7, 6, 5}; //Los pines que se deben activar con los pasos de los 2 motores
// Configuraciones varias.
set_tris_b(0xF0); // Nibble bajo salidas, el alto entradas.
output_b(0x00); // Inicializamos las salidas a 0.
setup_adc_ports(AN0_TO_AN2); // Configura canales usados por el ADC.
setup_adc(ADC_CLOCK_DIV_64); // Asigna la velocidad: relog\64.
config_ADCON2(); // Configuramos el ADCON2.
usb_init(); // Inicializamos el stack USB.
usb_task(); // Habilita el periferico usb y las interrupciones.
USB_debug(); // Nos muestra el estado de conección del USB.
Vueltas[0]=0;
Vueltas[1]=0;
Paso[0]=0;
Paso[1]=1;
while (TRUE) // Bucle infinito.
{
if(usb_enumerated()) // Si el dispositivo está configurado...
{
usb_put_packet(1, envia, USB_CONFIG_HID_TX_SIZE, USB_DTS_TOGGLE); // Enviamos el paquete de datos por USB.
if (usb_kbhit(1)) // Si hay un paquete de datos del host.. en el buffer lo tomamos y guardamos en la variable data.
{
usb_get_packet(1, recibe, USB_CONFIG_HID_RX_SIZE); // En el buffer lo tomamos del EP1 y lo guardamos en la variable recibe....
MotorR=(recibe[1]==MOTOR1 ? 0 : 1);
if (recibe[0]==SUBIR) { // Si recibe comando de control de salidas...
Estado[MotorR] = 1;
Recorrido[MotorR] = recibe[2] * 256 + recibe[3]; //Genero un int16
} else if (recibe[0]==BAJAR) {
Estado[(MotorR] = 2;
Recorrido[MotorR] = recibe[2] * 256 + recibe[3]; //Genero un int16
} else if (recibe[0]==PARAR) {
Estado[MotorR] = 0;
}
}
for (MotorR=0; MotorR<2; MotorR++) {
if (Estado[MotorR] > 0) { //Si no es 0 se tiene que mover
if (Estado[MotorR]==1) {
if (Vueltas[MotorR] >= Recorrido[MotorR]) {
Estado[MotorR]=0;
} else {
Vueltas[MotorR]++;
}
} else if (Estado[MotorR]==2) {
if (Vueltas[MotorR] <= 0) {
Estado[MotorR]=0;
} else {
Vueltas[MotorR]--;
}
}
Paso[MotorR]=Vueltas[MotorR] % 4;
switch(MotorPasos[MotorR * 4 + Paso[MotorR]]) {
case 0 : output_high(PIN_B0); break;
case 1 : output_high(PIN_B1); break;
case 2 : output_high(PIN_B2); break;
case 3 : output_high(PIN_B3); break;
case 4 : output_high(PIN_B4); break;
case 5 : output_high(PIN_B5); break;
case 6 : output_high(PIN_B6); break;
case 7 : output_high(PIN_B7); break;
}
}
}
delay_ms(1); //Dejo una pausa mientras este activado
for (MotorR=0; MotorR<2; MotorR++) { //Desactivo los pines
if (Estado[MotorR] > 0) {
switch(MotorPasos[MotorR * 4 + Paso[MotorR]]) {
case 0 : output_low(PIN_B0); break;
case 1 : output_low(PIN_B1); break;
case 2 : output_low(PIN_B2); break;
case 3 : output_low(PIN_B3); break;
case 4 : output_low(PIN_B4); break;
case 5 : output_low(PIN_B5); break;
case 6 : output_low(PIN_B6); break;
case 7 : output_low(PIN_B7); break;
}
}
}
}
}
}