Autor Tema: A vueltas de nuevo con el RS232  (Leído 4408 veces)

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

Desconectado Xelene

  • PIC12
  • **
  • Mensajes: 81
A vueltas de nuevo con el RS232
« en: 18 de Mayo de 2005, 03:28:00 »
Después de varias semanas sin tocar los pics, lo retomo donde lo dejé: la comunicación PIC-PC via rs232.

El programa q he hecho os lo pongo abajo. Mi problema es q da igual q intente enviar q recibir, en el hyperterminal de windows no aparece nada, ni me deja escribir. La configuración del pc es la misma del  pic... El cable lo he hecho partiendo de un cable serie normal y cruzando el 2 y 3 y uniendo el 5... yo creo q está bien.

¿Alguna idea?

Codigo:
#include <16f877.h>

#use delay(clock=4000000)
#use RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7)
#use fast_io(B)
//
// 9600 baudios, 8 bits de datos, sin paridad.
//
//   ------------*                  *--------
//               |                  |
//   P   RC6(TxD)|----------------->|(RxD)
//   I           |                  |       PC
//   C   RC7(RxD)|<-----------------|(TxD)
//               |                  |
//   ------------*                  *--------

main()
{
    set_tris_b(0);

  while(1)
  {
    output_B(1);
    delay_ms(65);
    output_B(0);
    delay_ms(65);
   
    puts(" hola ");      // El pic transmite al pc la cadena.
   
    output_B(2);
    delay_ms(65);
    output_B(0);
    delay_ms(65);
  }
}


Por cierto, lo de puerto b lo he puesto para saber q el pic sigue vivo en todo momento (y efectivamente, sigue vivo)

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: A vueltas de nuevo con el RS232
« Respuesta #1 en: 18 de Mayo de 2005, 04:22:00 »
¿Has puesto un MAX232 entre PC y PIC?, ¿le has conectado los correspondientes condensadores?, esto no tiene más misterio, si está bien conectado debería funcionar.

Desconectado Xelene

  • PIC12
  • **
  • Mensajes: 81
RE: A vueltas de nuevo con el RS232
« Respuesta #2 en: 18 de Mayo de 2005, 09:16:00 »
Gracias por tu respuesta nocturno, si tengo el max, he cambiado de cable, el problema estaba ahí Flash. Se ve que mi placa de pruebas, la picdem 2 plus, trabaja con un cable serie normal... seguiré haciendo pruebas, xq pa mi q antes con uno normal no iba... xo en fin, el caso es q este programita en concreto ya tira.

X cierto, el día 11... nos vemos en la final
Saludos desde Pamplona!!

Giño

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: A vueltas de nuevo con el RS232
« Respuesta #3 en: 18 de Mayo de 2005, 09:20:00 »
Me alegro que funcionase.

Halaaaaa, no imaginaba que fueras rojilla. Pues bien, que gane el mejor ... y que seamos nosotros Sonrisa Gigante

Desconectado Xelene

  • PIC12
  • **
  • Mensajes: 81
RE: A vueltas de nuevo con el RS232
« Respuesta #4 en: 19 de Mayo de 2005, 09:33:00 »
Pozi, rojilla desde q nasí, así q no veo tan claro q gane el beti, jeje. A lo q voy...

Estoy haciendo un programa PWM + RS232, el programa sin más pregunta via serie la frecuencia y el duty... a partir de ahí el pic se supone q lo recoge y lo muestra por lcd y a través de un led...

He hecho esta primera aproximación, pero veo q no entrá en las condiciones... a partir del primer if no hace caso... no sé si es q debo dar un tratamiento primero al caracter recibido (q supongo q es lo q será, pero no sé como hacerlo) o es alguna otra xorradilla q se me olvida... os pongo el programa. Gracias!!

Codigo:
#include <16f877.h>
#fuses HS,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP

#use delay(clock=4000000)
#use RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7, RESTART_WDT)

#use fast_io(B)
#byte PORTB=6

#include <lcd-picdem.c>

main()
{
  char c;
  long int k;

  lcd_init();
  lcd_gotoxy(1,1);

  PORTB=0b00000010;             // B1 será el led q emplearemos para la modulación
  setup_ccp1(CCP_PWM);                          // Configura CCP1 como PWM
  set_pwm1_duty(0);                             // Frecuencia 0 de partida

while(1)
{
  puts("Pulsa 1, 2 o 3 segun a la frecuencia que prefieras trabajar: ");
  puts("1. f=500Hz (T=2ms=2000us)");
  puts("2. f=2kHz  (T=0.5ms=500us)");
  puts("3. f=20kHz (T=50us)");

  c = getc();
 
  if (c=1)
   {
   setup_timer_2(T2_DIV_BY_16,124,1);            // f=500Hz (T=2ms)
   puts("Has seleccionado la frecuencia de 500 Hz");
   lcd_putc(" f=500Hz->T=2ms ");
   }
  if (c=2)
   {
   setup_timer_2(T2_DIV_BY_16,30,1);            // f=2KHz (T=0,5ms)
   puts("Has seleccionado la frecuencia de 2 KHz");
   lcd_putc("f=2kHz->T=0.5ms ");
   }
  if (c=3)
   {
   setup_timer_2(T2_DIV_BY_16,2,1);             // f=20KHz (T=50us)
   puts("Has seleccionado la frecuencia de 20 KHz");
   lcd_putc("f=20KHz->T=50us ");
   }
  else
   {
   puts("El numero seleccionado no es correcto");
   }

  puts("Ahora selecciona el duty de la misma manera: ");
  puts("1. Duty=1.5ms");
  puts("2. Duty=750us");

  c = getc();
 
  if (c=1)
   {
   set_pwm1_duty(94);                            // Duty=1,5ms
   puts("Has seleccionado el duty de 1.5ms");
   lcd_putc("  Duty = 1.5ms  ");
   }
  if (c=2)
   {
   set_pwm1_duty(16);                            // Duty=750us
   puts("Has seleccionado el duty de 750us");
   lcd_putc("  Duty = 750us  ");
   }
}
}

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
RE: A vueltas de nuevo con el RS232
« Respuesta #5 en: 19 de Mayo de 2005, 09:45:00 »
Creo que tienes un pequeño fallo con los if...

debería ser:

if (c==1)
{
...
}

es decir, doble signo igual, lo que estas haciendo es asignar el valor 1 a la variable c, por eso se te queda siempre "enganxado" en el primer if

saludos! Giño

Desconectado Xelene

  • PIC12
  • **
  • Mensajes: 81
RE: A vueltas de nuevo con el RS232
« Respuesta #6 en: 19 de Mayo de 2005, 09:55:00 »
Si, J1M, tienes razón, me di cuenta nada mas postear el mensaje. Sin embargo no era todo lo q faltaba, he tenido q usar la funcion "atoi" para convertir el caracter.

Ahora ya, creo q funciona bien, seguiré completandolo con más cosillas.

Asias Rebotado

Desconectado Xelene

  • PIC12
  • **
  • Mensajes: 81
RE: A vueltas de nuevo con el RS232
« Respuesta #7 en: 23 de Mayo de 2005, 10:29:00 »
Holas de nuevo!! Sigo completando (y complicando) el programita con el que empecé... Os dejo luego lo que llevo hecho hasta ahora.

Ahora me gustaria que el programa cambiase bastante. En vez de dar opciones, me gustaria meter directamente una frecuencia y un duty cualquiera. El problema me viene a la hora de operar... Un ejemplo: Si yo meto frecuencia 500 Hz, tengo q operar para calcular PR2. Algo así

puts("Elige la frecuencia que prefieras trabajar en Hz y pulsa INTRO: ");

  gets(frec);
  k = atoi32(frec);            //Convierte los caracteres ascii recibidos a un numero entero.

  PR2=((1/frec)*1000000/16)-1;
  setup_timer_2(T2_DIV_BY_16,PR2,1);

Pero esto así no funciona, alguien me puede decir como hacerlo?

Aqui va el programa q he hecho de momento:

Codigo:
#include <16f877.h>
#fuses HS,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP

#use delay(clock=4000000)
#use RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7, RESTART_WDT)

#use fast_io(B)
#byte PORTB=6

#include <lcd-picdem.c>
#include <stdlib.h>

  char c[1];
  long int k1,k2;

main()
{
  lcd_init();
  lcd_gotoxy(1,1);

  PORTB=0b00000010;             // B1 será el led q emplearemos para la modulación
  setup_ccp1(CCP_PWM);        // Configura CCP1 como PWM

// Esta parte hasta el bucle infinito comprueba la eeprom para saber con que valores se trabajó anteriormente

  puts("La ultima vez se trabajo con:");

  k1=read_eeprom(0);          // Lee el valor de la última frecuencia seleccionada
  if (k1==1)
   {
   setup_timer_2(T2_DIV_BY_16,124,1);            // f=500Hz (T=2ms)
   puts("Una frecuencia de 500 Hz");
   }
  if (k1==2)
   {
   setup_timer_2(T2_DIV_BY_16,30,1);            // f=2KHz (T=0,5ms)
   puts("Una frecuencia de 2 KHz");
   }
  if (k1==3)
   {
   setup_timer_2(T2_DIV_BY_16,2,1);             // f=20KHz (T=50us)
   puts("Una frecuencia de 20 KHz");
   }

  k2=read_eeprom(1);          // Lee el valor del último duty seleccionado
  if (k2==1)
   {
   set_pwm1_duty(94);          // Duty=1,5ms
   puts("Y un duty de 1,5ms");
   }
  if (k2==2)
   {
   set_pwm1_duty(16);          // Duty=750us
   puts("Y un duty de 750us");
   }

while(1)
{
 parte1:

  puts("Pulsa 1, 2 o 3 segun a la frecuencia que ahora prefieras trabajar: ");
  puts("1. f=500Hz (T=2ms=2000us)");
  puts("2. f=2kHz  (T=0.5ms=500us)");
  puts("3. f=20kHz (T=50us)");

  gets(c);
 
  k1 = atoi32(c);      //Convierte los caracteres ascii recibidos a un numero entero.
  write_eeprom(0,k1); // Escribe k1 en la direccion 0 de la eeprom

  lcd_gotoxy(1,1);

  if (k1==1)
   {
   setup_timer_2(T2_DIV_BY_16,124,1);            // f=500Hz (T=2ms)
   puts("Has seleccionado la frecuencia de 500 Hz");
   lcd_putc(" f=500Hz->T=2ms ");
   }
  if (k1==2)
   {
   setup_timer_2(T2_DIV_BY_16,30,1);            // f=2KHz (T=0,5ms)
   puts("Has seleccionado la frecuencia de 2 KHz");
   lcd_putc("f=2kHz->T=0.5ms ");
   }
  if (k1==3)
   {
   setup_timer_2(T2_DIV_BY_16,2,1);             // f=20KHz (T=50us)
   puts("Has seleccionado la frecuencia de 20 KHz");
   lcd_putc("f=20KHz->T=50us ");
   }
  if ((k1!=1)&(k1!=2)&(k1!=3))
   {
   puts("Error: Frecuencia indebida, selecciona de nuevo");
   goto parte1;
   }

 parte2:

  puts("Selecciona el duty pulsando 1 o 2: ");
  puts("1. Duty=1.5ms");
  puts("2. Duty=750us");

  gets(c);

  k2 = atoi32(c);      //Convierte los caracteres ascii recibidos a un numero entero.
  write_eeprom(1,k2);       // Escribe k2 en la direccion 1 de la eeprom

  lcd_gotoxy(1,2);

  if (k2==1)
   {
   set_pwm1_duty(94);                            // Duty=1,5ms
   puts("Has seleccionado el duty de 1.5ms");
   lcd_putc("  Duty = 1.5ms  ");
   }
  if (k2==2)
   {
   set_pwm1_duty(16);                            // Duty=750us
   puts("Has seleccionado el duty de 750us");
   lcd_putc("  Duty = 750us  ");
   }
  if ((k2!=1)&(k2!=2))
   {
   puts("Duty incorrecto, selecciona de nuevo");
   goto parte2;
   }
  puts(" ");
 }
}

 
 

Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
RE: A vueltas de nuevo con el RS232
« Respuesta #8 en: 23 de Mayo de 2005, 10:50:00 »
Supongo será una errata al escribir el mensaje.. pero por si acaso:

gets(frec);
k = atoi32(frec); //Convierte los caracteres ascii recibidos a un numero entero.

PR2=((1/frec)*1000000/16)-1;
setup_timer_2(T2_DIV_BY_16,PR2,1);

Cuando calculas PR2 usas por error frec en lugar de k


Saludos y suerte!!
Saludos desde Huelva (ESPAÑA)

Desconectado Xelene

  • PIC12
  • **
  • Mensajes: 81
RE: A vueltas de nuevo con el RS232
« Respuesta #9 en: 25 de Mayo de 2005, 04:58:00 »
Si, cucaracha, era una errata al redactar el mensaje, no me di cuenta
Creo q mi problema está en la definición de datos. ¡ Va a ser q me toi liando con los bits, los signos y las operaciones!

Si yo defino PR2 como entero de 8 bits y yo hago una cuenta del tipo:

PR2=62500/2000=31.25

¿PR2 que valor toma si lo he definido como entero de 8 bits??

Helado





Desconectado Xelene

  • PIC12
  • **
  • Mensajes: 81
RE: A vueltas de nuevo con el RS232
« Respuesta #10 en: 25 de Mayo de 2005, 10:42:00 »
Ya esta todo controlao!!!! Ole ole y ole!!

Dejo aqui el programa por si alguien le puede interesar.

//Resumen: El programa trabaja con PWM a distancia (a traves de RS232), con ayuda del hyperterminal se introduce una frecuencia y un duty, el resultado se puede ver a través de una pantalla LCD y un led conectado a RC2//

Codigo:
#include <16f877.h>
#fuses HS,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP

#use delay(clock=4000000)
#use RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7, RESTART_WDT)

#use fast_io(B)
#byte PORTB=6

#include <lcd-picdem.c>
#include <stdlib.h>

  char frec[5];
  long int k1,K2,PR2,CCPR1L;

main()
{

  lcd_init();
  lcd_gotoxy(1,1);
  lcd_putc("F=          Hz");
 
  lcd_gotoxy(1,2);
  lcd_putc("Duty=       us");

  PORTB=0b00000010;             // B1 será el led q emplearemos para la modulación
  setup_ccp1(CCP_PWM);                          // Configura CCP1 como PWM

  puts("Ejercicio de PWM a distancia.");
 
  set_pwm1_duty(0);                             // Frecuencia 0 de partida

while(1)
{
 parte1:

  puts("Elige la frecuencia que prefieras trabajar en Hz y pulsa INTRO: ");

  gets(frec);
  k1 = atoi32(frec);            //Convierte los caracteres ascii recibidos a un numero entero.
  printf("%Lu" " Hz", k1);
  puts(" ");

  PR2=(62500/k1)-1;
  if ((PR2<0)|(PR2>255))
   {
   puts("Frecuencia indebida, seleccione de nuevo una frecuencia");
   goto parte1;
   }
  if ((PR2>0)&(PR2<256))
   {
   setup_timer_2(T2_DIV_BY_16,PR2,1);
   printf(" por tanto, PR2=" "%Lu", PR2);
   puts(" ");
   }
 
  lcd_gotoxy(4,1);
  printf(lcd_putc,"%Lu",k1);
 
 parte2:

  puts("Elige el duty en us y pulsa INTRO: ");

  gets(frec);
  k2 = atoi32(frec);
  printf("%Lu" " us", k2);      //Devolvemos el dato recibido por la USART, Por ejemplo.
  puts(" ");

  CCPR1L=k2/16;
  if ((CCPR1L<0)|(CCPR1L>255))
   {
   puts("Duty incorrecto, repite el proceso");
   goto parte2;
   }
  if ((CCPR1L>0)&(CCPR1L<256))
   {
   set_pwm1_duty(CCPR1L);
   printf(" por tanto, CCPR1L=" "%Lu", CCPR1L);
   puts(" ");
   }

  lcd_gotoxy(7,2);
  printf(lcd_putc,"%Lu",k2);

  puts("Muy bien, ahora comprueba el resultado en la placa.");
  puts(" ");

}
}

Desconectado Xelene

  • PIC12
  • **
  • Mensajes: 81
RE: A vueltas de nuevo con el RS232
« Respuesta #11 en: 27 de Mayo de 2005, 02:34:00 »
Siento ser tan sumamente pesada Angelito pero he visto que el hiperterminal se pueden enviar archivos de texto, ¿Funcionaría eso con un PIC? y en ese caso ¿Qué mandas en un archivo?¿Funcionaría como una librería? Nu se. Si alguien ha hecho algun ejemplito alguna vez no estaría mal q lo pusiera x aqui.

Asias!!

Desconectado Julepaiser

  • PIC10
  • *
  • Mensajes: 12
RE: A vueltas de nuevo con el RS232
« Respuesta #12 en: 15 de Junio de 2005, 19:02:00 »
Ayuda con el RS232

Buenas a todos,

Estoy haciendo un circuito con el 16F876A y uso el RS232, he copiado el programita de arriba y no me va. Tengo un MAX232 con 4C de 1uf en sus patas y la 2 y 3 de TX y RX cortcircuitadas para ver si envia algo.
Hay alguna manera de si transmite algo o como debugarlo a algo.

Gracias por adelantado

Josep

Desconectado Xelene

  • PIC12
  • **
  • Mensajes: 81
RE: A vueltas de nuevo con el RS232
« Respuesta #13 en: 16 de Junio de 2005, 04:57:00 »
...Asi a simple vista solo se me ocurre q puedas tener la configuración incorrecta:

#use RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7, RESTART_WDT)... q pines del 876 tienes conectado al puerto serie?

Yo para comprobar siempre he ido a maneras más practicas q una simulación. He tirado de pantallas que muestren algun resultado... y si no, con un osciloscopio cuando podía disponer de él.

Si lo estas conectando a un PC además debes comprobar el tipo de cable, no son todos válidos.

Por lo demás, debería funcionar.

Desconectado Julepaiser

  • PIC10
  • *
  • Mensajes: 12
RE: A vueltas de nuevo con el RS232
« Respuesta #14 en: 16 de Junio de 2005, 06:53:00 »
Hola Xelene,

RX

En el Pin 18 del PIC tengo RC7 conectado al Pin 12 del MAX232 y el PIN 14 del MAX al 2 y 3 del DB9.

TX

En el Pin 17 del PIC tengo RC6 conectado al Pin 11 del MAX232 y el PIN 13 del MAX al 2 y 3 del DB9.

El cable serie es el que utilizo para programar el TE20, y funciona perfectamente para grabar el PIC.

No he podido leer el mail en mi cuenta en @, podrias subirlo en algun sitio por lo menos de comunicacion serie.

Saludos y Muchas GRacias

Josep