Autor Tema: Problemilla al recibir caracter en 16F877 desde PC  (Leído 2051 veces)

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

Desconectado joep2802

  • PIC10
  • *
  • Mensajes: 5
Problemilla al recibir caracter en 16F877 desde PC
« en: 24 de Enero de 2006, 12:39:00 »
FlashHola amigos estoy comenzando, si se quiere, con la programacion de un PIC16F877. El codigo que programe es el siguiente:

#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#include <input.c>
#include <stdlib.h>


byte multiplexor_H, multiplexor_L;
int i,maximo;

void set_modemA();
void set_modemB();
void set_portadoraA();
void set_portadoraB();
void set_premodulacion();
void incremento(byte multiplexor_H, byte multiplexor_L, int maximo);

void main()
{
   char opcion;
   int tarjeta;
   while(1)
   {
      delay_ms(100);
      opcion=getc();
      tarjeta=atoi(opcion);
      switch(tarjeta)
      {
         case 1: set_modemA();
              break;
         case 2: set_modemB();
              break;
         case 3: set_portadoraA();
              break;
         case 4: set_portadoraB();
              break;
         case 5: set_premodulacion();
              break;
      }
   }
}

void incremento(BYTE multiplexor_H, byte multiplexor_L, int maximo)
{
   output_d(multiplexor_H);
   for(i=0;i<maximo;i++)
   {
      output_b(multiplexor_L);
      ++multiplexor_L;
      delay_ms(1000);
   }
}

void set_modemA()
{
   multiplexor_H=0x01;
   multiplexor_L=0x00;
   maximo=52;
   incremento(multiplexor_H,multiplexor_L,maximo);
}

void set_modemB()
{
   multiplexor_H=0x02;
   multiplexor_L=0x00;
   maximo=52;
   incremento(multiplexor_H,multiplexor_L,maximo);
}

void set_portadoraA()
{
   multiplexor_H=0x03;
   multiplexor_L=0x00;
   maximo=30;
   incremento(multiplexor_H,multiplexor_L,maximo);
}

void set_portadoraB()
{
   multiplexor_H=0x04;
   multiplexor_L=0x00;
   maximo=30;
   incremento(multiplexor_H,multiplexor_L,maximo);
}

void set_premodulacion()
{
   multiplexor_H=0x05;
   multiplexor_L=0x00;
   maximo=30;
   incremento(multiplexor_H,multiplexor_L,maximo);
}

   Brevemente lo que deseo realizar es un proceso de multiplexacion,que se llevara a  cabo de acuerdo al caracer que envie desde el PC, en este caso un1,2,3,4 ó 5.

   Una vez que recibo este caracter hago un switch() para mostrar por los puertos b y d los bits deseados (digamos una direccion). La cuestion es que con esta direccion comenzare un conteo hasta cierto valor, a medida que esta direccion ascienda en valor binario (como un contador), ire activando las entradas de algunos multiplexores.

   De verdad he probado con varias modificaciones y nada. Lo cierto es que el PIC esta en buen estado porq con cualquier otro programa sencillo que le programe este funciona.De hecho una de las modificaciones fue eliminar la comunicacion PC-PIC dejando la variable tarjeta con un valor especifico para comprobar la funcionalidad del SWITCH(), y este funciona perfecto.

   De antemano muchisimas gracias por la colaboracion prestada.Espero sus prontas respuestas.

 Un saludo desde venezuela

Desconectado lovando

  • PIC16
  • ***
  • Mensajes: 193
RE: Problemilla al recibir caracter en 16F877 desde PC
« Respuesta #1 en: 24 de Enero de 2006, 21:06:00 »
Hola

Bueno, podrias inicar que es exactamente lo que te sucede?.

1.- Compila ?
2.- Recibes algo desde el PC?
3.- La interconexion entre el PC y el PIC es la correcta (TRansistores o MAX232)


Sugerencias


a)  Agrega bits=8, parity=N en la sentencia del rs232
b)  Aplica una rutina de atencion a interrupcion RDA, osea #int_RDA y recien ahi aplica tu rituna de lectura
c)  En el codigo C, primero creas las rutinas especificas de modo que el main() quede al final..

Cuentanos como te va

Saludos

Desconectado joep2802

  • PIC10
  • *
  • Mensajes: 5
RE: Problemilla al recibir caracter en 16F877 desde PC
« Respuesta #2 en: 04 de Febrero de 2006, 10:35:00 »
desquiciadode verdad que intente hacer las pruebas que me dijeron acerca de la modificacion del bits=8 y parity=N, pero sigue sin responder a lo que envie por PC. Por  esto creo que debe ser un problema de comunicacion o de mala conexion entre el max-232   y  el PIC. Lo raro es que  cuando  programo el pic con mi programador todo sale  bien a excepcion de cuando envio algun caracter....

De hecho intente probar con otro programa que consegui en otro tema y tampoco funciona nada, se queda como muerto!.El programa que copie es el siguiente:

#include <16f877.h>
#fuses HS, NOPROTECT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay(clock=20000000)
#use rs232(baud=9600, bits=8, parity=N, xmit=PIN_C6, rcv=PIN_C7)

char opcion;

izq()
{
//   do
//    {
        output_b(1);
        delay_ms(1000);
        output_b(2);
        delay_ms(1000);
        output_b(4);
        delay_ms(1000);
        output_b(8);
        delay_ms(1000);
//    }
//    while (opcion=="1");
}
der()
{
//   do
//    {
       output_b(8);
        delay_ms(1000);
        output_b(4);
        delay_ms(1000);
        output_b(2);
        delay_ms(1000);
        output_b(1);
        delay_ms(1000);
//    }
//    while (opcion=="2");
}

/*

detener()
{
   do
    {
       while(!kbhit());
        opcion=getc();
    }
    while (opcion!="1" && opcion!="2");
}

*/

detener()
{
      output_b(0);
}

main()
{
   set_tris_b(0x00);
   output_b(0);

    while (TRUE)
    {
       //detener();

       opcion=getc();

        switch (opcion)
       {
         case "1":
          do
          izq();
          while(!kbhit());
          break;
          case "2":
          do
          der();
          while(!kbhit());
          break;
          case "3":
           detener();
          break;
        }
    }
}

De todos modos necesito que me asesoren acerca de como puedo hacer para comprobar que estoy recibiendo bien los datos enviados por PC, he intentado con la interfaz que trae el PCWH el serial monitor y nada; si fueran tan amables de indicarme de otro que sea mas eficiente se los agradeceria, y ademas de como compruebo lo que les dije.
Muchas gracias por las atenciones brindadas,espero sus respuestas;

GRACIAS

Desconectado bottar

  • PIC10
  • *
  • Mensajes: 6
RE: Problemilla al recibir caracter en 16F877 desde PC
« Respuesta #3 en: 04 de Febrero de 2006, 18:58:00 »
Buenas, a priori el código parece estar bien (no lo he probador), pero como dice lovando te aconsejo que definas la interrupcion de comunicaciones serie int_rda.

Si no la defines entonces te aconsejaria que en la declaracion del rs232 añadieses ademas STREAM=COM_A o como quieras llamar al puerto de comunicaciones, y cuando leas la recepción del caracter los hagas con fgets(COM_A).

Con respecto a como comprobar lo que te ha llegado, es sencillo, configura el Hiperterminal de Windows como Conexion COM1 (suponiendo que sea este el puerto del PC que quieras usar para recibir las respuestas) Velocidad=9600 ,Paridad=None, y 1 bit de Stop.

De esta manera podras tanto enviarle datos al pic como recibir sus respuestas.

Espero haberte ayudado, un saludo Giño.

Desconectado joep2802

  • PIC10
  • *
  • Mensajes: 5
RE: Problemilla al recibir caracter en 16F877 desde PC
« Respuesta #4 en: 10 de Febrero de 2006, 19:10:00 »
SonrisaHola amigos ya comprobé el fin de semana algunas cosas y entre esas pude determinar que una de esas es que el max-232 estaba defectuoso, por lo que lo cambie y con ayuda de otro programa que conseguí pude por fin realizar una comunicación.

Luego de esto, después de varios intentos en la reforma del programa inicial que planteé pude conseguir el objetivo básico de lo que deseo. Una de las modificaciones que hice fue la que hizo el compañero “lovando”: cree las rutinas especificas de las funciones antes del main y parece que esto ayudo mucho; de igual manera probé con la inserción de los parámetros bits=8 y parity=n y sin estos en la definición de la usart y de ambos modos funciono.

Aquí les paso el codigo:

#include <16F877.h>
#fuses HS, NOPROTECT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay(clock=20000000)
#use rs232(baud=9600, bits=8, parity=N, xmit=PIN_C6, rcv=PIN_C7)

char tarjeta;
int multiplexor_H, multiplexor_L;
int i,maximo;

void incremento(int multiplexor_H, int multiplexor_L, int maximo)
{
   output_d(multiplexor_H);
   for(i=0;i<maximo;i++)
   {
      output_b(multiplexor_L);
      ++multiplexor_L;
      delay_ms(1000);
   }

}

set_modemA()
{
   multiplexor_H=0x00;
   multiplexor_L=0x00;
   maximo=10;
   incremento(multiplexor_H,multiplexor_L,maximo);
   output_b(0);
   output_d(0);
}

set_modemB()
{
   multiplexor_H=0x01;
   multiplexor_L=0x00;
   maximo=10;
   incremento(multiplexor_H,multiplexor_L,maximo);
   output_b(0);
   output_d(0);
}

set_portadoraA()
{
   multiplexor_H=0x02;
   multiplexor_L=0x00;
   maximo=10;
   incremento(multiplexor_H,multiplexor_L,maximo);
   output_b(0);
   output_d(0);
}

set_portadoraB()
{
   multiplexor_H=0x03;
   multiplexor_L=0x00;
   maximo=10;
   incremento(multiplexor_H,multiplexor_L,maximo);
   output_b(0);
   output_d(0);
}

set_premodulacion()
{
   multiplexor_H=0x04;
   multiplexor_L=0x00;
   maximo=10;
   incremento(multiplexor_H,multiplexor_L,maximo);
   output_b(0);
   output_d(0);
}


main()
{
   set_tris_b(0x00);
   output_b(0);
   set_tris_d(0x00);
   output_d(0);
   while (TRUE)
   {
      tarjeta=getc();
      switch(tarjeta)
      {
         case "0":
               do
               set_modemA();
               while(!kbhit());
               break;
         case "1":
               do
               set_modemB();
               while(!kbhit());
               break;
         case "2":
               do
               set_portadoraA();
               while(!kbhit());
               break;
         case "3":
               do
               set_portadoraB();
               while(!kbhit());
               break;
         case "4":
               do
               set_premodulacion();
               while(!kbhit());
               break;
      }
   }
}

Gracias por la ayuda prestada amigos, estamos en contacto para cualquier duda