Hallo liebe E-Lab Gemeinde,
ich verzeifel an folgendem Problem:
Nachdem ich in nun nach sechs Monaten meine Hard-&Softwareentwicklung abschlossen habe, wird mir kundenseitig ein Bootloader für den Xmega128A4U aufgedrückt. Den und nur den darf ich verwenden !!!
In meiner Delphi Geräte App habe ich den Flip von Atmel eingebunden und das läuft in Verbindung mit dem USBsmart wie geschmiert. Flip in der App und der zugehörige Flip Bloader in der Source müssen nun ersetzt werden.
So nun zum Problem:
Mit dem kundenseitigen BLoader kann ich das Hex File in den 128er laden und diesen starten.
Die Geräte-Firmware läuft bis auf die EEProm Zugriffe. Es kann weder gelesen noch geschrieben werden. Dies hat nichts mit den Fuses (EESave) zu tun.
Ein in C++ (bääh) erstelltes Testprogramm arbeitet mit dem Kunden BLoader. Es können EEprom W/R Zugriffe ausgeführt werden. Das identische Testprogramm in AvrCo versagt.
Soweit ich das verstehe, arbeitet AvrCo bei EEprom Zugriffen mit dem NVM Controller.
Die C++ Lib eeprom.h anscheinend nicht.
Der C++ Befehl zum schreiben von Data= $8F auf EEprom_Adr= $07FF lautet:
eeprom_write_byte((uint8_t*)0x7ff,0x8f);
In AvrCo lautet der identische Befehl:
EEprom[EEPROMend]:= $8F;
Das Assembly von eeprom_write_byte((uint8_t*)0x7ff,0x8f) sieht so aus:
28c: 6f e8 ldi r22, 0x8F ; EE Data 143
28e: 8f ef ldi r24, 0xFF ; EE Adr Lsb 255
290: 97 e0 ldi r25, 0x07 ; EE Msb 7
292: 21 d0 rcall .+66 ; 0x2d6 <__eewr_byte_x128a4u>
...
...
...
000002d6 <__eewr_byte_x128a4u>:
2d6: 26 2f mov r18, r22
000002d8 <__eewr_r18_x128a4u>:
2d8: e0 ec ldi r30, 0xC0 ; 192
2da: f1 e0 ldi r31, 0x01 ; 1
2dc: 37 85 ldd r19, Z+15 ; 0x0f
2de: 37 fd sbrc r19, 7
2e0: fd cf rjmp .-6 ; 0x2dc <__eewr_r18_x128a4u+0x4>
2e2: 34 85 ldd r19, Z+12 ; 0x0c
2e4: 37 7f andi r19, 0xF7 ; 247
2e6: 34 87 std Z+12, r19 ; 0x0c
2e8: 37 85 ldd r19, Z+15 ; 0x0f
2ea: 31 ff sbrs r19, 1
2ec: 09 c0 rjmp .+18 ; 0x300 <__eewr_r18_x128a4u+0x28>
2ee: 36 e3 ldi r19, 0x36 ; 54
2f0: 32 87 std Z+10, r19 ; 0x0a
2f2: 38 ed ldi r19, 0xD8 ; 216
2f4: 34 bf out 0x34, r19 ; 52
2f6: 31 e0 ldi r19, 0x01 ; 1
2f8: 33 87 std Z+11, r19 ; 0x0b
2fa: 37 85 ldd r19, Z+15 ; 0x0f
2fc: 37 fd sbrc r19, 7
2fe: fd cf rjmp .-6 ; 0x2fa <__eewr_r18_x128a4u+0x22>
300: 33 e3 ldi r19, 0x33 ; 51
302: 32 87 std Z+10, r19 ; 0x0a
304: 80 83 st Z, r24
306: 91 83 std Z+1, r25 ; 0x01
308: 12 82 std Z+2, r1 ; 0x02
30a: 24 83 std Z+4, r18 ; 0x04
30c: 25 e3 ldi r18, 0x35 ; 53
30e: 22 87 std Z+10, r18 ; 0x0a
310: 28 ed ldi r18, 0xD8 ; 216
312: 31 e0 ldi r19, 0x01 ; 1
314: 24 bf out 0x34, r18 ; 52
316: 33 87 std Z+11, r19 ; 0x0b
318: 01 96 adiw r24, 0x01 ; 1
31a: 08 95 ret
Dies betrifft jetzt nur den Schreibbefehl auf EEpromEnd zum Start des BootLoaders.
Es versagen alle Schreib-Lesezugriffe und dadurch auch meine CRC Routinen für das EEprom.
Vielen Dank vorab,
Roland
ich verzeifel an folgendem Problem:
Nachdem ich in nun nach sechs Monaten meine Hard-&Softwareentwicklung abschlossen habe, wird mir kundenseitig ein Bootloader für den Xmega128A4U aufgedrückt. Den und nur den darf ich verwenden !!!
In meiner Delphi Geräte App habe ich den Flip von Atmel eingebunden und das läuft in Verbindung mit dem USBsmart wie geschmiert. Flip in der App und der zugehörige Flip Bloader in der Source müssen nun ersetzt werden.
So nun zum Problem:
Mit dem kundenseitigen BLoader kann ich das Hex File in den 128er laden und diesen starten.
Die Geräte-Firmware läuft bis auf die EEProm Zugriffe. Es kann weder gelesen noch geschrieben werden. Dies hat nichts mit den Fuses (EESave) zu tun.
Ein in C++ (bääh) erstelltes Testprogramm arbeitet mit dem Kunden BLoader. Es können EEprom W/R Zugriffe ausgeführt werden. Das identische Testprogramm in AvrCo versagt.
Soweit ich das verstehe, arbeitet AvrCo bei EEprom Zugriffen mit dem NVM Controller.
Die C++ Lib eeprom.h anscheinend nicht.
Der C++ Befehl zum schreiben von Data= $8F auf EEprom_Adr= $07FF lautet:
eeprom_write_byte((uint8_t*)0x7ff,0x8f);
In AvrCo lautet der identische Befehl:
EEprom[EEPROMend]:= $8F;
Das Assembly von eeprom_write_byte((uint8_t*)0x7ff,0x8f) sieht so aus:
28c: 6f e8 ldi r22, 0x8F ; EE Data 143
28e: 8f ef ldi r24, 0xFF ; EE Adr Lsb 255
290: 97 e0 ldi r25, 0x07 ; EE Msb 7
292: 21 d0 rcall .+66 ; 0x2d6 <__eewr_byte_x128a4u>
...
...
...
000002d6 <__eewr_byte_x128a4u>:
2d6: 26 2f mov r18, r22
000002d8 <__eewr_r18_x128a4u>:
2d8: e0 ec ldi r30, 0xC0 ; 192
2da: f1 e0 ldi r31, 0x01 ; 1
2dc: 37 85 ldd r19, Z+15 ; 0x0f
2de: 37 fd sbrc r19, 7
2e0: fd cf rjmp .-6 ; 0x2dc <__eewr_r18_x128a4u+0x4>
2e2: 34 85 ldd r19, Z+12 ; 0x0c
2e4: 37 7f andi r19, 0xF7 ; 247
2e6: 34 87 std Z+12, r19 ; 0x0c
2e8: 37 85 ldd r19, Z+15 ; 0x0f
2ea: 31 ff sbrs r19, 1
2ec: 09 c0 rjmp .+18 ; 0x300 <__eewr_r18_x128a4u+0x28>
2ee: 36 e3 ldi r19, 0x36 ; 54
2f0: 32 87 std Z+10, r19 ; 0x0a
2f2: 38 ed ldi r19, 0xD8 ; 216
2f4: 34 bf out 0x34, r19 ; 52
2f6: 31 e0 ldi r19, 0x01 ; 1
2f8: 33 87 std Z+11, r19 ; 0x0b
2fa: 37 85 ldd r19, Z+15 ; 0x0f
2fc: 37 fd sbrc r19, 7
2fe: fd cf rjmp .-6 ; 0x2fa <__eewr_r18_x128a4u+0x22>
300: 33 e3 ldi r19, 0x33 ; 51
302: 32 87 std Z+10, r19 ; 0x0a
304: 80 83 st Z, r24
306: 91 83 std Z+1, r25 ; 0x01
308: 12 82 std Z+2, r1 ; 0x02
30a: 24 83 std Z+4, r18 ; 0x04
30c: 25 e3 ldi r18, 0x35 ; 53
30e: 22 87 std Z+10, r18 ; 0x0a
310: 28 ed ldi r18, 0xD8 ; 216
312: 31 e0 ldi r19, 0x01 ; 1
314: 24 bf out 0x34, r18 ; 52
316: 33 87 std Z+11, r19 ; 0x0b
318: 01 96 adiw r24, 0x01 ; 1
31a: 08 95 ret
Dies betrifft jetzt nur den Schreibbefehl auf EEpromEnd zum Start des BootLoaders.
Es versagen alle Schreib-Lesezugriffe und dadurch auch meine CRC Routinen für das EEprom.
Vielen Dank vorab,
Roland