TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Xelene en 18 de Mayo de 2005, 03:28:00

Título: A vueltas de nuevo con el RS232
Publicado por: Xelene 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)
Título: RE: A vueltas de nuevo con el RS232
Publicado por: Nocturno 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.
Título: RE: A vueltas de nuevo con el RS232
Publicado por: Xelene 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
Título: RE: A vueltas de nuevo con el RS232
Publicado por: Nocturno 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
Título: RE: A vueltas de nuevo con el RS232
Publicado por: Xelene 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  ");
   }
}
}
Título: RE: A vueltas de nuevo con el RS232
Publicado por: J1M 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
Título: RE: A vueltas de nuevo con el RS232
Publicado por: Xelene 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
Título: RE: A vueltas de nuevo con el RS232
Publicado por: Xelene 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(" ");
 }
}

 
 
Título: RE: A vueltas de nuevo con el RS232
Publicado por: cucaracha 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!!
Título: RE: A vueltas de nuevo con el RS232
Publicado por: Xelene 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




Título: RE: A vueltas de nuevo con el RS232
Publicado por: Xelene 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(" ");

}
}
Título: RE: A vueltas de nuevo con el RS232
Publicado por: Xelene 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!!
Título: RE: A vueltas de nuevo con el RS232
Publicado por: Julepaiser 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
Título: RE: A vueltas de nuevo con el RS232
Publicado por: Xelene 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.
Título: RE: A vueltas de nuevo con el RS232
Publicado por: Julepaiser 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
Título: RE: A vueltas de nuevo con el RS232
Publicado por: Xelene en 16 de Junio de 2005, 07:18:00
Josep, tu problema seguramente está en el cable. No sirve un cable serie como el que utilizas tu cable es CRUZADO y debe de ser NO CRUZADO. Venden adaptadores en cualquier tienda de electrónica que hacen la conversión o lo puedes hacer tu simplemente cruzando las señales 2 y 3 uniendo el 5.

En el mensaje privado te decía que terminaré el proyecto para el 5 de Julio, si puedes esperar hasta entonces te lo mandaré entero. Si te interesa solo la parte puramente teórica puedo mandarte los capítulos correspondientes si quieres, aunq x mi parte preferiría esperar a tenerlo todo xq seguramente sufrirán modificaciones.

Saludos, Maria.