Ik heb iets waar ik (nog) niks van snap.
Misschien is er iemand die me dit kan uitleggen:
Ik heb de volgende code:
code:
; ****************************************************** ; BASIC .ASM template file for AVR ; ****************************************************** .include "C:\VMLAB\include\m16def.inc" .Def Rmp = R16 ;Multi purpose register ;EEPRom Positions .ESEG .ORG $0000 EUniLoopTmr: .DB 0x07 EBiLoopTmr: .DB 0x00,0x40 ECamSetTmr: .DB 0x00,0x00,0x00,0x04 ECamShootTmr: .DB 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06 ;SRam positions .DSEG .ORG $0060 UniSteprLoopTmr: .Byte 0x02 BiSteprLoopTmr: .Byte 0x02 ShutterSet: .Byte 0x02 ShutterShoot: .Byte 0x02 ;Code segment .CSEG .org 0x0000 ; Define here Reset and interrupt vectors, if any Reset: RJMP main .org 0x0028 RETI ;To return from Interrupts we dont use main: ; Program starts here after Reset LDI Rmp, High(RamEnd);Initialize the stack OUT SPH, Rmp LDI Rmp, Low(RamEnd) OUT SPL, Rmp ;Here we read the eeprom values ReadFromEprom: SBIC EECR,EEWE RJMP ReadFromEprom LDI ZH,High(2*EUniLoopTmr) LDI ZL,Low(2*EUniLoopTmr) OUT EEARH,ZH OUT EEARL,ZL SBI EECR,EERE;Start eeprom read by writing EERE IN Rmp,EEDR ;Read data from eprom Keurig 0x07 zoals ik zou verwachten CBI EECR,EERE;Reset read bit to zero LDI ZH,High(2*UniSteprLoopTmr) LDI ZL,Low(2*UniSteprLoopTmr) ST Z,Rmp ;2de lus om de volgende waarde op te halen LDI ZH,High(2*EBiLoopTmr) LDI ZL,Low(2*EBiLoopTmr) OUT EEARH,ZH OUT EEARL,ZL SBI EECR,EERE IN Rmp,EEDR ;Read data from eprom, hier krijg ik dus 0x04 als ik geen voorloop bytes gebruik CBI EECR,EERE;Reset read bit to zero LDI ZH,High(2*BiSteprLoopTmr) LDI ZL,Low(2*BiSteprLoopTmr) ST Z,Rmp ;3rd value LDI ZH,High(2*ECamSetTmr) LDI ZL,Low(2*ECamSetTmr) OUT EEARH,ZH OUT EEARL,ZL SBI EECR,EERE IN Rmp,EEDR CBI EECR,EERE LDI ZH,High(2*ShutterSet) LDI ZL,Low(2*ShutterSet) ST Z,Rmp ;4th value LDI ZH,High(2*ECamShootTmr) LDI ZL,Low(2*ECamShootTmr) OUT EEARH,ZH OUT EEARL,ZL SBI EECR,EERE IN Rmp,EEDR; hier krijg ik 0xFF, ik ga dus over de labels heenin de vrije ruimte van de eeprom CBI EECR,EERE LDI ZH,High(2*ShutterShoot) LDI ZL,Low(2*ShutterShoot) ST Z,Rmp forever: ;From here we can get in to the realy interesting stuff rjmp forever
Een heel stuk code, maar goed jullie moeten ook weten waar ik het over heb.
Zoals je ziet heb ik een aantal labels gemaakt voor de eeprom sectie zoals ik dat ook heb gedaan voor de sram sectie.
Als ik de SRam labels wil aanspreken heb ik keurig voldoende aan:
code:
LDI ZH,High(2*UniSteprLoopTmr) LDI ZL,Low(2*UniSteprLoopTmr) ST Z,Rmp
om een waarde op te slaan op de plek waar ik dat verwacht.
Echter zoals je ziet moet ik bij de EEprom sectie labels declareren met een een hoop bytes ervoor, en hoe verder ik kom in de memory hoe meer voorloop bytes ik moet gebruiken om de juiste waarde te kunnen opvragen.
(Het werkt overigens wel goed zo, want als ik wat schrijf naar de eprom , dan komt het ook op de goeie plek, maar het lijkt zo'n 'waste of space')
Wie o wie kan mij vertellen waarom dat is, of wat ik verkeerd doe, want die documentatie van de atmega18 verteld hier helemaal niets over..
[Bericht gewijzigd door yogib3ar op 7 september 2008 23:38:33]


