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...
Datenblatt -> Memory programming -> Self programming the Flash -> Read Fuses
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...
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
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?
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
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...
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.
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...
Ä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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.