PIC16f84a no recibe bien, max232 to PC

Hola a todos, estoy tratando de armar un miniprograma "intercomunicacion entre PIC y mi PC".
La salida de mi PIC a PC va todo bien escribe todo lo que debe escribir ahora al enviar datos de mi PC a el PIC el pic me devuelve un valor totalmente distinto o vacio, aca les dejo todo lo que escribi. Tengan en cuenta que lo manejo desde linux debian.

Mi programa PIC en CCS:
Código:
#include <16F84A.h>                       //pic a utilizar   
#fuses XT ,NOWDT ,NOPROTECT //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz 
#use rs232(baud=9600,xmit=PIN_A1,rcv=PIN_A0,bits=8,ERRORS)  //por A1 envia y por A0 recibe
//#include <string.h>
//#include <input.c>

char c;
void main() {
enable_interrupts(global); 
enable_interrupts(INT_EXT); 

do{
puts("starting..");
delay_ms(1000);

   if (kbhit())
   {
      c = getc();
     
      if (c=='u') {puts("Up_Received");}
      if (c=='d') {puts("Down_Received");}
      if (c=='s') {puts("Stop_Received");}

    puts(c);
    
}
}while(true);

}


este es mi servidor perl el cual recibe datos:

Código:
#!/usr/bin/perl -w
use strict;
use Device::SerialPort;



 my $port=Device::SerialPort->new("/dev/ttyS0");

 my $STALL_DEFAULT=120; # how many seconds to wait for new input

 my $timeout=$STALL_DEFAULT;

 $port->baudrate(9600);
 $port->databits(8);
 $port->stopbits(1);
 $port->parity("none");
 $port->read_char_time(1);     # don't wait for each character
# $port->read_const_time(1000); # 1 second per unfulfilled "read" call

 my $chars=0;
 my $buffer="";
 while (1) {
        my $string = $port->read(255);
print $string;
        }

para enviar datos a mi PIC lo hago desde la shell (todo a 9600 baud) con esto:

echo "u" > /dev/ttyS0


hoy estuve todo el dia tratando de resolver porque el pic no interpreta bien la letra/s enviada/s ya me estoy volviendo loco.

si alguien me puede dar una mano agradecido.

Saludos.
 
Buenas.

¿No es mejor usar en Ensamblador?

Código:
;************************************ RS232_11B.asm **************************************
;
;    ===================================================================
;      Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;      E. Palacios, F. Remiro y L. López.        www.pic16f84a.com
;       Editorial Ra-Ma.  www.ra-ma.es
;    ===================================================================
;
; Ejercicio RS232_11.asm resuelto de una forma más eficaz.
;
; ZONA DE DATOS **********************************************************************

    LIST        P=16F84A
    INCLUDE        <P16F84A.INC>
    __CONFIG    _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

    CBLOCK   0x0C        
    TeclaPulsada                    ; Va a guardar el contenido de la tecla pulsada.
    MensajeApuntado                    ; Va a guarda la dirección del mensaje apuntado.
    ENDC

#DEFINE  SalidaAdelante        PORTB,3    ; Define dónde se sitúan las salidas.
#DEFINE  SalidaAtras        PORTB,2
#DEFINE  SalidaIzquierda    PORTB,1
#DEFINE  SalidaDerecha        PORTB,0

TECLA_ADELANTE    EQU    't'                ; Código de las teclas utilizadas.
TECLA_ATRAS        EQU    'b'
TECLA_IZQ        EQU    'a'
TECLA_DER        EQU    'l'
TECLA_PARADA    EQU    ' '                ; Código de la tecla espaciadora, (hay un espacio,
                                    ; tened cuidado al teclear el programa).
; ZONA DE CÓDIGOS ********************************************************************

    ORG    0
Inicio
    call    LCD_Inicializa
    call    RS232_Inicializa
    bsf        STATUS,RP0                ; Configura como salidas las 4 líneas del
    bcf        SalidaAdelante            ; del Puerto B respetando la configuración del
    bcf        SalidaAtras                ; resto de las líneas.
    bcf        SalidaIzquierda
    bcf        SalidaDerecha
    bcf        STATUS,RP0
    call    Parado                    ; En principio todas las salidas deben estar 
Principal                            ; apagadas.
    call    RS232_LeeDato            ; Espera a recibir un carácter.
    clrf    PORTB
    call    TesteaTeclado
    goto    Principal

; "Mensajes" ----------------------------------------------------------------------------
;
Mensajes
    addwf    PCL,F
MensajeParado
    DT "Sistema PARADO", 0x00
MensajeAdelante
    DT "Marcha ADELANTE", 0x00
MensajeAtras
    DT "Marcha ATRAS", 0x00
MensajeIzquierda
    DT "Hacia IZQUIERDA", 0x00
MensajeDerecha
    DT "Hacia DERECHA", 0x00

; Subrutina "TesteaTeclado" -------------------------------------------------------------
;
; Testea el teclado y actúa en consecuencia.

TesteaTeclado
    bcf        SalidaAdelante            ; Primero apaga todas las salidas.
    bcf        SalidaAtras    
    bcf        SalidaIzquierda
    bcf        SalidaDerecha
;
    movwf    TeclaPulsada            ; Guarda el contenido de la tecla pulsada.
    xorlw    TECLA_ADELANTE            ; ¿Es la tecla del movimiento hacia adelante?
    btfsc    STATUS,Z
    goto    Adelante                ; Sí, se desea movimiento hacia adelante.
;
    movf    TeclaPulsada,W            ; Recupera el contenido de la tecla pulsada.
    xorlw    TECLA_ATRAS                ; ¿Es la tecla del movimiento hacia atrás?
    btfsc    STATUS,Z
    goto    Atras                    ; Sí, se desea movimiento hacia atrás.
;
    movf    TeclaPulsada,W            ; Recupera el contenido de la tecla pulsada.
    xorlw    TECLA_IZQ                ; ¿Es la tecla del movimiento hacia la izquierda?
    btfsc    STATUS,Z
    goto    Izquierda                ; Sí, se desea movimiento hacia la izquierda.
;
    movf    TeclaPulsada,W            ; Recupera el contenido de la tecla pulsada.
    xorlw    TECLA_DER                ; ¿Es tecla del movimiento hacia la derecha?
    btfsc    STATUS,Z
    goto    Derecha                    ; Sí, se desea movimiento hacia la derecha.
;
    movf    TeclaPulsada,W            ; Recupera el contenido de la tecla pulsada.
    xorlw    TECLA_PARADA            ; ¿Es la tecla de parada?.
    btfss    STATUS,Z
    goto    Fin                        ; No es ninguna tecla de movimiento. Sale.
Parado
    movlw    MensajeParado
    goto    Visualiza
Adelante
    bsf        SalidaAdelante
    movlw    MensajeAdelante
    goto    Visualiza
Atras
    bsf        SalidaAtras
    movlw    MensajeAtras
    goto    Visualiza
Izquierda
    bsf        SalidaIzquierda
    movlw    MensajeIzquierda
    goto    Visualiza
Derecha
    bsf        SalidaDerecha
    movlw    MensajeDerecha

; Según el estado de las salidas visualiza el estado del sistema en el visualizador LCD y en
; el monitor del ordenador.

Visualiza
    movwf    MensajeApuntado            ; Guarda la posición del mensaje.
    call    LCD_Borra                ; Borra la pantalla del modulo LCD.
    movf    MensajeApuntado,W        ; Visualiza el mensaje en la pantalla
    call    LCD_Mensaje                ; del visualizador LCD.
    call    RS232_LineasBlanco        ; Borra la pantalla del ordenador.
    movf    MensajeApuntado,W
    call    RS232_Mensaje            ; Lo visualiza en el HyperTerminal.
    call    RS232_LineasBlanco
Fin    return

    INCLUDE  <RS232.INC>
    INCLUDE  <RS232MEN.INC>
    INCLUDE  <LCD_4BIT.INC>
    INCLUDE  <LCD_MENS.INC>
    INCLUDE  <RETARDOS.INC>
    END
 
Atrás
Arriba