Hallo,
Ik heb iets waar ik (nog) niks van snap.
Misschien is er iemand die me dit kan uitleggen:
Ik heb de volgende 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:
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..
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Je moet in de datasheet kijken bij "AVR ATmega16 Memories", daar staat het duidelijk uitgelegd. Bijvoorbeeld, om naar EEPROM te schrijven:
1. Wait until EEWE becomes zero.
2. Wait until SPMEN in SPMCR becomes zero.
3. Write new EEPROM address to EEAR (optional).
4. Write new EEPROM data to EEDR (optional).
5. Write a logical one to the EEMWE bit while writing a zero to EEWE in EECR.
6. Within four clock cycles after setting EEMWE, write a logical one to EEWE.