PIC16F1503 XC8 Zugriff auf Variablen in Programmspeicher

Gast #3099255
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
Gast #3099287
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.
Gast #3099298
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
Gast #3099313
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.