AlfredoSC   28-12-2020, 19:56
#7
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:
/* Programa con el 18f13k50 que se utiliza como sensor de intensidad de luz, temperatura y voltaje,
a traves de dos entradas analógicas, enviando la información por USB a una PC o Laptop,
desde donde se podrá consultar dichos valores a petición de un usuario o de manera periodica
en forma automática. Se usa un LED blanco, como sensor de luz, ya que este dispositivo,
cuando es iluminado presenta en sus terminales un voltaje, proporcional a la intensidad de la luz incidente. 
Se pone un botón en rc5 para enviar desde el PIC18 hacia la PC la información delos sensores.
(El modo de envío automático se deshabilita). En la aplicación de VB6 se coloca un botón para solicitar
datos al PIC18, enviando un valor numérico en el packet el cual debe ser reconocido por el PIC18. 
VendorID = 6019, ProductID = 2003 Alfredo Segura, Queretaro, Mexico, noviembre de 2020.*/ 

#include <18F13k50.h>
#fuses HS,NOWDT,NOPROTECT,NOCPB,NOLVP,NODEBUG,MCLR,CPUDIV1,PLLEN,USBDIV1,NOIESO,PUT
#use delay(clock = 48000000)   
//utiliza un XTAL de 12 MHz, para que con PLL arroje 48MHz 
#define USB_HID_DEVICE  TRUE    // Deshabilitamos el uso de las directivas HID
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK    // Activa EP1(EndPoint1) para las transferencias IN Bulk/Interrupt
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK    // Activa EP1(EndPoint1) para las transferencias OUT Bulk/Interrupt
#define USB_EP1_TX_SIZE 8                  // Tamaño reservado para el Buffer Tx EndPoint1
#define USB_EP1_RX_SIZE 8                  // Tamaño reservado para el Buffer Rx EndPoint1 
#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 
// Se declara el nombre a cada uno de los 8 elemento del vector recibe[8]   
#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] 
// Se declara el nombre a cada uno de los 8 elemento del vector envia[8], enviar_n   
#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)          // LATA=0xF89  PORTA=0xF80, 5 I/O pins
#use fast_io(B)            // LATB=0xF8A  PORTB=0xF81, 4 I/O pins
#use fast_io(C)            // LATC=0xF8B  PORTC=0xF82, 8 I/O pins 
#byte ptoa = 0xf80#byte ptob = 0xf81
#byte ptoc = 0xf82 
#byte lata = 0xf89
#byte latb = 0xf8a
#byte latc = 0xf8b 
#bit ra0 = 0xf89.0         // D+ de USB
#bit ra1 = 0xf89.1         // D- de USB                           
// ra3 es MCLR                           
// ra4 y ra5 XTAL 12MHz
#bit rb6 = 0xf8a.6         // rb6 salida LED de conexión establecida
#bit rb7 = 0xf8a.7         // rb7 salida LED de actividad 
#bit rc3 = 0xf82.3         // Sensor Luz con LED Blanco
#bit rc5 = 0xf82.5         // Botón para iniciar envío de datos a una PC
#bit rc6 = 0xf82.6         // Sensor Voltaje#bit rc7 = 0xf82.7         
// Sensor Temperatura  int8 recibe[8];           
// Declaramos la variable recibe de 8 bytes
//int info0 = 0, info1, info2, info3, info4, info5, info6, info7;
int8 envia[8];             // Declaramos la variable envia de 8 bytes
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++;                     // LED de actividadi = 0;
  } 
  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);       // XTAL, D+, D-, MCLRset_tris_b(0b00001111);       
  // rb6 Enumerado, rb7 LED de actividadset_tris_c(0b11101000);       
  // rc3, rc6 y rc7 entradas analogicas. 
  usb_init();                  // Inicializa USB
  delay_ms(100);
  ptoa = 0x00, ptob = 0x00, ptoc = 0xbf;
  set_timer0(0);


void main(void) {
  ini();
  delay_ms(100); 
  usb_task();                  ///habilita USB
  usb_wait_for_enumeration();  ///Espera hasta que la PC reconozca este dispositivo
  rb6 = 1;
  enable_interrupts(int_timer0); 
  while(true) { 
    if(usb_kbhit(1)) {            // Se reciben dati[0,2,4,6,8,10,12] de una sola vez
      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) {                // Se ha recibido un MSG USB válido
      if (info[2] == 49) {            // Verificar si infa[2] == 49, indica petición de informe
        flag = 0;
        goto DISPARO;
      }flag = 0;
    } 
    if (rc5 == 0) {
      DISPARO:set_adc_channel(7);             // Prepara AN8 para leer Votaje
      luz = read_adc();
      delay_us(50);
      set_adc_channel(8);             // Prepara AN8 para leer Votaje
      volts = read_adc();
      delay_us(50);
      set_adc_channel(9);             // Prepara AN9 para leer Temperatura
      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(int8 endpoint, int8 * ptr, unsigned int16 len, USB_DTS_BIT tgl)
      usb_put_packet(1, envia, 8, usb_dts_toggle); 
      do {
        delay_us(50);
        j++;
      } while (rc5 == 0);
    } 
    if (flag2 == 1) {             // Monitorea sensores en forma automática
      set_adc_channel(7);             // Prepara AN8 para leer Votaje
      luz = read_adc();
      delay_us(50);
      set_adc_channel(8);             // Prepara AN8 para leer Votaje
      volts = read_adc();
      delay_us(50);
      set_adc_channel(9);             // Prepara AN9 para leer Temperatura
      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
Última modificación: 29-12-2020, 22:37 por jguardon.

Es mejor saber un poco de todo, que todo de muy poco. Lo primero, garantiza la supervivencia humana.
  
Usuarios navegando en este tema: 1 invitado(s)
Powered By MyBB, © 2002-2025 MyBB Group.
Made with by Curves UI.