Shock Media

Navigatie

EEprom lezen en schrijven in atmega16

Forum > Digitaal > EEprom lezen en schrijven in atmega16
Naam Bericht
yogib3ar

Hallo,

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]
pros

Je moet in de datasheet kijken bij "AVR ATmega16 Memories", daar staat het duidelijk uitgelegd. Bijvoorbeeld, om naar EEPROM te schrijven:
code:
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.
Een stijgtijd van 1V/nS komt overeen met 3600000000000V/h. Pros Robaer (1995)
Zoeken in topic