Autor Tema: problema interrupcion rda.  (Leído 12579 veces)

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

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: problema interrupcion rda.
« Respuesta #15 en: 06 de Noviembre de 2008, 12:18:02 »
Te has explicado a la perfección RedPic ya he modificado el programa tal y como me ahs dicho y tengo 0 erores y 0 warnings. Muchas gracias por la ayuda, he ido a Teoría y praxis de las com serie TTL : 3.- Comandos de un solo carácter
como me has dicho y he estado mirando, he querido probar el primer programilla super sencillo

Código: [Seleccionar]
///////////////////////////////////////////////////////////////////////////////////////////////////
#include <16f877.h>
///////////////////////////////////////////////////////////////////////////////////////////////////
// Fuses y ajuste de Clock
///////////////////////////////////////////////////////////////////////////////////////////////////
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
#use delay(clock=20000000)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Canal de Comunicación : usart
///////////////////////////////////////////////////////////////////////////////////////////////////
#define TTL_TX PIN_C6
#define TTL_RX PIN_C7
#use rs232(baud=9600, xmit=TTL_TX, rcv=TTL_RX)
void main() {
  char rec;
  printf("TyP_Serie_TTL\r\n");   // Al inicio escribe para ver que emite correctamente
  do{                            // Bucle ...
     if(kbhit()){                //  Si hay algo pendiente de recibir ....
        rec=getc();              //  recibe el caracter ...
        putc(rec);               //  ... y lo escribes ...
     }                           // ... después continúa ...
  }while(TRUE);                  // ... hasta el infinito.
}

y me compila bien, pero sin embargo no imprime nada en el ordenador ni si quiera  "TyP_Serie_TTL\r\n"

después cambié #use rs232(baud=9600, xmit=TTL_TX, rcv=TTL_RX) por
#use rs232(baud=9600,parity=N,bits=8,stop=1,xmit=PIN_C6,rcv=PIN_C7)  sigue sin funcionar
y finalmente cambie esto por #use rs232(baud=9600,parity=N,bits=8,stop=1,xmit=PIN_C6,rcv=PIN_C7,enable=PIN_C5)

y sigue sin funcionar. No me imprime nada en la pantaya, ¿quizás es porque uso el rs485?

Pero sin embargo cuando cargo un programa que envia datos si que los envia, no entiendo el motivo por el cual en el programa este tan sencillo no evnia ningún dato.

Creo que el hardware está correctamente conectado.

Gracias!!!


ACABO DE LEER LO DE HABILITAR MANUALMENTE EL PROGRAMA SIN EL ENABLE PIN, ES DECIR EL PIN 5 QUE TENGO VA DIRECTAMENTE AL MAX485 (PINES 2 Y 3 PUENTEADOS), ESTO CREAun conflicto entre el pic.


Ahora hablando de el programilla sencillo que he comentado anteriormente según lo entiendo me decis que lo mas correcto sea utilizar
Código: [Seleccionar]
///////////////////////////////////////////////////////////////////////////////////////////////////
#include <16f877.h>
///////////////////////////////////////////////////////////////////////////////////////////////////
// Fuses y ajuste de Clock
///////////////////////////////////////////////////////////////////////////////////////////////////
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
#use delay(clock=20000000)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Canal de Comunicación : usart
///////////////////////////////////////////////////////////////////////////////////////////////////
#use rs232(baud=9600,parity=N,bits=8,stop=1,xmit=PIN_C6,rcv=PIN_C7)
void main() {
  char rec;
  printf("TyP_Serie_TTL\r\n");   // Al inicio escribe para ver que emite correctamente
  do{                            // Bucle ...
     if(kbhit()){                //  Si hay algo pendiente de recibir ....
        rec=getc();              //  recibe el caracter ...
        putc(rec);               //  ... y lo escribes ...
     }                           // ... después continúa ...
  }while(TRUE);                  // ... hasta el infinito.
}
Creo que tiene que haber algo más porque utilizando este codigo no funciona.

Puede ser que tenga que modificar algo mas al utilizar el protocolo rs485?


Muchisimas gracias amigos.. estoy aprendiendo muchisimo, siento causaros molestias.

Un saludo enorme!

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: problema interrupcion rda.
« Respuesta #16 en: 06 de Noviembre de 2008, 13:51:48 »
Hola.

Lo que se me ocurre que puede estar ocurriendo es que el baud rate de la PC no coincide con el del PIC ( revisa la configuracion del soft con el que accedes al COM del PC ) o que el MAX232 que estas usando puede estar un poco danando, es decir que el problema es de Hard, ya que en las simulaciones corre perfectamente.

En mi caso, para que el PIC pudiera recibir bytes del PC, tengo que puentear el pin 1 con el pin 6 del conector DB9.

Saludos
El papel lo aguanta todo

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: problema interrupcion rda.
« Respuesta #17 en: 07 de Noviembre de 2008, 10:27:00 »
Hola buenas, el archivo adjunto muestra la conexión física que tengo puesta,
Probando este código:
///////////////////////////////////////////////////////////////////////////////////////////////////
#include <16f877.h>
///////////////////////////////////////////////////////////////////////////////////////////////////
// Fuses y ajuste de Clock
///////////////////////////////////////////////////////////////////////////////////////////////////
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
#use delay(clock=20000000)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Canal de Comunicación : usart
///////////////////////////////////////////////////////////////////////////////////////////////////
//#define TTL_TX PIN_C6
//#define TTL_RX PIN_C7
//#use rs232(baud=9600,parity=N,bits=8,stop=1,xmit=PIN_C6,rcv=PIN_C7) //enable=PIN_C5 hace que el C maneje el pin de habilitación
#use rs232(baud=9600,parity=N,bits=8,stop=1,xmit=PIN_C6,rcv=PIN_C7,enable=PIN_C5,errors) //enable=PIN_C5 hace que el C maneje el pin de habilitación
void main() {
  char rec;
  output_high(PIN_C66);
  output_LOW(PIN_C7);
  printf("TyP_Serie_TTL\r\n");   // Al inicio escribe para ver que emite correctamente
  output_high(PIN_C7);
  output_LOW(PIN_C6);
  do{                            // Bucle ...
     if(kbhit()){                //  Si hay algo pendiente de recibir ....
        rec=getc();              //  recibe el caracter ...
         output_high(PIN_C6);
         output_LOW(PIN_C7);
        putc(rec);               //  ... y lo escribes ...
     }                           // ... después continúa ...
  }while(TRUE);                  // ... hasta el infinito.
}

El pic no envia nada.

Utilizando este código:
///////////////////////////////////////////////////////////////////////////////////////////////////
#include <16f877.h>
///////////////////////////////////////////////////////////////////////////////////////////////////
// Fuses y ajuste de Clock
///////////////////////////////////////////////////////////////////////////////////////////////////
#fuses XT,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
#use delay(clock=20000000)
///////////////////////////////////////////////////////////////////////////////////////////////////
// Canal de Comunicación : usart
///////////////////////////////////////////////////////////////////////////////////////////////////
//#define TTL_TX PIN_C6
//#define TTL_RX PIN_C7
//#use rs232(baud=9600,parity=N,bits=8,stop=1,xmit=PIN_C6,rcv=PIN_C7) //enable=PIN_C5 hace que el C maneje el pin de habilitación
#use rs232(baud=9600,parity=N,bits=8,stop=1,xmit=PIN_C6,rcv=PIN_C7,enable=PIN_C5,errors) //enable=PIN_C5 hace que el C maneje el pin de habilitación
void main() {
  char rec;
  output_high(PIN_C5);

  printf("TyP_Serie_TTL\r\n");   // Al inicio escribe para ver que emite correctamente

  output_LOW(PIN_C5);
  do{                            // Bucle ...
     if(kbhit()){                //  Si hay algo pendiente de recibir ....
        rec=getc();              //  recibe el caracter ...
         output_high(PIN_C5);
       
        putc(rec);               //  ... y lo escribes ...
     }                           // ... después continúa ...
  }while(TRUE);                  // ... hasta el infinito.
}
El PIC envia "TyP_Serie_TTL\r\n"  pero no ahce caso a la interrupción.

¿Creeis que algo tengo mal? o como bien dices MLO_  seguramente l hardware esta dañado. Hoy iré a pedir un nuevo MAX485 para ver si realmente es eso, aunque tengo mis dudas.

Un saludo y gracias a todos!!!

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: problema interrupcion rda.
« Respuesta #18 en: 07 de Noviembre de 2008, 11:46:45 »
Parafraseando a los Les Luthiers y su "voiglo entrare per la finestra" solo puedo decir "Temo, tiemblo, tanto". ja, ja, ja  :D :D :D

1º.- ¿Que cristal tienes? Por que en tus últimos ejemplos veo con temor que usas el fuse XT mientras que el use_delay sigue siendo de 20000000 cuando XT solo es válido para cristales de hasta 4000000, siendo el fuse HS el necesario para los cristales mayores a ese valor.  :shock:

2º.- Subes y bajas en main() los pines de TX y RX con lo que los TRIS los dejas locos ya que automáticamente el CCS ambos pines como SALIDA (no hay nada declarado en contra de este automatismo del CCS).  :shock:

3º.- En el primer ejemplo dices "el pin no envia nada" pero ¿recibe?  :shock:

4º.- En el segundo ejemplo veo que levantas o bajas "a mano" el PIN_C5 pero te has dejado en el use_rs232 el enable=PIN_C5 con lo cual sois dos manejando el mismo pin. A saber quien de los dos, tú o el CCS es el que tiene el control de dicho pin.  :shock:

5º.- Al final de tu segundo ejemplo dices que "El PIC envia "TyP_Serie_TTL\r\n"  pero no ahce caso a la interrupción" ¿Qué interrupción? Ni en ese ejemplo ni en el primero se declara, se escribe o se habilita interrupción alguna. Imagino que querras decir que "no recibe".  :shock:

6º.- En el segundo ejemplo veo que pones en alto PIN_C5 y después usas el printf para "hablar" por el RS485 y justo después lo bajas para "oir" el RS485. Inmediatamente después entras en el bucle infinito donde checas si has recibido algo y en tal caso vuelves a levantar PIN_C5 para "hablar" y usar el putc(). Pero ¿donde bajas PIN_C5 de nuevo para seguir "oyendo"?  :shock:

Por último te propongo este programa, lo copias, lo compilas sin tocar una coma y nos dices que tal te ha ido. A ver si vamos desbrozando el terreno y llegamos a alguna conclusión  :mrgreen::

Código: C#
  1. ///////////////////////////////////////////////////////////////////////////////////////////////////
  2. #include <16f877.h>
  3. ///////////////////////////////////////////////////////////////////////////////////////////////////
  4. // Fuses y ajuste de Clock
  5. ///////////////////////////////////////////////////////////////////////////////////////////////////
  6. #fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT
  7. #use delay(clock=20000000) // Verificar que el cristal es de 20 Mhz
  8. ///////////////////////////////////////////////////////////////////////////////////////////////////
  9. // Canal de Comunicación : usart
  10. ///////////////////////////////////////////////////////////////////////////////////////////////////
  11.  
  12. #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
  13.  
  14.  
  15. void main() {
  16.  
  17.   char rec;
  18.  
  19.   delay_ms(1000) // esperamos
  20.  
  21.    set_tris_c(0b10000000); // Configuramos bien pines TX y RX
  22.  
  23.   output_high(PIN_C5); // Habilito transmisión
  24.   printf("TyP_Serie_TTL\r\n");   // Al inicio escribe para ver que emite correctamente
  25.   output_low(PIN_C5);  // Habilito recepción
  26.  
  27.   do{                            // Bucle ...
  28.     if(kbhit()){                //  Si hay algo pendiente de recibir ....
  29.       rec=getc();              //  recibe el carácter ...
  30.       output_high(PIN_C5); // Habilito transmisión
  31.       putc(rec);               //  ... y lo escribes ...
  32.       output_low(PIN_C5);  // Habilito recepción
  33.     }                           // ... después continúa ...
  34.   }while(TRUE);                  // ... hasta el infinito.
  35. }
 
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: problema interrupcion rda.
« Respuesta #19 en: 10 de Noviembre de 2008, 09:54:13 »
Buenas, Tal y como djiste he compilado tu programa, pero sigue sin devolver ningún carácter,
he probado en poner un printf dentro de if(kbhit()){  y si que entra en la interrupción pero sin embargo no lo envia al PC.
Estoy esperando un max485 para descartar el error en el hardware, todavía no ha llegado. Por lo que el software creo que este último programa no tiene ningún error, a no ser que en el bucle al cambiarse todo el rato el pin de habilitación c5 el pic se colapse y por eso no envie.

Código: [Seleccionar]
      ///////////////////////////////////////////////////////////////////////////////////////////////////

      #include <16f877.h>

      ///////////////////////////////////////////////////////////////////////////////////////////////////

      // Fuses y ajuste de Clock

      ///////////////////////////////////////////////////////////////////////////////////////////////////

      #fuses HS,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT

      #use delay(clock=20000000) // Verificar que el cristal es de 20 Mhz

      ///////////////////////////////////////////////////////////////////////////////////////////////////

      // Canal de Comunicación : usart

      ///////////////////////////////////////////////////////////////////////////////////////////////////

      #use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
 
      void main() {

       char rec;

       delay_ms(1000); // esperamos

       set_tris_c(0b10000000); // Configuramos bien pines TX y RX

       output_high(PIN_C5); // Habilito transmisión

       printf("TyP_Serie_TTL\r\n");   // Al inicio escribe para ver que emite correctamente
     
       output_low(PIN_C5);  // Habilito recepción

       do{                            // Bucle ...

         if(kbhit()){                //  Si hay algo pendiente de recibir ....

           rec=getc();              //  recibe el carácter ...

           output_high(PIN_C5); // Habilito transmisión
         //printf("FUNIONA\r\n");
           putc(rec);               //  ... y lo escribes ...

           output_low(PIN_C5);  // Habilito recepción

         }                           // ... después continúa ...

       }while(TRUE);                  // ... hasta el infinito.

      }

Un saludo!

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: problema interrupcion rda.
« Respuesta #20 en: 10 de Noviembre de 2008, 10:35:28 »
perdón no en la interrupción sino en el while

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: problema interrupcion rda.
« Respuesta #21 en: 13 de Noviembre de 2008, 08:39:26 »
Buenas a todos,

He probado su codigo RedPic, y me envia la frase "TyP_Serie_TTL\r\n", pero sigo teniendo el problema aquí
do{                            // Bucle ...

         if(kbhit()){                //  Si hay algo pendiente de recibir ....

           rec=getc();              //  recibe el carácter ...

           output_high(PIN_C5); // Habilito transmisión
         //printf("FUNIONA\r\n");
           putc(rec);               //  ... y lo escribes ...

           output_low(PIN_C5);  // Habilito recepción

         }                           // ... después continúa ...

       }while(TRUE);                  // ... hasta el infinito.

      }


y es que por algun motivo no le llega ningún adto al pic para poder devolverlo. He cambiado el MAX485 por uno de nuevo y sigue haciendo lo mismo.  Sabe alguien cual puede ser el error?

gracias un saludo

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: problema interrupcion rda.
« Respuesta #22 en: 13 de Noviembre de 2008, 10:02:04 »
No se si esta información os  puede dar algún dato por donde puede estar el error, pero en el max en las patillas de recerepción de datos y de enviar datos estan a nivel alto simultaneamente(patillas 1 y 4). Las patillas 2 y 3 que son de habilitacion están a nivel bajo.

Las patilla de habilitación del pic queda a un nivel bajo, y las patillas de enviar datos del pic c6 y c7 están a nivel alto.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: problema interrupcion rda.
« Respuesta #23 en: 13 de Noviembre de 2008, 11:38:44 »
Hola.

Hiciste el puente entre los pines del conector DB9  como te dije anteriormente?

Otra cosa: Las conexiones entre PIC y PC deben ser las siguientes:

PIC -> MAX485 ---------------------- MAX485 -> MAX232 -> PC

Saludos.
El papel lo aguanta todo

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: problema interrupcion rda.
« Respuesta #24 en: 13 de Noviembre de 2008, 11:46:38 »
Bueno yo esque mi hardware es el siguiente:

pic-> rs 485 y rs485->usb  PC

y lo curioso es que cuando envio desde el PC al PIC, los cables balanceados los miro con el osciloscopio y le llegan datos pero sin embargo el PIC no recibe nada. Y el Max485 no esta roto.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: problema interrupcion rda.
« Respuesta #25 en: 13 de Noviembre de 2008, 11:57:56 »
Hola.

Ya, ya, Lo haces por USB. Ok.

Me imagino que en el PC estas usando CDC. Revisa las velocidades de transmision, que coincidan con las del PIC.

Saludos
El papel lo aguanta todo

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: problema interrupcion rda.
« Respuesta #26 en: 13 de Noviembre de 2008, 13:30:47 »
¿a que te refieres cuando dices si uso CDC?   Configuración de Dispositivos Conectados, si bueno en el ccs pongo a la velocidad que transmito.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: problema interrupcion rda.
« Respuesta #27 en: 13 de Noviembre de 2008, 20:56:24 »
Hola.

Me refiero a la clase de comunicacion. Hay varios tipos: HID, CDC, MSD. Me imagino que es CDC la tuya. Si es de esa manera aparece en el PC un COM virtual, en el cual hay que configurar la velocidad de transmision, el numero de bits, la paridad y esas cosas, es decir todo lo que configuras en el #use rs232 debe configurarse en el COM virtual del PC.

Saludos
El papel lo aguanta todo

Desconectado cheapekt

  • PIC12
  • **
  • Mensajes: 93
Re: problema interrupcion rda.
« Respuesta #28 en: 13 de Noviembre de 2008, 21:29:57 »
Ahhh.... si si todo eso esta configurado de la misma forma.... en el PC se ha creado un puerto serie virtual llamado COM4, ese puerto tiene las mismas caracteristicas que las que configuro en el ccs, el problema es que el pc si que recibe datos del pic pero el pic del pc no. Y no hay motivo aparente, o por lo menos yo no lo encuentro

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: problema interrupcion rda.
« Respuesta #29 en: 13 de Noviembre de 2008, 23:08:38 »
Hola.


Ok.

Como estas controlando el pin de habilitacion del max485 que esta conectado al conversor USB_485?.
El papel lo aguanta todo


 

anything