- Labornetzteil AliExpress         
Ergebnis 1 bis 3 von 3

Thema: EEPROM ACCESS

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    478

    EEPROM ACCESS

    Anzeige

    Praxistest und DIY Projekte
    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:
    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
    ;_______________________________________________Quellcode
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von wkrug
    Registriert seit
    17.08.2006
    Ort
    Dietfurt
    Beiträge
    2.214
    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.

    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
    ;_______________________________________________Quellcode
    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

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    12.06.2006
    Beiträge
    478
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test