Buenas a todos! he visto MUCHA información pero yo tengo un par de dudas todavia sobre USB (gracias a esto he aprendido BASTANTE porque lo he aprendido por mi cuenta).
Yo tengo que hacer un proyecto que me cuente los pulsos de 3 cosas (en 3 terminales y 3 variables) y que los mande a la PC cada minuto.
mis problemas son:
- primera vez que programo en CCS y también en C.
- no se como configurar un temporizador para que me de una señal o puldo o desborde cada minuto para mandar el dato de mis 3 variables cada minuto por eso lo iba a poner con otra cosa que me generar el pulso cada minuto y lo metia a la interrupcion B0 y los pulsos los quiero leer en 3 terminales del puerto B.
- no se como ir sumando a cada variable y lo que mas me detiene:
- NO SE CUAL ES LA INSTRUCCION O COMANDO PARA MANDAR INFO AL PC CON UNA VARIABLE DE palabra (16 bits).
si alguien me guiara o me mandara un simple codigo (que se que no esta dificil porque he programado en otros lenguajes y se como hacerlo en los otros pero no en C y tampoco conozco las instrucciones)
Tengo el siguiente programa que he ido construyendo poco a poco:
---------------------------------------------------------------------------------
#include <18F4550.h> // Usamos el PIC 18F4550, pero puedes declarar cualquiera de los 18Fxx5x
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN // Cristal a 20MHz.
// * Haz clic aquí para ver otras configuraciones del cristal.
#use delay(clock=48000000) // El PLL interno siempre ha de ser de 48MHz. (No es el cuarzo)
#include "usb_cdc.h" // Descripción de funciones del USB.
#include "usb_desc_cdc.h" // Descriptores del dispositivo USB.
#Byte PortA = 0xF80 // Dirección del puerto A para la familia 18Fxx5x.
#Byte PortB = 0xF81 // Dirección del puerto B para la familia 18Fxx5x.
#Byte PortC = 0xF82 // Dirección del puerto C para la familia 18Fxx5x.
#Byte PortD = 0xF83 // Dirección del puerto D para la familia 18Fxx5x (Sólo 40/44 pines).
#Byte PortE = 0xF84 // Dirección del puerto E para la familia 18Fxx5x.
// ------ Variable Global ------
Int16 contador_1 = 0; // Declaramos el valor de X como Word (16 bits). Esta variable
Int16 contador_2 = 0; // ha de ser global porque su valor lo usaremos en la interrupción y
Int16 contador_3 = 0; // en el programa principal. Por tanto declaramos esta variable antes
// de la interrupción y de "void main".
// ------- Interrupción --------
#INT_EXT // Interrupción Externa por RB0: Decodificación de Encoder.
Void IntRB0()
{
// CCS se encarga de desactiva automáticamente cualquier interrupción.
// No hace falta guardar contextos de registros.
If (Bit_Test(PortB, 0)) // Si RB0 se ha puesto a 1 (flanco de subida),
{
Ext_Int_Edge(H_TO_L); // entonces activar la siguiente interrupción para flanco de bajada.
//mandar mis datos de las 3 variables a la PC.
//y resetear mis variables.
}
// Al finalizar la interrupción CCS se encarga de volver a poner automáticamente
// la badera INTF = 0 ---> borra la interrupción para poder permitir la siguiente;
// no hemos de hacer nada por nuestra parte.
}
void main()
{
Port_B_Pullups(FALSE); // Configuración para el PIC 18F4550.
Setup_ADC_Ports(NO_ANALOGS); // Sin comparadores ni ADCs, todo digital, etc...
Setup_adc(ADC_CLOCK_DIV_2);
Setup_spi(SPI_SS_DISABLED);
Setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
Setup_timer_1(T1_DISABLED);
Setup_timer_2(T2_DISABLED,0,1);
Setup_comparator(NC_NC_NC_NC);
Setup_vref(FALSE);
Ext_Int_Edge(L_TO_H); // Inicialmente detectar interrupción por flanco de subida.
Enable_Interrupts(Int_Ext); // Activar Interrupción Externa a través de RB0.
Enable_Interrupts(GLOBAL); // Interrupciones Generales Activadas.
Set_Tris_A(0b11111111); // Puerto A todo entradas (en este caso no usamos el Puerto A).
Set_Tris_B(0b11111111); // Puerto B todo entradas (sólo usamos las entradas RB0 y RB1).
Set_Tris_C(0b11111111); // Puerto C todo entradas (en este caso no usamos el Puerto C).
Set_Tris_D(0b11111111); // Puerto D todo entradas (en este caso no usamos el Puerto D).
Set_Tris_E(0b11111111); // Puerto E todo entradas (en este caso no usamos el Puerto E).
usb_cdc_init(); // Carga el modo CDC (Puerto virtual de comunicaciones).
usb_init(); // Carga el manejo del USB.
char Buffer[20]; // Declaramos (sobradamente) un buffer de 20 bytes.
while(!usb_cdc_connected()) // El PIC espera hasta enlazar con el PC a través del USB.
{
//QUISIERA ENCENDER UN LED CUANDO YA CONECTO EN ALGUN PIN DEL PUERTO B
}
while (TRUE)
{
usb_task();
if (usb_enumerated())
{
If (Bit_Test(PortB, 1)) // Pulso del contador_1,
{
contador_1++ //aumenta en 1 por cada pulso que recibe.
}
If (Bit_Test(PortB, 2)) // Pulso del contador_2,
{
contador_2++ //aumenta en 1 por cada pulso que recibe.
}
If (Bit_Test(PortB, 3)) // Pulso del contador_3,
{
contador_3++ //aumenta en 1 por cada pulso que recibe.
}
// al PC a través del USB.
}
}
No tienen idea cuanto les agradeceria su ayuda (Y ESTOY SEGURO QUE SE PUEDE SIMPLIFICAR EL CODIGO
)
GRACIAS