PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ATmega8 aus dem EEPROM lesen und ins EEPROM Schreiben



melowtrax
20.02.2006, 21:10
Hallo Leute hab da ein Problem soll bis morgen früh in Assembler ein Progrämmchen schreiben mit dem man einen Wert aus dem EEPROM liesst diesen inkrementiert und dann wieder ins eeprom schreibt beim entfernen der Stromzufuhr und wiederherstellung soll dies geschehen sprich strom weg strom drann wert im eeprom inkrementieren da ich noch totaler anfänger auf diesem gebiet bin und auch keine Interrupts verwenden möchte habe ich folgendes Programm geschrieben: Ich würde mich freuen wenn ihr es hinbekommt dass es auch wirklich funktioniert ergänzen der main usw da ich wirklich nicht weiss was ich machen muss danke im vorraus







.include "4433def.inc"

eep_print:


ldi r16, 0

;;;;out EEAR, r16;; Bei Controllern mit mehr als 256 Byte EEPROM, z.B. dem ATmega8,
;;;;;passt die EEPROM-Adresse nicht mehr in ein Byte alleine. Statt einem Adressregister (EEAR)
;;;;;gibt es bei diesen Controllern deshalb 2 Register, eines für das Low-Byte (EEARL) und eines für das High-Byte
out EEARH, r16 ; Hi-Byte: 0*256
out EEARL, r16 ; Lo-Byte: +0 = Adresse 0
sbi EECR,EERE ;Lesevorgang starten
in r17,EEDR ;gelesenes Byte nach r17
inc r17 ;inkrementiere r17
out EEDR, r17 ;EEPROM data register
sbi EECR, EEMWE ;Prepare EEPROM to write to
sbi EECR, EEWE ;Write to EEPROM
sbic EECR, EEWE ;EEWE is zero when previous write cycle is finished
rjmp Eeprom_wait ;If not completed yet, then try again
reti

rjmp eep_print ; ... und zum Anfang der Funktion

izaseba
20.02.2006, 21:23
Hallo,
Hier (http://www.avr-asm-tutorial.net/avr_de/avr_hard.html) hat der Gerd ein Programm für Dich geschrieben, ich glaube sowas suchst Du, oder?

Gruß Sebastian



und auch keine Interrupts verwenden möchte



....
....
reti
....


:-s
Dir ist die Bedeutung des reti Aufrufes aber klar oder ?
Außerdem muß vor jedem Zugriff auf EEPROM zuerst geprüft werden, ob er nicht gerade beschäftigt ist.

melowtrax
20.02.2006, 21:51
ehrlich gesagt nicht wirklich.
hab mir den oberen code auch aus anderen boards zusammengeschustert bin noch sehr sehr neu auf dem gebiet und hab eigentlich kaum ahnung... die lösung ist gut nur sollen keine leds blinken oder ähnliches es soll nur der wert erhöht werden sonst gaaaar nichts wäre wirklich super toll wenn dass jemand für mich bearbeiten könnte

Danke und Danke auch für das Programm

izaseba
20.02.2006, 22:09
die lösung ist gut nur sollen keine leds blinken oder ähnliches es soll nur der wert erhöht werden sonst gaaaar nichts wäre wirklich super toll wenn dass jemand für mich bearbeiten könnte

Moment mal, wo ist das Problem ? :-k
Das ist wohl das kleinste Problem, oder ?

Also gut es sind zu entfernen:


LDI mpr,$FF ; alle Bits von Port B sind Output
OUT DDRB,mpr


und


COM neu ; invertieren
OUT PORTB,neu ; an Port B


fertig...
Warum die Zeilen für die LEDs zuständig sind darfst Du selber rausfinden
[-(

Gruß Sebastian

melowtrax
20.02.2006, 23:22
jooooo thnx a lot hab mir mit hilfe von freunden mal mein eigenes progrämmchen geschrieben könnt ihr mal draufschaun ob ihr Fehler entdeckt? Danke im vorraus Hier der Code:





.DEVICE "ATMega8"
;
; Register definitions
;
;.DEF rmp = R16 ; Multipurpose register
;
; Constants
;
;.EQU fclock = 4000000 ; processor clock frequency
;
; Reset- and interrupt vectors
;
.CSEG
.ORG $0000
rjmp main ;
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
reti
;
; Main program start
;
main:



ldi r16, 0
;;;; out EEAR, r16;; Bei Controllern mit mehr als 256 Byte EEPROM, z.B. dem ATmega8,
;;;;;passt die EEPROM-Adresse nicht mehr in ein Byte alleine. Statt einem Adressregister (EEAR)
;;;;;gibt es bei diesen Controllern deshalb 2 Register, eines für
;;;;;das Low-Byte (EEARL) und eines für das High-Byte
out EEARH, r16 ; High-Byte: 0*256
out EEARL, r16 ; Low-Byte: +0 = Adresse 0
sbi EECR,EERE ;Lesevorgang starten
in r17,EEDR ;gelesenes Byte nach r17
inc r17 ;inkrementiere r17
out EEDR, r17 ;EEPROM data register
sbi EECR, EEMWE ;Prepare EEPROM to write to
sbi EECR, EEWE ;Write to EEPROM
sbic EECR, EEWE ;EEWE is zero when previous write cycle is finished
rjmp Eeprom_wait ;If not completed yet, then try again


ende_hier_wirklch:
rjmp ende_hier_wirklich

; Hier beginnt nun das Nullsetzen des EEPROMs beim Programmieren
; Zuerst wird dem Assembler mitgeteilt, dass der folgende Code in
; das EEPROM gehört:
.ESEG

; Jetzt kommt der EEPROM-Inhalt:
.DB $00 ; Ein Byte mit Null

; End of source code

melowtrax
20.02.2006, 23:22
Bitte bitte schaut es euch an da ich morgen früh abgeben muss DANKE LEUTE

izaseba
20.02.2006, 23:32
Ich hab Dir ein funktionierendes Programm gepostet, warum machst Du das wieder nach eigener Nase?
Hast Du schon meine Tips oben gelesen?
Hast Du schon das Dattenblatt durchgelesen ?
Hast Du versucht das Programm von Dir zu Assemblieren?

Ich mach an dieser Stelle Schluß,

Gruß Sebastian