Fehler beim Auslesen der Extended Fuse Bits

Gast #4872618
Lesenswert?

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.
Gast #4872668
Lesenswert?

Hallo,

bitte schauen Sie jetzt in's Datenblatt des ATmega328p:

Seite 287f
Table 28-6. Extended Fuse Byte for ATmega328/328P

Definiert/ belegt sind nur die Bits 2-0, also muss das Programm noch ein 
(result & 0b111) enthalten !

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren