Problema con el puntero XC8

Estoy luchando 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, para usar el valor en lugar de la 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.

Uso MPLAB X v3.30, XC8 1.37, PIC18F14K50

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

ACTUALIZAR:

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

Intente hacer un itipo uintptr_t(el tipo debe definirse en stdint.h). Es posible que termine con extraños desbordamientos de enteros; no es exactamente el mejor compilador del mundo.
¿Tienes la optimización activada? ¿Qué sucede cuando establece la optimización en 0 (si la tiene en algo superior a 0)?
@TomCarpenter Probé uintptr_t, pero obtuve el mismo resultado.
@ efox29 No puedo establecer un nivel de optimización, solo selecciono el modo (gratis). --opt=predeterminado. Escribí opciones adicionales: --opt=none. El mismo resultado.
Si usa notación de matriz, ¿funciona? arr[0],arr[1] ?
@efox29 a veces. Si defino una matriz fuera de main (global) y escribo TXREG= arr[1] directamente en main, sin llamar a la función -> funciona. Si defino una matriz dentro de main, no funciona. ...Creo que tengo que comprobar el desassy, ​​paso a paso.
¿A qué bits de configuración están configurados? No los veo en tu código.
Cambia el orden. Arr[2]={'b','a'}. ¿A todavía envía o b envía? ¿Qué pasa con otras letras que no sean y b?
@efox29 Siempre recibí el primer artículo. Estoy 99% seguro, el hw murió.
Después de escribir por primera vez en EUSART, intente sondear el bit TMRT hasta que suba (es decir, while (!TMRT);) antes de volver a escribir en EUSART.
Puede ser una posibilidad remota, pero también intente agregar el calificador "volátil" a arr.

Respuestas (2)

No especifica la tasa de baudios prevista, pero supongo que es de 9600 bps, si es así, está configurando la tasa de baudios incorrectamente.

Al usar el oscilador interno, está configurando la frecuencia del oscilador del microcontrolador en 16 MHz, también está configurando los bits BRG16 y BRGH en 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 en 832.

Al reemplazar los valores con los proporcionados, tiene:

16000000 4 × ( 832 + 1 ) = 16000000 3332 = 4801.92... 4802
Si desea establecer la velocidad de transmisión en 9600 bps, debe invertir la fórmula para encontrar n .

b a tu d r a t mi = F o s C 4 × ( norte + 1 ) norte + 1 = F o s C 4 × b a tu d r a t mi norte = F o s C 4 × b a tu d r a t mi 1

Entonces:

16000000 4 × 9600 1 = 16000000 38400 1 = 416.66 ( 6 ) 1 = 415.66 ( 6 ) 416

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

Tienes razón, no dije nada sobre la tasa de baudios. 4800 está bien. No me juzgues, a veces también uso 1200. :) De lo contrario, gracias por esta explicación de alta calidad.
Eso fue solo una suposición ya que 9600 bps es la velocidad de transmisión más común.

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

Conclusión: El primer mcu (parcialmente) murió.