von
Christian (Gast)
26.07.2007 11:34
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 1 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
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.
von
Nullpainter (Gast)
26.07.2007 13:36
Wenn man eine library routine verwendet, sollte man auch sicherstellen,
dass die auch da ist. In einem Bootloader sollte man nur ASM verwenden.
von
Christian (Gast)
27.07.2007 07:40
Hallo!
Danke für die Antworten. Ich habe nun nochmal das DB bemüht und
folgendes ausprobiert:
1 void EEPROM_write ( unsigned int uiAddress , unsigned char ucData )
2 {
3 /* Wait for completion of previous write */
4 while ( EECR & ( 1 << EEWE ))
5 ;
6 /* Set up address and data registers */
7 EEAR = uiAddress ; // 0xA0
8 EEDR = ucData ; // 0xAA
9 /* Write logical one to EEMWE */
10 EECR |= ( 1 << EEMWE );
11 /* Start eeprom write by setting EEWE */
12 EECR |= ( 1 << EEWE );
13 }
Dies bringt leider auch nicht den gewünschten Erfolg. Als nächstes wird
das ganze in Assembler implementiert:
1 EEPROM_write:
2 ; Wait for completion of previous write
3 sbic EECR,EEWE
4 rjmp EEPROM_write
5 ; Set up address (r18:r17) in address register
6 out EEARH, r18
7 out EEARL, r17
8 ; Write data (r16) to data register
9 out EEDR,r16
10 ; Write logical one to EEMWE
11 sbi EECR,EEMWE
12 ; Start eeprom write by setting EEWE
13 sbi EECR,EEWE
14 ret
Grüße Christian
Hast Du denn überhaupt mal etwas in´s EEPROM bekommen?
von
Christian (Gast)
27.07.2007 08:03
Nicht mit Hilfe des Bootloaders.
Nur aus dem eigentlich ausgeführten Programm kann ich lesen und
schreiben, in dem ich EEprom-Variablen anlege.
von
Christian (Gast)
27.07.2007 08:33
schade... also habe es nun mal in ASM probiert: 1 ;*******************************************************************
2 ;* void eeprom_write (WORD adress, BYTE data)
3 ;* Die Funktion schreibt ein Datenbyte in den EEprom
4 ;*
5 ;* @param address : Ziel-Adresse, in Assembler in Registern r24 und r25
6 ;* @param data : Wert, in Assembler in Registern r23
7 ;*******************************************************************
8 .global eeprom_write
9
10 eeprom_write:
11 ; Wait for completion of previous write
12 SBIC 0x1C, 0x02 ; EECR, EEWE
13 RJMP eeprom_write
14 ; Set up address (r24:r25) in address register
15 out 0x1F, r24 ; EEARH, r24
16 out 0x1E, r25 ; EEARL, r25
17 ; Write data (r23) to data register
18 out 0x1D, r23 ; EEDR, r23
19 ; Write logical one to EEMWE
20 sbi 0x1C, 0x04 ; EECR, EEMWE
21 ; Start eeprom write by setting EEWE
22 SBIC 0x1C, 0x02 ; EECR, EEWE
23 ret
Leider mag er das auch net... die funktion wird in c folgendermaßen
deklariert: 1 /**
2 * Die Funktion eeprom_werite schreibt ein Byte in den eeprom
3 */
4 extern void eeprom_write ( WORD adress , BYTE data );
passen die Übergaberegister?? habe ich da evtl die falschen genommen?
Grüße Christian
von
Christian (Gast)
27.07.2007 11:06
So, nun habe ich das Prob gelöst! War nen Fehler im ASM. So geht es nun:
1 *******************************************************************
2 ;* void write_eeprom_byte(WORD address, BYTE byteval)
3 ;* Die Funktion schreibt ein Byte ins EEPROM an die vorgegebene Adresse.
4 ;*
5 ;* @param address : EEPROM-Adresse, in Assembler in Registern r24 und r25
6 ;* @param byteval : zu schreibender Wert, in Assembler im Register r22
7 ;*******************************************************************
8 .global write_eeprom_byte
9
10 write_eeprom_byte:
11 ; Registerinhalte retten
12 PUSH r16
13 wait_write_eeprom:
14 ; auf den Abschluss eines vorhergehenden Schreibvorgangs warten
15 ; EEWE-Bit (Bit1) im EECR muss 0 sein
16 SBIC 0x1C,1
17 RJMP wait_write_eeprom
18 ; warten bis ein vorhergehender SPM abgeschlossen ist
19 ; SPMEN-Bit (Bit0) im SPMCSR muss 0 sein
20 LDS r16, 0x68
21 SBRC r16, 0
22 RJMP wait_write_eeprom
23 ; EEPROM-Schreibadresse in EEPROM-Adressregister eintragen
24 STS 0x3E, r24
25 STS 0x3F, r25
26 ; Schreibdatum ins EEDR eintragen
27 STS 0x3D, r22
28 ; EEPROM-Schreibvorgang starten
29 ; erst EEMWE-Bit (Bit2) dann EEWE-Bit (Bit1) im EECR setzen
30 SBI 0x1C,2
31 SBI 0x1C,1
32 ; Registerinhalte wiederherstellen
33 POP r16
34 RET
Grüße
Christian
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.