Autor Tema: Problema recepcion caracter usart xc8  (Leído 2581 veces)

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

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Problema recepcion caracter usart xc8
« en: 20 de Octubre de 2013, 12:11:10 »
Hola, estoy dandole vuelta a un problema, anoche casi ni duermo!!!!
el tema es que conecte un modulo Bluetooth por el puerto serie de un 16f883. en una tablet tengo una aplicacion en appinventor tratando de enviar un byte al micro y este en funcion del byte activa o apaga un led.
de apoco fui haciendo andar cada parte, hasta que llegó el momento final y no puedo resolverlo.
tengo todo configurado, el baudrate a 9600, interrupcion al recivir, y hasta dereccion de errores. cuando entra en la interrupcion por rcif lo primero que hago es preguntar por error de frame y de overrun, si hay error prendo un LED.
luego guardo el rcreg en una variable tipo char. acto seguido asigno esa variable a txreg, para hacer un echo. luego pongo if(rcv == 1) prender un led tambien puse if(rcv == ‘1‘) prender led. puse el osciloscopio en el rx y en el tx del micro.
cuando mando un 1 (con sendbyte) en el osciloscopio veo en un canal el codigo del 1 y en el canal correspondiente al tx veo que sale el mismo 1, con esto verifico que el baudrate esta bien y que en rcv tengo lo que me manda el bt. probe en vez de mandar un 1 mandar un 2 y en el osciloscopio veo todo bien....

el problema es que esos if no funcionan, es decir no entra nunca, es como que rcv == 1 o rcv == ‘1‘ estubiese mal. probe de poner rcv != 0 y ahi si entra al if y prende el LED.

disculpen que no ponga codigo, pero no estoy en casa ahora.
la gran pregunta es como devo declarar la variable para almacenar lo que recivo y como devo comparar contra una constante para saber lo que me envió la tablet....

es lo uncio que me queda com fuente de error para que no funcione... encima no tengo nada para hacer debug!!!! por cierto, en mplab x hay algún programador clon que sirva para hacer debug?

Saludos y gracias!!!
-
Leonardo Garberoglio

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema recepcion caracter usart xc8
« Respuesta #1 en: 20 de Octubre de 2013, 15:39:10 »
  Sin ver el código es un poco difícil poder ayudarte... de todos modos si en rcv tienes el código del 1 (imagino que te refieres al código ascii) quiere decir que el bluetooth te envía código ascii. y que lo estás recepcionando bien -al menos en teoría-. Puedes probar enviar por ejemplo la letra "a" y ver si en rcv obtienes el código ascii correspondiente
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Problema recepcion caracter usart xc8
« Respuesta #2 en: 20 de Octubre de 2013, 17:02:59 »
Ahora estoy en casa listo para probar sugerencias.
Mi código es este:

Código: [Seleccionar]

/*
 * File:   main.c
 * Author: elgarbe
 *
 * Created on 12 de junio de 2013, 19:01
 */

#define _XTAL_FREQ 8000000 // Indicamos a que frecuencia de reloj esta funcionando el micro
//Funciones para delay's. No son muy precisas por lo que vi en el osciloscopio
//REVISAR
#pragma intrinsic(_delay)
extern void _delay(unsigned long);
#define __delay_us(x) _delay((unsigned long)((x)*(_XTAL_FREQ/8000000.0)))
#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/8000.0)))

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>         // Librería XC8. Este include termina incluyendo al 16F883.h
//#include <delays.h>     // Para utilizar demoras en nuestro código debemos incluir la librería delays.h.

//Includes locales, configuracion de fusibles y del IO
#include "configuracion_de_fuses.c"
#include "configuracion_hard.c"


int mask = 0;                     // Flag para deteccion de sensor activo
unsigned char cont = 0;                   //Contador para destello de LED

/*------------------------DECLARACION DE FUNCIONES---------------------------*/

void conf_oscilador (void); // Configuracion del oscilador
void conf_puertos (void);   // Configuracion de puertos I/O
void conf_timer0 (void);    // Configuracion registros TIMER0
void conf_timer1 (void);    // Configuracion registros TIMER1

    char rcv=0;

/********** Funcion para la ISR (Rutina de Servicio de Interrupcion) **********/
void interrupt interrupciones (void) {
    //Verifico que interrupcion se disparó
    if((PIE1bits.RCIE == 1) && (PIR1bits.RCIF ==1)){
        if(RCSTAbits.FERR || RCSTAbits.OERR){
            LED=1;
        }
        LED2=0;
        rcv=RCREG;
        //TXREG=rcv;
        if(rcv=='1'){
            LED2=1;
        }
        if(rcv==49){
           LED2=1;
        }
        if(rcv == 2){
           LED2=1;
           __delay_ms(400);
           LED2=0;
        }
        RCIF=0;
    }
/* el resto de las interrupciones utilizadas se deben analizar a coninuacion*/
}




/*************************** Programa Principal ******************************/
 void main(void) {
    conf_oscilador ();
    conf_puertos ();
    conf_timer0 ();
    //conf_timer1 ();

    PIE1bits.RCIE=1;
    INTCONbits.PEIE=1;
    INTCONbits.GIE = 1;          //Habilito Interrupcion Global

       //clear recieve buffer
   rcv = RCREG;
   rcv = RCREG;
   rcv = RCREG;

    BRGH=0;
    BRG16=0;
    SPBRG=12;
    RX9=0;
    TXSTAbits.TXEN=1;
    TXSTAbits.SYNC=0;
    RCSTAbits.SPEN=1;
    RCSTAbits.CREN=1;
    PIR1bits.RCIF=0;
   

    LED2=1;
    LED=1;

    __delay_ms(500);
    LED=0;


    /*-------------------------- Bucle infinito ------------------------------*/
    do{


    }while(1);
}


/*------------------------------FUNCIONES------------------------------------*/

/* Funcion para la configuracion del oscilador del pic16f88 */
void conf_oscilador (void) {

    OSCCONbits.IRCF2 = 1;
    OSCCONbits.IRCF1 = 1;
    OSCCONbits.IRCF0 = 1; // IRCF <2:0> = 110 setea Fosc 4MHz

    OSCCONbits.SCS = 0; /* SCS = 0 Modo del oscilador definido por
                         * FOSC <2:0> en #pragma config FOSC = INTOSCIO */
}
/* Funcion para la configuracion de los puertos entrada salida del pic 16f88 */
void conf_puertos (void) {

    ANSEL=0x00;         //Todos entrada/salida digitales - Puerto A.
    ANSELH=0x00;        //Todos entrada/salida digitales - Puerto B.
    TRISA=0x00; //Todos como SALIDA-
    PORTA=0;
    TRISB=0XFF; //Todos como ENTRADA.
    TRISCbits.TRISC6=1; //RX como entrada
    TRISCbits.TRISC7=0; //TX como salida

    PORTC=0;
}

/* Funcion para la configuracion del modulo Timer0 como temporizador */
void conf_timer0 (void) {

    // Configuración del timer 0. Con Osc de 4MHz la frecuencia de entrada del TMR
    // es 1MHz, con el prescaler en 256 tenemos una cuenta cada 256uSeg. Al ser
    // de 8 bits tenemos interrupcion cada 65,535 mSeg.
    TMR0 = 0;
    OPTION_REGbits.PS0 = 1;
    OPTION_REGbits.PS1 = 1;
    OPTION_REGbits.PS2 = 1;     //Prescaler en 256
    OPTION_REGbits.PSA = 0;     //Prescaler al TMR0 y no al WDT
    OPTION_REGbits.T0CS = 0;    //Clock Source es el Ciclo de Instruccion
}

Estoy pensando en conectar 8 led en el puerto A y sacar el dato recivido al puerto para ver bien que mierda es!
-
Leonardo Garberoglio

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Problema recepcion caracter usart xc8
« Respuesta #3 en: 20 de Octubre de 2013, 17:24:49 »
Bueno, ya aisle el problema... falta la solucion:

Código: [Seleccionar]

unsigned char rcv=0;

/********** Funcion para la ISR (Rutina de Servicio de Interrupcion) **********/
void interrupt interrupciones (void) {
    //Verifico que interrupcion se disparó
    if((PIE1bits.RCIE == 1) && (PIR1bits.RCIF ==1)){
        if(RCSTAbits.FERR || RCSTAbits.OERR){
            LED=1;
        }
        PORTA=0;
        rcv=RCREG;
        PORTA=rcv;
        //TXREG=rcv;
        if(rcv==129){
           LED2=1;
           __delay_ms(400);
           LED2=0;
        }

A la variable RCV la declaro como unsigned char (sería para recivir 1 byte, verdad?)
Entonces cuando recivo el caracter lo paso derecho al puerto A, con el tester mido y cuando mando un 1 obtengo 10000001 y cuando mando un 2 obtengo 10000010, entonces abajo agrgue la comparacion con 129 (cuando espero recivir un 1) y fnciona bien!

Ahora, por que estoy reciviendo un 1 en el MSB del byte? como si estuviese reciviendo -1 y -2 cuando mando 1 y 2????

Saludos!
-
Leonardo Garberoglio

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema recepcion caracter usart xc8
« Respuesta #4 en: 20 de Octubre de 2013, 17:48:12 »
Hola! Lo que no me quedo claro es cuando cuelgas el osciloscopio al pin rx del microcontrolador, ves correctamente que se envía un 1?
No contesto mensajes privados, las consultas en el foro

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema recepcion caracter usart xc8
« Respuesta #5 en: 20 de Octubre de 2013, 17:55:07 »
  Los códigos 129 y 130 corresponden a la "A" y la "B" respectivamente.

  ¿Estás enviando un "1" desde la tablet? ¿El módulo bluetooth, no hace ningún cambio al dato recibido? Tal vez de te está pasando algo por alto.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Problema recepcion caracter usart xc8
« Respuesta #6 en: 20 de Octubre de 2013, 18:04:20 »
Con el AppInventor envio con la funcion Send1byteNumber ligado a un Texto (no me deja ligara a un numero) y el valor del texto es 1

En el osciloscopio veo lo siguiente:



En este caso envié un 2, como se ve el MSB es 0!!!!

Sin embargo cuando asigno el dato recivido al puerto A, el pin RA7 está en 1....

Lamentablemente esto seguramente es un error boludo que estoy cometiendo en algún lugar....

Saludos

EDITO en la foto mande un 1, no un 2. perdon!
« Última modificación: 20 de Octubre de 2013, 18:30:18 por elgarbe »
-
Leonardo Garberoglio

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Problema recepcion caracter usart xc8
« Respuesta #7 en: 20 de Octubre de 2013, 18:28:30 »
bueno, ahora envío con la tabet y la funcion sendtext el numero 1, pero como es sendtext debo ver el decimal 49. bueno, en el osciloscopio veo el codigo binario del 49, pero cuando lo paso al puerto a veo cualquier cosa...
me parece que voy a tener que buscar el cable serie y conectarlo a un hiperterminal al modulo BT y asegrarme que recivo bien y luego ir por el lado del micro.... como lo ven?

saludos!
-
Leonardo Garberoglio


 

anything