Gracias a todas tus recomendaciones, seguí con mi proyecto usando el USB en Ubuntu 18.04, para lo cual ya había elaborado un prototipo usando un PIC18f13k50 para recoger los valores de 3 sensores (Temperatura, Voltaje y Cantidad de Luz ambiental) y enviar esta información por USB a un programa en VB6 en Win2. Pero ahora lo he logrado hacer en Linux.
Bien, habiendo realizado un 90% del proyecto, estoy anexando: Un listado del programa en Cpp del proyecto PIC18f13k50, Un listado del Programa en GAMBAS3, un pantallazo del IDE en Linux.
[img]/home/usuario/Documentos/Usb_TempVolt/Captura de pantalla de 2020-12-28 11-09-16.png[/img]
Código:
#include <18F13k50.h>
#fuses HS,NOWDT,NOPROTECT,NOCPB,NOLVP,NODEBUG,MCLR,CPUDIV1,PLLEN,USBDIV1,NOIESO,PUT
#use delay(clock = 48000000)
#define USB_HID_DEVICE TRUE
#define USB_EP1_TX_ENABLE USB_ENABLE_BULK
#define USB_EP1_RX_ENABLE USB_ENABLE_BULK
#define USB_EP1_TX_SIZE 8
#define USB_EP1_RX_SIZE 8
#include <pic18_usb.h>
#include <hid_analog2.c> // Configuración del USB y los descriptores para este dispositivo
#include <usb.c> // Handles usb ,tokens y descriptores
#define dato0 recibe[0]
#define dato1 recibe[1]
#define dato2 recibe[2]
#define dato3 recibe[3]
#define dato4 recibe[4]
#define dato5 recibe[5]
#define dato6 recibe[6]
#define dato7 recibe[7]
#define enviar_0 envia[0]
#define enviar_1 envia[1]
#define enviar_2 envia[2]
#define enviar_3 envia[3]
#define enviar_4 envia[4]
#define enviar_5 envia[5]
#define enviar_6 envia[6]
#define enviar_7 envia[7]
#use fast_io(A)
#use fast_io(B)
#use fast_io(C)
#byte ptoa = 0xf80#byte ptob = 0xf81
#byte ptoc = 0xf82
#byte lata = 0xf89
#byte latb = 0xf8a
#byte latc = 0xf8b
#bit ra0 = 0xf89.0
#bit ra1 = 0xf89.1
#bit rb6 = 0xf8a.6
#bit rb7 = 0xf8a.7
#bit rc3 = 0xf82.3
#bit rc5 = 0xf82.5
#bit rc6 = 0xf82.6
int8 envia[8];
int info[8] = {0,0,0,0,0,0,0,0};
int i, j, volts = 0, tempe = 0, luz = 0;
int volts_ant, tempe_ant, luz_ant;
int1 flag = 0, flag2 = 0;long k = 0;
#int_timer0void actividad(void) {
i++;
k++;
if (i >= 190) {
rb7++;
}
if (k >= 1500) {
flag2 = 1;
k = 0;
}
set_timer0(0);
}
void ini(void) {
enable_interrupts(global);
disable_interrupts(int_timer0);
setup_timer_0(t0_internal | t0_div_1);
setup_adc(adc_clock_internal);
setup_adc_ports(sAN7 |sAN8 | sAN9 | vss_vdd);
set_tris_a(0b11101111);
usb_init();
delay_ms(100);
ptoa = 0x00, ptob = 0x00, ptoc = 0xbf;
set_timer0(0);
}
void main(void) {
ini();
delay_ms(100);
usb_task();
usb_wait_for_enumeration();
rb6 = 1;
enable_interrupts(int_timer0);
while(true) {
if(usb_kbhit(1)) {
usb_get_packet(1, recibe, 8);
info[0] = dato0;
info[1] = dato1;
info[2] = dato2;
info[3] = dato3;
info[4] = dato4;
info[5] = dato5;
info[6] = dato6;
info[7] = dato7;
delay_us(10);
flag = 1;
}
if (flag == 1) {
if (info[2] == 49) {
flag = 0;
goto DISPARO;
}flag = 0;
}
if (rc5 == 0) {
DISPARO:set_adc_channel(7);
luz = read_adc();
delay_us(50);
set_adc_channel(8);
volts = read_adc();
delay_us(50);
set_adc_channel(9);
tempe = read_adc();
delay_us(50);
enviar_0 = 255;
enviar_1 = volts;
enviar_2 = 255;
enviar_3 = Tempe;
enviar_4 = 255;
enviar_5 = luz;
enviar_6 = 255;
enviar_7 = 255;
usb_put_packet(1, envia, 8, usb_dts_toggle);
do {
delay_us(50);
j++;
} while (rc5 == 0);
}
if (flag2 == 1) {
set_adc_channel(7);
luz = read_adc();
delay_us(50);
set_adc_channel(8);
volts = read_adc();
delay_us(50);
set_adc_channel(9);
tempe = read_adc();
delay_us(50);
if (luz != luz_ant) {
luz_ant = luz;
flag2 = 0;
goto DISPARO;
}
if (volts != volts_ant) {
volts_ant = volts;
flag2 = 0;
goto DISPARO;
}
if (tempe != tempe_ant) {
tempe_ant = tempe;
flag2 = 0;
goto DISPARO;
}flag2 = 0;
} delay_us(100);
}
}
Código:
' Gambas class file
Public Const VendorID As Integer = 6019 '0x1783
Public Const ProductID As Integer = 2003 '0x07D3
Public BufferOut As New Integer[32]
Public BufferIn As New Integer[32]
Public usb_Bit As New Integer[32]
Public usb_B0 As Short
Public usb_B1 As Short
Public usb_B2 As Short
Public usb_B3 As Short
Public usb_B4 As Short
Public usb_B5 As Short
Public usb_B6 As Short
Public usb_B7 As Short
Public usb_B8 As Short
Public usb_B9 As Short
Public usb_B10 As Short
Public usb_B11 As Short
Public usb_B12 As Short
Public usb_B13 As Short
Public usb_B14 As Short
Public usb_B15 As Short
Public usb_B16 As Short
Public usb_B17 As Short
Public usb_B18 As Short
Public usb_B19 As Short
Public usb_B20 As Short
Public usb_B21 As Short
Public usb_B22 As Short
Public usb_B23 As Short
Public usb_B24 As Short
Public usb_B25 As Short
Public usb_B26 As Short
Public usb_B27 As Short
Public usb_B28 As Short
Public usb_B29 As Short
Public usb_B30 As Short
Public usb_B31 As Short
Public hProc As Process
Public puerto_usb As String
Public usb_insertado As Process
Public j As Integer
Public flag As Boolean
Public Sub cmdMonitor_Click()
Dim N As Integer
For N = 0 To 31
BufferOut[N] = 255
Next
BufferOut[0] = 0
BufferOut[3] = 49 ' este es el Disparador para pedir datos al PIC18
WriteSomeData()
End
Public Sub Form_Open()
'On Error Resume Next
' no quitar!
'ConnectToHID (Me.hwnd)
txtConectar.Text = "No"
cmdConectar.Enabled = True
Timer1.Enabled = True
Timer1.Delay = 1000
Me.Left = 1200
Me.Top = 100
End
Public Sub cmdConectar_Click()
lblvid.Text = VendorID
lblPid.Text = ProductID
txtConectar.Text = "SI"
cmdConectar.Enabled = False
puerto_usb = txtPuertoS.Text
Try usb_insertado = Exec ["cat", puerto_usb] For Read Write As "Display"
Wait 1
End
Public Sub Form_Close()
lblVid.Text = "NO VID"
lblPid.Text = "NO PID"
End
Public Sub Display_Read()
Dim Mm As Integer
txtDatos.Text = ""
' El primer byte es el ID del reporte, ej. BufferIn(0)
' los demás bytes son los datos del microcontrolador
' Los valores se reciben en DECIMAL
' Leer los nuevos datos del Display
Read #usb_insertado, usb_B0
Read #usb_insertado, usb_B1
Read #usb_insertado, usb_B2
Read #usb_insertado, usb_B3
Read #usb_insertado, usb_B4
Read #usb_insertado, usb_B5
Read #usb_insertado, usb_B6
Read #usb_insertado, usb_B7
Read #usb_insertado, usb_B8
Read #usb_insertado, usb_B9
Read #usb_insertado, usb_B10
Read #usb_insertado, usb_B11
Read #usb_insertado, usb_B12
Read #usb_insertado, usb_B13
Read #usb_insertado, usb_B14
Read #usb_insertado, usb_B15
Read #usb_insertado, usb_B16
Read #usb_insertado, usb_B17
Read #usb_insertado, usb_B18
Read #usb_insertado, usb_B19
Read #usb_insertado, usb_B20
Read #usb_insertado, usb_B21
Read #usb_insertado, usb_B22
Read #usb_insertado, usb_B23
Read #usb_insertado, usb_B24
Read #usb_insertado, usb_B25
Read #usb_insertado, usb_B26
Read #usb_insertado, usb_B27
Read #usb_insertado, usb_B28
Read #usb_insertado, usb_B29
Read #usb_insertado, usb_B30
Read #usb_insertado, usb_B31
' Distribuir los datos leidos en las acciones correspondientes
BufferIn[0] = usb_B0
BufferIn[1] = usb_B1
BufferIn[2] = usb_B2
BufferIn[3] = usb_B3
BufferIn[4] = usb_B4
BufferIn[5] = usb_B5
BufferIn[6] = usb_B6
BufferIn[7] = usb_B7
BufferIn[8] = usb_B8
BufferIn[9] = usb_B9
BufferIn[10] = usb_B10
BufferIn[11] = usb_B11
BufferIn[12] = usb_B12
BufferIn[13] = usb_B13
BufferIn[14] = usb_B14
BufferIn[15] = usb_B15
BufferIn[16] = usb_B16
BufferIn[17] = usb_B17
BufferIn[18] = usb_B18
BufferIn[19] = usb_B19
BufferIn[20] = usb_B20
BufferIn[21] = usb_B21
BufferIn[22] = usb_B22
BufferIn[23] = usb_B23
BufferIn[24] = usb_B24
BufferIn[25] = usb_B25
BufferIn[26] = usb_B26
BufferIn[27] = usb_B27
BufferIn[28] = usb_B28
BufferIn[29] = usb_B29
BufferIn[30] = usb_B30
BufferIn[31] = usb_B31
For Mm = 0 To 15
txtDatos.Text = txtDatos.Text & " " & BufferIn[Mm]
Next
txtDatos.Text &= Chr$(13)
For Mm = 16 To 31
txtDatos.Text = txtDatos.Text & " " & BufferIn[Mm]
Next
sldLuz.Value = Abs(BufferIn[22]) ' Luz
sldVolts.Value = Abs(BufferIn[6]) ' Voltaje
sldTempe.Value = Abs(BufferIn[14]) ' Temperatura
txtDatos.Text = txtDatos.Text & Chr$(13)
For Mm = 0 To 31
BufferIn[Mm] = 0
Next
End
Public Sub WriteSomeData()
'On Error Resume Next
BufferOut[0] = 0 ' El primer byte es siempre el REPORTE ID
Dim Mm As Integer
'For Mm = 0 To 7
' Escribe los datos, sin olvidar pasar el arreglo completo
Try Exec ["outb", puerto_usb, BufferOut]
Wait
'Next
txtDatos2.Text &= Str$(BufferOut) & Chr$(13) & Str$(BufferIn)
End
Public Sub cmdBorrar_Click()
txtDatos.Text = ""
End
Public Sub Timer1_Timer()
If cmdVivo.Background = Color.Green Then
cmdVivo.Background = Color.Gray
Else
cmdVivo.Background = Color.Green
End If
End
Public Sub cmdSalir_Click()
Quit
End