Fuse Bits Mitten im Programm ändern

OP #4207300
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
Gast #4207310
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
#4207322
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?
OP #4207330
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 =)
#4207353
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
#4207361
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.
OP #4207388
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** =)
Gast #4207410
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.
#4207459
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.
Gast #4207466
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.
OP #4207487
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.
Gast #4207523
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...
Gast #4207555
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...
OP #4215620
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".

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