www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega64: EEprom vom Bootloader aus beschreiben?


Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

ich bin derzeit dabei mittels eines selbst geschriebenen Bootloaders für 
den mega64 und mega128 den eeprom zu beschreiben, um der Software im 
Flash mitzuteilen, dass sie 'neu' überschrieben wurde.

dazu will ich mittels
eeprom_write_byte((BYTE *)0x00, 0xAA);
an Adresse 0x00 des EEprom 0xAA schreiben. Wenn ich jedoch nach dem 
Schreiben einer neuen Software den EEprom mittels PonyProg auslese, dann 
kann ich das 0xAA net finden :(

Ist es evtl prinzipell garnicht möglich denn EEprom vom Bootloader aus 
zu beschreiben??

Grüße

Christian

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Doch, ist absolut möglich. Versuch´s doch in ASM, nutze die Routinen aus 
dem Datenblatt. Unter ASM ist es problemlos möglich, an absolute 
Adressen zu schreiben. Du mußt darauf auchten, daß sich FLASH und 
EEPROM-Zugriffe nicht in´s Gehege kommen, eins geht nur zu einer Zeit. 
Das steht aber auch im Datenblatt.

Autor: Nullpainter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn man eine library routine verwendet, sollte man auch sicherstellen, 
dass die auch da ist. In einem Bootloader sollte man nur ASM verwenden.

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Danke für die Antworten. Ich habe nun nochmal das DB bemüht und 
folgendes ausprobiert:
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
    /* Wait for completion of previous write */
  while(EECR & (1<<EEWE))
  ;
    /* Set up address and data registers */
  EEAR = uiAddress;  //  0xA0
  EEDR = ucData;    //  0xAA
    /* Write logical one to EEMWE */
  EECR |= (1<<EEMWE);
    /* Start eeprom write by setting EEWE */
  EECR |= (1<<EEWE);
}

Dies bringt leider auch nicht den gewünschten Erfolg. Als nächstes wird 
das ganze in Assembler implementiert:
EEPROM_write:
    ; Wait for completion of previous write
  sbic EECR,EEWE
  rjmp EEPROM_write
    ; Set up address (r18:r17) in address register
  out EEARH, r18
  out EEARL, r17
    ; Write data (r16) to data register
  out EEDR,r16
    ; Write logical one to EEMWE
  sbi EECR,EEMWE
    ; Start eeprom write by setting EEWE
  sbi EECR,EEWE
  ret

Grüße Christian

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du denn überhaupt mal etwas in´s EEPROM bekommen?

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht mit Hilfe des Bootloaders.

Nur aus dem eigentlich ausgeführten Programm kann ich lesen und 
schreiben, in dem ich EEprom-Variablen anlege.

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schade... also habe es nun mal in ASM probiert:
;*******************************************************************
;* void eeprom_write (WORD adress, BYTE data)
;* Die Funktion schreibt ein Datenbyte in den EEprom
;* 
;* @param address :    Ziel-Adresse, in Assembler in Registern r24 und r25
;* @param data :      Wert, in Assembler in Registern r23
;*******************************************************************        
  .global    eeprom_write

eeprom_write:
    ; Wait for completion of previous write
  SBIC 0x1C, 0x02    ;  EECR, EEWE
  RJMP eeprom_write
    ; Set up address (r24:r25) in address register
  out 0x1F, r24    ;  EEARH, r24
  out 0x1E, r25    ;  EEARL, r25
    ; Write data (r23) to data register
  out 0x1D, r23    ;  EEDR, r23
    ; Write logical one to EEMWE
  sbi 0x1C, 0x04    ;  EECR, EEMWE
    ; Start eeprom write by setting EEWE
  SBIC 0x1C, 0x02    ;  EECR, EEWE
  ret

Leider mag er das auch net... die funktion wird in c folgendermaßen 
deklariert:
/**
 * Die Funktion eeprom_werite schreibt ein Byte in den eeprom
 */
extern void eeprom_write(WORD adress, BYTE data);

passen die Übergaberegister?? habe ich da evtl die falschen genommen?

Grüße Christian

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, nun habe ich das Prob gelöst! War nen Fehler im ASM. So geht es nun:
*******************************************************************
;* void write_eeprom_byte(WORD address, BYTE byteval)
;* Die Funktion schreibt ein Byte ins EEPROM an die vorgegebene Adresse.
;*
;* @param address : EEPROM-Adresse, in Assembler in Registern r24 und r25
;* @param byteval : zu schreibender Wert, in Assembler im Register r22
;*******************************************************************
 .global  write_eeprom_byte
 
write_eeprom_byte:
        ; Registerinhalte retten
  PUSH r16
  wait_write_eeprom:
    ; auf den Abschluss eines vorhergehenden Schreibvorgangs warten
        ; EEWE-Bit (Bit1) im EECR muss 0 sein
  SBIC 0x1C,1
    RJMP    wait_write_eeprom
        ; warten bis ein vorhergehender SPM abgeschlossen ist
        ; SPMEN-Bit (Bit0) im SPMCSR muss 0 sein
  LDS r16, 0x68
  SBRC r16, 0
  RJMP wait_write_eeprom
        ; EEPROM-Schreibadresse in EEPROM-Adressregister eintragen
    STS 0x3E, r24
    STS 0x3F, r25
        ; Schreibdatum ins EEDR eintragen
    STS 0x3D, r22
        ; EEPROM-Schreibvorgang starten
        ; erst EEMWE-Bit (Bit2) dann EEWE-Bit (Bit1) im EECR setzen
  SBI 0x1C,2
  SBI 0x1C,1
        ; Registerinhalte wiederherstellen
    POP     r16
RET

Grüße

Christian

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.