Autor Tema: Interrupciones RS232 AYuda por favor  (Leído 6156 veces)

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

Desconectado guillotte

  • PIC10
  • *
  • Mensajes: 23
Re: Interrupciones RS232 AYuda por favor
« Respuesta #15 en: 08 de Junio de 2007, 17:35:29 »
Si es verdad no se como se me paso muchas gracias ya estoy llendo ha probarlo...

Desconectado guillotte

  • PIC10
  • *
  • Mensajes: 23
Re: Interrupciones RS232 AYuda por favor
« Respuesta #16 en: 10 de Junio de 2007, 21:20:49 »
Bueno resultado positivo recibo por la usart!!!!  como le comente prende el led que puse como testigo pero cuando hago un eco de lo que recibo me devuelve 128 248 no se porque? :shock:
Se complico pero lo importante que recibo ahora sigo buscando el otro problema.
 cuando agrego gets(Buffer_Rx); no recibo nada  :shock:. bueno sigo probando y despues le comento el resultado.



Desconectado microman

  • PIC10
  • *
  • Mensajes: 17
Re: Interrupciones RS232 AYuda por favor
« Respuesta #17 en: 11 de Junio de 2007, 21:15:28 »
Como estas enviando los valores..?...si lo envias en formato ASCII no deberias de tener problema...
El eco lo puedes implementar dentro mismo de tu rutina de interrupcion ..algo así..

#int_RDA       //cuando llega un dato habilito band_rx y capturo el dato
RDA_isr()
{
   gets(Buffer_Rx);
   bandera_rxdato=true;
   printf("%s",Buffer_Rx);
}


Saludos

Desconectado jodorowsky

  • PIC12
  • **
  • Mensajes: 52
Re: Interrupciones RS232 AYuda por favor
« Respuesta #18 en: 12 de Junio de 2007, 02:12:15 »
Hola, como ya dijeron por ahi, es hacer un eco para comprobar si estás recibiendo bien, mira yo hice uno sencillo que ha parpadear un led en PIN_C5, como un segundero y si recibe algo por el puerto le hace un eco, lo simulé en proteus asi que debe servir ya que no tengo un 18f... para probarlo, por si acaso te paso este código que hace es y lo pruebas... si tienes el proteus simula ahi con el virtual  terminal....


#include <18F252.h>
#device adc=8
#use delay(clock=20000000)
#fuses NOWDT,WDT128,HS, NOPROTECT, NOOSCSEN, BROWNOUT, BORV42, PUT, STVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOWRTB, NOWRTC, NOCPD, NOCPB, NOEBTR, NOEBTRB
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#byte port_c=7

#int_RDA
RDA_isr()
{ char x;
 
  x=getc();
  putc(x);
}

void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   enable_interrupts(INT_RDA);
   enable_interrupts(global);

   port_c=0x00;
   output_high(PIN_B5);
   while(true)
     { output_high(PIN_C5);
       delay_ms(500);
       output_low(PIN_C5);
       delay_ms(500);
     }
}


te adjunto el hex por si acaso quieras hacer algo...

Desconectado guillotte

  • PIC10
  • *
  • Mensajes: 23
Re: Interrupciones RS232 AYuda por favor
« Respuesta #19 en: 12 de Junio de 2007, 11:31:56 »
Bueno les comento, Funciono  :-/  pero le remarco los errores que tuve.
como bien dijo microman, con el SET_TRIS_C(0x40);, yo tenia 0x00 en realidad 0x80.
Segundo error: configuracion USART yo configure en asembler
 void Inicializo_rs232()
   {
   #asm
   
   INI232:
                MOVLW   15            //seleccion del banco.
                MOVWF   BSR
         MOVLW   6              // con 6 cargo el spbrg con 9600baudios
                MOVWF   SPBRG           
         MOVLW   0X20           
                MOVWF   TXSTA               
            MOVLW   0X90             
         MOVWF   RCSTA         
   
   
   #endasm
   }
Pc y el pic deben trabajar a la misma velocidad sino devuelve cualquier cosa.
Bueno ahora estoy intentando con la trama que me comento microman, pero no  :(

 
Formato para recibir:
 #int_rda
   RDA_isr()
        {
         // gets(Buffer_Rx);=> cuando quiero recibir la trama completa no va no no.
          rxdato=RCREG; =>cuando recibo asi de a uno funciona bien.
          bandera_rxdato=true;   
          var++;
          }
cuando lo quiero convertir uso asi pero no se si esta bien.

origen=(atoi(Buffer_Rx[1])); estoy probando asi pero no anda sigo probando.

Bueno dejo la inquietud, Y muchas gracias por responder.

Desconectado microman

  • PIC10
  • *
  • Mensajes: 17
Re: Interrupciones RS232 AYuda por favor
« Respuesta #20 en: 15 de Junio de 2007, 19:40:53 »
Citar
guillotte
void Inicializo_rs232()
   {
   #asm
   
   INI232:
                MOVLW   15            //seleccion del banco.
                MOVWF   BSR
         MOVLW   6              // con 6 cargo el spbrg con 9600baudios
                MOVWF   SPBRG           
         MOVLW   0X20           
                MOVWF   TXSTA               
            MOVLW   0X90             
         MOVWF   RCSTA         
   
   
   #endasm
   }
CCS tiene una directiva de preprocesador para la configuración eficiente del modulo USART ...te recomiendo q lo utilices...

Prueba con esto en la cabecera de tu programa:
Código: C
  1. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
[/color] [/b]

Respecto a como recibis la cadena deberas de recordar que la funcion gets() recibe una cadena entera hasta que el ultimo caracter sea un caracter de fin de cadena (caracter null generalmente)....o bien un retorno de carro (ASCII decimal igual a 13 creo)... Recuerda que un sistema windows el retorno de carro viene acompañado de un caracter nueva linea (ASCII decimal igual a 10 creo)...
Si al procesar tu cadena en tu PC y lo envias al PIC olvidas colocar este caracter la funcion gets() se quedará en una espera infinita hasta que llegue dicho caracter...

La funcion atoi() convierte un string a entero tipo int... bien para poder aplicar deberas desempaquetar tu trama en campos donde esten los valores a convertir y cargarlo en otro array auxiliar (Utiliza la funcion memcopy para copiar parte de un string a otro...) para llevar a cabo la conversion.. si simplemente tu le pasas el nombre del arreglo Buffer_Rx lo que intentara tu funcion atoi() es realizar la conversion de la cadena entera alojada en dicho array...es decir hasta que encuentre un caracter de fin de cadena... No olvides esto puesto que es un punto muy critico a la hora de trabajar con cadenas o string...y seguro te dara dolores de cabeza..igual como yo los tuve.... :mrgreen:

Tambien asegurate al pasar el argumento a la funcion atoi() que esta sea por referencia...esto lo logras usando de esta forma
Si:
Código: C
  1. int aux[4]='\0';  //.... este es la manera de que inicializo mi string
  2. int valor;
  3. valor=atoi(&aux[0]);
Espero que te sea de ayuda....


Saludos..



Desconectado guillotte

  • PIC10
  • *
  • Mensajes: 23
Re: Interrupciones RS232 AYuda por favor
« Respuesta #21 en: 20 de Junio de 2007, 10:09:53 »
Ok, entoces la funcion gets(); queda esperando. Y que funcion puedo usar o como puedo hacer?
Bueno te comento que estuve probando y envio los datos al pic y es como que algunos valores los tomas y otros no y los comparo con un numero y muestra un mensaje en el display. pero como te comente nose porque algunos valores los toma y otros no.
los cargo en un array y los comparo. bueno sigo probando....
gracias por responder.


Desconectado microman

  • PIC10
  • *
  • Mensajes: 17
Re: Interrupciones RS232 AYuda por favor
« Respuesta #22 en: 26 de Junio de 2007, 16:41:29 »
Podrias levantar tu codigo para que se te pueda ayudar mejor.....

Desconectado guillotte

  • PIC10
  • *
  • Mensajes: 23
Re: Interrupciones RS232 AYuda por favor
« Respuesta #23 en: 02 de Julio de 2007, 08:58:32 »
Bueno, muchisimas gracias por su preocupacion anduvo bien si alguien le interesa saber. El ccs tiene librerias de usar y no hace falta cofigurar en asm. Luego me fallo la memoria 24lc256 no funcionaba por lo tanto la cambie por otra y funciono  :-/ todo.
Bueno si le hace falta mas detalle solo pregunten... Desde ya muchas gracias por su ayuda.


 

anything