Gracias por responder tan rápido compañero, acá adjunto lo que tengo hecho en VB... del lado del pic se que no hay problemas porque lo tenia funcionando a la perfección en XP, ademas es bien sencillo lo que hace... recibe ocho bytes desde la pc y usa dos para manejar el modulo PWM del pic.
Lo mismo me pasaba si usaba un botón para enviar la intensidad, se veia un parpadeo y luego se apagaba, es como que se enviaba el byte y luego 0

Me desorientó este comportamiento...
-----------
Hola fernandoae, agradeciendo el aporte del programa antes de nada y quisiera me puedas dar una idea sobre algo que estoy haciendo, para ser rápido te cuento que usando un PIC18F2550 he conectado 18LEDS en todos los puertos menos el A0, desde el puerto A1 en adelante uso 18 LEDS a las salidas; mediante el programa en VB.NET 2010 controlo el encendido y el apagado de los mismos vía USB, realizando además una verificación el VB de que realmente se encendio la zona y todo funciona perfectamente(para lo cual el PIC me envio un cero o un uno para cada zona); el problema que tengo es el siguiente: ejecuto el program el VB.NET enciendo ciertos LEDS y lo cierro (al VB.NETT) obviamente los LEDS quiero que se queden encendidos y es lo que sucede, pero cuando vuelvo a ejecutar el programa de VB quiero que me lea el estado de todos los LEDS ya que en el formulario tengo los 18 botones y 18 pictureBox que me cambian de color entre amarillo y negro según esté encendido o apagadas las zonas; entonces he probado un bucle For para que una vez el programa reconozca que esta conectado el dispositivo USB envíe automáticamente a mi PIC los códigos que uso para leer los estados como tengo 18 leds con el bucle for remito 18 datos los cuales son leídos por el PIC y como en el PIC he programado un SELECT CASE cuando ve ese dato lee el puerto al que corresponde y me responde con una bandera si esta encendido o apagado, el bucle es el siguiente:
Código:
For i As Integer=27 to 54
BufferOut(0) = 0
BufferOut(5) = i
Call WriteSomeData()
aux_i = 54
Next
En la lógica del programa cuando tu envias un dato al PIC(clic a un boton) por USB y este te responde si encendio o no el LED salta automaticamente a la función que se denomina Public Sub OnRead(ByVal pHandle As Integer)... entonces yo suponía que si hago ese for cada que se envie el dato en cada recorrido al for iba a saltar a esa función y leerme el dato pero el problema que tengo es que solo me entra a la función en la ultima corrida del For, es decir para cuando i se encuentra en 54 y para este caso si me cambia el color del picturebox a amarillo si esta encendido el LED o negro si está apagado, pero para los anteriores no me salta a la función, probé con un Do while y me da el mismo problema que solo me lee para el ultimo dato del bucle.
En vista de no ver resultado probé de otra manera haciendo una subrutina por cada zona con la siguiente estructura:
Código:
Sub Verifica_estado1()
'verifica zona 1
BufferOut(0) = 0
BufferOut(5) = 37
Call WriteSomeData()
aux_i = 37
End Sub
cuando me manda este dato y el PIC me responde entra a la funcion Sub OnRead(ByVal pHandle As Integer)... dentro de esta tengo esto para cada zona obviamente:
Código:
'ZONA 1
If BufferIn(2) = 0 And aux_i = 37 Then
Me.PictureBox1.BackColor = Color.Black
z1 = False
Me.Verifica_estado2()
End If
If BufferIn(2) = 1 And aux_i = 37 Then
Me.PictureBox1.BackColor = Color.Yellow
z1 = True
Me.Verifica_estado2()
End If
en esta parte leo si en el BuferIn(2) me llego un cero (zona apagada) o un 1 (zona encendida) y según eso cambio de color entre negro y amarillo mi picture box y la bandera denominada z1 la pongo en el valor que debería tener en vista de que con el mismo botón mando a encender o apagar la zona con esa bandera; luego de esto como se ve llamo a la siguiente subrutina Me.Verifica_estado2() para que ahora me haga lo siguiente:
Código:
Sub Verifica_estado2()
'verifica zona 2
BufferOut(0) = 0
BufferOut(5) = 38
Call WriteSomeData()
aux_i = 38
End Sub
Y así hasta que BufferOut(5) = 54 en este caso me funciona correcto para las dos primeras zonas me las lee correctamente pero desde la tercera vez que mando a la subrutina siempre el buffer de entrada tengo como 1.
En mi PIC tengo un SELECT CASE para el valor que envío mediante mi BufferOut(5) un ejemplo es el siguiente:
Código:
DATO VAR BYTE
(...)
DATO=usbbuffer[4]
SELECT CASE DATO
CASE 1
'enciende zona 1
PORTA.1=1
SYMBOL Z1E = PORTA.1
usbbuffer[0] = 0
usbbuffer[1] = Z1E
GOSUB DoUSBOut
pause 100
CASE 2
'apaga zona 1
PORTA.1=0
SYMBOL Z1A = PORTA.1
usbbuffer[0] = 0
usbbuffer[1] = Z1A
GOSUB DoUSBOut
pause 100
(...)'desde aqui la parte que verifica estado de cada zona
case 37
'verifica estado zona 1
SYMBOL Z1 = PORTA.1
usbbuffer[0] = 0
usbbuffer[1] = Z1
GOSUB DoUSBOut
pause 100
CASE 38
'verifica estado zona 2
SYMBOL Z2 = PORTA.2
usbbuffer[0] = 0
usbbuffer[1] = Z2
GOSUB DoUSBOut
pause 100
END SELECT
Esta es mi inquietud ya que por lo demás el programa funciona perfectamente, agradecería mucho si me pueden ayudar con una idea que funcione para la lectura automática de los puertos, ah por cierto dentro del for y del do while incluso de las subrutinas he probado con System.Threading.Thread.Sleep(200) para dar una pausa entre los envíos de datos al PIC pero no me ha funcionado tampoco, muchas gracias de antemano, adjunto los archivos y pido disculpas por tanto texto que he escrito jejee
