TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: jnavarro 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
-
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... :-) :-) :-) :-) :-) :-)
-
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
-
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?
-
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 (http://www.todopic.com.ar/foros/index.php?topic=4573.0) y a Traductor RS232 a Morse (Sonoro y visual) (http://www.todopic.com.ar/foros/index.php?topic=12717.0) (éste tiene un ejemplo de aplicación del primero recibiendo sobre un buffer)
-
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