Forum: Mikrocontroller und Digitale Elektronik Fuse Bits Mitten im Programm ändern


von Marc O. (marcosfs)


Lesenswert?

Hallo mal wieder zusammen,

ich bin gerade dabei zu versuchen, die Taktquelle eines ATTiny88s mitten 
im Code-Ablauf zu ändern. Also ist es relativ einfach, die Fuse Bits 
beim Programmieren mit Atmel Studio oder jeglichen anderen Tools zu 
setzen, und sogar im Code, wie in der fuse.h-Datei in den Kommentaren 
erklärt, habe ich es schon hingekriegt, was allerdings nur beim 
kompilieren ausgeführt wird und in der .elf-Datei eingefügt wird, also 
nichts dass in Runtime was ändert.

Meine Frage ist, wie man vorgehen würde, wenn man eine externe 
Taktquelle verwendet (Taktgeber, kein Quarz möglich bei diesem ATTiny), 
und man überwachen möchte, ob sie noch vorhanden ist. Wenn aus jeglichem 
Grund z.B. der externe Taktgeber nicht mehr funktioniert und man das 
sofort erkennen möchte und daraufhin auf den internen RC-Oszillator 
umstellen will: wie geht man vor? Ist das überhaupt möglich?

Ich weiss, dass laut Datenblatt die Fuse Bits nur im Programmiermodus 
gesetzt werden können, die Frage in diesem Fall wäre: kann man durch die 
Selbstprogrammierfunktion (unter Verwendung von "SELFPRGEN" o.ä.) diesen 
Zustand einleiten und die entsprechende FUSE-Einstellungen durchführen?

Oder gibt es einen einfacheren Weg, die Taktquelle in einem solchen 
Fehlerfall zu ändern? I.e. eine Library die ich übersehen habe?

Hier der Code zu den Fuse-Einstellungen, die nur in der .elf-Datei beim 
kompilieren eingefügt werden und nicht für Änderungen im Code geeignet 
sind (interne Taktquelle usw. eingestellt):
1
FUSES = 
2
{
3
  .low = (FUSE_CKSEL0 & FUSE_SUT0),
4
  .high = (FUSE_BODLEVEL1 & FUSE_EESAVE & FUSE_SPIEN),
5
  .extended = (FUSE_SELFPRGEN)
6
};

Vielen Dank für jegliche Hilfe =)

Grüsse

von PeterL (Gast)


Lesenswert?

dieser "Fehlerfall" wir in der Praxis nie vorkommen.
Wenn der interne RC reicht(Stabilität, Frequenz) , kann man ihn doch 
gleich von Anfang an verwenden , oder?

von Peter II (Gast)


Lesenswert?

Marc O. schrieb:
> Oder gibt es einen einfacheren Weg, die Taktquelle in einem solchen
> Fehlerfall zu ändern?

ja, steht im Datenblatt. Geht aber nicht mit SELFPRGEN.

von spess53 (Gast)


Lesenswert?

Hi

>kann man durch die
>Selbstprogrammierfunktion (unter Verwendung von "SELFPRGEN" o.ä.) diesen
>Zustand einleiten und die entsprechende FUSE-Einstellungen durchführen?

Nein. Fusebits können nur gelesen werden.

MfG Spess

von Martin L. (martin_l795)


Lesenswert?

Wie sollte das denn überhaupt funktionieren können?
Dein AVR läuft mit externem Takt. Sobald der Takt fehlt, wird der 
interne Oszillator angeschaltet. Um den internen Oszillator anzuschalten 
(oder überhaupt nur den nächsten Befehl abzuarbeiten) brauchst Du einen 
Takt.
Woher kommt der ? Vom Fallback-externen Taktgenerator?

von Marc O. (marcosfs)


Lesenswert?

Peter II schrieb:
> Marc O. schrieb:
>> Oder gibt es einen einfacheren Weg, die Taktquelle in einem solchen
>> Fehlerfall zu ändern?
>
> ja, steht im Datenblatt. Geht aber nicht mit SELFPRGEN.

Wo genau? Ausser mit den CKSEL Fuse Bits, die wie gesagt laut Datenblatt 
nur im Programmiermodus gesetzt werden können, sehe ich keine 
Möglichkeit. Den Programmiermodus mitten im Code-Ablauf herbeizurufen 
habe ich noch nicht hingekriegt. Wäre man so nett, auf den Abschnitt des 
Datenblatts hinzuweisen, wo das beschrieben ist? Der Beitrag von Spess 
scheint das zu unterstützen, wovor ich mich fürchte:
spess53 schrieb:
> Nein. Fusebits können nur gelesen werden.

Und bzgl. der Antwort:
PeterL schrieb:
> dieser "Fehlerfall" wir in der Praxis nie vorkommen.
> Wenn der interne RC reicht(Stabilität, Frequenz) , kann man ihn doch
> gleich von Anfang an verwenden , oder?

Ich habe eine Kommunikationsschnittstelle, die aufgrund der bestenfalls 
mit Kalibrierung erreichbare 1%-Genauigkeit des internen RC oft genug 
aus den Schienen gerät. Und es gibt gute Gründe, aus denen mir die 
Umstellung zwischen Taktquellen sehr nützlich wäre. Der Fehlerfall kann 
bei mir nämlich durchaus auftreten.

Martin L. schrieb:
> Wie sollte das denn überhaupt funktionieren können?
> Dein AVR läuft mit externem Takt. Sobald der Takt fehlt, wird der
> interne Oszillator angeschaltet. Um den internen Oszillator anzuschalten
> (oder überhaupt nur den nächsten Befehl abzuarbeiten) brauchst Du einen
> Takt.
> Woher kommt der ? Vom Fallback-externen Taktgenerator?

Ich dachte man könnte vllt. einen Übergangszustand bzw. 
"Fast-Failure"-Zustand der Taktquelle detektieren, so was ähnliches wie 
ein Brown-Out der Versorgung. Ich geh gerne immer davon aus, es gibt 
etwas, das ich noch nicht kenne =)

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

beim XMega kannst du die Taktquelle auch per Software umschalten - nützt 
für deinen Fall auber auch nichts, denn wie schon gesagt muss der 
Controller ja noch laufen um die Umschaltung auszuführen.
Was du noch machen kannst währe eine automatische Korrektur des RC-Osc. 
über das OSCCAL-Register anhand eines externen Taktsignals. Dazu wirst 
du allerdings einen freien Timer brauchen.

Sascha

von Ulrich F. (Gast)


Lesenswert?

Marc O. schrieb:
> Ich geh gerne immer davon aus, es gibt
> etwas, das ich noch nicht kenne =)

Oh...
Da hätte ich was für dich: Das Datenblatt.

von Max D. (max_d)


Lesenswert?

Sascha W. schrieb:
> Was du noch machen kannst währe eine automatische Korrektur des RC-Osc.
> über das OSCCAL-Register anhand eines externen Taktsignals. Dazu wirst
> du allerdings einen freien Timer brauchen.

Naja, grade mit einer langsmen externen Quelle kommt man zur Not mit ner 
Zählschleife (währenddessen UNBEDINGT Interrupts ausschalten) aus 
handgezählten assembler-befehlen über die runden.

von Marc O. (marcosfs)


Lesenswert?

Sascha W. schrieb:
> Was du noch machen kannst währe eine automatische Korrektur des RC-Osc.
> über das OSCCAL-Register anhand eines externen Taktsignals. Dazu wirst
> du allerdings einen freien Timer brauchen.

Max D. schrieb:
> Zählschleife (währenddessen UNBEDINGT Interrupts ausschalten) aus
> handgezählten assembler-befehlen über die runden.

Die interne Oszillator-Kalibrierung durch den OSCCAL mit einer externen 
PWM-Welle habe ich schon erfolgreich implementiert. Die damit 
erreichbare Genauigkeit ist trotzdem nicht genug für meine Anwendung. 
Ich habe Gründe, wie schon gesagt, den internen RC ersetzen zu wollen, 
und die Quelle trotzdem mal ändern zu wollen, falls möglich. Siehe 
hierzu

https://www.mikrocontroller.net/articles/AVR-Tutorial:_Equipment#Erg.C3.A4nzende_Hinweise_zur_Taktversorgung_.28kann_.C3.BCbersprungen_werden.29

Spess hat schon gesagt, die Fuse Bits können einfach nicht ohne 
Programmiermodus geändert werden, wie ich befürchtet habe. Ausser es 
kennt jemand doch eine Lösung. Dann wäre sie willkommen. Ansonsten 
trotzdem danke für eure Zeit.

Ulrich F. schrieb:
> Oh...
> Da hätte ich was für dich: Das Datenblatt.

Ich frage in Mikrocontroller.net, weil das Datenblatt nichts anderes 
mehr liefert, ausser dem, was schon geschrieben wurde: Fuse Bits können 
nur im Programmiermodus manipuliert werden. Das erlaubt keine dynamische 
Änderung der Taktquelle ohne externen ISP-Programmer o.ä., wie im 
idealen Fall, den ich mir vorstelle. Datenblatt lesen kann ich seit 
langer Zeit. Apropos Bedarf nach Heilen von schwachen Egos gibt es 
übrigens bessere Mittel, als in Elektrnik-Foren ohne richtiges 
Durchlesen der Beiträge zu klugsch** =)

von Ulrich F. (Gast)


Lesenswert?

Marc O. schrieb:
> Datenblatt lesen kann ich seit
> langer Zeit.
Vortrefflich!
Dann ist dir ja klar, dass es nicht so geht, wie du dir das erträumst.
Oder glaubst du dem Datenblatt nicht?
Woher sollten wir mehr wissen, als da drin steht?

Marc O. schrieb:
> klugsch**
Jagut....

von Stefan F. (Gast)


Lesenswert?

Du kannst den Takt mit einer PLL Schaltung vorgeben, die mit der 
ausfallträchtigen Taktquelle synchronisiert wird.

Wenn diese ausfällt, läuft die PLL Schaltung auf ihrer (eventuell 
weniger genauen) Frequenz weiter.

Allerdings: Wenn man so einen Aufwand betreibt, kann man gleich einen 
externen Quarzoszillator verwenden.

von Thomas E. (thomase)


Lesenswert?

Marc O. schrieb:
> Der Fehlerfall kann bei mir nämlich durchaus auftreten.

Dann ist dein Konzept aber nicht unbedingt überragend.

Warum nimmst du keinen Atmega88 mit Quarz?

mfg.

von Programmierer (Gast)


Lesenswert?

STM32 können ihre Taktquelle während der Laufzeit umschalten, und sogar 
vollautomatisch auf den internen RC Oszillazor umschalten wenn der 
externe versagt.

von npn (Gast)


Lesenswert?

Programmierer schrieb:
> STM32 können ihre Taktquelle während der Laufzeit umschalten, und
> sogar
> vollautomatisch auf den internen RC Oszillazor umschalten wenn der
> externe versagt.

Das ist ja schön, wenn der das kann. Hier ging es aber um einen ATtiny!

von Malte S. (maltest)


Lesenswert?

Stefan U. schrieb:
> Du kannst den Takt mit einer PLL Schaltung vorgeben, die mit der
> ausfallträchtigen Taktquelle synchronisiert wird.
> Wenn diese ausfällt, läuft die PLL Schaltung auf ihrer (eventuell
> weniger genauen) Frequenz weiter.

Und wenn die PLL ausfällt hast du was genau gewonnen?

von Frank K. (fchk)


Lesenswert?

> Spess hat schon gesagt, die Fuse Bits können einfach nicht ohne
> Programmiermodus geändert werden, wie ich befürchtet habe. Ausser es
> kennt jemand doch eine Lösung. Dann wäre sie willkommen. Ansonsten
> trotzdem danke für eure Zeit.

Andere Architektur verwenden! PICs können es, viele ARMs können es, 
einige 8051-Derivate (nicht die von Atmel...) können es auch.

Das Umschalten zwischen verschiedenen Taktquellen ist nicht trivial, 
weil es glitchfree erfolgen muss. Soll heißen: Auch im Zeitpunkt des 
Umschaltens darf die minimale High- und/oder Low-Zeit des Taktsignals 
nicht unterschritten werden. Atmel hat sich diese Logik eben gespart.

von c-hater (Gast)


Lesenswert?

Marc O. schrieb:

> Ich dachte man könnte vllt. einen Übergangszustand bzw.
> "Fast-Failure"-Zustand der Taktquelle detektieren

Wie soll das denn gehen? Begreife: Messen heißt vergleichen! Womit 
bitteschön soll der Takt verglichen werden, um eine Abweichung vom Soll 
feststellen zu können? Du hast doch keinen anderen Takt, mit dem du 
vergleichen könntest. Und hättest du einen, brächtest du die äußere 
Taktquelle erst garnicht...

Formale Logik ist nicht deine starke Seite, stimmt's?

> so was ähnliches wie
> ein Brown-Out der Versorgung.

Der BOD vergleicht mit einer internen Spannungsreferenz. Deswegen kann 
das funktionieren.

> Ich geh gerne immer davon aus, es gibt
> etwas, das ich noch nicht kenne =)

Gibt es: Laß' das Teil einfach immer mit dem internen Taktgeber laufen 
und benutze den externen Oszillator als Referenz, um den internen 
Oszillator regelmäßig nachzujustieren.

Mit einer Plausibilitätsprüfung der Messergebnisse ist die Sache dann 
sogar gegen den (Total-) Ausfall des externen Oszillators gesichert. 
Natürlich wird aber vom Moment dieses Ausfalls an die interne Taktquelle 
nicht mehr nachjustiert und bei einer nachfolgenden signifikanten 
Temperaturänderung ist dann doch wieder Ende Gelände für deine UART.

D.h.: Im Prinzip hast du selbst mit mit diesem ganzen Aufwand bezüglich 
der Ausfallsicherheit fast nix gewonnen. Nur die Möglichkeit, den 
Ausfall der Referenztaktquelle melden zu können. Was aber nur dann etwas 
bringt, wenn irgendwer diese Meldung zu sehen bekommt und dann den 
Wechsel der externen Taktreferenz in die Wege leitet...

Deswegen ist folgendes viel besser:

Man macht sich die Tatsache der Kommunikation über UART an sich zunutze 
und benutzt diese selber als Referenztaktquelle zum Justieren des 
internen Taktgebers. Dazu muß man sich bloß ein primitives Protokoll zur 
Kommunikation ausdenken, was neben der Nutzkommunikation die regelmäßige 
Aussendung von vereinbarten (und geeigneten) Sync-Pattern beinhaltet.

Bei 8N1 z.B. wäre eine Mindest-Sendepause von 20 Bitlängen, gefolgt von 
einem "dicht" gesendeten Burst von z.B. 16 großen "U"s, wiederum gefolgt 
von einer 20Bit-Mindest-Sendepause ein hervorragendes Synchron-Pattern. 
Darauf kann sich selbst ein mit internem Takt betriebener Controller 
sofort neu synchronisieren, der einem 100K-Temperaturschock unterworfen 
wurde.

Bei geringeren Anforderungen kann man natürlich das Synchronpattern 
deutlich verkürzen oder sogar ganz darauf verzichten und einfach die 
normale Kommunikation als Referenz verwenden. Dann dauert es aber 
deutlich länger, bis ein vollkommen aus dem Tritt gekommener Client 
wieder synchron ist. Und bei extrem ungünstigen Komunikationsinhalten 
könnte es sogar passieren, daß er überhaupt nicht mehr "einrastet".

Und letztlich kann man beide Ansätze auch kombinieren: Ständige 
Feinjustierung anhand der normalen Kommunikation und das Synchronpattern 
gibt's nur dann, wenn der Master von irgendwem keine verständliche 
Antwort mehr bekommt.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Frank K. schrieb:
> Andere Architektur verwenden!

Auch Xmegas können es, war aber eben hier nicht gefragt.

Automatischen Fallback haben viele ARMs, auch die von Atmel.  Braucht
logischerweise Hardware zur Überwachung.  Könnte man genauso gut mit
ein wenig diskreter Mimik aufsetzen.

von Marc O. (marcosfs)


Lesenswert?

c-hater schrieb:
> Formale Logik ist nicht deine starke Seite, stimmt's?

Dass du den kleinen Sarkasmus unbedingt bringen musst, obwohl du weder 
meinen Lebenslauf gesehen hast noch mich persönlich kennst, spricht 
nicht gerade dafür dass du sehr objektiv und wissenschaftlich handelst 
:) Und apropos Takt, das sollen auch Menschen haben, die nicht ihr 
berufliches Leben in der Werkstatt verbringen möchten. Aber naja, 
Bescheidenheit ist im Internet noch nicht angekommen.

Und darum geht es eben, offen fragen zu können. Wer weiß ob es nicht 
doch ein Trick gegeben hätte? Fragen schadet nicht. Der, der glaubt, gut 
genug zu sein, hat aufgehört besser zu werden.

Trotzdem danke für deine Zeit und für den ausführlichen Beitrag. Hat mir 
weiter geholfen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Marc O. schrieb:
> spricht nicht gerade dafür dass du sehr objektiv und wissenschaftlich
> handelst

Das sagt doch schon sein Nickname aus.

von Drahti (Gast)


Lesenswert?

Eine Möglichkeit wurde noch nicht genannt: 2 Controller der eine 
überwacht mittels Quarzoszillator deinen Spezialoszillator ob dieser 
noch osszilliert und wenn nicht programmiert dieser deinen 
Messcontroller auf den internen Oszillator um...

von Thomas E. (thomase)


Lesenswert?

Jörg W. schrieb:
> Marc O. schrieb:
>> spricht nicht gerade dafür dass du sehr objektiv und wissenschaftlich
>> handelst
>
> Das sagt doch schon sein Nickname aus.

Ich habe doch schon vor längerer Zeit aufgedeckt, dass c-hater gar nicht 
existiert, sondern eine Verschwörung ist.

mfg.

von c-hater (Gast)


Lesenswert?

Marc O. schrieb:

> Dass du den kleinen Sarkasmus unbedingt bringen musst, obwohl du weder
> meinen Lebenslauf gesehen hast noch mich persönlich kennst

Das ist ja gerade der Witz. Hast du schonmal was von einem 
Beweisverfahren namens "vollständige Deduktion" gehört und es auch 
verstanden?

Dann weisst du, warum ich diesen "kleinen Sarkasmus" bringen kann, ohne 
über deinen Lebenslauf informiert zu sein oder dich jemals kennengelernt 
zu haben. Weil die Informationen daraus zur Beurteilung des 
Sachverhaltes schlicht irrelevant sind. Der ist aus den gegebenen 
Informationen bereits eindeutig bestimmt oder gar überbestimmt.

> Trotzdem danke für deine Zeit und für den ausführlichen Beitrag. Hat mir
> weiter geholfen.

DAS ist doch mal etwas, was ich gern lese. Leute, die wenigstens noch 
in der Lage sind, verstehen können, dass ich ihnen wirklich nur helfen 
möchte...

von (prx) A. K. (prx)


Lesenswert?

c-hater schrieb:
> Hast du schonmal was von einem
> Beweisverfahren namens "vollständige Deduktion" gehört

Nö. Erklär mal.

von Paul B. (paul_baumann)


Lesenswert?

A. K. schrieb:
> Nö. Erklär mal.

Er hält sich für Sherlock Holmes.
http://www.donaukurier.de/themen/blog/kinotv/Die-Kunst-der-Deduktion-Sherlock;art315487,2964513

MfG Dr. Watson

von (prx) A. K. (prx)


Lesenswert?

Paul B. schrieb:
> MfG Dr. Watson

Ja, damit hätten wir die Deduktion. Aber wann ist die vollständig?

von ?!? (Gast)


Lesenswert?

Paul B. schrieb:
> A. K. schrieb:
>> Nö. Erklär mal.
>
> Er hält sich für Sherlock Holmes.
> http://www.donaukurier.de/themen/blog/kinotv/Die-K...
>
> MfG Dr. Watson

Zitat:
„Sherlock antwortet immer. Auf alles!
Er ist die Schlagfertigkeit in Person.
Er wird Gott überleben,
nur damit er das letzte Wort haben kann."

Na das passt doch wie die Faust auf's Auge :-)

von (prx) A. K. (prx)


Lesenswert?

Ja, so passt es. ;-)

von Malte S. (maltest)


Lesenswert?

Paul B. schrieb:
> http://www.donaukurier.de/themen/blog/kinotv/Die-K...

"Dieses Plugin wird nicht unterstützt". Damit der Bogen zu 
Beitrag "Ein leben ohne Flash"
Fullscreen über die ganze Seite gelegt, der Text gerade noch zu 
erkennen. Garantiert nur ein Banner, aber am Handy halt nicht geblockt.
Immerhin beim zweiten Aufruf war Flash-freie Werbung.

von Marc O. (marcosfs)


Lesenswert?

Hahahaha jetzt lach ich nur noch über die Arroganz des c-hater und über 
die nachfolgenden Kommentare. Mit so Menschen hab ich beruflich bisher 
nur im Kellergeschoss der Firma zu tun gehabt. Du kannst ein As der 
Elektronik sein, Freundchen, aber dass du daraus schließt, jemand der 
kein Elektronik Expert ist und mal in einem Forum eine Frage stellt, sei 
zu formaler Logik unfähig, ist nun echt sehr ironisch, aber wenn du 
meinst das kannst du doch draus schließen, dann naja, "ignorance is 
bliss".

von spess53 (Gast)


Lesenswert?

Hi

>Automatischen Fallback haben viele ARMs, auch die von Atmel.  Braucht
>logischerweise Hardware zur Überwachung.  Könnte man genauso gut mit
>ein wenig diskreter Mimik aufsetzen.

Atmel hat jetzt auch einen AVR mit Clock Failure Detection angekündigt:

http://www.atmel.com/Images/Atmel-42397-8-bit-AVR-Microcontroller-ATmega328PB_Datasheet.pdf

MfG Spess

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.