Forum: Mikrocontroller und Digitale Elektronik Osccal für EEPROM bei mega8535 mit Quarz


von Matthias W. (matt007)


Lesenswert?

Hallo,

ich weiß zwar, daß das Thema OSCCAL
schon ein paar Mal diskutiert wurde,
leider jedoch wohl nicht, wenn ein Quarz
verwendet wird und OSCCAL nur für das
interne EEPROM Bedeutung hat. Genau das ist
bei mir der Fall.

Ich hatte bisher einen 8535, der mit Quarz
und internem EEPROM prima gearbeitet hat.
Nun muss ich umsteigen auf mega8535.

Es ist klar, daß ich die Fuses umstellen
muss, damit die neue CPU den Quarz benutzt statt
den RC-Oszillator.

Unklar ist mir nur, warum das Teil dann scheinbar
nicht in der Lage ist sich an diesem Quarz auch
für das interne EEPROM zu orientieren.

Laut Datenblatt nimmt das EEPROM bei mega8535
den 1MHz-Takt her. Damit wäre ich aber langsamer
als bisher. Gibt es denn eine rasche Lösung
ohne viel Assemblercode um das EEPROM wieder so
schnell wie beim 8535 zu bekommen?

Mehr will ich ja gar nicht. Präzisionsfanatiker
bin ich an der Stelle nicht. Es muss halt funktionieren.

Matthias

von spess53 (Gast)


Lesenswert?

Hi

>Unklar ist mir nur, warum das Teil dann scheinbar nicht in der Lage ist >sich an 
diesem Quarz auch für das interne EEPROM zu orientieren.

1. Das macht der AT90S8535 auch nicht.
2. Das Beschreiben einer EEPROM-Zelle benötigt eine bestimmte Zeit, die 
unabhängig von der Taktfrequenz des Controllers ist

MfG Spess

von Matthias W. (matt007)


Lesenswert?

@Spess:
In der AVR086 zum Ersetzen des 8535 durch
den Mega8535 steht auf S.7:

Beim 8535 hängt die EEPROM-Schreibzeit
von der Betriebsspannung ab. Bei 5V sind
es typisch 2.5ms.

Beim mega8535 benötigt die Schreibzeit
8448 Zyklen des calibrated RC-Oszillator.
Wenn er nun auf 1MHz arbeitet (default)
so liegt die Schreibzeit damit dann bei
8.4ms. Das ist also mehr als das 3-fache
als das Vorgängermodell.

Aus diesem Grund suche ich eine praktikable
Abhilfe. Ich verwende 2 Quarze, einen mit
7.xx MHz und einen mit 32kHz. Nur nützen mir
die wohl leider nichts, weil das EEPROM
sich an dem ungenauen Oszillator orientiert.

Es steht extra dabei, daß das Schreiben
von OSCCAL die Frequenz des calibrated
RC-Oszillator verändert und somit auch die
EEPROM-Schreibzeit.

Matthias

von spess53 (Gast)


Lesenswert?

Hi

Du kannst die Schreibzeit nicht einfach verkürzen, die ist 
systembedingt.
Ich vermute, das die längere Schreibzeit bei den ATMegas durch eine 
andere EEPROM-Tchnologie bedingt ist, da sich andere Parameter 
(z.B.Schreibzyklen)
verbessert haben. Hast du ein massives Problem damit?

MfG Spess

von Matthias W. (matt007)


Lesenswert?

Hi,

ich verstehe nicht recht, warum die Teile
nun so langsam geworden sind. Faktor 3
ist ja nicht von Pappe. Normalerweise
werden die Strukturen ja kleiner und
so sollte auch die Energiemenge kleiner
werden, die da benötigt wird. EEPROMS
hatten schon immer viele Zyklen. Nur
die Flashs waren oft schlecht.

Ich würde schon gerne die Angaben
des Herstellers auch verstehen, wenn er
da schreibt, daß die Schreibzeit an diesem
Oszillator hängt.

Im Datenblatt sah ich eine Tabelle, wo
darüber stand, daß der calibrated Osc
auf 1MHz, 2, 4 und 8 MHz laufen kann.
Ist das dann mit dem EEPROM möglich
oder muss jedesmal wenn man aufs EEPROM
schreiben will auf 1MHz runtergeschaltet
werden? So sehr klar ist das nicht beschrieben
auf der Seite 30.

Es steht da was von einer Nominalfrequenz.
Nur was ist das? Sollen das die 1 MHz sein?
10% darf man da angeblich drüber gehen.
Dann wären 2-8MHz ja nicht zulässig.

Die Tabelle ist zudem reichlich unklar.
Ich sehe da Werte von 50-200% für den RC-Oszi.
Wenn die Nominalfrequenz 1MHz beträgt, so
wären 50% davon 500kHz und 200% davon 2MHz.
4 oder 8MHz wären dann laut dieser Liste
nicht möglich. Wie ist es denn jetzt nun?
Ich werde aus dem Datenblatt nicht schlau.

Matthias

von Johannes M. (johnny-m)


Lesenswert?

In meinem Datenblatt steht, dass für das EEPROM grundsätzlich der 1 
MHz-Oszillator verwendet wird, unabhängig von den CKSEL-Settings.

Außerdem steht da, dass bei der Benutzung des EEPROM den Oszillator mit 
Hilfe von OSCCAL um nicht mehr als 10 % verändern soll.

von Matthias W. (matt007)


Lesenswert?

@Johannes:
Danke für den Hinweis auf Deine Interpretation
des Datenblatts. Demnach ist das Teil 3x
langsamer als früher und nicht schneller
zu bekommen.

Aus der Tabelle mit 50-200% für den RC-Oszi
werde ich immer noch nicht schlau.
Wenn die Nominalfrequenz 1MHz beträgt, so
wären 50% davon 500kHz und 200% davon 2MHz.
4 oder 8MHz wären dann laut dieser Liste
gar nicht möglich.

Matthias

von Johannes M. (johnny-m)


Lesenswert?

Matthias W. wrote:
> 4 oder 8MHz wären dann laut dieser Liste
> gar nicht möglich.
Der ATMega8535 hat vier unterschiedliche RC-Kombinationen mit 1, 2, 4 
und 8 MHz nomineller Frequenz. Welcher von denen aktiv ist, hängt von 
den CKSEL-Fuses ab. Und für jeden dieser 4 Takte gibt es zwei 
Diagramme im Datenblatt, eines für die Temperaturabhängigkeit der 
Frequenz und eines mit den OSCCAL-Werten...

Warum das EEPROM-Schreiben jetzt langsamer ist, kann ich nicht sagen. 
Aber lt. Datenblatt dauert ein Schreibzugriff etwas über 8 ms. Und der 
Wert ist weitgehend konstant, da immer der 1 MHz-Oszillator benutzt 
wird.

von Matthias W. (matt007)


Lesenswert?

@Johannes:
wenn der RC-Oszi über fuses benutzt wird
sehe ich aber ein Problem.

Wenn die Fuses so stehen, daß der Oszi auf 8MHz
laufen wie soll man dann auf das EEPROM
zugreifen können?

Die Fuses kann der Controller im Betrieb
ja kaum temporär mal schnell umprogrammieren.

Übrigens:
Die Cksel-Fuses habe ich laut Datenblatt
nun wie folgt für meinen externen Quarz
eingestellt:
CKopt 1   : 1
Cksel 3..1: 111   für 7MHz Quarz
SUT   1..0: 10    für 4.1ms Startzeit

wo nimmt jetzt das EEPROM seine Frequenz
her, wenn mit genau diesen Fuses normaler-
weise der RC Oszi verstellt wird?

Auf der Seite 30 fand ich dazu nichts
erhellendes. Oder hast Du da eine Seitenangabe
für mich?

Matthias

von Benedikt K. (benedikt)


Lesenswert?

Matthias W. wrote:
> wenn der RC-Oszi über fuses benutzt wird
> sehe ich aber ein Problem.
>
> Wenn die Fuses so stehen, daß der Oszi auf 8MHz
> laufen wie soll man dann auf das EEPROM
> zugreifen können?

Indem er weiterhin den 1MHz Oszillator für das EEPROM verwendet.

von Matthias W. (matt007)


Lesenswert?

@Benedict:
noch einmal zum Verständnis:
Der mega8535 nimmt also den RC Oszi
mit 1 Mhz für das EEPROM her, egal
wie die Fuses nun stehen, die normaler-
weise den RC Oszi umstellen?

Ist das hardwaretechnisch erklärbar?
Gibt es da ein Bild dazu?

Matthias

von /Atmel (Gast)


Lesenswert?

Der RC-Oszi wird wohl immer mit 8 MHz laufen, die 1,2 und 4 MHz
sind dann runtergeteilte Werte.

Dann kann er immer die 1 MHz für das interne Timing verwenden.

Wenn man dann aber z.B. die 8 MHz verwenden und diese auf
z.B. 10 MHz hochsetzt sind die 1 MHz ebenfalls verstimmt, und
das interne Timing wird nicht mehr eingehalten.

Das ist allerdings nur meine Interpretation und ich bin
nicht Atmel.

/Atmel

von Benedikt K. (benedikt)


Lesenswert?

/Atmel wrote:
> Der RC-Oszi wird wohl immer mit 8 MHz laufen, die 1,2 und 4 MHz
> sind dann runtergeteilte Werte.

Nein. Das ist nur bei den neueren AVRs so (mega48 und ähnliche). Die 
alten haben wirklich 4 getrennte Oszillatoren, daher auch 4 
unterschiedliche Werte für OSCCAL.

@ Matthias W.
Im mega8535 Datenblatt auf Seite 20:
Unter "Table 1. EEPROM Programming Time" steht:
Note: 1. Uses 1 MHz clock, independent of CKSEL Fuse settings.

von /Atmel (Gast)


Lesenswert?

Ich meinte mit "immer", daß es egal ist, wie die Fuses
des MEGA8535 gesetzt sind.
War halt verständlich wie das Orginal :-D

/Atmel

von Matthias W. (matt007)


Lesenswert?

Danke für die Hinweise. Danke
auch an Benedikt für Seite 20 !

Wenn es 4 Oszillatoren sind kann
das EEPROM sich den passenden ja
raussuchen. Dann müsste es EEPROM
jedenfalls hinhauen, auch wenn
ich die Fuses für den externen
Clock für 7MHz gewählt habe.

Wählt der AVR automatisch auch
die Fabrikkalibration aus?
Unkalib. ist das Ding ja reichlich
ungenau.

Wenn ich mit dem Ponyprog
reinschaue gibt er 169 aus.
Bei den anderen chips könnte
es ja anders sein.

Muss ich da programmtechnisch
beim Umstieg auf den mega8535 vom 8535
noch ein paar Zeilen Code einfügen
um den RC-Oszillator zu tunen, oder
ist das in diesem Fall nicht nötig?

Beim 8535 musste ich da ja nichts
tun.

Matthias

von Hannes Lux (Gast)


Lesenswert?

> Wählt der AVR automatisch auch
> die Fabrikkalibration aus?

Das ist von Typ zu Typ unterschiedlich. Der Mega8535 kalibriert bei 
Reset nur den 1MHz-Oszillator.

Schau Dir mal die Appnote AVR053 an:
http://www.atmel.com/dyn/resources/prod_documents/doc2555.pdf
Da steht so ziemlich alles Wissenswerte drin.

...

von Matthias W. (matt007)


Lesenswert?

@Hannes:
Danke für den Link.

Ich fasse kurz zusammen, wie ich es verstehe:

Da steht, daß eine Calib gemacht wurde im Werk,
bei 5V. Prima. Dabei betreib ich das Teil ja auch.

Sie reden davon das factory calib byte zu lesen
und in den Speicher zu übertragen.

Da die Fabrikcalib mindestens 10% genau ist bräuchte
ich keine eigene Calib durchzuführen für die Nutzung
des EEPROMs. Auch ok.

Es steht hier wieder, daß die Fuses für die Nutzung
des RC-Osz. entsprechend zu programmieren sind.
Ich habe ja die Fuses für den externen Quarz
programmiert.

Es steht auch, daß bei den meisten Bausteinen
der Fabrikwert aus der Signature Row automatisch
geladen wird und nach OSCCAL kopiert.

Wenn es beim mega8535 so wäre bräuchte ich ja
nichts tun und nichts weiter beachten.
Es wär ja schon ein ziemlicher Aufwand jedesmal
mit einem Programmierwerkzeug das Calib byte
aus der Signature Row auszulesen und dann in
Flash oder EEPROM zu speichern, von wo aus das
Hauptprogramm es dann umkopieren kann ins OSCCAL.
Das EEPROM ist bei mir voll mit Daten. Bliebe also
nur das Flash.

Offenbar gibt es mehrere Oszillatorversionen.
Der mega8535 steht nicht in der Liste AVR053. Da soll
man dann in RC_Calibration.asm schauen. In dieser
Datei, wenn man sie endlich findet (z.B.
Beitrag "Frequenzkalibrierung")
steht dann nicht gerade viel drin außer der Targetfrequenz
und der Genauigkeit in %. Es wird includiert
die m8535.asm, die dann die m8535def.inc einbindet.

Leider weiß ich so nun immer noch nicht welche
Oszillatorversion der mega8535 hat. Ich vermute mal
daß es die Version 3.x ist.

Es fällt mir schwer zu diesem Thema rasch brauchbare
Infos zu finden. Überall steht ein bisschen was.
Manches verwirrt, wie mich z.B. das Datenblatt
des mega8535 zu diesem Thema. Siehe oben.
Muss ich jetzt wirklich alle Datenblätter lesen?

Matthias

von Johannes M. (johnny-m)


Lesenswert?

Matthias W. wrote:
> Muss ich jetzt wirklich alle Datenblätter lesen?
Nein. Du musst nur das Datenblatt des ATMega8535 lesen. Da steht nämlich 
klipp und klar drin, dass das 1 MHz-Calibration Byte automatisch geladen 
wird. Wenn auf eine andere Frequenz kalibriert werden soll, dann muss 
das betreffende Calibration Byte von Hand aus der Signature Row geladen 
werden. Dafür wird aber weder irgendwelcher Speicher im EEPROM noch im 
Flash benötigt (letzteres natürlich mit Ausnahme des zusätzlichen Codes 
für das Umkopieren).

Ich verstehe allerdings absolut nicht, warum Du Dir überhaupt einen 
Kopf wegen der Kalibrierung des internen RC-Oszillators machst, wenn Du 
einen externen Oszillator als Taktquelle verwendest... Wenn Du einen 
Quarz dran hast und die Fuses entsprechend konfiguriert sind, dann kann 
Dir die Kalibrierung völlig egal sein. Die Kalibrierung und die damit 
verbundenen Einschränkungen in Sachen OSCCAL sind nur dann relevant, 
wenn Du einen der internen RC-Oszillatoren als Taktquelle verwendest und 
diesen auf einer von seiner Nennfrequenz abweichenden Frequenz betreiben 
willst, was eine erhebliche Änderung von OSCCAL zur Folge hätte.

von Matthias W. (matt007)


Lesenswert?

@Johannes:
Ich bin zufrieden, wenn ich sicher bin,
daß ich es richtig gemacht habe. Ich hoffte ja
alle wichtigen Infos in dem Blatt für den Umstieg
vom 8535 auf den mega8535 zu finden. Leider bleiben
Unklarheiten nach dem Lesen dieser Note und dem
Lesen des mega8535-Datenblatts.

Oben schriebst Du:
In meinem Datenblatt steht, dass für das EEPROM grundsätzlich der 1
MHz-Oszillator verwendet wird, unabhängig von den CKSEL-Settings.

Demnach ist damit der interne RC-Oszi gemeint.
So hatte ich das Datenblatt auch verstanden.
Wenn das 1 MHz-Calibration Byte automatisch geladen
wird sollte es ja kein Problem geben. Danke !

Matthias

von Johannes M. (johnny-m)


Lesenswert?

S. 239 im aktuellen Datenblatt (Abschnitt "Calibration Byte"):
1
"The ATmega8535 stores four different calibration values for the internal RC Oscillator.
2
These bytes resides in the signature row high byte of the addresses 0x000, 0x0001,
3
0x0002, and 0x0003 for 1, 2, 4, and 8 MHz respectively. During Reset, the 1 MHz value
4
is automatically loaded into the OSCCAL Register. If other frequencies are used, the
5
calibration value has to be loaded manually, see “Oscillator Calibration Register – OSCCAL”
6
on page 30 for details."

von Matthias W. (matt007)


Lesenswert?

@Johannes:
Danke für den klaren Hinweis !

Mit Ponyprog 2.07 konnte ich den Wert auf 0x000
auslesen, also für die 1MHz. 169 steht da bei mir
drin.

Das Auslesen 0x0001, 0x0002 und 0x0003 brachte
aber keine anderen Werte. Keine Ahnung warum
da nichts kam. Ich tippte einfach diese Adressen
in das Fenster und dann unten auf den Knopf.

Egal, ich brauche die Werte für die anderen
Frequenzen ja nicht. Ist halt schade, daß mir
das Auslesen nicht gelang. Oder steht da überall
169 drin?

Matthias

von Oork (Gast)


Lesenswert?

Offensichtlich gibt es 4 Speicherwerte und einen Oszillator.

von Matthias W. (matt007)


Lesenswert?

@Oork:
Das mit dem "einen" RC-Oszillator schien
nicht so ganz klar. Siehe oben. Da gab es
auch mal die Meinung, daß es 4 sein könnten:
"Die alten haben wirklich 4 getrennte Oszillatoren"

Der Text "values for the" deutet wieder
auf einen einzigen hin.

An einen der Speicherwerte kam ich ran,
an die anderen nicht - warum auch immer.

Matthias

von Johannes M. (johnny-m)


Lesenswert?

Es gibt vier Oszillatoren! andernfalls wäre es gar nicht möglich, dass 
für das EEPROM immer der 1 MHz-Takt verwendet wird, auch wenn ein 
anderer RC-Takt aktiv ist. Es gibt aber nur ein OSCCAL-Register, und 
deshalb ist es wichtig, dass bei der Verwendung eines der internen 
Oszillatoren als Haupttakt der OSCCAL-Wert nicht zu stark verändert 
wird. Die Kalibrierungswerte selbst haben untereinander i.d.R. nur 
relativ geringe Abweichungen, weshalb es praktisch egal ist, ob der 1 
MHz-Wert im OSCCAL steht oder der 4 MHz-Wert.

BTW:
Wenn Du nach der Application Note gehst, wäre das ein Oszillator vom Typ 
3.

von Matthias W. (matt007)


Lesenswert?

Danke für die Hinweise Johannes.

Matthias

von Hannes Lux (Gast)


Angehängte Dateien:

Lesenswert?

> Offenbar gibt es mehrere Oszillatorversionen.
> Der mega8535 steht nicht in der Liste AVR053.

Die neueste Version habe ich noch nicht gelesen, aber die ältere Version 
von AVR053 (von der STK500-CDROM) stuft den Mega8535 in Kalibrationsmode 
3.0 ein.

> Mit Ponyprog 2.07 konnte ich den Wert auf 0x000
> auslesen, also für die 1MHz. 169 steht da bei mir
> drin.

Ponyprog ist nicht das Maß der Dinge, soviel ich weiß (ich nutze es 
nicht), kann es nur das Calibrationsbyte an Adresse 0 auslesen. Das 
Auslesen der anderen drei Adressen sind nicht in Ponyprog implementiert. 
Schau mal im Datenblatt des Mega8535 bei der Beschreibung des 
ISP-Protokolls, da siehst Du, dass es mehr Möglichkeiten gibt, als 
Ponyprog bietet.

Meiner Meinung nach bezieht sich die Warnung betreffs OSCCAL und EEP nur 
darauf, dass man die internen Oszilklatoren nicht "übertakten" soll, da 
dies die EEP-Zugriffe unzuverlässig macht. Bei externem 
(baudratentauglichen) Quarz habe ich noch nie Probleme gehabt und hatte 
mich auch nicht an OSCCAL vergriffen (wozu auch?).

Das Einzige, was ich (fast) immer mache: Ich setze nach jedem 
EEP-Zugriff EEAR auf eine unbenutzte Adresse. Das stammt noch aus der 
Zeit der Classic-AVRs und hat sich als Schutz gegen versehentliches 
Löschen einzelner EEP-Zellen bewährt.

...

von Matthias W. (matt007)


Lesenswert?

@Hannes:
Danke für Deine Version 2555C-AVR-02/04 der Datei. Da steht ja wirklich 
etwas von Version 3 beim mega8535.

In der neueren Version 2555G-AVR-05/06, die ich hatte steht nichts mehr 
vom mega8535, so als ob es das Teil nicht mehr gäbe. Seltsam. Dabei gibt 
es das Teil ja bei Rei..... aktuell zu kaufen.

Welches Tool nimmst Du denn statt dem Ponyprog her? Seit 2002 war ich 
mit dem Pony recht zufrieden.

Ich hatte eine Menge Probleme mit dem internen EEPROM bei den alten 
8535, bis ich dann einen Spannungsregler mit Reset-Ausgang von TI 
verwendete. Damit waren die Probleme fort. Irgendwann sank wohl die 
Spannung ab und so wurde das EEPROM verändert durch Unsinn, den die CPU 
dann wohl anstellte.
Wie gesagt - keinerlei Probleme mehr seit ich den Reset am 
Spannungsregler nutze und nicht den Powergood so wie zuvor.

Matthias

von Hannes Lux (Gast)


Lesenswert?

> Welches Tool nimmst Du denn statt dem Ponyprog her?

Ich benutze seit einigen Jahren nur noch das AVR-Studio mit STK500 bzw. 
Dragon. Davor nutzte ich einen Eigenbau, da Pony bei mir nicht lief (was 
vermutlich mit zu langen Leitungen zu tun hatte):
http://www.hanneslux.de/avr/isp/isp.html
Diesen Eigenbau würde ich (heute) niemandem mehr empfehlen, er wird auch 
schon lange nicht mehr gepflegt. Beim Erstellen der QB-Software musste 
ich mich allerdings intensiv mit dem ISP-Protokoll beschäftigen, der 
damals zuerst verwendete AT90S1200 verhält sich auch noch etwas zickig. 
Meine Soft liest übrigens bei jedem Brennen eines calibrierbaren AVRs 
das zum Takt passende Calibrationsbyte aus und fügt es am Flash-Ende 
(letzte Zelle, L- und H-Byte) ein, falls dort kein Programmcode ist. Das 
erlaubte sehr einfaches Calibrieren per Software, besonders bei Tiny12 
und Tiny15, die ja bei Reset nicht automatisch calibriert werden.

> so als ob es das Teil nicht mehr gäbe.

Der Tiny26 wurde damals auch vergessen, er verhielt sich aber wie 
Mega8/8515/8535. ;-)

> Ich hatte eine Menge Probleme mit dem internen EEPROM bei den alten
> 8535,

Ich anfangs auch. Dann fiel mir auf, dass immer die Zelle 
gelöscht/verändert wurde, auf die beim langsamen Absinken der Spannung 
beim Ausschalten das Adressregister zeigte. Also setzte ich nach jedem 
Zugriff das Adressregister auf eine unbenutzte Zelle (meist Adresse 0) 
und schon hatte die Vergesslichkeit ein Ende. Bei den Tinies und Megas 
gibt es ja BOD, wenn das aktiviert ist, gibt es auch keine Probleme mehr 
mit dem EEP.

...

von Matthias W. (matt007)


Lesenswert?

@Hannes:
Danke für den Hinweis auf Deine Tool-Kette. Das
hat sicher eine Menge Zeit gekostet die Hardware
aufzubauen und das ausgefeilte Programm zu schreiben.

Ich weiß wie lange ich damals an meinem Zapper
baute und programmierte an Code und Oberfläche.
Immer wieder gab es überraschende Fehler.

Das AVR-Studio verwendete ich nicht so gerne.
Ich benötigte bald den Assembler mit der Möglichkeit
defines zu verwalten. Beim Studio fand ich auf die
Schnelle nicht die Einstellung, daß ein EEPROM-file
mit erstellt wurde. Mit der Kommandozeilenversion
avrasm2 kam ich schneller zu Ergebnissen.

Mit einem Tiny hatte ich auch mal was gemacht.
Bei der Programmierung der Fuses war die Logik
von Ponyprog anders rum und am Ende hatte ich
wohl den RC-Oszillator abgeschaltet und konnte
das Teil auf die einfache Art nicht mehr verwenden.
Das ist alles schon ein paar Jahre her.

Matthias

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.