Autor Tema: problema con rs 232 y puerto c con reles 16f876  (Leído 3414 veces)

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

Desconectado juansi

  • PIC16
  • ***
  • Mensajes: 102
problema con rs 232 y puerto c con reles 16f876
« en: 17 de Junio de 2009, 18:54:56 »
pues mi problema es el siguiente, he hecho un codigo en el q uso el puerto c del 16f876 para unos reles y quiero usar rs232 para comunicarme, el caso es q el codigo funciona bien pero el rs232 no, ¿puede ser por  "set_tris_c(0x00);" o por "output_c(0x00);", o alguna otra cosa?
el caso es q los mensajes q mando al pc salen en distorsionados
gracias de antemano
Las mujeres quieren "SOLUCIONES", y los hombres lo mismo pero escrito al reves.

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: problema con rs 232 y puerto c con reles 16f876
« Respuesta #1 en: 17 de Junio de 2009, 18:58:59 »
en este caso tendrias ke enviar caracteres y el pic que los reciba que los interprete asi nadamas mediante If dices lo que necesitas hacer

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: problema con rs 232 y puerto c con reles 16f876
« Respuesta #2 en: 17 de Junio de 2009, 19:03:57 »
Cuando decís distorsionado a que te referís? se envía solo parte del mensaje, solo aparecen caracteres raros? Esta bien configurado el baud rate?
No contesto mensajes privados, las consultas en el foro

Desconectado juansi

  • PIC16
  • ***
  • Mensajes: 102
Re: problema con rs 232 y puerto c con reles 16f876
« Respuesta #3 en: 17 de Junio de 2009, 19:07:43 »
primero los mensajes salen bien pero en una parte del programa salen en codigo ascci
Las mujeres quieren "SOLUCIONES", y los hombres lo mismo pero escrito al reves.

Desconectado juansi

  • PIC16
  • ***
  • Mensajes: 102
Re: problema con rs 232 y puerto c con reles 16f876
« Respuesta #4 en: 17 de Junio de 2009, 19:17:39 »
se me olvido decir q en mi codigo tengo tambien una interrupcion timer0


gracias
Las mujeres quieren "SOLUCIONES", y los hombres lo mismo pero escrito al reves.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: problema con rs 232 y puerto c con reles 16f876
« Respuesta #5 en: 17 de Junio de 2009, 19:18:22 »
Coloca el código para verlo...
No contesto mensajes privados, las consultas en el foro

Desconectado juansi

  • PIC16
  • ***
  • Mensajes: 102
Re: problema con rs 232 y puerto c con reles 16f876
« Respuesta #6 en: 17 de Junio de 2009, 19:21:17 »
aun no esta terminado y es un poco largo pèro ahi va:

Código: Text
  1. #include <16f876.h>
  2. #fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
  3. #use delay (clock=4000000)
  4.  
  5. #use standard_io(C)
  6. #use standard_io(A)
  7.  
  8. #include <flex_lcd.c>
  9. #define use_portb_lcd TRUE
  10. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, FORCE_SW)
  11. void error(void);
  12. void configurar(void);
  13. void memorizar(void);
  14. void trabajar(void);
  15. void rs232(void);
  16. int factor[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
  17. int lat=0,flag=0,ti=0,err=0;
  18. int rx=1,ry=1,z=1,zz=1,menu=0,pas=0,pul=0,avc=0,u=0,w=0,chek=0,menu2=0;
  19. char y=1,LAST_VOLUME=0;
  20. signed char x=1;
  21. boolean v=0;
  22.  
  23. #int_timer0
  24. void interrupcion()
  25. {
  26. if(flag==20){
  27.    lat++;
  28.    flag=0;
  29.    if(lat>15)
  30.       lat=0;
  31. }
  32. set_timer0(61);
  33. flag++;
  34. if(ti==1)
  35.    err++;
  36. }
  37.  
  38.  
  39. void main(void)
  40. {
  41. set_tris_c(0b00000000);
  42. set_tris_a(0xff);
  43. enable_interrupts(INT_TIMER0);
  44. setup_counters(RTCC_INTERNAL,RTCC_DIV_256);
  45. set_timer0(61);
  46. lcd_init();
  47. LAST_VOLUME=0;
  48. rx = read_EEPROM (LAST_VOLUME);
  49. LAST_VOLUME++;
  50. ry = read_EEPROM (LAST_VOLUME);
  51. LAST_VOLUME++;
  52. z = read_EEPROM (LAST_VOLUME);
  53. LAST_VOLUME++;
  54. zz = read_EEPROM (LAST_VOLUME);
  55. LAST_VOLUME=0;
  56. puts("Maquina de Afilar         JCS, S.L.,\n");
  57. puts("Pulsa \" R \" para manejar desde el pc");
  58. do{
  59. if(!input(pin_a0)){
  60.    while(!input(pin_a0)){}
  61.    menu++;
  62.    lcd_putc("\f");
  63.  
  64. }
  65. configurar();
  66. }while(true);
  67. }
  68.  
  69. void configurar(void)
  70. {
  71. switch(menu){
  72.    case 0: lcd_gotoxy(1,1);
  73.    lcd_putc("Afiladora JCG,SL
  74. por:   Juan Cruz");
  75.       flag=0;
  76.       lat=0;
  77.       err=0;
  78.       pas=0;
  79.       pul=0;
  80.       avc=0;
  81.       u=0;
  82.       w=0;
  83.       v=0;
  84.       output_c(0x00);
  85.    break;
  86.    case 1: lcd_gotoxy(1,1);
  87.      lcd_putc("Tiempo
  88. Barrido:");
  89.      lcd_gotoxy(10,2);
  90.      printf(lcd_putc,"%u",factor[ rx ]);
  91.       if(!input(pin_a1)){
  92.          while(!input(pin_a1)){}
  93.          lcd_putc("\f" );
  94.          rx++;
  95.          if(rx>15)
  96.             rx=1;
  97.       }
  98.    break;
  99.    case 2: lcd_gotoxy(1,1);
  100.       lcd_putc("Pasadas para
  101. avance:");
  102.       lcd_gotoxy(10,2);
  103.       printf(lcd_putc,"%u",factor[ ry ]);
  104.       if(!input(pin_a1)){
  105.          while(!input(pin_a1)){}
  106.          lcd_putc("\f" );
  107.          ry++;
  108.          if(ry>15)
  109.             ry=1;
  110.       }
  111.    break;
  112.    case 3: lcd_gotoxy(1,1);
  113.       lcd_putc("Avance en
  114. decimas:");
  115.       lcd_gotoxy(10,2);
  116.       printf(lcd_putc,"%u",factor[ z ]);
  117.       if(!input(pin_a1)){
  118.          while(!input(pin_a1)){}
  119.          lcd_putc("\f" );
  120.          z++;
  121.          if(z>10)
  122.             z=1;
  123.       }
  124.    break;
  125.    case 4: lcd_gotoxy(1,1);
  126.       lcd_putc("Cantidad de
  127. Avances:");
  128.       lcd_gotoxy(10,2);
  129.       printf(lcd_putc,"%u",factor[ zz ]);
  130.       if(!input(pin_a1)){
  131.          while(!input(pin_a1)){}
  132.          lcd_putc("\f" );
  133.          zz++;
  134.          if(zz>15)
  135.             zz=1;
  136.       }
  137.  
  138.       break;
  139.    case 5:
  140.       memorizar();
  141. }
  142. }
  143. void memorizar(void)
  144. {
  145.  
  146. if(chek==0){
  147.    lcd_gotoxy(1,1);
  148. lcd_putc("Pulse: Guardar>+
  149. Empezar>Menu");
  150.  
  151.    if(!input(pin_a1)){
  152.  
  153.       LAST_VOLUME=0;
  154.       write_eeprom(LAST_VOLUME,rx);
  155.       LAST_VOLUME++;
  156.       write_eeprom(LAST_VOLUME,ry);
  157.       LAST_VOLUME++;
  158.       write_eeprom(LAST_VOLUME,z);
  159.       LAST_VOLUME++;
  160.       write_eeprom(LAST_VOLUME,zz);
  161.       while(!input(pin_a1)){}
  162.       lcd_putc("\f");
  163.       chek=1;
  164.    }
  165.    if(!input(pin_a0)){
  166.       while(!input(pin_a0)){}
  167.       lcd_putc("\f");
  168.       chek=1;
  169.    }
  170. }
  171. if(chek==1){
  172.    
  173.    
  174.    trabajar();
  175. }
  176. }
  177. void trabajar(void)
  178. {
  179.  
  180. if(menu2==0){
  181.       lcd_gotoxy(1,1);
  182.       lcd_putc("Ti.Pas.Avan.Pul."  ) ;
  183.       lcd_gotoxy(1,2);
  184.       printf(lcd_putc,"%u",lat);
  185.         lcd_gotoxy(4,2);
  186.       printf(lcd_putc,"%u",pas / 2);
  187.         lcd_gotoxy(8,2);
  188.       printf(lcd_putc,"%u",avc);
  189.         lcd_gotoxy(13,2);
  190.       printf(lcd_putc,"%u",pul);
  191.       enable_interrupts(global);
  192.       if(lat==rx){
  193.          lat=0;
  194.          if(avc<=zz)
  195.             v++;
  196.          pas++;
  197.       }
  198.       if(avc<=zz){
  199.          if(pas-ry==ry){
  200.             avc++;
  201.             pas=0;
  202.             pul=0;
  203.             if(avc<=zz)
  204.                output_high(pin_c1);
  205.                ti=1;
  206.          }
  207.       }
  208.       if(avc>zz){
  209.  
  210.          v=1;
  211.          flag=0;
  212.          w=1;
  213.          pas=0;
  214.          output_high(pin_c2);
  215.          ti=1;
  216.          if(pul==z * zz + 20){
  217.             output_low(pin_c2);
  218.             ti=0;
  219.             avc=0;
  220.             lcd_putc("\f");
  221.             lat=0;
  222.             pul=0;
  223.             menu2=1;
  224.  
  225.          }
  226.       }
  227. }
  228.    if(menu2==1){
  229.       lcd_gotoxy(1,1);
  230.       lcd_putc("TERMINADO");
  231.       lcd_gotoxy(1,2);
  232.       lcd_putc("Pulsos:");
  233.       lcd_gotoxy(10,2);
  234.       printf(lcd_putc,"%u",pul);
  235.       if(!input(pin_a0)){
  236.          while(!input(pin_a0)){}
  237.          u=1;
  238.          output_high(pin_c1);
  239.  
  240.       }
  241.    }
  242. if(u==0){
  243. if(w==0){
  244.    if(!input(pin_a2)){
  245.       err=0;
  246.       delay_ms(130);
  247.       while(!input(pin_a2)){}
  248.       pul++;
  249.       if(pul==z){
  250.          pul=0;
  251.          output_low(pin_c1);
  252.          ti=0;
  253.  
  254.       }
  255.    }
  256. }
  257. if(w==1){
  258.    if(!input(pin_a2)){
  259.       err=0;
  260.       delay_ms(130);
  261.       while(!input(pin_a2)){}
  262.       pul++;
  263.       if(pul>z * zz + 20)
  264.          pul=0;
  265.          ti=0;
  266.    }
  267. }
  268. }
  269. if(u==1){
  270.    ti=1;
  271.    if(!input(pin_a2)){
  272.       err=0;
  273.       delay_ms(130);
  274.       while(!input(pin_a2)){}
  275.       pul++;
  276.       if(pul==20){
  277.          disable_interrupts(global);
  278.          pul=0;
  279.          menu2=0;
  280.          lcd_putc("\f" );
  281.          ti=0;
  282.          u=0;
  283.          chek=0;
  284.          menu=0;
  285.  
  286.  
  287.       }
  288.    }
  289. }
  290.  
  291. if(!input(pin_a0)){
  292.    menu2++;
  293.    lcd_putc("\f" );
  294. }
  295.   while(!input(pin_a0)){}
  296.       if(menu2>1)
  297.          menu2=0;
  298. if(v==1)
  299.    output_high(pin_c0);
  300. else
  301.    output_low(pin_c0);
  302. if(err>9){
  303.    lcd_putc("\f");
  304.    error();
  305. }
  306. }
  307. void error(void)
  308. {
  309. disable_interrupts(global);
  310. printf("Ha fallado el final de carrera");
  311. do{
  312.    output_c(0x00);
  313.    lcd_gotoxy(1,1);
  314.    lcd_putc("ERROR EN A1
  315. REVISE, REINICIE");
  316. }while(true);
  317. }

Las mujeres quieren "SOLUCIONES", y los hombres lo mismo pero escrito al reves.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: problema con rs 232 y puerto c con reles 16f876
« Respuesta #7 en: 17 de Junio de 2009, 20:12:53 »
 :shock: En serio que es largo!  :D
Primero que nada, porque indicas que la comunicación se haga por software?
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, FORCE_SW)
Ya que tienes el módulo aprovéchalo!

Después como estas ejecutando reles, puede ser que al accionarlo ingrese ruido al PIC que generé tu problema. Revisa la aislación de acople con el pic.
No contesto mensajes privados, las consultas en el foro

Desconectado juansi

  • PIC16
  • ***
  • Mensajes: 102
Re: problema con rs 232 y puerto c con reles 16f876
« Respuesta #8 en: 17 de Junio de 2009, 20:24:20 »
cuando te refieres a software te refieres a force_sw?
es q estoy aprendiendo ahora lo del rs232 y seguramente no lo configure bien, ¿es necesario el force_sw?
que formas hay de configurar el rs232 y para q son?
o mejor donde me podria informar?

gracias
Las mujeres quieren "SOLUCIONES", y los hombres lo mismo pero escrito al reves.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: problema con rs 232 y puerto c con reles 16f876
« Respuesta #9 en: 17 de Junio de 2009, 21:17:43 »
Claro, al colocar FORCE_SW la comunicación la realiza por software y no utiliza el módulo del mismo. Una configuración normal para la comunicación con una PC seria:
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

Este es un pdf que explica sobre la comunicación serial.
No contesto mensajes privados, las consultas en el foro

Desconectado juansi

  • PIC16
  • ***
  • Mensajes: 102
Re: problema con rs 232 y puerto c con reles 16f876
« Respuesta #10 en: 18 de Junio de 2009, 16:32:13 »
suky con la configuracion "#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)" se resolvio el problema de mi codigo.
muchas gracias.
Las mujeres quieren "SOLUCIONES", y los hombres lo mismo pero escrito al reves.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
Re: problema con rs 232 y puerto c con reles 16f876
« Respuesta #11 en: 18 de Junio de 2009, 18:58:40 »
buen pdf suky si tenes mas material asi te lo agradeceria ya que me estoy iniciando en CCS
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: problema con rs 232 y puerto c con reles 16f876
« Respuesta #12 en: 18 de Junio de 2009, 20:23:40 »
buen pdf suky si tenes mas material asi te lo agradeceria ya que me estoy iniciando en CCS
Todo lo que tengo, lo he publicado en mi blog. Reuní todo lo que me ha servido en mis inicios y algo más  :mrgreen:
No contesto mensajes privados, las consultas en el foro

Desconectado krakc

  • PIC10
  • *
  • Mensajes: 29
Re: problema con rs 232 y puerto c con reles 16f876
« Respuesta #13 en: 18 de Junio de 2009, 20:50:57 »
Bueno te recomiendo un par de cosas.

Primero que todo divide tu problema en varios pequeños programas y verifica todo y despues unes todo en un solo gran programa.

me explico, si vas a hacer conversion ADC, y luego interrupcion y luego salida a lcd y luego envio al pc... entonces primero verifica que sabes hacer adc con un programa, si te sale bien la conversion, entonces te haces otro donde manipulas interrupciones y cuando esten bien, haces otro para manejo de lcd, y por ultimo envias datos a la pc...

como veo que tu problema esta en el envio de datos a la pc, lo que debes saber es que solo se pueden enviar caracteres, osea variables CHAR y el pc los leera correctamente, si tratas de enviar una variable numero, float o demas, no lo hara, asi que revisa eso...

para pasar de numeros a caracteres, usa la funcion itoa(); .... no sirve para float... double o demas, solo enteros...

luego para enviar solo tienes que poner puts(dato);... donde "dato" es la cadena de caracteres... asi de sencillo..... bueno eso te funcionara si tienes bien los fuses.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: problema con rs 232 y puerto c con reles 16f876
« Respuesta #14 en: 18 de Junio de 2009, 21:10:14 »
Bueno te recomiendo un par de cosas.

Primero que todo divide tu problema en varios pequeños programas y verifica todo y despues unes todo en un solo gran programa.

me explico, si vas a hacer conversion ADC, y luego interrupcion y luego salida a lcd y luego envio al pc... entonces primero verifica que sabes hacer adc con un programa, si te sale bien la conversion, entonces te haces otro donde manipulas interrupciones y cuando esten bien, haces otro para manejo de lcd, y por ultimo envias datos a la pc...

como veo que tu problema esta en el envio de datos a la pc, lo que debes saber es que solo se pueden enviar caracteres, osea variables CHAR y el pc los leera correctamente, si tratas de enviar una variable numero, float o demas, no lo hara, asi que revisa eso...

para pasar de numeros a caracteres, usa la funcion itoa(); .... no sirve para float... double o demas, solo enteros...

luego para enviar solo tienes que poner puts(dato);... donde "dato" es la cadena de caracteres... asi de sencillo..... bueno eso te funcionara si tienes bien los fuses.

Esta muy bien lo que recomiendas krakc , de modulizar el proyecto y saber que todo funciona bien por separado. Esto es muy útil si recién se esta ingresando en el mundo de la programación.

Después con respecto a enviar variables numéricas, todo se soluciona con printf, donde en sus parámetros le indicas que tipo de variable se enviará y de que manera. Por ejemplo enviar un flotantes es muy sencillo:
Código: C
  1. float Valor=17.52;
  2. printf("La medida es: %2.2f",Valor);
No contesto mensajes privados, las consultas en el foro


 

anything