umov
PIC10F
Desconectado
Mensajes: 16
|
 |
« Respuesta #75 : Abril 16, 2009, 01:40:51 » |
|
Hola Gero, en estos momentos estamos intentando algo nuevo, esta ves nos disponemos a desarrollar una aplicacion derivada de la tuya, donde desde el momento de ejecutar el JFrame, haga la lectura automatica (sin depender de presionar un boton) y continuamente del dato que recibe del PIC para mostrarlo en el Text Field.
Hasta ahora el codigo que hemos desarrollado es este: ////////////////////////////////////////////////////////////
package javaformulario;
import jPicUsb.*;
public class AccionesAula extends javax.swing.JFrame {
public byte cmd_FW = 99; public byte cmd_LED = 88; /** Creates new form AccionesAula */ public AccionesAula() {
initComponents();
try { iface.load(); //carga la libreria jPicUsb.dll } catch (Exception e) { setTitle(e.getMessage()); } iface.set_vidpid("vid_04d8&pid_000b"); iface.set_instance(0);
//Creamos un arreglo de bytes de tamaño 64 byte[] out = new byte[64]; out[0] = 99;
//do { try { send_command(cmd_FW); // ENVIA DATOS AL PIC PARA QUE LE ESCRIBA LA VERISON DEL FIRMWARE
//iface.WriteRead(byte[] salida, int writeout, int readin, long timeoutmsec) //Parametro 1: arreglo de bytes con los datos a enviar (out) //Parametro 2: cantidad de bytes del arreglo que se enviaran via usb (1) //Parametro 3: cantidad de bytes que se esperan de respuesta via usb (6) //Parametro 4: tiempo maximo que se esperara al dispositivo en el envio y la recepcion (1 segundo) //Retorna: arreglo de bytes con la respuesta del dispositivo usb byte[] respuesta = iface.QWriteRead(out, 1, 6, 1000); //convertimos el arreglo de bytes recibido en una cadena con codificacion utf-8 String data_in = new String(respuesta, "utf-8"); //verificamos que se hallan recibido datos if (data_in.length() == 0) { texto.setText(texto.getText() + "No se recibieron datos\n"); } else { texto.setText(texto.getText() + "Datos recibidos:" + data_in + "\n"); } } catch (Exception ex) { System.out.println("ERROR:" + ex.getMessage()); } //} while(true); }
public void send_command(byte command) { byte[] out = {command}; // DECLARACION DE VECTOR TIPO BYTE iface.QWrite(out, 1, 1000); // METODO QUE REALIZA UN ESCRITURA RAPIDA EN EL PUERTO USB DE UN BYTE, // DE LOS VALORES DE OUT, SOLO EL BYTE 1 SE ESCRIBIRA DURANTE 1 SEG (1000 MILISEGUNDOS) }
private void SalirActionPerformed(java.awt.event.ActionEvent evt) { dispose(); // TODO add your handling code here: }
////////////////////////////////////////////////////////////////////////////////////////////////
Como veras, incluimos el codigo correspondiente al que estaba el boton, en el constructor principal dentro de la clase principal.
Asi como lo ves, el formulario se ejecuta y se muestra, pero solo lo hace una sola vez (envia datos y lee el puerto USB), ............para que estubiera continuamente ejecutandose, incorporamos este codigo dentro de un do-while, sin embargo cuando este se ejecuta el JFrame no aparece para nada.
|
|
|
|
|
En línea
|
|
|
|
|
|
|
geronimox
|
 |
« Respuesta #76 : Abril 16, 2009, 06:28:20 » |
|
Hola umov, lo que esta pasando es que por culpa del ciclo do while, el proceso de tu aplicacion nunca sale del contructor  jeje lo que podes hacer es esto: Crear una inner class que extienda la clase TimerTask, en tu clase AccionesAula. Luego, en el constructor de AccionesAula, instanciar un timer que ejecute tu TimerTask  algo asi: package javaformulario;
import jPicUsb.*; import java.util.Timer; import java.util.TimerTask;
public class AccionesAula extends javax.swing.JFrame {
public byte cmd_FW = 99; public byte cmd_LED = 88; Timer t; miTickTask tarea;
class miTickTask extends TimerTask {
@Override public void run() { //Creamos un arreglo de bytes de tamaño 64 byte[] out = new byte[64]; out[0] = 99; //Este metodo de ejecutara con la frecuencia especficada en el timer instanciado en el contructor de AccionesAula try {
send_command(cmd_FW); // ENVIA DATOS AL PIC PARA QUE LE ESCRIBA LA VERISON DEL FIRMWARE
//iface.WriteRead(byte[] salida, int writeout, int readin, long timeoutmsec) //Parametro 1: arreglo de bytes con los datos a enviar (out) //Parametro 2: cantidad de bytes del arreglo que se enviaran via usb (1) //Parametro 3: cantidad de bytes que se esperan de respuesta via usb (6) //Parametro 4: tiempo maximo que se esperara al dispositivo en el envio y la recepcion (1 segundo) //Retorna: arreglo de bytes con la respuesta del dispositivo usb byte[] respuesta = iface.QWriteRead(out, 1, 6, 1000); //convertimos el arreglo de bytes recibido en una cadena con codificacion utf-8 String data_in = new String(respuesta, "utf-8"); //verificamos que se hallan recibido datos if (data_in.length() == 0) { texto.setText(texto.getText() + "No se recibieron datos\n"); } else { texto.setText(texto.getText() + "Datos recibidos:" + data_in + "\n"); } } catch (Exception ex) { System.out.println("ERROR:" + ex.getMessage()); } } }
/** Creates new form AccionesAula */ public AccionesAula() {
initComponents();
try { iface.load(); //carga la libreria jPicUsb.dll } catch (Exception e) { setTitle(e.getMessage()); }
iface.set_vidpid("vid_04d8&pid_000b"); iface.set_instance(0);
tarea = new miTickTask(); t = new Timer(); t.schedule(tarea, 0, 1000); //Comenzar la ejecucion YA y repetir cada 1000 milisegundos
}
public void send_command(byte command) { byte[] out = {command}; // DECLARACION DE VECTOR TIPO BYTE iface.QWrite(out, 1, 1000); // METODO QUE REALIZA UN ESCRITURA RAPIDA EN EL PUERTO USB DE UN BYTE, // DE LOS VALORES DE OUT, SOLO EL BYTE 1 SE ESCRIBIRA DURANTE 1 SEG (1000 MILISEGUNDOS) }
private void SalirActionPerformed(java.awt.event.ActionEvent evt) { dispose(); // TODO add your handling code here: } }
Bueno, capaz que halla algun error de tipeo, nada q no se pueda arreglar.. Y espero que se entienda. Saludos!
|
|
|
|
|
En línea
|
Gero. Divide & Conquer.>----. ^ -------------------------------| -'-------------------------------'
|
|
|
umov
PIC10F
Desconectado
Mensajes: 16
|
 |
« Respuesta #77 : Abril 17, 2009, 02:02:04 » |
|
Hola Gero, nuevamente te agradecemos por tu incondicional colaboración, te comentamos que confiamos que nada en la vida nos quedará grande, sin embargo tenemos que reconocer que somos aun novatos en cuanto a programación en JAVA se refiere, ya que la ultima explicacion que nos referiste no la entendimos.
Es por eso que acudimos a "san google" y sus muy habilidosas capacidades para la busqueda, y encontramos una explicación aun más didactica y gracias conseguimos lo que buscabamos. A continuacion te copio el codigo que nos funcionó:
//////////////////////////////////////////////////////////////////////////////// package javaformulario;
import jPicUsb.*; import java.util.Timer; import java.util.TimerTask;
public class AccionesAula extends javax.swing.JFrame {
public byte cmd_FW = 99; public byte cmd_LED = 88; /** Creates new form AccionesAula */ public AccionesAula() { initComponents(); try { iface.load(); //carga la libreria jPicUsb.dll } catch (Exception e) { setTitle(e.getMessage()); } //configuramos el vid_pid del dispositivo asi podemos usar las funciones "rapidas" de la interfaz iface.set_vidpid("vid_04d8&pid_000b"); //configuramos la instancia del dispositivo asi podemos usar las funciones "rapidas" de la interfaz iface.set_instance(0);
//Creamos un arreglo de bytes de tamaño 64 final byte[] out = new byte[64]; //agregamos el comando 99 en el primer byte del arreglo out[0] = 99;
TimerTask timerTask = new TimerTask() { public void run() { try {
send_command(cmd_FW); // ENVIA DATOS AL PIC PARA QUE LE ESCRIBA LA VERISON DEL FIRMWARE
//iface.WriteRead(byte[] salida, int writeout, int readin, long timeoutmsec) //Parametro 1: arreglo de bytes con los datos a enviar (out) //Parametro 2: cantidad de bytes del arreglo que se enviaran via usb (1) //Parametro 3: cantidad de bytes que se esperan de respuesta via usb (6) //Parametro 4: tiempo maximo que se esperara al dispositivo en el envio y la recepcion (1 segundo) //Retorna: arreglo de bytes con la respuesta del dispositivo usb byte[] respuesta = iface.QWriteRead(out, 1, 6, 1000); //convertimos el arreglo de bytes recibido en una cadena con codificacion utf-8 String data_in = new String(respuesta, "utf-8"); //verificamos que se hallan recibido datos if (data_in.length() == 0) { texto.setText(""); texto.setText(texto.getText() + "No se recibieron datos\n"); } else { texto.setText(""); texto.setText(texto.getText() + "Datos recibidos:" + data_in + "\n"); texto1.setText(""); texto1.setText(texto1.getText() + data_in + "\n"); } } catch (Exception ex) { System.out.println("ERROR:" + ex.getMessage()); } } };
// Aquí se pone en marcha el timer cada segundo. Timer timer = new Timer(); // Dentro de 0 milisegundos avísame cada 1000 milisegundos timer.scheduleAtFixedRate(timerTask, 0, 1000);
}
public void send_command(byte command) { byte[] out = {command}; // DECLARACION DE VECTOR TIPO BYTE iface.QWrite(out, 1, 1000); // METODO QUE REALIZA UN ESCRITURA RAPIDA EN EL PUERTO USB DE UN BYTE, // DE LOS VALORES DE OUT, SOLO EL BYTE 1 SE ESCRIBIRA DURANTE 1 SEG (1000 MILISEGUNDOS) }
public void send_command(byte command, byte param1) { byte[] out = {command, param1}; // DECLARACION DE VECTOR TIPO BYTE iface.QWrite(out, 2, 1000); // METODO QUE REALIZA UN ESCRITURA RAPIDA // EN EL PUERTO USB DE DOS BYTE, DE LOS // VALORES DE OUT, SOLO EL BYTE 2 SE ESCRIBIRA // DURANTE 1 SEG (1000 MILISEGUNDOS) }
private void encender_led() { byte LED = 0x00; if (jCheckBox1.isSelected()) { LED |= 0x01; } send_command(cmd_LED, LED); // ENVIA DATOS AL PIC PARA QUE ENCIENDA LOS LED´S }
private void SalirActionPerformed(java.awt.event.ActionEvent evt) { dispose(); // TODO add your handling code here: }
private void jCheckBox1ActionPerformed(java.awt.event.ActionEvent evt) { encender_led(); }
private void texto1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: }
/** * @param args the command line arguments */
public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new AccionesAula().setVisible(true); } }); } ///////////////////////////////////////////////////////////////////////////////////////////
Como veras utilizamos las habilidades de las clases Timer y TimerTask que tu nos habias sugerido, pero a nuestro parecer, se utilizan de una manera distinta y funciona de verdad.
Te adjunto una imagen de la inerfaz.
Sin embargo ahora como veras en la interfaz colocamos un CheckBox el cual le ordenara al PIC, que encienda o apague un led por el puerto D0, pero al momento de ejecutar la aplicación corre normal para el ciclo continuo de la temperatura que se visualiza en el TextField, pero mientras vallamos al CheckBox y lo checkeamos no responde si no de vez en cuando y otras veces no responde para nada (osea no enciende ni apaga el led).
No sabemos por que sera. Otra vez nos encontramos a punto de aprender algo nuevo y eso nos motiva.
Te agradecemos de antemano mi hermano.
|
|
|
|
En línea
|
|
|
|
umov
PIC10F
Desconectado
Mensajes: 16
|
 |
« Respuesta #78 : Abril 17, 2009, 02:09:31 » |
|
Hey hermano, no se si podra pero por que no nos incluyes en tu correo electronico, para estar más en contacto. Nos agrada que personas brinden ayuda sin animo de lucro alguno. Eso habla bien de una persona. Ademas nosotros estamos bastante animados con JAVA y nos disponemos a seguir desarrollando mas proyectos en este lenguaje.
|
|
|
|
|
En línea
|
|
|
|
umov
PIC10F
Desconectado
Mensajes: 16
|
 |
« Respuesta #79 : Abril 17, 2009, 02:10:05 » |
|
Aahhhh mi correo es umov@hotmail.com
|
|
|
|
|
En línea
|
|
|
|
Waldo
PIC10F
Desconectado
Mensajes: 3
|
 |
« Respuesta #80 : Abril 21, 2009, 02:40:44 » |
|
Hola geronimo la verdad kiero felicitarte por este gran aporte ya he estado buscando sobre esto y aki es donde me dan la libreria y aparte me dan un ejemplo. la verdad soy nuevo en este tipo de porgramacion de usb y kisiera saber si puedo utilizar con cualquier micro, y si no puedo con ke pics los puedo utilizar, tambien me gustaria saber si el archivo .dll ke esta en tu proyecto lo puedo utilizar para una aplicacion que consiste en enviar datos del micro al puerto usb y de alli a la aplicacion o para ke me sirve ese archivo la verdad estoy un poco confundido o si io tengo ke crear uno aparte para mi proyecto. y no se, si no te molesta que te agregue a mi correo. Saludos y gracias de antemano. 
|
|
|
|
|
En línea
|
|
|
|
Waldo
PIC10F
Desconectado
Mensajes: 3
|
 |
« Respuesta #81 : Abril 21, 2009, 03:00:05 » |
|
A y otra cosa se me paso^^ ke es lo ke esta en la carpeta Codigo C Pic para que sirven los archivos de esa carpeta. 
|
|
|
|
|
En línea
|
|
|
|
|
geronimox
|
 |
« Respuesta #82 : Abril 21, 2009, 02:08:15 » |
|
Hola umov. Me alegro que hallan encontrado la solucion en los Timers =D siempre son una buena opcion para tareas de polling Sobre el problema que tuvieron, no tengo la mas palida idea de porque no anda recibe los datos el pic :S, si averiguo algo no dudes q te comento al toque. Saludos!
Waldo: para usar el driver de microchip, necesitas si o si un chip que sea microchip, y que ademas implemente en su hardware el sub mismo. Es decir que cualquier chip usb de microchip te va bien. Por ej el que yo uso es el 18F4550. La dll de mi proyecto es para poder usar las apis del driver de microchip en una aplicacion java, pues java tiene graves problemas para cargar librerias dinamicas. Esta dll te permite comunicarte en las 2 direcciones, pc a chip y chip a pc. Empezar con usb de prepo me parece muy exagerado. Te recomiendo que realizes proyectos simples antes de adentrarte en usb. Por ejemplo, te recomiendo que aprendas bien el lenguaje C utilizado en CCS (ide y compilador usados en el proyecto de la carpeta Codigo C Pic). Podiras realizar proyectos con comunicacion serie antes de usb. Y desde luego, cuando ya te sientas confiado con CCS y PICs, deberias aprender leguaje Java para estar mas cerca de realizar el enlace usb con el Pic. Y por supuesto, si navegas el foro, veras que puedes sacarte varias dudas sobre Pics y CCS, pues hay varios manuales dando vueltas. 1 Saludo!
|
|
|
|
|
En línea
|
Gero. Divide & Conquer.>----. ^ -------------------------------| -'-------------------------------'
|
|
|
Waldo
PIC10F
Desconectado
Mensajes: 3
|
 |
« Respuesta #83 : Abril 22, 2009, 02:35:02 » |
|
Gracias gero. java lo se manejar el tu codigo ke subiste lo entendi muy bien bueno algunas cositas no como porke inicializas estos dos(cmd_FW, cmd_LED) en 99 y 88 respectivamente y el set_vidpid y el set_instance no entendi porke llevan esos parametros, pero dije ke era nuevo en usb no en java^^ java lo se manejar, lo ke me ayudaria es entender utilizar la libreria jpicusb ke es lo ke puedo hacer con ella, aparte de leer datos y mandar datos, lo ke si no estoy familiarizado es con c^^ pero una amiga si, pero este es un proyecto ke estamos haciendo con un maestro ke no sabe java y nos pidio ayuda en hacer una aplicacion y el se encargaria de la programacion del micro en este caso del pic. y tengo una duda espero no molestarte y no suene tonta bueno es del maestro jeje, en donde le decimos a cual puerto va ir conectado el circuito o ke puerto utilizar, por lo ke he entendido de eso se encarga los driver de microchip y la libreria si no me ekivoco. gracias gero de antemano saludos.
|
|
|
|
|
En línea
|
|
|
|
joana
PIC10F
Desconectado
Mensajes: 1
|
 |
« Respuesta #84 : Abril 22, 2009, 03:10:38 » |
|
Hola Geronimo.....En verdad agradesco que compartas nos compartas tus conocimientos respecto a este tema, es la primera vez que trabajo con un pic conectado a una pc a traves de un puerto....podrias subir el diagrama del circuito q utilizaste en tu proyecto,,,porfavor solo para ver su estructura... De antemano gracias...Saludos 
|
|
|
|
|
En línea
|
|
|
|
|
geronimox
|
 |
« Respuesta #85 : Abril 22, 2009, 11:39:39 » |
|
Gracias gero. java lo se manejar el tu codigo ke subiste lo entendi muy bien bueno algunas cositas no como porke inicializas estos dos(cmd_FW, cmd_LED) en 99 y 88 respectivamente y el set_vidpid y el set_instance no entendi porke llevan esos parametros, pero dije ke era nuevo en usb no en java^^ java lo se manejar, lo ke me ayudaria es entender utilizar la libreria jpicusb ke es lo ke puedo hacer con ella, aparte de leer datos y mandar datos, lo ke si no estoy familiarizado es con c^^ pero una amiga si, pero este es un proyecto ke estamos haciendo con un maestro ke no sabe java y nos pidio ayuda en hacer una aplicacion y el se encargaria de la programacion del micro en este caso del pic. y tengo una duda espero no molestarte y no suene tonta bueno es del maestro jeje, en donde le decimos a cual puerto va ir conectado el circuito o ke puerto utilizar, por lo ke he entendido de eso se encarga los driver de microchip y la libreria si no me ekivoco. gracias gero de antemano saludos.
Hola Waldo! Si ya sabes Java, es un gran paso, y tenes la mitad del camino allanado. Sobre la interface jpicusb, la documentacion de cada metodo esta en divideandconquer.com.ar. Dentro del Rar de la libreria. Alli explica la funcion de cada metodo de la libreria. Si no conoces la Base del funcionamiento de ennumeracion de un dispositivo usb en la pc, te va a costar entender la funcion de cada metodo de la libreria. Yo no tengo el conocimiento como para desarrollar una explicacion, por lo que te recomiendo que, antes de largarte en la programacion java, o pic, leas sobre USB y sigas los pasos basicos para el desarrollo de una comunicacion punto a punto. Por ej: Establecer una estructura de datos para la comunicacion entre tu profesor (codigo C del pic) y vos (Java + interfaz mcirochip), que comandos existiran, la frecuencia con la que se haran transferencias, etc. Te recomiendo que investigues sobre usb y los terminos mas usados en su entorno , por ej vid, pid, clases de dispositivos, etc. Tambien sobre la libreria USB de microchip. Y luego de todo esto, la documentacion de JpicUSB. 1 Saludo!
|
|
|
|
|
En línea
|
Gero. Divide & Conquer.>----. ^ -------------------------------| -'-------------------------------'
|
|
|
|
geronimox
|
 |
« Respuesta #86 : Abril 22, 2009, 11:40:28 » |
|
Hola Geronimo.....En verdad agradesco que compartas nos compartas tus conocimientos respecto a este tema, es la primera vez que trabajo con un pic conectado a una pc a traves de un puerto....podrias subir el diagrama del circuito q utilizaste en tu proyecto,,,porfavor solo para ver su estructura... De antemano gracias...Saludos  Hola joana, aguantame un tiempito y publico un esquema.agrego una imagen del esquema de la simulacion, ojo que porque funcione en el simulador no significa que valla a funcionar en la vida real. Faltan resistencias en los leds, y esas cosas que en una simulacion digital pueden obviarse. En un rato publico en divideandconquer.com.ar el archivo de la simulacion asi simules vos misma.En divideanconquer.com.ar podes descargar nuevamente el proyecto de demostracion de los leds. Ahora incluye una simulacion en Isis Proteus Saludos! 
|
|
|
|
« Última modificación: Abril 22, 2009, 03:48:01 por geronimox »
|
En línea
|
Gero. Divide & Conquer.>----. ^ -------------------------------| -'-------------------------------'
|
|
|
umov
PIC10F
Desconectado
Mensajes: 16
|
 |
« Respuesta #87 : Abril 27, 2009, 02:25:07 » |
|
Hola gero,
hermano, ahora ya decidimos pasar de simulacion a la realidad, por eso hicimos el montaje tal y cual esta en proteus, pero ahora en protoboard y al momento de conectar el circuito nos aparece un cuadro en amarillo que nos indica que "No se reconoce el dispositivo USB", al dar click sobre este cuadro nos aparece una ventana indicandonos lo mismo, para muestra de ello te adjuntamos dos imagenes, una antes y otra despues de dar click.
Nosotros estamos creidos que la respuesta se debe al cristal que estamos utilizando (que es de 4 MHz), ya que en tu programa en C compiler notamos que utilizas uno de 48 MHz.
Estuvimos nuevamente consultando el Datasheet del PIC18f4550 y alli encontramos que los cristales que utilizan se clasifican así como encontraras en la tabla que tambien te adjuntamos.
|
|
|
|
En línea
|
|
|
|
Suky
**----- ^^ ------**
Moderador
dsPIC
   
Desconectado
Sexo: 
Mensajes: 5345
Con Qt...
|
 |
« Respuesta #88 : Abril 27, 2009, 02:32:39 » |
|
Lo que necesitan que el micro trabaje a 48MHz por el puerto usb. Pueden conectar otro de menor valor y usar la configuración de oscilador del pic para lograr internamente los 48MHz.
|
|
|
« Última modificación: Abril 27, 2009, 02:40:35 por Suky »
|
En línea
|
|
|
|
|
geronimox
|
 |
« Respuesta #89 : Abril 27, 2009, 02:39:44 » |
|
Buenas umov, como te dijo Suky, la norma USB especifica que la frecuencia de trabajo debe ser de 48Mhz, lo que se logra usando un cristal externo de 20Mhz y activando el PLL del hardware internoo con la directiva #fuses HSPLL,PLL5. En el programa se lee #use delay(clock=48000000) debido a que el pic va a funcionar a 48Mhz, entonces el compilador debe generar todo el codigo de los retardos en base a dicha frecuencia. Saludos!
|
|
|
|
|
En línea
|
Gero. Divide & Conquer.>----. ^ -------------------------------| -'-------------------------------'
|
|
|
|
|
|