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