Forum: Mikrocontroller und Digitale Elektronik Fehler beim Auslesen der Extended Fuse Bits


von TO (Gast)


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.

von Karl M. (Gast)


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 !

von TO (Gast)


Lesenswert?

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

Vielen Dank für den Hinweis. Dass die Bits 3-7 den Standardwert 1 haben 
hatte ich übersehen.

lg

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.