Hallo,
ich möchte die Fuse-Bits meines Atmega328P in der Firmware auslesen.
Dazu benutze ich die Funktion boot_lock_fuse_bits_get(address) aus der
Datei avr/boot.h. Das Auslesen der High- und Low-Fuses funktioniert wie
gewünscht. Beim Auslesen der Extended-Fuses wird mir aber ein falscher
Wert angezeigt. Ich kann den Fehler in meinem Code nicht finden, deshalb
wäre ich um eure Hilfe dankbar.
Der folgende Code
1 | #include <stdlib.h>
|
2 | #include <avr/io.h>
|
3 | #include <avr/boot.h>
|
4 |
|
5 | #include "uart.h"
|
6 |
|
7 | int main(void)
|
8 | {
|
9 | InitUart(UART_BAUD_SELECT(9600, F_CPU));
|
10 | sei();
|
11 | char str_lfuse[2];
|
12 | char str_hfuse[2];
|
13 | char str_efuse[2];
|
14 |
|
15 | uint8_t lfuse = boot_lock_fuse_bits_get(GET_LOW_FUSE_BITS);
|
16 | itoa(lfuse, str_lfuse, 16);
|
17 | UartSendString("lfuse: 0x");
|
18 | UartSendString(str_lfuse);
|
19 | UartSendString("\n\r");
|
20 |
|
21 | uint8_t hfuse = boot_lock_fuse_bits_get(GET_HIGH_FUSE_BITS);
|
22 | itoa(hfuse, str_hfuse, 16);
|
23 | UartSendString("hfuse: 0x");
|
24 | UartSendString(str_hfuse);
|
25 | UartSendString("\n\r");
|
26 |
|
27 | uint8_t efuse = boot_lock_fuse_bits_get(GET_EXTENDED_FUSE_BITS);
|
28 | itoa(efuse, str_efuse, 16);
|
29 | UartSendString("efuse: 0x");
|
30 | UartSendString(str_efuse);
|
31 | UartSendString("\n\r");
|
32 |
|
33 | while(1){ /* Super loop. */ }
|
34 |
|
35 | return 0;
|
36 | }
|
liefert folgendes Ergebnis:
1 | lfuse: 0xff
|
2 | hfuse: 0xd8
|
3 | efuse: 0xfd
|
Wenn ich die Werte mit avrdude überprüfe komme ich aber zu folgendem
Ergebnis:
1 | NMR@nmr-opensuse42:~> avrdude -p m328p -P /dev/ttyUSB0 -c stk500v2 -n -U lfuse:r:-:h -U hfuse:r:-:h -U efuse:r:-:h
|
2 |
|
3 | avrdude: AVR device initialized and ready to accept instructions
|
4 |
|
5 | Reading | ################################################## | 100% 0.01s
|
6 |
|
7 | avrdude: Device signature = 0x1e950f
|
8 | avrdude: reading lfuse memory:
|
9 |
|
10 | Reading | ################################################## | 100% 0.00s
|
11 |
|
12 | avrdude: writing output file "<stdout>"
|
13 | 0xff
|
14 | avrdude: reading hfuse memory:
|
15 |
|
16 | Reading | ################################################## | 100% 0.00s
|
17 |
|
18 | avrdude: writing output file "<stdout>"
|
19 | 0xd8
|
20 | avrdude: reading efuse memory:
|
21 |
|
22 | Reading | ################################################## | 100% 0.00s
|
23 |
|
24 | avrdude: writing output file "<stdout>"
|
25 | 0x5
|
26 |
|
27 | avrdude: safemode: Fuses OK (E:05, H:D8, L:FF)
|
28 |
|
29 | avrdude done. Thank you.
|
Wobei die Extended-Fuse-Bits offensichtlich nicht übereinstimmen.