Forum: Mikrocontroller und Digitale Elektronik Fuses durch den AVR auslesen?


von AVRli (Gast)


Lesenswert?

Hallo, wink

ich möchte gerne die Fuse Bits abfragen welche im µC gesetzt sind.
Gibt es eine Möglichkeit diese zur Laufzeit auszulesen?

Ich würde gerne die Werte auf dem Display sehen um sicher zu gehen das 
ich alles richtig gesetzt habe. Ich habe eben 1h damit verbracht einen 
Fehler zu suchen der beim setzen der Fuses gemacht wurde. Hurra! :-)

Gruß AVRli...

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Datenblatt -> Memory programming -> Self programming the Flash -> Read 
Fuses

von AVRli (Gast)


Lesenswert?

Ok ich habe das schon nach gesehen aber einfach nicht verstanden. :(

Die Fuses sind nicht in irgendein Register abgelegt was man einfach so 
auslesen kann. Das hatte ich vermutet...

Ich arbeite mit einem ATmega 644 an dem lief die Serielle Schnittstelle 
nicht, weil ich eben ein Programmier Fehler gemacht habe. Nun wollte ich 
mir so eine Art Überprüfung schreiben die mir nach dem Einschalten eben 
über eine LED signalisiert das was mit den Fuses noch nicht ok ist.

Gruß AVRli...

von Fred S. (Gast)


Lesenswert?

Hi AVRli,

selbst habe ich mit dem Auslesen der Fuses mit "lpm" keine Erfahrung. 
Hier wird beschrieben, wie es jemand in C beim ATmega128 gemacht hat:
http://www.dragonsgate.net/pipermail/icc-avr/2006-August/007486.html

Gruß

Fred

von jack (Gast)


Lesenswert?

Frage:   Wie kann man die Fuses auslesen?
Antwort: z.B. im "serial programmimg mode".

Frage:   Wie kommt man dahin?
Antwort: Indem zuerst RESET auf low gezogen wird.

Frage:   Kann der µC dann ein eigenes Programm ausführen?

von You don't know Jack (Gast)


Lesenswert?

Frage : Hast Du den Thread richtig gelesen

Antwort : Nein

von Peter D. (peda)


Lesenswert?

Kann man die Fuses auch aus der Applikation lesen oder muß dazu das SPM 
im Bootloaderbereich ausgeführt werden?

Aus dem Datenblatt geht das nicht klar hervor.


Peter

von AVRli (Gast)


Lesenswert?

Hi, danke für die Antworten!

Ich werde es wohl erst morgen mal angehen können.
Der Link von Fred S. sieht interessant aus. Es ist aber wohl ASM in C 
verpackt. ;-)

Na mit den Info's schlag ich nochmal im Datenblatt nach.

Einen schönen Abend!
AVRli...

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Fuses auslesen geht auch aus der Applikations-Sektion heraus, nur daß 
hierfür die CPU für einige Zeit gestoppt wird. Beim Fuse-Lesen aus der 
Bootloader-Sektion läuft sie einfach weiter. Auf jeden Fall geht dies 
nur mit (Inline-)Assembler, weil dafür eine zeitgenaue SPM-Routine 
gebraucht wird.

von AVRli (Gast)


Lesenswert?

Hallihallo,

um es abzuschließen, es funktioniert so wie ich es wollte. :-)
Da mein Bootloader in ASM geschrieben ist, bietet es sich ja an dort die 
Sachen zu vergleichen und wenn irgendwas nicht stimmt eine 
Signalisierung zu machen.

Sowit so gut. Mit den Infos die ich hier bekommen hatte ist es mir sehr 
viel leichter gefallen die entsprechenden Sachen auch im Datenblatt zu 
finden. Ich habe die Vergleiche mal rausgelassen da ja jeder vlt. andere 
Vorstellungen hat was er mit den Info's machen möchte. Ich schau mir den 
Inhalt an und wenn er mit dem festgelegten Wert übereinstimmt dann gibt 
es ein ok, sonst eben die Fehlermeldung per LED.

Alles auf den ATmega644 bezogen, bei anderen AVR's geht das mit 
Sicherheit ähnlich, da hilft dann der Blick in das Datenblat :-P 
(Reading the Fuse and Lock Bits from Software)
1
  cli
2
3
  ldi ZH, 0    ; $0000=FLB / $0001=LB / $0002=FEB / $0003=FHB
4
  ldi ZL, 0              
5
  in wrH, SPMCSR
6
  ori wrH,(1<<BLBSET)|(1<<SPMEN);
7
  out SPMCSR, wrH
8
  nop
9
  nop
10
  nop
11
  nop
12
  nop
13
  lpm wrH,Z    ; Inhalt ist das abgefragte Byte
14
15
  sei

$0000=FLB ist das Fuse Low Byte
$0001=LB  ist das Lock Byte
$0002=FEB ist das Fuse Extended Byte
$0003=FHB ist das Fuse High Byte

Den abschließenden Satz aus dem Datenblatt sollte man auch beachten.

"Fuse and Lock bits that are programmed, will be read as zero. Fuse and 
Lock bits that are unprogrammed, will be read as one"

Also 0 ist 1 und 1 ist 0... :-D

Vielen Dank für Eure Hilfe!
MfG AVRli...

von AVRli (Gast)


Lesenswert?

Ähm ich bin es nochmal...

Irgendwie kappiere ich die Reaktion vom µC nicht ganz.
Hab ich was übersehen?

Alle Abfragen haben den Inhalt wie er tatsächlich programmiert wurde,
lediglich das Fuse High Byte hat immer einen anderen Wert als es haben 
sollte.

Abfrage ist:

  ldi ZH, 0  ; $0003=FHB / Fuse High Byte
  ldi ZL, 3
  in wrH, SPMCSR
  ori wrH,(1<<BLBSET)|(1<<SPMEN);
  out SPMCSR, wrH
  nop
  nop
  nop
  nop
  nop
  lpm wrH, Z
  cpi wrH, F_H

Als Antwort kommt immer 0x3A obwohl eigendlich 0xBA zu erwarten wäre.
Was auch noch omisch ist, nach dem abfragen wird das High Byte 
verändert.

Ich programmiere es auf 0x3A wenn ich es nun durch den mega644 auslese 
dann kommt zwar 0x3A zurück, schau ich mir das HByte über das AVR Studio 
(JTAG) wieder an, steht wieder 0xBA drin... Ähmm kopfkratz

Ich habe es also durch das auslesen verändert... das leuchtet nun nicht 
ein...


MfG AVRli...

von AVRli (Gast)


Lesenswert?

Uijuijui...

Kommando zurück! :-D

Ich habe den Vergleich mit dem JTAG Interface gemacht, damit das richtig 
arbeitet wird wohl das Fuse "OCDEN" im FHByte gelöscht, also Ergebniss 
wenn man es ausließt ohne JTAG also Schaltung getrennt vom JTAG und neu 
gestartet, dann ist die Welt auch in Ordnung.

Denke da hab ich gepennt...

MfG AVRli...

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.