problema con el puntero XC8

5

Estoy teniendo problemas con el siguiente código:

#include <xc.h>
#include "config.h"

void Init(void);
void uart_send(char*);

void main(void)
{
    char arr[2]= {'a','b'};
    char i=0;
    Init();       
    uart_send(arr+i);
    i++;
    uart_send(arr+i);
    while(1);    
}

void uart_send(char* c)
{
    while(PIR1bits.TXIF < 1);
    TXREG= *c;
}

void Init(void)
{
    OSCCON = 0xef;    
    TRISBbits.RB7 = 0;  
    ANSELHbits.ANS11 = 0;
    PORTBbits.RB5 = 0;
    TRISBbits.RB5 = 1;  
    BAUDCON = 0x00;
    BAUDCONbits.BRG16= 1;
    SPBRGH  = 0x03;
    SPBRG  = 0x40;
    TXSTA= 0x24;          
    RCSTA= 0x90;       
    PIE1 = 0x00;
    INTCON = 0x00;    
    RCSTAbits.CREN = 1;
}

En el primer caso, llamo a la función uart_send y recibo 'a'. En el segundo caso, cuando vuelvo a llamar a la función, también recibo 'a' en lugar de 'b'. No puedo entender por qué. Si modifico el código, usar valor en lugar de dirección:

void uart_send(char);

void main(void)
{
    char arr[2]= {'a','b'};
    char i=0;
    Init();       
    uart_send(*(arr+i));
    i++;
    uart_send(*(arr+i));
    while(1);    
}

void uart_send(char c)
{
    while(PIR1bits.TXIF < 1);
    TXREG= c;
}

Luego, en ambos casos recibo 0x03.

Yo uso MPLAB X v3.30, XC8 1.37, PIC18F14K50

Por favor, si tienes alguna idea de qué me equivoco, compártela. Gracias.

ACTUALIZACIÓN:

Revisé la desasy y debería funcionar. Tal vez mi mcu en parte murió o algo mágico ...

    
pregunta PeterPal

2 respuestas

0

Hace 2 años, pero recuerdo por este molesto problema. Finalmente, compré un nuevo PIC y luego programé el mismo programa. Funcionó correctamente.

Conclusión: El primer mcu (en parte) murió.

    
respondido por el PeterPal
1

No especifica la velocidad de transmisión deseada, pero supongo que es de 9600 bps, si así lo está configurando de forma incorrecta.

Al usar el oscilador interno, está configurando la frecuencia del oscilador del microcontrolador a 16MHz, también está configurando los bits BRG16 y BRGH a 1, por lo que la fórmula de velocidad en baudios es Fosc / [4 * (n + 1)], donde n es el valor SPBRG que está configurando para ser 832.

Al reemplazar los valores con los proporcionados, usted tiene: $$ {16000000 \ durante 4 \ times (832 + 1)} = {16000000 \ sobre 3332} = 4801.92 ... \ approx4802 $$ Si desea establecer la velocidad en baudios a 9600 bps, debe invertir la fórmula para encontrar n .

$$ baudrate = {Fosc \ over {4 \ times (n + 1)}} \ Leftrightarrow n + 1 = {Fosc \ over {4 \ times baudrate}} \ Leftrightarrow n = {Fosc \ over {4 \ times baudrate}} - 1 $$

Entonces: $$ {16000000 \ durante 4 \ veces 9600} -1 = {16000000 \ sobre 38400} -1 = 416.66 (6) -1 = 415.66 (6) \ approx416 $$

Por lo tanto, el valor SPBRG debe ser 0x1A0.

    
respondido por el Bruno Ferreira

Lea otras preguntas en las etiquetas