Autor Tema: Comunicación USB deja colgado el pic  (Leído 1540 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Evonkc

  • PIC12
  • **
  • Mensajes: 50
Comunicación USB deja colgado el pic
« en: 21 de Mayo de 2014, 23:37:59 »
Estimados muchos saludos a todos a ver si me pueden hechar una mano con este probelma.


Les comento, tengo un pic 18f4550 dispuesto para tomar datos ADC y digitales para almacenarlos cada 5 min en una memoria uSD.
El Micro lo tengo configurado para que se pueda conectar al PC via USB y poder efectuar configuraciones al reloj RTC y sacar los datos. El problema de todo esto es que logra tomar datos solamente cuando conecto el pic al puerto USB del computador, pero no asi cuando lo alimento con una fuente externa y que pase por el regulador LM7805..
por otro lado si elimino las lineas de código que permiten al computador identificar al micro como dispositivo USB, el PIC puede tomar los datos cuando es alimentado con una fuente externa.

La programación la hago por medio del software Pic18 simulator iden de oshon.

A continuación les dejo mi programación para que puedan observar y comentar.
Código: [Seleccionar]
  Define CLOCK_FREQUENCY = 20
Define CONFIG1L = 0x24
Define CONFIG1H = 0x0c
Define CONFIG2L = 0x3e
Define CONFIG2H = 0x00
Define CONFIG3L = 0x00
Define CONFIG3H = 0x83
Define CONFIG4L = 0x80
Define CONFIG4H = 0x00
Define CONFIG5L = 0x0f
Define CONFIG5H = 0xc0
Define CONFIG6L = 0x0f
Define CONFIG6H = 0xe0
Define CONFIG7L = 0x0f
Define CONFIG7H = 0x40
UsbSetVendorId 0x1234
UsbSetProductId 0x1234
UsbSetVersionNumber 0x1122
UsbSetManufacturerString "Erick-Von"
UsbSetProductString "Datalogger v 1.5"
UsbSetSerialNumberString "1111111111"
UsbOnIoInGosub input_report_before_sending
UsbOnIoOutGosub output_report_received
UsbOnFtInGosub feature_report_before_sending
UsbOnFtOutGosub feature_report_received
Dim data(7) As Byte
AllDigital
ADCON1 = %00001010

'definicion de puertos como salidas o entradas.
PORTB.0 = 0  'se configura como salida para puerto SDA
PORTB.1 = 0  'se configura como salida para puerto SCL
PORTC.6 = 0  'se configura como salida para puerto Tx envio mediante Uart
TRISA.0 = 1  'Como entrada(RA0, ADC)
TRISA.1 = 1  'Como entrada(RA1, ADC)
TRISA.2 = 1  'Como entrada(RA2, ADC)
TRISA.5 = 1  'Como entrada (RA5, ADC)

Symbol sda = PORTB.0
PORTB.0 = 0  'se configura como salida
Symbol scl = PORTB.1
PORTB.1 = 0
Symbol tx = PORTC.6
PORTC.6 = 0  'se configura el puerto tx como salida para envio de datos.

'configuracion de variables para adquisicion de datos adc
Dim an(7) As Word  'configuración adquisicion datos analogicos
Dim an_sum(7) As Word  'suma de datos analogicos
Dim t(7) As Word  'promedio datos analogicos
Dim i As Byte  'contador de veces que adquiere los datos analogicos
Dim rad As Single  'variable adquririr radiacion
Dim temp As Single  'variable de temperatura
Dim temp2 As Single  'variable de temperatura 2
Dim hum As Single  'variable de humedad

'configuracion de datos reloj
Dim seg As Byte  'variable segundo reloj
Dim min As Byte  'variable segundo reloj
Dim hora As Byte  'variable segundo reloj
Dim daym As Byte  'variable segundo reloj
Dim dias As Byte  'variable segundo reloj
Dim mes As Byte  'variable segundo reloj
Dim anno As Byte  'variable segundo reloj

Dim seg1 As Byte  'variable auxiliar del segundo
Dim min1 As Byte  'variable auxiliar del segundo
Dim hora1 As Byte  'variable auxiliar del segundo
Dim dias1 As Byte  'variable auxiliar del segundo
Dim mes1 As Byte  'variable auxiliar del segundo
Dim anno1 As Byte  'variable auxiliar del segundo
Dim j As Byte  'variable auxiliar del segundo

'variables a 0
an(0) = 0
an_sum(0) = 0
an(1) = 0
an_sum(1) = 0
an(2) = 0
an_sum(2) = 0
an(3) = 0
an_sum(3) = 0

rad = 0
temp = 0
temp2 = 0
hum = 0


sync_data:

Gosub reloj_rtc
Gosub calculo1
For j = 0 To 55 Step 5
If min1 = j Then Goto inicio
'determina la coincidencia de los minutos
'(00,05,10,15,20,25,30,35,40,45,50,55)
'luego recien comienza a tomar datos
Next j
UsbStart
UsbService
data(7) = UsbIoBuffer(7)
If data(7) = 5 Then Gosub configura_a
If data(7) = 6 Then Gosub configura_b
If data(7) = 45 Then Gosub escribir
If data(7) = 9 Then Gosub desc_usb
WaitMs 1
UsbStop
Goto sync_data

inicio:
Gosub reloj_rtc
Gosub calculo1
If seg1 = 00 Or seg1 = 10 Or seg1 = 20 Or seg1 = 30 Or seg1 = 40 Or seg1 = 50 Then Gosub adc
Gosub procesar
Gosub enviar
Goto inicio
End                                               

feature_report_received:
Toggle PORTB.7
Return                                           

feature_report_before_sending:
UsbFtBuffer(0) = UsbFtBuffer(0) - 1
UsbFtBuffer(1) = UsbFtBuffer(1) - 1
UsbFtBuffer(2) = UsbFtBuffer(2) - 1
UsbFtBuffer(3) = UsbFtBuffer(3) - 1
UsbFtBuffer(4) = UsbFtBuffer(4) - 1
UsbFtBuffer(5) = UsbFtBuffer(5) - 1
UsbFtBuffer(6) = UsbFtBuffer(6) - 1
UsbFtBuffer(7) = UsbFtBuffer(7) - 1
Return                                           

output_report_received:
Toggle PORTB.6
Return                                           

input_report_before_sending:
UsbIoBuffer(0) = UsbIoBuffer(0) + 1
UsbIoBuffer(1) = UsbIoBuffer(1) + 1
UsbIoBuffer(2) = UsbIoBuffer(2) + 1
UsbIoBuffer(3) = UsbIoBuffer(3) + 1
UsbIoBuffer(4) = UsbIoBuffer(4) + 1
UsbIoBuffer(5) = UsbIoBuffer(5) + 1
UsbIoBuffer(6) = UsbIoBuffer(6) + 1
UsbIoBuffer(7) = UsbIoBuffer(7) + 1
Return                                           

escribir:
data(0) = UsbIoBuffer(0)
data(1) = UsbIoBuffer(1)
data(2) = UsbIoBuffer(2)
data(3) = UsbIoBuffer(3)
data(4) = UsbIoBuffer(4)
data(5) = UsbIoBuffer(5)
data(6) = UsbIoBuffer(6)

I2CWrite sda, scl, 0xd1, 0, data(2)  'segundos
I2CWrite sda, scl, 0xd1, 1, data(1)  'minutos
I2CWrite sda, scl, 0xd1, 2, data(0)  'horas
I2CWrite sda, scl, 0xd1, 3, data(3)  'dia de la semana
I2CWrite sda, scl, 0xd1, 4, data(4)  'dia del  mes
I2CWrite sda, scl, 0xd1, 5, data(5)  'mes
I2CWrite sda, scl, 0xd1, 6, data(6)  'año
Return                                           



reloj_rtc:
I2CRead sda, scl, 0xd1, 0x00, seg
WaitMs 20
I2CRead sda, scl, 0xd1, 0x01, min
WaitMs 20
I2CRead sda, scl, 0xd1, 0x02, hora
WaitMs 20
I2CRead sda, scl, 0xd1, 0x03, daym
WaitMs 20
I2CRead sda, scl, 0xd1, 0x04, dias
WaitMs 20
I2CRead sda, scl, 0xd1, 0x05, mes
WaitMs 20
I2CRead sda, scl, 0xd1, 0x06, anno
WaitMs 20
Return                                           

calculo1:
'conversion de hexa a decimal segundos
If seg >= 0 And seg <= 9 Then seg1 = seg
If seg >= 16 And seg <= 25 Then seg1 = seg - 6
If seg >= 32 And seg <= 41 Then seg1 = seg - 12
If seg >= 48 And seg <= 57 Then seg1 = seg - 18
If seg >= 64 And seg <= 73 Then seg1 = seg - 24
If seg >= 80 And seg <= 89 Then seg1 = seg - 30

'conversion de hexa a decimal minutos
If min >= 0 And min <= 9 Then min1 = min
If min >= 16 And min <= 25 Then min1 = min - 6
If min >= 32 And min <= 41 Then min1 = min - 12
If min >= 48 And min <= 57 Then min1 = min - 18
If min >= 64 And min <= 73 Then min1 = min - 24
If min >= 80 And min <= 89 Then min1 = min - 30

'conversion de hexa a decimal hora
If hora >= 0 And hora <= 9 Then hora1 = hora
If hora >= 16 And hora <= 25 Then hora1 = hora - 6
If hora >= 32 And hora <= 41 Then hora1 = hora - 12

'conversion de hexa a decimal dias
If dias >= 0 And dias <= 9 Then dias1 = dias
If dias >= 16 And dias <= 25 Then dias1 = dias - 6
If dias >= 32 And dias <= 41 Then dias1 = dias - 12
If dias >= 48 And dias <= 57 Then dias1 = dias - 18

'conversion de hexa A decimal mes
If mes >= 0 And mes <= 9 Then mes1 = mes
If mes >= 16 And mes <= 25 Then mes1 = mes - 6

'conversion de hexa a decimal año
If anno >= 0 And anno <= 9 Then anno1 = anno
If anno >= 16 And anno <= 25 Then anno1 = anno - 6

Return                                           

procesar:
If min1 = 0 And seg1 = 2 Then Gosub promediar
If min1 = 5 And seg1 = 2 Then Gosub promediar
If min1 = 10 And seg1 = 2 Then Gosub promediar
If min1 = 15 And seg1 = 2 Then Gosub promediar
If min1 = 20 And seg1 = 2 Then Gosub promediar
If min1 = 25 And seg1 = 2 Then Gosub promediar
If min1 = 30 And seg1 = 2 Then Gosub promediar
If min1 = 35 And seg1 = 2 Then Gosub promediar
If min1 = 40 And seg1 = 2 Then Gosub promediar
If min1 = 45 And seg1 = 2 Then Gosub promediar
If min1 = 50 And seg1 = 2 Then Gosub promediar
If min1 = 55 And seg1 = 2 Then Gosub promediar
Return                                           

enviar:
If min1 = 0 And seg1 = 4 Then Gosub enviar2
If min1 = 5 And seg1 = 4 Then Gosub enviar2
If min1 = 10 And seg1 = 4 Then Gosub enviar2
If min1 = 15 And seg1 = 4 Then Gosub enviar2
If min1 = 20 And seg1 = 4 Then Gosub enviar2
If min1 = 25 And seg1 = 4 Then Gosub enviar2
If min1 = 30 And seg1 = 4 Then Gosub enviar2
If min1 = 35 And seg1 = 4 Then Gosub enviar2
If min1 = 40 And seg1 = 4 Then Gosub enviar2
If min1 = 45 And seg1 = 4 Then Gosub enviar2
If min1 = 50 And seg1 = 4 Then Gosub enviar2
If min1 = 55 And seg1 = 4 Then Gosub enviar2
Return                                           

adc:
i = i + 1
Adcin 0, an(0)
an_sum(0) = an_sum + an(0)
WaitMs 23
Adcin 1, an(1)
an_sum(1) = an_sum + an(1)
WaitMs 23
Adcin 2, an(2)
an_sum(2) = an_sum + an(2)
WaitMs 23
Adcin 4, an(3)
an_sum(3) = an_sum + an(3)
WaitMs 23
WaitMs 200
Return                                           

promediar:
t(0) = an_sum(0) / 30
WaitMs 1
t(1) = an_sum(1) / 30
WaitMs 1
t(2) = an_sum(2) / 30
WaitMs 1
t(3) = an_sum(3) / 30
WaitMs 1
'calcular
rad = 1.5933 * t(0) + 5.8753  'radiación
WaitMs 1
temp = ((t(3) * (500 / 1024)) - 273)  'conversión de temperatura interna lm335
WaitMs 1
temp2 = (t(1) * 30 * 100) / 6138  'conversión de temperatura ambiente
WaitMs 1
hum = ((t(2) * 5) / 1024)  'conversión de humedad relativa
WaitMs 1
Return                                           

enviar2:
Serout PORTC.6, 9600, #dias1
WaitMs 2
Serout PORTC.6, 9600, "/"
WaitMs 2
Serout PORTC.6, 9600, #mes1
WaitMs 2
Serout PORTC.6, 9600, "/"
WaitMs 2
Serout PORTC.6, 9600, #anno1
WaitMs 2
Serout PORTC.6, 9600, ","
WaitMs 2
Serout PORTC.6, 9600, #hora1
WaitMs 2
Serout PORTC.6, 9600, ":"
WaitMs 2
Serout PORTC.6, 9600, #min1
WaitMs 2
Serout tx, 9600, ","
WaitMs 2
Serout PORTC.6, 9600, #rad
WaitMs 2
Serout PORTC.6, 9600, ","
WaitMs 2
Serout PORTC.6, 9600, #temp
WaitMs 2
Serout PORTC.6, 9600, ","
WaitMs 2
Serout PORTC.6, 9600, #temp2
WaitMs 2
Serout PORTC.6, 9600, ","
WaitMs 2
Serout PORTC.6, 9600, #hum, CrLf
WaitMs 2
an_sum(0) = 0
an_sum(1) = 0
an_sum(2) = 0
an_sum(3) = 0
i = 0
WaitMs 950
Return                                           


configura_a:
data(0) = UsbIoBuffer(0)
data(1) = UsbIoBuffer(1)
data(2) = UsbIoBuffer(2)
data(3) = UsbIoBuffer(3)
data(4) = UsbIoBuffer(4)
data(5) = UsbIoBuffer(5)

If data(0) = 60 Then Serout tx, 9600, "T_Lm35,"
If data(0) = 61 Then Serout tx, 9600, "T.D,"
If data(0) = 62 Then Serout tx, 9600, "Vel_vie,"
If data(0) = 63 Then Serout tx, 9600, "Dir_Vie,"
If data(0) = 64 Then Serout tx, 9600, "Hum_Sue,"
If data(0) = 65 Then Serout tx, 9600, "HR,"
If data(0) = 66 Then Serout tx, 9600, "Temp_Int,"
If data(0) = 67 Then Serout tx, 9600, "S/U,"

If data(1) = 60 Then Serout tx, 9600, "T_Lm35,"
If data(1) = 61 Then Serout tx, 9600, "T.D,"
If data(1) = 62 Then Serout tx, 9600, "Vel_vie,"
If data(1) = 63 Then Serout tx, 9600, "Dir_Vie,"
If data(1) = 64 Then Serout tx, 9600, "Hum_Sue,"
If data(1) = 65 Then Serout tx, 9600, "HR,"
If data(1) = 66 Then Serout tx, 9600, "Temp_Int,"
If data(1) = 67 Then Serout tx, 9600, "S/U,"

If data(2) = 60 Then Serout tx, 9600, "T_Lm35,"
If data(2) = 61 Then Serout tx, 9600, "T.D,"
If data(2) = 62 Then Serout tx, 9600, "Vel_vie,"
If data(2) = 63 Then Serout tx, 9600, "Dir_Vie,"
If data(2) = 64 Then Serout tx, 9600, "Hum_Sue,"
If data(2) = 65 Then Serout tx, 9600, "HR,"
If data(2) = 66 Then Serout tx, 9600, "Temp_Int,"
If data(2) = 67 Then Serout tx, 9600, "S/U,"

If data(3) = 60 Then Serout tx, 9600, "T_Lm35,"
If data(3) = 61 Then Serout tx, 9600, "T.D,"
If data(3) = 62 Then Serout tx, 9600, "Vel_vie,"
If data(3) = 63 Then Serout tx, 9600, "Dir_Vie,"
If data(3) = 64 Then Serout tx, 9600, "Hum_Sue,"
If data(3) = 65 Then Serout tx, 9600, "HR,"
If data(3) = 66 Then Serout tx, 9600, "Temp_Int,"
If data(3) = 67 Then Serout tx, 9600, "S/U,"

If data(4) = 60 Then Serout tx, 9600, "T_Lm35,"
If data(4) = 61 Then Serout tx, 9600, "T.D,"
If data(4) = 62 Then Serout tx, 9600, "Vel_vie,"
If data(4) = 63 Then Serout tx, 9600, "Dir_Vie,"
If data(4) = 64 Then Serout tx, 9600, "Hum_Sue,"
If data(4) = 65 Then Serout tx, 9600, "HR,"
If data(4) = 66 Then Serout tx, 9600, "Temp_Int,"
If data(4) = 67 Then Serout tx, 9600, "S/U,"

Return                                           

configura_b:

data(0) = UsbIoBuffer(0)
data(1) = UsbIoBuffer(1)
data(2) = UsbIoBuffer(2)
data(3) = UsbIoBuffer(3)
data(4) = UsbIoBuffer(4)
data(5) = UsbIoBuffer(5)

If data(0) = 60 Then Serout tx, 9600, "T_Lm35,"
If data(0) = 61 Then Serout tx, 9600, "T.D,"
If data(0) = 62 Then Serout tx, 9600, "Vel_vie,"
If data(0) = 63 Then Serout tx, 9600, "Dir_Vie,"
If data(0) = 64 Then Serout tx, 9600, "Hum_Sue,"
If data(0) = 65 Then Serout tx, 9600, "HR,"
If data(0) = 66 Then Serout tx, 9600, "Temp_Int,"
If data(0) = 67 Then Serout tx, 9600, "S/U,"

If data(1) = 60 Then Serout tx, 9600, "T_Lm35,"
If data(1) = 61 Then Serout tx, 9600, "T.D,"
If data(1) = 62 Then Serout tx, 9600, "Vel_vie,"
If data(1) = 63 Then Serout tx, 9600, "Dir_vie,"
If data(1) = 64 Then Serout tx, 9600, "Hum_Sue,"
If data(1) = 65 Then Serout tx, 9600, "HR,"
If data(1) = 66 Then Serout tx, 9600, "Temp_int,"
If data(1) = 67 Then Serout tx, 9600, "S/U,"

If data(2) = 60 Then Serout tx, 9600, "T_lm35,"
If data(2) = 61 Then Serout tx, 9600, "T.D,"
If data(2) = 62 Then Serout tx, 9600, "Vel_vie,"
If data(2) = 63 Then Serout tx, 9600, "Dir_vie,"
If data(2) = 64 Then Serout tx, 9600, "Hum_sue,"
If data(2) = 65 Then Serout tx, 9600, "HR,"
If data(2) = 66 Then Serout tx, 9600, "Temp_int,"
If data(2) = 67 Then Serout tx, 9600, "S/U,"

If data(3) = 60 Then Serout tx, 9600, "T_Lm35,"
If data(3) = 61 Then Serout tx, 9600, "T.D,"
If data(3) = 62 Then Serout tx, 9600, "Vel_vie,"
If data(3) = 63 Then Serout tx, 9600, "Dir_vie ,"
If data(3) = 64 Then Serout tx, 9600, "Hum_sue,"
If data(3) = 65 Then Serout tx, 9600, "HR,"
If data(3) = 66 Then Serout tx, 9600, "Temp_Int,"
If data(3) = 67 Then Serout tx, 9600, "S/U,"

If data(4) = 60 Then Serout tx, 9600, "T_Lm35,"
If data(4) = 61 Then Serout tx, 9600, "T.D,"
If data(4) = 62 Then Serout tx, 9600, "Vel_vie,"
If data(4) = 63 Then Serout tx, 9600, "Dir_vie,"
If data(4) = 64 Then Serout tx, 9600, "Hum_sue,"
If data(4) = 65 Then Serout tx, 9600, "HR,"
If data(4) = 66 Then Serout tx, 9600, "Tem_int,"
If data(4) = 67 Then Serout tx, 9600, "S/U,", CrLf

Return                                           
desc_usb:
UsbStop
WaitMs 3000