Forum: Mikrocontroller und Digitale Elektronik PIC16F1503 XC8 Zugriff auf Variablen in Programmspeicher


von Alex M. (Gast)


Lesenswert?

Hi!

Ich würde gern auf ein Array von Bytes, welcher folgendermaßen definiert 
ist zugreifen:
1
const uint8_t tx_addr[5] = {0x00,0x00,0x00,0x00,0x00};

In der folgenden Funktion möchte ich über dieses Array iterieren:
1
void rf_write_register(uint8_t reg, const uint8_t *value, uint8_t len){
2
    rf_CSN_lo();
3
    spi_shift_sync(W_REGISTER|(REGISTER_MASK & reg));
4
    while(len--){
5
        spi_shift_sync(*(value++));
6
    }
7
    rf_CSN_hi();
8
}

Ich rufe die Funktion so auf:
1
rf_write_register(TX_ADDR,tx_addr,5);

Ich erwarte, dass die Funktion "spi_shift_sync" mit dem Inhalt des 
dereferenzierten Pointers "value" aufgerufen wird.

Stadtdessen aber wird Code generiert welcher die Adresse der 
Speicherzelle "value" im Datenspeicher nimmt und diese als Funktion 
aufruft...
1
0xCC: MOVLB 0x0
2
0xCD: MOVF value, W
3
0xCE: MOVLP 0x1
4
0xCF: CALLW
5
0xD0: MOVLP 0x0
6
0xD1: MOVLP 0x1

Was geht da schief?

Viele Grüße
Alex

von Klaus (Gast)


Lesenswert?

Macht dein C-Code das richtige? Wenn ja, ist doch alles gut.

Wobei, ein const Array voller Nullen ist auch nicht so der Knaller.

MfG Klaus

von Alex M. (Gast)


Lesenswert?

Wenn ich in der Simulation mir nur den C Code anzeigen lassen, stimmt 
zumindest der Programmablauf.
Ich kann mir nicht anzeigen lassen, ob der SPI das richtige ausspuckt, 
da der Simulator den nicht unterstützt.

Wenn ich mir die disassembly anzeigen lasse springt der mit dem oben 
genannten asmcode ins Nirvana.

Die Nullen sind nur Platzhalter, später steht da was anderes drin.

von Klaus (Gast)


Lesenswert?

Schreib doch einfach statt

spi_shift_sync(*(value++));

temp = *(value++);
spi_shift_sync(temp);

und mach was signifikantes in das Array, dann kannst du sehen, ob das 
richtige in temp ankommt.

MfG Klaus

von Alex M. (Gast)


Lesenswert?

Gerade ausprobiert. Scheint das richtige zu tun. Wenn das disassembly 
angezeigt wird springt es aber trotzdem ins Nirvana...

Naja, ich werde mal davon ausgehen, dass es funktioniert. Wenn ich mal 
die Hardware dazu habe werde ich das auch ausprobieren können.

Vielen Dank!

Alex

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.