Forum: Mikrocontroller und Digitale Elektronik ATTIINY12 Probleme mit int. Oszillator


von Walter L. (Firma: Funkservice) (lidschreiber)


Lesenswert?

Hallo Leute,
kann mir wer einen Tipp geben.

Problem: Ich habe ein Programm für einen ATTINY12 geschrieben, welches 
auch gut läuft .... aber bei einigen Platinen habe ich das Problem das 
das Programm nicht mehr in der vorgesehenen Geschwindigkeit abläuft da 
sich die Frequenz des int. Oszillators geändert hat bzw. die 
Programmierung verloren hat. Ich kann die Oszillatorfrequenz neu aus dem 
Speicher lesen und programmieren .... dann läuft alles wieder für ca. 3 
Monate bis 1/2 Jahr ... dann kommt der Fehler wieder.

Über zeitnahe Infos wäre ich sehr froh ;-)

Vielen Dank und Grüße aus Tirol von
Walter Lidschreiber

von Peter D. (peda)


Lesenswert?

Enable mal das BOR.

von Hannes L. (hannes)


Lesenswert?

Walter Lidschreiber schrieb:
> Ich kann die Oszillatorfrequenz neu aus dem
> Speicher lesen und programmieren

Was meinst Du damit?

Da das bereits alles schon mal erklärt wurde, möchte ich auf diesen 
Beitrag verweisen: 
Beitrag "Re: DCC Decoder"
ATTiny12 und ATTiny15 sind betreffs Calibration des internen 
RC-Oszillators identisch.

Die Routine, die ich zur Calibration von Tiny12 und Tiny15 verwendet 
habe, sieht so aus:
1
RESET:
2
 ser temp               ;Referenzwert ($FF) für ungültiges Calbyte
3
 ldi zl,low(flashend*2) ;Zeiger auf Flash-Ende (letzte Flash-Zelle Low,
4
 ldi zh,high(flashend*2);da schreibt ATLEL und mein ISP-Programm das Calbyte hin)
5
 lpm                    ;Calbyte vom Flash einlesen
6
 cpse r0,temp           ;Calbyte gültig (ungleich $FF)?
7
 out osccal,r0          ;ja, Oszillator kalibrieren
Das damals verwendete Eigenbau-ISP-Programm las bei jedem "Brennen" das 
(exemplarabhängige) Calibrationsbyte aus dem Signaturespace des AVRs 
(siehe dazu die Tabelle "Low-voltage Serial Programming Instruction Set" 
im Kapitel Memory Programming, Low-voltage Serial Downloading im 
Datasheet des Tiny12 oder Tiny15) und legte es ins Low-Byte der letzten 
Flash-Zelle. Dort wird es dann von der Calibrationsroutine (erster Block 
der Reset-Routine) gefunden und in das Register OSCCAL eingetragen.

Modernere AVRs machen das beim Hardware-Reset automatisch.

...

von Walter (Gast)


Lesenswert?

Hallo Hannes,
kann ich dir meine Programmierung (Datei) mal schicken und Du "baust" 
die
vin dir geschriebene RESET-Programmierung dort ein .... ein Freund hat 
das Programm für mich geschrieben - dar hat aber keine Zeit (Lust) mehr 
sich um das Problem zu kümmern. Bei mir steht in RESET natürlich etwas 
anderes und ich möchte das Programm durch falsche Eingaben nicht 
"zerstören" ;-) .... es läuft ja sonst einwandfrei !!
Gerne bin ich auch bereit die Arbeitsleistung zu bezahlen - ich brauche 
dringend Hilfe !!
Mit lieben Grüßen aus Tirol - Walter Lidschreiber

von Walter L. (Firma: Funkservice) (lidschreiber)


Lesenswert?

Hallo Hannes,
kann ich dir meine Programmierung (Datei) mal schicken und Du "baust"
die von dir geschriebene RESET-Programmierung dort ein .... ein Freund 
hat
das Programm für mich geschrieben - dar hat aber keine Zeit (Lust) mehr
sich um das Problem zu kümmern. Bei mir steht in RESET natürlich etwas
anderes und ich möchte das Programm durch falsche Eingaben nicht
"zerstören" ;-) .... es läuft ja sonst einwandfrei !!
Gerne bin ich auch bereit die Arbeitsleistung zu bezahlen - ich brauche
dringend Hilfe !!
Mit lieben Grüßen aus Tirol - Walter Lidschreiber

von Hannes L. (hannes)


Lesenswert?

Sorry, Deine erste Anfrage hatte ich übersehen...

Walter Lidschreiber schrieb:
> kann ich dir meine Programmierung (Datei) mal schicken und Du "baust"
> die von dir geschriebene RESET-Programmierung dort ein ....

Das nützt Dir nichts, denn das ist nur die halbe Miete. Denn beim 
Flashen des Controllers muss ja auch das individuelle Calibrationsbyte 
aus dem Controller gelesen werden und ins Flash des Controllers 
geschrieben werden, wo es meine Routine dann finden soll.

Wenn es sich um einen einzelnen Controller handelt und nicht um eine 
Serie, bietet sich folgender einfache Weg an:

- Mittels ISP-Programm Calibrationsbyte des zu flashenden
  Controllers auslesen

- In Reset-Routine des Programms (also hinter die Interrupt-
  Sprungtabelle) zwei Programmzeilen einfügen:
1
    ldi r16,$xx     ;($xx ist das zuvor ermittelte Calibrationsbyte)
2
    out osccal,r16  ;Wert in Calibrationsregister schreiben.

- Quelltext neu assemblieren (Build).

- Neu entstandene Hexdatei mittels ISP-Programm in Controller übertragen 
(flashen).

Wenn ich das machen soll, dann brauche ich nicht nur den Quelltext, 
sondern auch den zu flashenden Controller, denn es muss ja das 
exemplarabhängige Calibrationsbyte aus dem Controller ausgelesen werden.

...

von Karl H. (kbuchegg)


Lesenswert?

Hannes, weißt du wie gut der Oszillator der 12-er ist?
Ist das noch einer von den alten oder schon ein neuerer, der weniger 
Temperatur-Drift hat.

Denn das hier
> dann läuft alles wieder für ca. 3 Monate bis 1/2 Jahr
klingt für mich schon verdächtig nach Sommer/Winter 'Betrieb'.

Dann hilft auf lange Sicht nur ein Quarz.

von Walter L. (Firma: Funkservice) (lidschreiber)


Lesenswert?

Hallo Hannes,
also wenn ich nun richtig verstanden habe:

1) mit ISP-Programm das Calibrationsbyte auslesen
2) dieses dann mit den 2 Programmzeilen in mein Programm
   (in die Resetroutine) schreiben z.B. $34
3) Controller mit der neuen Datei programmieren

d.h. vor dem programmieren des Controllers muß ich jedesmal vorher das 
Byte auslesen und implizieren !!!
Da gibt es keine Routine !! ...... lt. Beitrag "Re: DCC Decoder"

Ich muß nämlich ca. 100 Platinen programmieren und in Geräte einbauen 
;-)
.... und jedes verwendete ATiny12 hat ein anderes Calibrationsbyte ;-(

Liebe Grüße von Walter aus Tirol
und vielen Dank für deine Mühen

von Hannes L. (hannes)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Hannes, weißt du wie gut der Oszillator der 12-er ist?

Nicht gut, UART wüede ich damit ungern machen wollen.

> Ist das noch einer von den alten oder schon ein neuerer, der weniger
> Temperatur-Drift hat.

Es ist der erste nach dem AT90S1200, also ein alter...

> Dann hilft auf lange Sicht nur ein Quarz.

Dann hat der Controller aber nur noch 3 nutzbare I/O-Pins.

Walter Lidschreiber schrieb:
> d.h. vor dem programmieren des Controllers muß ich jedesmal vorher das
> Byte auslesen und implizieren !!!

So ist das.

> Da gibt es keine Routine !! ...... lt. Beitrag "Re: DCC Decoder"

Nein, auf die High-Bytes im Signature-Space (da wo die Calibrationsbytes 
stehen) kann nur ein (brauchbarer) Programmer zugreifen. Das Programm im 
AVR hat darauf keinen Zugriff. Werksneue (calibrierbare) AVRs hatten das 
Calibrationsbyte zusätzlich in der letzten EEPROM-Zelle und der letzten 
Flash-Zelle (Low-Byte und High-Byte) gespeichert. Diese geht aber beim 
Erase verloren. Dummerweise führen viele ISP-Programme vor jedem Flashen 
Erase aus, was die Nutzung der vorbereiteten Calibration verhindert.

Und auf das (auch noch flüchtige) Register OSCCAL kann nur das Programm 
im AVR zugreifen.

Meine Routine nahm das Calibrationsbyte aus dem Low-Byte der letzten 
Flash-Zelle. Das ging aber nur, weil mein damals benutztes 
Eigenbau-ISP-Programm (in QBASIC geschrieben) beim Flashen das 
Calibrationsbyte aus dem Signaturespace des AVRs gelesen hat und in die 
letzte Flash-Zelle (L und H) geschrieben hat. Der Programmer von 
AVR-Studio kann das zwar auch, ist dabei aber recht 
bedienerunfreundlich, da man die Adresse explizit (in Hex) angeben muss. 
Ein Auswahlfeld mit "letzte Flash-Adresse" hätte die Sache vereinfacht.

>
> Ich muß nämlich ca. 100 Platinen programmieren und in Geräte einbauen

Du kannst mir gerne den Quelltext schicken, damit ich meine Routine 
einbaue. Du musst Dir aber trotzdem einen Weg suchen, wie Du Deinen 
Programmer dazu bringst, die letzten beiden Bytes im Flash durch das 
auszulesende exemplarabhängige Calibrationsbyte zu ersetzen.

Alternativ kann dazu auch die letzte EEPROM-Zelle genutzt werden. Dann 
muss die Routine eben statt des Flash das EEP euslesen. Dazu muss aber 
BOD (Brown Out Detect) aktiviert werden, da sonst das EEP vergesslich 
werden kann.

> ;-)
> .... und jedes verwendete ATiny12 hat ein anderes Calibrationsbyte ;-(

Das ist nunmal aufgrund der Fertigungstoleranzen so. ATtiny 12 und '15 
mussten von Hand calibriert werden, ebenso ATMega8, '16, '32, ATTiny26, 
wenn der interner Oszillator auf 2, 4 oder 8 MHz eingestellt wurde. Die 
automatische Calibration beim Reset funktionierte nur für 1 MHz.

Man sollte aber beachten, dass Tiny12 und Tiny15 obsolet sind. Die 
Nachfolger Tiny13 und Tiny25/45/85 haben bedeutend bessere Eigenschaften 
und müssen auch nicht mehr von Hand calibriert werden. Vielleicht kann 
Deine Software ja auf Tiny13 umgestellt werden.

...

von Route_66 H. (route_66)


Lesenswert?

@ Walter Lidschreiber

Hallo!
Leider kennen wir Deine Anwendung nicht. Eine "Selbstjusierung" kommt 
wohl nicht in Frage? Bei vielen UART-Anwendungen sieht man 
Auto-Baud-Funktionen. Kann sich Dein Tiny z.B. beim Einschalten aus 
irgend einem externes Signal seinen eigenen Takt ausrechnen, und sich 
dann selbst das Calibration-byte ermitteln?

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.