PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : EEPROM ACCESS



The Man
03.03.2007, 15:51
Guten Tag liebe Assemblerer,

ich versuche schon den ganzen Tag, einen ADC Wert in den EEPROM zu laden und dann wieder auszulesen.
Genauer:
es wird ein ADC Wert gebildet,
auf PORTB ausgegeben
und in den EEPROM laden
das findet solange statt, bis das Register r26 = 255 ist.
Dieses bildet gleichzeitig die LOW Adresse im EEPROM, auf die zugegriffen wird.
IST r26 = 255 wird in der leseschleife weiter gemacht.
Wert aus EEPROM auslesen,
r26 um 1 verringern
auf PORTB ausgeben
und das ganze solange, bis r26 = 0 ist,
dann alles von vorn.

WAS aber passiert ist, dass solange das Prog in der Schreibschleife
ist, kann ich über den ADC auch auf PORTB einfluss nehmen.
Wenn aber die Leseschleife läuft, passiert nix.
Von den Proceduren "wandeln" und "marke" weiß ich dass sie funktionieren.
hier der CODE:


;+----------------------------------------------------------------------
;| Title : myAVR Grundgerüst für ATmega8
;+----------------------------------------------------------------------
;| Funktion : ...
;| Schaltung : ...
;+----------------------------------------------------------------------
;| Prozessor : ATmega8
;| Takt : 3,6864 MHz
;| Sprache : Assembler
;| Datum : ...
;| Version : ...
;| Autor : ...
;+----------------------------------------------------------------------
.include "AVR.H"
;------------------------------------------------------------------------
;Reset and Interrupt vector ;VNr. Beschreibung
rjmp main ;1 POWER ON RESET
reti ;2 Int0-Interrupt
reti ;3 Int1-Interrupt
reti ;4 TC2 Compare Match
reti ;5 TC2 Overflow
reti ;6 TC1 Capture
reti ;7 TC1 Compare Match A
reti ;8 TC1 Compare Match B
reti ;9 TC1 Overflow
reti ;10 TC0 Overflow
reti ;11 SPI, STC Serial Transfer Complete
reti ;12 UART Rx Complete
reti ;13 UART Data Register Empty
reti ;14 UART Tx Complete
reti ;15 ADC Conversion Complete
reti ;16 EEPROM Ready
reti ;17 Analog Comparator
reti ;18 TWI (I²C) Serial Interface
reti ;19 Store Program Memory Ready
;------------------------------------------------------------------------
;Start, Power ON, Reset
main: ldi r16,lo8(RAMEND)
out SPL,r16
ldi r16,hi8(RAMEND)
out SPH,r16
ldi r16,0b11111111
out DDRB,r16
out DDRD,r16
ldi r16,0b00000000
out DDRC,r16
ldi r16,0b01100010
out ADMUX,r16
ldi r16,0b11100010
out ADCSRA,r16
ldi r16,0b00000101 ;prescaler 1/1024
out TCCR0,r16
ldi r16,0b00000000
out EEARH,r16
out EEARL,r16
ldi r28,255 ;dienen zur write oder
ldi r29,0 ; read Anzeige und werden auf PORTD gschoben
;Hier Init-Code eintragen.
;------------------------------------------------------------------------
mainloop: wdr
bis_converted:
in r16,ADCSRA ;auf conversion complete warten
ori r16,0b11101111 ;Wert von r16 verändert!
cpi r16,0b11111111 ;
breq ausgabe
rjmp bis_converted
ausgabe:
out PORTD,r28;zeigt durch PORTD = 255 EEPROM write access an
in r25,ADCH;Aufnahme des ADC Wertes
mov r30,r25
rcall wandeln
rcall marke



rcall ew

inc r26
cpi r26,255
breq lesen
rjmp bis_converted
lesen:
out PORTD,r29 ;zeigt durch PORTD = 0 read access an
rcall er
mov r30,r25
rcall wandeln
rcall marke
dec r26
cpi r26,0b00000000
breq bis_converted
rjmp lesen
;_______________________________________________Qu ellcode
ew:
eprom_write:
sbic EECR,0b00000010
rjmp eprom_write
out EEARH,r27 ;adresse
out EEARL,r26 ;adresse
out EEDR,r25 ;write value
sbi EECR,0b00000100 ;write srobe
sbi EECR,0b00000010 ;EEWE signt eeprom access - cleared after 4 clock cycles
ret ;Hier den Quellcode eintragen.

er:
eprom_read:
sbic EECR,0b00000010
rjmp eprom_read
out EEARH,r27 ;adresse
out EEARL,r26 ;adresse
sbi EECR,0b00000001
in r25,EEDR
ret

marke:

bis255:
in r16,TCNT0 ;Verzögerung
cpi r16,255
brne bis255
inc r17
cpi r17,2
brne bis255
ret

wandeln: ;da der mega8 pro Port
mov r31,r30 ; nur über 5 BIT´s verfügt,
lsr r31 ;/2 wird so geshiftet, dass zusammen
lsr r31 ;mit PORTD dann 8 BIT angezeigt
;werden können/ hier noch nicht genutzt
lsl r30 ;*2
lsl r30
lsl r30
lsl r30
lsl r30
lsl r30
out PORTB,r31

ret

wkrug
03.03.2007, 17:45
Also ich konnte da 2 Fehler ausmachen:
1. Die definitionsdatei AVR.h ist falsch und muss m8def.inc für AVR Studio 4 heissen, oder ist das Teil eines C-Codes ?
2. Die Zugriffe auf das EEPROM EECR Register sind falsch:
sbi EECR,2 ;write srobe
sbi EECR,1 ;EEWE signt eeprom access - cleared after 4 clock cycles

sbi EECR,0 ; beim lesen
müsste richtig sein und funktioniert auch so im Simulator.

Mit deinen falschen EECR Zugriffen bleibt im EEPROM immer der einmal Vorhandene Wert drin und würde dann beim Lesen immer wieder mit ausgegeben wenn die EEPROM Leseroutine richtig gewesen wäre.

Denk bitte auch daran, das das EEPROM nur für 100000 Schreib/Lese Zugriffe pro Speicherstelle ausgelegt ist.

Solche Fehler teste ich immer mit AVR Studio 4 aus, da kann man das Fehlverhalten auch wunderbar beobachten.
Ich hab den Code nur bis zur feststellung des Fehlers beim Lesen getestet, wenns immer noch nicht funktioniert bitte noch mal melden.
Anbei noch der geänderte Code.


;+----------------------------------------------------------------------
;| Title : myAVR Grundgerüst für ATmega8
;+----------------------------------------------------------------------
;| Funktion : ...
;| Schaltung : ...
;+----------------------------------------------------------------------
;| Prozessor : ATmega8
;| Takt : 3,6864 MHz
;| Sprache : Assembler
;| Datum : ...
;| Version : ...
;| Autor : ...
;+----------------------------------------------------------------------
.include "m8def.inc"
;------------------------------------------------------------------------
;Reset and Interrupt vector ;VNr. Beschreibung
rjmp main ;1 POWER ON RESET
reti ;2 Int0-Interrupt
reti ;3 Int1-Interrupt
reti ;4 TC2 Compare Match
reti ;5 TC2 Overflow
reti ;6 TC1 Capture
reti ;7 TC1 Compare Match A
reti ;8 TC1 Compare Match B
reti ;9 TC1 Overflow
reti ;10 TC0 Overflow
reti ;11 SPI, STC Serial Transfer Complete
reti ;12 UART Rx Complete
reti ;13 UART Data Register Empty
reti ;14 UART Tx Complete
reti ;15 ADC Conversion Complete
reti ;16 EEPROM Ready
reti ;17 Analog Comparator
reti ;18 TWI (I²C) Serial Interface
reti ;19 Store Program Memory Ready
;------------------------------------------------------------------------
;Start, Power ON, Reset
main: ldi r16,low(RAMEND)
out SPL,r16
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,0b11111111
out DDRB,r16
out DDRD,r16
ldi r16,0b00000000
out DDRC,r16
ldi r16,0b01100010
out ADMUX,r16
ldi r16,0b11100010
out ADCSRA,r16
ldi r16,0b00000101 ;prescaler 1/1024
out TCCR0,r16
ldi r16,0b00000000
out EEARH,r16
out EEARL,r16
ldi r28,255 ;dienen zur write oder
ldi r29,0 ; read Anzeige und werden auf PORTD gschoben
;Hier Init-Code eintragen.
;------------------------------------------------------------------------
mainloop: wdr
bis_converted:
in r16,ADCSRA ;auf conversion complete warten
ori r16,0b11101111 ;Wert von r16 verändert!
cpi r16,0b11111111 ;
breq ausgabe
rjmp bis_converted
ausgabe:
out PORTD,r28;zeigt durch PORTD = 255 EEPROM write access an
in r25,ADCH;Aufnahme des ADC Wertes
mov r30,r25
rcall wandeln
rcall marke



rcall ew

inc r26
cpi r26,255
breq lesen
rjmp bis_converted
lesen:
out PORTD,r29 ;zeigt durch PORTD = 0 read access an
rcall er
mov r30,r25
rcall wandeln
rcall marke
dec r26
cpi r26,0b00000000
breq bis_converted
rjmp lesen
;_______________________________________________Qu ellcode
ew:
eprom_write:
sbic EECR,0b00000010
rjmp eprom_write
out EEARH,r27 ;adresse
out EEARL,r26 ;adresse
out EEDR,r25 ;write value
sbi EECR,2 ;write srobe
sbi EECR,1 ;EEWE signt eeprom access - cleared after 4 clock cycles
ret ;Hier den Quellcode eintragen.

er:
eprom_read:
sbic EECR,0b00000010
rjmp eprom_read
out EEARH,r27 ;adresse
out EEARL,r26 ;adresse
sbi EECR,0
in r25,EEDR
ret

marke:

bis255:
in r16,TCNT0 ;Verzögerung
cpi r16,255
brne bis255
inc r17
cpi r17,2
brne bis255
ret

wandeln: ;da der mega8 pro Port
mov r31,r30 ; nur über 5 BIT´s verfügt,
lsr r31 ;/2 wird so geshiftet, dass zusammen
lsr r31 ;mit PORTD dann 8 BIT angezeigt
;werden können/ hier noch nicht genutzt
lsl r30 ;*2
lsl r30
lsl r30
lsl r30
lsl r30
lsl r30
out PORTB,r31

ret

The Man
03.03.2007, 19:22
Danke wkrug!

läuft jetzt. Ich benutzte das Workpad von my_AVR, wahrscheinlich heißt deshalb die include Datei anders.
Was die Lebensdauer angeht, ist das für´s erste net so wichtig. Das sind meine ersten Schritte in Assembler und ich muss vorallem erstmal die Basics drauf kriegen.

The Man