Buenas a todos, haber si alguien me puede ayudar, sigo con mi proyecto USB en el 18f4550. Tengo q capturar un voltaje por RA0 y las interrupciones de un encoder por RB0 y RB1, despues enviar los valores por USB. He desarrollado el siguiente codigo, donde la comunicación USB funciona correctamente, también la captura del ADC, pero he tenido problemas con las interrupciones RB0 y RB1 ya que no me captura la cantidad de interrupciones recibidas. He programado varios PIC's y he modificado muchas veces el codigo pero nada q encuentro el fallo, entonces he programado el PIC y lo he montado en protoboard, luego he mirado los voltajes en RB0 y RB1 y resulta q me aparecen 4V en RB0 y 1,5V en RB1 y no tengo ni idea por q razon salen esos voltajes si estoy configurando RB0 y RB1 como entradas y el resto como salidas. Me gustaria q alguien probara mi código y me dijera si tambien salen esos voltajes en RB0 y RB1. El codigo es el siguiente:
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#use fast_io(b)
#Byte PortB = 0xF81
#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 32 // size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE 32 // size to allocate for the rx endpoint 1 buffer
#include <pic18_usb.h> // Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include "header.h" // Configuración del USB y los descriptores para este dispositivo
#include <usb.c> // handles usb setup tokens and get descriptor reports
int16 x = 0;
int16 adc0=0;
char voltage[9];
char bufer[];
char Conexion[] = "o.k";
const int8 Lenbuf = 32;
int8 recbuf[Lenbuf];
#INT_EXT
void prueba()
{
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 por flanco de bajada.
If (Bit_Test(PortB, 1)) // Si RB1 está a 1,
{
x++; // entonces incrementar una unidad el valor de X.
}
}
Else // Si RB0 se ha puesto a 0 (flanco de bajada),
{
Ext_Int_Edge(L_TO_H); // entonces activar la siguiente interrupción por flanco de subida.
If (Bit_Test(PortB, 1)) // Si RB1 está 1,
{
x--; // entonces decrementar una unidad el valor de X.
}
}
}
void main()
{
port_b_pullups(false);
setup_adc_ports(AN0|VSS_VDD);//para escoger el canal cero y el vss y vdd
SETUP_ADC(ADC_CLOCK_INTERNAL);//la frecuencia de muestreo es 2-6us
SET_ADC_CHANNEL(0);
delay_ms(333);
disable_interrupts(Int_Ext);
disable_interrupts(GLOBAL);
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_B(0b00000000); // Puerto B todo entradas (sólo usamos las entradas RB0 y RB1).
PortB=0;
usb_init();
usb_task();
delay_ms(333);
output_high(PIN_C2);
while (TRUE) // Si el PIC esta conectado al PC a través del USB.
{
while(!usb_enumerated())
{
output_high(PIN_B0);
delay_ms(500);
output_low(PIN_B0);
output_high(PIN_B1);
delay_ms(500);
output_low(PIN_B1);
output_high(PIN_B2);
delay_ms(500);
output_low(PIN_B2);
output_high(PIN_B3);
delay_ms(500);
output_low(PIN_B3);
output_high(PIN_B4);
delay_ms(500);
output_low(PIN_B4);
output_high(PIN_B5);
delay_ms(500);
output_low(PIN_B5);
output_high(PIN_B6);
delay_ms(500);
output_low(PIN_B6);
output_high(PIN_B7);
delay_ms(500);
output_low(PIN_B7);
}
while(usb_enumerated())
{
if (usb_kbhit(1))
{
usb_get_packet(1, recbuf, Lenbuf);
if(recbuf[0]==127)
{
output_high(PIN_B2);
}
if(recbuf[0]==126)
{
output_low(PIN_B2);
}
if(recbuf[0]==125)
{
usb_put_packet(1,Conexion,3,USB_DTS_TOGGLE);
output_high(PIN_B2);
}
if(recbuf[0]==124)
{
output_high(PIN_D6);
output_low(PIN_D7);
}
if(recbuf[0]==123)
{
output_high(PIN_D7);
output_low(PIN_D6);
}
if(recbuf[0]==122)
{
output_low(PIN_D7);
output_low(PIN_D6);
}
if(recbuf[0]==121)
{
int16 muestra;
int s;
for(s=0;s<=64;s++)
{
muestra = read_adc(); //para leer el valor del adc0
adc0=adc0+muestra;
delay_ms(50);
}
adc0=adc0/65;
sprintf(voltage, "%f", (float)adc0 * 0.01960784); //esta instruccion nos permite convertir el valor del adc en un string.
usb_put_packet(1,voltage,4,USB_DTS_TOGGLE);//con esta instruccion mandamos el arrglo que se creo en la instruccion anterior
}
if(recbuf[0]==120)
{
char contador[6];
sprintf(contador, "%06lu", x);
usb_put_packet(1,contador,6,USB_DTS_TOGGLE);
}
}
}
}
}
Creo que el problema esta a la hora de configurar el ADC o depronto debido a las resistencias pull-up de RB0 y RB1, no se si tengo errores en esas partes.