XC8-Zeigerproblem

Ich kämpfe mit folgendem Code:

#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;
}

Im ersten Fall rufe ich die Funktion uart_send auf und erhalte 'a'. Im zweiten Fall erhalte ich beim erneuten Aufruf der Funktion ebenfalls 'a' statt 'b'. Ich kann es nicht herausfinden, warum. Wenn ich den Code ändere, um Wert anstelle von Adresse zu verwenden:

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;
}

Dann erhalte ich in beiden Fällen 0x03.

Ich verwende MPLAB X v3.30, XC8 1.37, PIC18F14K50

Bitte, wenn Sie eine Ahnung haben, was ich falsch mache, teilen Sie es mit. Danke schön.

AKTUALISIEREN:

Ich habe die Disassy überprüft und es sollte funktionieren. Vielleicht ist mein MCU teilweise gestorben oder etwas Magisches ...

Versuchen Sie, einen iTyp uintptr_tzu erstellen (der Typ sollte in definiert sein stdint.h). Es ist möglich, dass Sie mit seltsamen Integer-Überläufen enden - es ist nicht gerade der beste Compiler der Welt.
hast du die Optimierung aktiviert? Was passiert, wenn Sie die Optimierung auf 0 setzen (wenn Sie sie auf etwas höher als 0 haben)?
@TomCarpenter Ich habe uintptr_t ausprobiert, aber ich habe das gleiche Ergebnis.
@efox29 Ich kann keine Optimierungsstufe festlegen, nur den Modus auswählen (kostenlos). --opt=Standard. Ich habe zusätzliche Optionen eingegeben: --opt=none. Das gleiche Ergebnis.
Wenn Sie die Array-Notation verwenden, funktioniert das? arr[0],arr[1] ?
@efox29 manchmal. Wenn ich Array außerhalb von main (global) definiere und TXREG=arr[1] direkt nach main schreibe, ohne Funktionsaufruf -> funktioniert es. Wenn ich ein Array innerhalb von main definiere, funktioniert es nicht. ...Ich glaube, ich muss Schritt für Schritt disassy checken.
Auf was sind deine Konfigurationsbits eingestellt? Ich sehe sie nicht in deinem Code.
Die Bestellung ändern. Arr[2]={'b','a'}. Sendet a noch oder sendet b? Was ist mit anderen Buchstaben außer und b?
@DanLaks Ich habe die Datei hier hochgeladen: drive.google.com/file/d/0BzjPcZR6xiIzaFF1X0IwRVJoR28/…
@efox29 Ich habe immer den ersten Artikel erhalten. Ich bin mir zu 99% sicher, dass der HW gestorben ist.
Versuchen Sie nach dem ersten Schreiben in den EUSART, das TMRT-Bit abzufragen, bis es hoch geht (dh während (!TMRT);), bevor Sie erneut in den EUSART schreiben.
Könnte ein langer Schuss sein, aber versuchen Sie auch, den Qualifizierer "volatile" zu arr hinzuzufügen.

Antworten (2)

Sie geben Ihre beabsichtigte Baudrate nicht an, aber ich gehe davon aus, dass sie 9600 bps beträgt. Wenn ja, stellen Sie die Baudrate falsch ein.

Durch die Verwendung des internen Oszillators stellen Sie die Oszillatorfrequenz des Mikrocontrollers auf 16 MHz ein, Sie setzen auch die BRG16- und BRGH-Bits auf 1, sodass die Baudratenformel Fosc/[4*(n+1)] ist, wobei n die ist SPBRG-Wert, den Sie auf 832 setzen.

Indem Sie die Werte durch die bereitgestellten ersetzen, haben Sie:

16000000 4 × ( 832 + 1 ) = 16000000 3332 = 4801.92... 4802
Wenn Sie die Baudrate auf 9600 bps einstellen möchten, müssen Sie die Formel umkehren, um n zu finden .

B A u D R A T e = F Ö S C 4 × ( N + 1 ) N + 1 = F Ö S C 4 × B A u D R A T e N = F Ö S C 4 × B A u D R A T e 1

So:

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

Daher sollte Ihr SPBRG-Wert 0x1A0 sein.

Du hast Recht, ich habe nichts über die Baudrate gesagt. 4800 ist in Ordnung. Verurteilen Sie mich nicht, manchmal benutze ich auch 1200. :) Ansonsten vielen Dank für diese hochwertige Erklärung.
Das war nur eine Vermutung, da 9600 bps die gebräuchlichste Baudrate ist.

Vor 2 Jahren, aber ich erinnere mich an dieses lästige Problem. Schließlich habe ich einen neuen PIC gekauft, dann das gleiche Programm geflasht. Korrekt gearbeitet.

Fazit: Der erste mcu ist (teilweise) gestorben.