Autor Tema: Comunicacion RS232  (Leído 2232 veces)

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

Desconectado jnavarro

  • PIC10
  • *
  • Mensajes: 33
Comunicacion RS232
« en: 29 de Enero de 2007, 15:29:29 »
Hola a todos  :-)

Estoy intentando hacer un programa con CCS en el cual el pic reciba a trabes del rs232 (la usart) una secuencia de 32 bytes

En el programa tengo varios if, en funcion de lo que kiero hacer, pero uno de ellos es que reciba los 32 bytes por rs232, mi panteamiento es este:


#use rs232(baud=4800,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

(...)

if(botonAzul==1){
    .... lo q sea
}
if(botonRojo==1){
   ... lo q sea
}
if(kbhit()){
     for(i=0 ; i<32 ; i++){
         Buffer=getc();
     }
}


Esta bien planteada la idea? Eske por mas que le doy vueltas no me funciona
__El conocimiento humano pertenece al mundo__

Desconectado c4_esp_VR

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
    • www.muchotrasto.com
Re: Comunicacion RS232
« Respuesta #1 en: 29 de Enero de 2007, 15:37:18 »
Hola:

Si quieres que te ayudemos lo primero que tienes que hacer es postear todo el código que hayas implementado quitando las cosas menos significativas y así te podremos ayudar, aunque tb decirte que sobre rs232 tienes muchos links en el foro, sólo hay que buscar...Pero si buscas y no logras que te funcione postea todo, el pic que usas, el reloj, el programa...  :-) :-) :-) :-) :-) :-)

Desconectado jnavarro

  • PIC10
  • *
  • Mensajes: 33
Re: Comunicacion RS232
« Respuesta #2 en: 29 de Enero de 2007, 15:52:27 »
Buenas, gracias por contestar tan rapido.

Lo de escribir solo esa parte del codigo era por no enrrollarme mucho, pensaba que asi me entenderias, sorry.

El codigo es este:

#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000)
#use rs232(baud=4800,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#define use_portb_lcd TRUE

#define USB_HID_DEVICE     FALSE             
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   
#define USB_EP1_TX_SIZE    32               
#define USB_EP1_RX_SIZE    32               

#include <pic18_usb.h>                       
#include ".\USB_RF.h"                       
#include <usb.c>                            
#include <lcd.c>

//-----Doy nombre a las salidas---------

#define LED_VERDE    PIN_E0
#define LED_AMARILLO PIN_D7
#define LED_ROJO     PIN_E2
#define BOTON1       PIN_D4
#define BOTON2       PIN_D5
#define ACK          PIN_D3
#define LEDRS        PIN_C0

//-----Doy nombre a las acciones--------

#define Enciende     Output_High
#define Apaga        Output_Low
#define Conmuta      Output_Toggle

//-----Variables Utilizadas-------------

const unsigned int8 LongitudBuffer = 32;             
int i;
int b;
int c=0;
unsigned int8 BufferRecibidoPC[LongitudBuffer];         

unsigned int8 BufferSalida[LongitudBuffer];

unsigned int8 BufferRS232[LongitudBuffer];

unsigned int8 Almacenado[LongitudBuffer] = {115,67,2,233,4,5,6,7,8,9,10,11,12,13,14,15,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1};

int8 pepe;

//-----Inicio del programa--------------

void main(void) {

   Apaga(LED_VERDE);
   Apaga(LED_AMARILLO);
   Enciende(LED_ROJO);

   lcd_init();
   lcd_putc("Conectando USB...");

   usb_init();
   usb_task();
   usb_wait_for_enumeration();

   enable_interrupts(global);

   if(usb_enumerated()){

         Apaga(LED_ROJO);
         Enciende(LED_VERDE);

         lcd_init();
         lcd_putc("USB Conectado");

         while (TRUE){

            if (usb_kbhit(1)){

                  usb_get_packet(1, BufferRecibidoPC, LongitudBuffer); 

                  lcd_init();
                  lcd_putc("Trama Recibida");

                  Enciende(LED_AMARILLO);

                     for(i=0 ; i<32 ; i++){
                        putc(BufferRecibidoPC);
                     }
                     while(input(ACK) == 1){
                     }

                  Apaga(LED_AMARILLO);

            }
            if (input(BOTON1) == 1){

                  Enciende(LED_AMARILLO);
                  for(i=0 ; i<32 ; i++){
                     putc(Almacenado);


                  }
                  while(input(ACK) == 1){
                  };
                  Apaga(LED_AMARILLO);
                  delay_ms(2000);
            }

            if(kbhit()){
                  for(i=0 ; i<32 ; i++){
                     Buffer=getc();
                  }
            }





         }

   }else{
         Apaga(LED_VERDE);
         Enciende(LED_ROJO);
   }

}



Todo el codigo me funciona correctamente, pero en el if que defino para la comunicacnon rs232 no me funciona, se me cuelga en ese punto, y no le encuentro sentido.

Si teneis alguna solucion os lo agradeceria mucho.

Un slaudo
__El conocimiento humano pertenece al mundo__

Desconectado jnavarro

  • PIC10
  • *
  • Mensajes: 33
Re: Comunicacion RS232
« Respuesta #3 en: 29 de Enero de 2007, 16:38:27 »
Buenas de nuevo

Todo lo que encuentro en el foro es com orecibir un solo byte por rs232, vamos lo tipico:

if(kbhit()){
     variable=getc();
}

Pero........ ¿y si quiero recibir 32 bytes seguido, como los almacenais?
__El conocimiento humano pertenece al mundo__

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Comunicacion RS232
« Respuesta #4 en: 29 de Enero de 2007, 17:11:49 »
No solo en el foro está lo típico, lo que pasa es que cuando buscáis os aburrís muy rápido  :mrgreen:

Dale un vistazo a Recibiendo del RS232 sobre un Buffer y procesandolo posteriormente y a Traductor RS232 a Morse (Sonoro y visual) (éste tiene un ejemplo de aplicación del primero recibiendo sobre un buffer)
« Última modificación: 29 de Enero de 2007, 17:17:14 por RedPic »
Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado jnavarro

  • PIC10
  • *
  • Mensajes: 33
Re: Comunicacion RS232
« Respuesta #5 en: 31 de Enero de 2007, 16:49:05 »

Buenas :)

RedPic gracias por tu ayuda, me he estado leyendo lo que me recomendaste y buscando mas, al final, en la parte de codigo que arriba ponia en negrita, la he cambiado por esta:

            if(kbhit()){
                  do{
                  BufferRS232[c] = getc();
                  c++;
                  }while(kbhit());


                     Enciende(LEDRS);
                     lcd_init();
                     printf(lcd_putc,"D %u",BufferRS232[2]);
                     c=0;
                     Apaga(LEDRS);
            }

Pero me ocurre algo rarisimo, yo mando 32 bytes desde el emisor y el receptor me los recibe, el primer byte (el BufferRS232[0]) me lo recibe bien, el segundo tambien, pero a partir del tercero ya no me recibe ninguno bien, cuando en teoria recibe los 32 de golpe.

En el emisor tengo este codigo (en ensamblador)

Primero configuro la usart cuando se inicializa el pic

;----------------------------------------
; Configuracion de la USART

bsf           RCSTA,SPEN   ; Se enchufa la USSART
       
bsf           STATUS, RP0              ; Cambia a banco 1

bcf   TXSTA,TX9   ; Selecciono que la transmision será de 8 bits
bcf   TXSTA,SYNC   ; Configuro la USART en modo asincrono
bcf   TXSTA,BRGH   ; Modo baja velocidad, K=64
movlw   D'12'
movwf   SPBRG      ; Se configura para trabajar a 4800 baudios

bcf     STATUS, RP0                    ; Cambia a banco 0

;----------------------------------------


El codigo para transmitir es este:


           bsf     STATUS, RP0     ; Cambia a banco 1
   bsf     TXSTA,TXEN    ; Activo la transmision
           bcf     STATUS, RP0     ; Cambia a banco 0

   movlw   D'32'
   movwf   ContRS232
   movlw       Buffer0         ; lsb primero
           movwf       FSR

SigTXByte   
   movf   INDF, W           ; Copio el buffer al acumulador
   movwf   TXREG           ; Copio el acumulador en el registro de TX

           bsf            STATUS, RP0     ; Cambia a banco 1
   btfss   TXSTA,TRMT      ; Testo la bandera para comprobar si ha terminado la transmision
   goto   $-1           ; Si no ha terminao vuelvo a testear
           bcf            STATUS, RP0     ; Cambia a banco 0
   incf   FSR, F
   decfsz   ContRS232, F
   goto   SigTXByte

           bsf     STATUS, RP0     ; Cambia a banco 1         
   bcf     TXSTA,TXEN    ; Desactivo la transmision
           bcf     STATUS, RP0     ; Cambia a banco 0
__El conocimiento humano pertenece al mundo__