Autor Tema: Detección de comandos del PIC al PC  (Leído 2364 veces)

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

Desconectado umalrovi

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 158
    • Aplicaciones Electrónicas
Detección de comandos del PIC al PC
« en: 27 de Noviembre de 2007, 11:48:48 »
Buenas,

He hecho un programa para que mi PIC haga una determinadas acciones, mande y reciba datos por la RS232. Si conectamos el PIC al PC (hyperterminal) por la RS232 todo funciona correctamente. Si le mando el comando del PC al PIC:

1.-  B1_on+RC  --> mi pic pone la RB1 a nivel alto y le dice al PC que está a nivel alto (confirmación)
2.-  B1_off+RC  ---> mi pic pone la RB1 a nivel bajo y le dice al PC que está a nivel bajo (confirmación).
3.-  versión       ----> mi pic le da al PC la versión del programa.

así con una serie de comandos, pero cada comando que envía el PC recibe contestación del PIC.

El PIC no manda datos al PC a no ser que:

1.- Reciba un dato de los que tenga contemplados mencionados anteriormente.
2.- reciba un trigger externo que me dispara el convertidor A/D y empieza a mandar datos como un loco por la rs232 durante un determinado tiempo X.

Todo esto por el hyperterminal funciona correctamente. El problema viene a la hora de controlarlo por Labview. (NO OS ASUSTEIS).

Me gustaría saber con otros lenguajes de programación, cómo detectáis que os llega algo por la RS232, me explico, en mi caso, como el pic siempre contesta pues sabéis que despues de una escritura del PC por la RS232 hay una lectura en el PC que envía el pic , pero cuando llega un triger externo al PIC  el PC no sabe que se tiene que ponerse en modo lectura para empezar a pillar datos por la rs232. ¿Cómo tenéis eso programado?
Redpic tu con Delphi como lo has hecho.

Saludos. :?
Aplicaciones Electrónicas
http://www.neoingenia.com/

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Detección de comandos del PIC al PC
« Respuesta #1 en: 27 de Noviembre de 2007, 17:01:28 »
Pues, amigo umalrovi, en Delphi, al igual que otros lenguajes orientados a objetos, tenemos un objeto que encapsula toda la comunicación RS232 de nuestro programa. Este objeto ademas de distintas propiedades y métodos o funciones tiene algo parecido a lo que en el PIC son las interrupciones, y que son los manejadores de eventos.

En el PIC cuando tu quieres tratar lo que recibas vía rs232 independiente de qué es lo que estás haciendo tu programa en ese momento escribes tu rda_isr() Aqui te pongo el ejemplo utilizado en el hilo Recibiendo del RS232 sobre un Buffer y procesandolo posteriormente. ...

Código: C++
  1. #int_rda
  2. void serial_isr() {                    // Interrupción recepción serie USART
  3.  
  4.    rcvchar=0x00;                       // Inicializo caracter recibido                    
  5.    if(kbhit()){                        // Si hay algo pendiente de recibir ...
  6.       rcvchar=getc();                  // lo descargo y ...
  7.       addcbuff(rcvchar);               // lo añado al buffer y ...
  8.       echos(rcvchar);                  // hago eco (si procede).
  9.    }
  10. }

En Delphi utilizo un componente que se llama TApdComPort (que dicho sea de paso es una maravilla). Y con él hago lo mismo que hacemos en el PIC. Escribo un trozo de código que se ejecutará cuando el PC reciba algo por la RS232.

O sea que escribo un código para tratar un Evento que se produce. O sea una especie de interrupción.

Te pongo el código que escribí en Delphi para mi aplicación del  Analizador lógico de 3 Canales monitorizado en el PC. Aquí está lo que hago cuando recibo algo por el RS232 desde el PIC cuando se produce el evento OnPortTriggerAvail del objeto ApdComPort.

Código: Delphi
  1. procedure TFrmMain.ApdComPortTriggerAvail(CP: TObject; Count: Word);
  2. var
  3.    i: Word;
  4.    c: Char;
  5.    s: String;
  6. begin
  7.      s := '';
  8.      for i := 1 to Count do
  9.      begin
  10.           c := ApdComPort.GetChar;
  11.           if (c = '{') then New_Data_Flag := true;
  12.           if (New_Data_Flag) then
  13.           begin
  14.                s := s + c;
  15.                if (c = '}') then
  16.                begin
  17.                     New_Data_Flag := false;
  18.                     BuffIn := BuffIn + s;
  19.                     Repositorio.Items.Add(BuffIn);
  20.                     BuffIn := '';
  21.                     Break;
  22.                end;
  23.           end;
  24.           if (c=RESPONSE_ACK) then
  25.           begin
  26.                TimerOut.Enabled := false;
  27.                End_of_reception := true;
  28.           end;
  29.      end;
  30.      If New_Data_Flag then
  31.         BuffIn := BuffIn + s;
  32. end;

Como puedes ver el concepto es el mismo, y el código también, salvando eso sí las diferencias de sintaxis, y en este caso que lo que hago en el PC es mas complejo  que lo que te he puesto para el PIC.

Espero que te sirva esta pequeña explicación.  :mrgreen:
« Última modificación: 27 de Noviembre de 2007, 17:03:51 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado umalrovi

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 158
    • Aplicaciones Electrónicas
Re: Detección de comandos del PIC al PC
« Respuesta #2 en: 28 de Noviembre de 2007, 05:38:42 »
Muchas gracias diego, voy analizar el programa tuyo y ya os cuento mis avances. Gracias y si alguién quiere aportar sobre otro lenguaje se lo agradecería.

P.D. Diego a lo mejor me paso al Delphi jejeje me ha gustado. Me recomiendas algún manual chulo????

Saludos
Aplicaciones Electrónicas
http://www.neoingenia.com/

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Detección de comandos del PIC al PC
« Respuesta #3 en: 28 de Noviembre de 2007, 06:41:32 »
Para empezar te recomiendo La Cara Oculta del Delphi 4 de Ian Marteens,  que a pesar de ser un libro obsoleto, hay varias versiones posteriores tanto del Delphi como de este libro,  el 80% te va a servir perfectamente. Y además gracias al autor es de libre distribución desde sitios autorizados como es éste que te pongo. Y en Español.  :mrgreen:


Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado umalrovi

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 158
    • Aplicaciones Electrónicas
Re: Detección de comandos del PIC al PC
« Respuesta #4 en: 29 de Noviembre de 2007, 05:55:59 »
Muchas gracias Diego por tu ayuda!!!

Respecto al Labview no he conseguido :? que se ponga a la escucha cuando el pic quiere hablar, solo cuando el PC manda un comando y se que luego le responde el micro. He intentado la programación con eventos en labview, detectando el inicio de trama pero por ahora no ha dado resultado. Utilizo un programa que red pic posteó en el foro (RS232 con Buffer, modificado a mis necesidades pero el esqueleto es el mismo).

Bueno yo estoy probando todo lo que pueda hasta que salga, pero de todas maneras os voy a contar un poco como funciona. En un principio el programa del PC envía comandos al micro y este le responde. Los comandos que envío son comandos de poner en marcha/apagar el aparato, mirar si está conectado mediante un pin del pic y mirar unos valores del CAD. A parte de todo esto, lo que quiero esactamente es que cuando surja un interrupción externa, mi pic se ponga como un cencerro a pillar muestras del CAD durante 1 minuto y enviarlas por la RS232 ó almacenarlas para luego ser enviadas al PC y ver la gráfica respecto al tiempo, para ver la variación que hay del CAD cuando salte la interrupción externa.

En primer lugar no se si la RS232 podrá saturarse con el envío de tanto información durante 1 minuto.  Hay veces que se bloquea y hace cosas raras. En ese caso había pensado en guardar los valores del CAd en un vector y luego descargarlo. No se me ocurre otra idea si me podéis sugerir o darme otras opciones os lo agradecería.

Un saludo.
Aplicaciones Electrónicas
http://www.neoingenia.com/