Forum: Compiler & IDEs Text oberhalb 64k lesen


von Mike R. (thesealion)


Lesenswert?

Hallo,

ich hab Probleme mit dem Auslesen von Daten die in einer Tabelle liegen, 
wobei die Tabelle oberhalb der "berühmten" 64k liegt.

Die Tabelle liegt direkt hinter den Interruptvektoren im 
Bootloaderbereich eines XMega128A1, wobei ich hier einfach mal 
Ausschnitte aus dem Disassemly poste:
1
+000100FA:   0000        NOP                      No operation
2
+000100FB:   0000        NOP                      No operation
3
+000100FC:   0000        NOP                      No operation
4
+000100FD:   5F00        SUBI      R16,0xF0       Subtract immediate
5
+000100FE:   0000        NOP                      No operation
6
.
7
.
8
.

Jetzt versuche ich mit einer Schleife einfach alle Zeichen aus der 
Tabelle per RS232 auszugeben, allerdings lese ich immer 0xFF.

Vielleicht kann mir jemand helfen, wie ich die Daten auslesen, damit ich 
auch das, was in meiner Tabelle steht, zurück bekomme.
1
69:             sendchar(pgm_read_byte_far(&TABLE5[i]));
2
+000104CC:   01C8        MOVW      R24,R16        Copy register pair
3
+000104CD:   27AA        CLR       R26            Clear Register
4
+000104CE:   FD97        SBRC      R25,7          Skip if bit in register cleared
5
+000104CF:   95A0        LAT       R26            Load and Toggle
6
+000104D0:   2FBA        MOV       R27,R26        Copy register
7
+000104D1:   B60B        IN        R0,0x3B        In from I/O location
8
+000104D2:   BFAB        OUT       0x3B,R26       Out to I/O location
9
+000104D3:   01FC        MOVW      R30,R24        Copy register pair
10
+000104D4:   9187        ELPM      R24,Z+         Extended load program memory and postincrement
11
+000104D5:   BE0B        OUT       0x3B,R0        Out to I/O location
12
+000104D6:   940F067D    CALL      0x0001067D     Call subroutine
13
+000104D8:   5F0F        SUBI      R16,0xFF       Subtract immediate
14
+000104D9:   4F1F        SBCI      R17,0xFF       Subtract immediate with carry
15
68:          for(i=0; i< 240; i++)
16
+000104DA:   E022        LDI       R18,0x02       Load immediate
17
+000104DB:   3E04        CPI       R16,0xE4       Compare with immediate
18
+000104DC:   0712        CPC       R17,R18        Compare with carry
19
+000104DD:   F771        BRNE      PC-0x11        Branch if not equal

Ich hab hier zwar den Assembler Code, da ich verstehen möchte wie das 
lesen funktioniert, aber das Programm soll eigenlich in C geschrieben 
sein und bleiben.

Gruß Mike

von Mike R. (thesealion)


Lesenswert?

Ok, ich habe Problem gefunden und konnte lösen.
Es waren die 16 Bit Pointer die C verwendet.

Beitrag "pgm_read_byte_far"

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.