Forum: Mikrocontroller und Digitale Elektronik AVR Temperatur Problem


von Robert (Gast)


Lesenswert?

Hallo liebe Leute
Vielleicht könnt ihr mir helfen ?!

Ich habe da ein Temperatur Problem mit meinen ATMEGA8

Ich habe da eine Platine mit einem ATMEGA8 mit internen 8Mhz Takt (RC)
Der Mega8 gibt mir über die Serielle Schnittstelle (9600Baud) Daten an 
den PC weiter.

Es trat jetzt bei einer Platine das Problem auf, dass die 
Datenübertragung manchmal abreißt.

Mit dem OSCI sieht man jedoch immer eine Datenübertragung.

Habe dann mal meinen Logikanalyzer dran gehängt und gemerkt, dass es 
Timing Probleme im Sende Signal (vom AVR) gibt.

Wenn der AVR warm ist, funktioniert alles gut. (22°C)
Wenn der AVR kühler ist, gibt es im Datenstrom Timing Probleme.

Habe jetzt den AVR durch einen neuen AVR ersetzt.

Jetzt funktioniert es soweit normal.
Wenn ich aber den AVR mit Kältespray leicht kühle, tritt das Timing 
Problem noch immer auf.

Ist jetzt nicht mehr so krass wie zuerst, aber noch immer vorhanden. :-(

Das hat mir jetzt keine Ruhe gelassen und ich habe ein gleiche Platine 
genommen, die ich schon vor 2 Jahren gebaut habe.
Mit einem ATMEGA8, den ich vor 2 Jahren verbaut habe.
Mit gleichen Programm probiert.

Da gibt es keine Timing Probleme !
Ich kann dort den AVR extrem mit Kältespray runterkühlen und die 
Datenverbindung funktioniert noch immer.


Der 2 Jahre alte AVR hat die Bezeichnung:(der funktioniert)
ATMEGA8 16AU  0628I


Die neueren AVR haben die Bezeichnung: (der ausgelötet wurde)
ATMEGA8  16AU  1637

bzw. der neu eingelötete
ATMEGA8A  AU 1538

Habt Ihr vielleicht einen Tipp, was da schuld sein kann ?

Danke für Antworten.

l.G. Robert

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Robert schrieb:
> Habt Ihr vielleicht einen Tipp, was da schuld sein kann ?

Race-Conditions im Code^^

Vlt verwendest du Interrupts unsauber ...

Vermutlich ein Software-Problem, da es über mehrere AVRs hinweg 
mitgewandert ist.

Schaltplan mit Anschlussbelegung und Source-Code wäre hilfreich.

: Bearbeitet durch User
von stromverdichter (Gast)


Lesenswert?

Entweder externen Quarz nutzen oder eine Kalibrierroutine einbauen, wenn 
du selbst Daten von außen schicken kannst. Die Atmegas sind halt nicht 
so genau. Du könntest auch den internen Takt selbst nochmal 
nachjustieren. Wenn es temperaturstabil sein soll, ist ein externer Takt 
das einfachste.

von TK (Gast)


Lesenswert?

Hallo,

>Habt Ihr vielleicht einen Tipp, was da schuld sein kann ?
Ich vermute mal:
a) int. Oszillator ist für Datenübertragung oftmals ungeeignet
b) Du hast beim Programmieren den falschen OSCCAL-Wert benutzt
c) unsaubere Lötstellen (vor allem bei den Power-Pins)
d) Sagt das Datenblatt etwas über die RC-Osc Toleranz über den 
Temperaturbereich aus?
e) falsche Baudrateparametrierung und damit von Haus aus zu hohe 
Toleranz

Wenn ich mir die Daten der Chips ansehe, ist der "neue" aber älter, da 
Datecode 1538 (=> KW38 aus 2015)

Eine Frage => mehrere Antworten
(Schaltplan?? Source-Code??)

Gruß
TK

von Peter D. (peda)


Lesenswert?

Robert schrieb:
> Mit dem OSCI sieht man jedoch immer eine Datenübertragung.

Und welche Bitzeit zeigt das Oszi an?
Bei 9600Baud: 1.04ms, max 1% Fehler

von Robert (Gast)


Lesenswert?

Hallo

Danke für die schnellen Antworten :-)

Wenn nicht der alte AVR funktionieren würde, würde ich ja an einen 
Programmierfehler, oder an eine falsche Konfiguration denken.
Aber der alte AVR, funktioniert ja auch bei tiefen Temperaturen ohne 
Probleme.
(mit gleicher Software)

Werde heute am Abend mal die Abweichungen messen und die Software 
durchgehen...

l.G. Robert

von Einer K. (Gast)


Lesenswert?

Vielleicht, hast du es überlesen....

Also nochmal Klarer: Oszillator kalibrieren!

OSCAL nutzen!!

Viele AVR haben einen Temperatursensor eingebaut, den kann man gut dabei 
verwenden

Alternativ, den WDT Takt für den Abgleich nutzen, der hat einen 
umgekehrten Temperaturkoeffizienten.

von Michael B. (laberkopp)


Lesenswert?

Robert schrieb:
> Habt Ihr vielleicht einen Tipp, was da schuld sein kann ?

Kein Quartz verwendet sondern internen Oszillator überschätzt ?

Robert schrieb:
> Wenn nicht der alte AVR funktionieren würde

Beide werden sich im Temperaturdrift des internen Oszillators nach 
Datenblatt verhalten, wenn man Schaltungen nicht nach Datenblatt sondern 
nach "funktionier 1 mal" auslegt, dann darf man sich nicht wundern, wenn 
sie auch wirklich nur mit dem Einen mal funktionieren.

von Stefan K. (stefan64)


Lesenswert?

Das sind Parameterschwankungen zwischen den verschiedenen Chargen.

Nach den Angangen im Datenblatt liegt das Verhalten ALLER Deiner Chips 
trotzdem noch innerhalb der Spec:

"At 5V, 25°C and 1.0MHz Oscillator frequency selected, this calibration 
gives a frequency within ±3% of the nominal frequency."
(2503Q–AVR–02/11, Calibrated Internal RC Oscillator, Seite 29)

Du kannst versuchen, bei den Chips, die Probleme verursachen, das OSCCAL 
Register etwas zu tunen. Es kann aber sein, dass Deine Schaltung dann 
zwar bi tiefen Temperaturen gut funktioniert, aber bei hohen 
Temperaturen Übertragungsprobleme bekommt.

Modernere ATmegas haben zu diesem Zweck einen groben Temperatursensor. 
damit kann der mc das OSCCAL Register an seine Temperatur angleichen.

Übrigens reagiert der interne RC nicht nur auf Temperatur, sondern auch 
auf Spannungsänderungen sehr empfindlich.

Die einfachste Lösung ist immer noch die Verwendung eines externen 
Quarzes.

Viele Grüße, Stefan

von Robert (Gast)


Lesenswert?

Hallo
Hallo @Arduino Fanboy

Ja, ich werde mich da rantasten...

Habe mal versucht ein kleines Testprogramm zu machen, dass mir einen 
Takt ausgibt.

mit :

int main (void)
{
DDRD = 255;
PORTD = 0;

Loop:
PORTD ^= (1<<PD2);
goto Loop;
}

(ich weiß, Goto wird nicht so gerne gesehen... ;-)  )

Jetzt bekomme ich bei 8MHz einen Takt von 820kHz  (23°C)
Wenn der AVR heiß ist, geht es zu 810 kHz (Heißluft)
Wenn es kalt ist zu 830 kHz (Kältespräy)

Bei 4MHz Takt  habe ich 411kHz
Bei 1MHz Takt, habe ich 99kHz

Kann mir jemand sagen, wie viele Takte mein Programm für die Schritte 
verwendet ?
(so gut kenne ich mich mit dem AVR doch nicht aus....)

Dann könnte ich mir eine Formel basteln, welchen Takt der RC-Generator 
jetzt wirklich hat.

---
Als nächstes werde ich mir mal die Abweichung im RS232 Signal ausmessen
und versuchen beim OSCCAL Register was zu verändern...

Danke für die Geduld :-)

l.G. Robert

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Du kannst Dir die .LST Datei ansehen, Die der Compiler ausspuckt 
(ausspucken kann), dort ist zu sehen, wie das Programm in Assembler 
aussieht und die einzelnen Befehle siehst Du Da auch.
Die Taktzyklen dazu stehen im Datenblatt des µC.

Etwas einfacher wird Es wohl, wenn Du einen Timer alle paar Takte (egal 
welchen Vorteiler) einen Pin wackeln lässt - Dessen Frequenz/Laufzeit 
messen und Du hast schon die Taktzeit eines Tick, da Du ja weißt, alle 
wie vielen Takte der Pin wackelt.
Da ist dann auch egal, was der Compiler daraus macht, da die ISR, egal 
wie aufgebaut, immer gleich lang ist.

MfG

von Der Pointler (Gast)


Lesenswert?

Robert schrieb:
> Kann mir jemand sagen, wie viele Takte mein Programm für die Schritte
> verwendet ?

Es werden fünf Takte benötigt (rjmp benötigt zwei Takte):
1
  40:  82 b3         in  r24, 0x12  ; 18 1
2
  42:  89 27         eor  r24, r25 1
3
  44:  82 bb         out  0x12, r24  ; 18 1
4
  46:  fc cf         rjmp  .-8        ; 0x40 <__SREG__+0x1> 2

Damit ergibt sich für den externen Takt in etwa F_CPU/10, was sich auch 
mit deinen Messungen deckt.

von Robert (Gast)


Lesenswert?

Hi @Der Pointler

Danke..

Habe mich gerade mit dem Simulator gespielt  (schon lange her....)
Ja, ich komme auch auf 5 Schritte :-)

Also 10 Schritte für eine ganze Welle ;-)

Das müssten dann 8,2 MHz sein ..

von Robert (Gast)


Lesenswert?

Habe da noch AVR Studio 4

von Robert (Gast)


Lesenswert?

mmhh..
Habe mich jetzt durch das Netz gelesen.
unter anderem auch hier:
Beitrag "AVR Studio, Atmel ICE und die unsägliche Oszillatorkalibrierung"

Habe jetzt mit dem OSCCAL experimentiert

Einfach im Programm mit:

OSCCAL = 164;


Wenn ich den OSCCAL Wert per AVR Studio auslese,
bekomme ich bei einer Einstellung von 8MHz einen Wert von 0x9F (159)raus

Wenn ich diesen Wert aber direckt in das OSCCAL Register schreibe:
OSCCAL = 159;
Dann kommt eine andere gemessene Frequenz raus  (ca. 7,8MHz)
(statt org. 8,2MHz)

Durch experimentieren komme ich jetzt mit einen Wert von 164, auf meine 
8Mhz
(gemesssen mit obiger Portausgabe und DSO)

l.G. Robert

von Auh Weia (Gast)


Lesenswert?

Dilettanten an der Front!

Was ist das für ein elendes Gepfriemel mit RC-Oszillator und
Temperaturdrift. Meistens ärgert man sich ewig weil am Ende
die schönste Kalibrierung nix hilft wenn der Temperaturdrift
einem alles zunichte macht. Und die Kalibrierung ist ein
richtig schönes Gebastel (oder hätte ich Gepfusche schreiben
sollen?) und braucht ja auch überhaupt keinen Zusatzaufwand.

Ein Quarz und 2 Kondensatoren, und alle Probleme der (dieser
kleinen) Welt sind wie weggeblasen.

Oh ich vergass: da handelt es sich um eine Gross-Serie von
vermutlich 100.000 Stück, da muss man natürlich auf jeden
Cent achten der zuviel ausgegeben werden könnte.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Auh Weia schrieb:
> Meistens ärgert man sich ewig weil am Ende
> die schönste Kalibrierung nix hilft wenn der Temperaturdrift
> einem alles zunichte macht. Und die Kalibrierung ist ein
> richtig schönes Gebastel (oder hätte ich Gepfusche schreiben
> sollen?) und braucht ja auch überhaupt keinen Zusatzaufwand.

Geb ich dir recht ... Hatte den internen RC mal für vUSB verwendet ... 
Das war auch trotz Kalibrierung ein Trauerspiel. Gab noch eine andere 
Möglichkeit ... Der Code konnte zur Kalibrierung die Paket-Längen noch 
messen, aber das hat es auch nicht besser gemacht.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

> Hatte den internen RC mal für vUSB verwendet

Bei STM32F1xx Controllern steht sogar klar im Datenblatt drin, daß der 
R/C Oszillator nicht für USB geeignet ist. Und ich meine, bei AVR gibt 
es einen ganz ähnlichen Kommentar bezüglich der seriellen Schnittstelle.

Ich hatte auch schon öfters erwägt, den R/C Oszillator mittels OSCCAL zu 
kalibrieren, es dann aber gelassen. Der Aufwand ist einfach zu hoch. Du 
müsstest die Zielschaltung komplett fertig bauen (mitsamt Gehäuse) und 
dann sowohl im Sommer als auch im Winter am Ziel-Standort kalibrieren. 
Das bedeutet in letzter Konsequenz, daß der Aufbau deines Gerätes 
mindestens 1 Jahr dauert.

Wenn du Pech hast, läuft die danach entweder nur im Sommer oder nur im 
Winter. Und selbst es prima geklappt hat, bist du immer noch nicht 
sicher, ob sie denn im kommenden Mai (zwischen Sommer und Winter) 
ordentlich laufen wird.

von Mampf F. (mampf) Benutzerseite


Lesenswert?

Stefan U. schrieb:
> Bei STM32F1xx Controllern steht sogar klar im Datenblatt drin, daß der
> R/C Oszillator nicht für USB geeignet ist. Und ich meine, bei AVR gibt
> es einen ganz ähnlichen Kommentar bezüglich der seriellen Schnittstelle.

Das Kuriose daran ist - bei meinem STM32L1 funktioniert USB wunderbar 
mit dem internen HSI8. Es wird zwar nicht empfohlen, den HSI8 in die PLL 
zu füttern und daraus den 48MHz USB-Clock zu generieren, aber es klappt.

Allerdings würde ich keine Produkte verkaufen, die das so machen.

Andere STM32 haben einen HSI48 eingebaut und ein (Hardware-) 
Clock-Recovery-Feature, wo anhand der USB-Frames der HSI48 ständig neu 
rekalibriert wird.

von Einer K. (Gast)


Lesenswert?

Stefan U. schrieb:
> Du
> müsstest die Zielschaltung komplett fertig bauen (mitsamt Gehäuse) und
> dann sowohl im Sommer als auch im Winter am Ziel-Standort kalibrieren.

Ich glaube, das siehst du etwas zu extrem.....

Sommer und Winter, kann man gut im Gefrierschrank und Backofen 
simulieren.
Irgendein Gehäuse ist dabei eher hinderlich. Der µC alleine recht fast.
Drei Drähtchen in die Außenwelt sind genug.
2 für die Versorgung, und einer für den Sekundentakt der RTC, oder 
sonstigen Referenztaktgeber

Es ist wahr, dass es etwas Zeit braucht.
Aber 1 Jahr?
Ganz sicher nicht!

Typischer Fall von:
> wer will findet Wege,
> und wer nicht will, Gründe.

Stefan U. schrieb:
> Wenn du Pech hast, läuft die danach entweder nur im Sommer oder nur im
> Winter. Und selbst es prima geklappt hat, bist du immer noch nicht
> sicher, ob sie denn im kommenden Mai (zwischen Sommer und Winter)
> ordentlich laufen wird.
Dann haste aber derbe Mist gebaut.
Nein!
Das Argument zählt nicht.

Auh Weia schrieb:
> Oh ich vergass:
Ja du vergaßest!
Die Liebhaber der Tinys hast du vergessen.
z.B.: die der Tiny85
Ohne Kalibrierung/Temperaturkompensation ist mit dem schlecht Kirschen 
essen, im Außenbereich.
Gerne haben sie mal zuwenig Beine für einen Quarz.
Mochten aber doch mit  WS2811 oder DS18B20 quatschen.


Nicht falsch verstehen...
Ich sage nichts gegen einen Quarz.
Gerne da, wo es möglich ist.
Aber manchmal möchte man/ich ihn nicht verwenden.
Alleine die mangelnde Rüttelfestigkeit verbietet manchmal den Einsatz.
Alles kann man eingießen, aber dem Quarz hilft das nicht.

von Auh Weia (Gast)


Lesenswert?

Arduino F. schrieb:
> Die Liebhaber der Tinys hast du vergessen.
> z.B.: die der Tiny85

Ahaaaaa! Der ATMEGA8 gehören also zu den Mikrokontollern der
Tiny-Familie. Gut dass du uns das jetzt durch die Blume mitteilst.

Robert schrieb:
> Ich habe da eine Platine mit einem ATMEGA8 mit internen 8Mhz Takt (RC)

von Einer K. (Gast)


Lesenswert?

Auh Weia schrieb:
> Ahaaaaa! Der ATMEGA8 gehören also zu den Mikrokontollern der
> Tiny-Familie. Gut dass du uns das jetzt durch die Blume mitteilst.

Ach so...
Da gehen dir die Argumente aus, und dann musst du mir Lügen 
andichten....
Das nennt man dann "Aktiver Rückzug", oder?



Eine feine Schwäche zeigst du da.

von Robert (Gast)


Lesenswert?

Hallo

OK, ihr habt mich überzeugt!
In Zukunft mache ich einen Quarz rein!

Aber in diesem Fall, muss ich bei der bestehenden Schaltung bleiben
und das beste daraus machen.
Bitte bleiben wir deshalb beim Thema ;-)
----------

Kann sich das jemand erklären, warum der ausgelesene Wert (OSCCAL)
(mit dem Programmer),von 0x9F, nicht übereinstimmt,
wenn ich den Wert direkt per Programm in das OSCCAL Register schreibe ?
(Dann bekomme ich 780hHz, satt original 820kHz)

--

Kann mir jemand sagen, wie viel Abweichung ich bei einem 8MHZ RC-Takt
und bei einer Baudrate von 9600, maximal haben darf ?!

Danke :-)

l.G. Robert

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Auh Weia schrieb:
> Ahaaaaa! Der ATMEGA8 gehören also zu den Mikrokontollern der
> Tiny-Familie. Gut dass du uns das jetzt durch die Blume mitteilst.

Hier hast Du einen Lolli, geht draußen weiter flennen.

Ja, eigentlich geht es hier um einen ATmega, wo das Anpassen von OSCAL 
empfohlen wurde, um damit trotzdem glücklich zu werden - Das 
funktioniert dann auch bei 'den Kleinen'.
Dann kam das Üblich: Geht nicht, steht doch drin, seid Ihr alle blöd, 
... nimm einen Quarz, dann ich Alles gut
Worauf die Antwort, daß halt nicht überall Platz (Anzahl Beinchen, nur 
für Dich) ist und die Anwendung teilweise einem Quarz nicht zuträglich 
ist, nicht lange auf sich warten ließ.

Und dann kommst Du, Erbsenzähler, Krümmelkacker, wie man diese Art Leute 
auch nennen mag, Jeder kennt und mag Sie.

Ich mag Dich

MfG

Robert schrieb:
> Kann mir jemand sagen, wie viel Abweichung ich bei einem 8MHZ RC-Takt
> und bei einer Baudrate von 9600, maximal haben darf ?!

Die zulässige Abweichung ist von der Taktquelle unabhängig - wenn Du zu 
weit weg bist, versteht Dich der Gegenüber halt nicht mehr.
Wie weit Du genau weg sein darfst, damit Dich Dein Gegenüber noch 
verstehen MUSS, sollte sich in Datenblättern finden lassen - bin Da aber 
auch eher der Try&Eror-Typ ... und stelle an OSCAL rum ... ;)

: Bearbeitet durch User
von Roland F. (rhf)


Lesenswert?

Hallo Robert,

> Kann mir jemand sagen, wie viel Abweichung ich bei einem 8MHZ RC-Takt
> und bei einer Baudrate von 9600, maximal haben darf ?!

http://rn-wissen.de/wiki/index.php?title=UART:

Zitat:

Damit eine asynchrone Übertragung funktioniert, müssen Sender und 
Empfänger die gleiche (oder wenigstens fast) Geschwindigkeit benutzen. 
Für die üblichen Datenpakete von 10 (Roh-)Bits kann eine Abweichung bis 
etwa 4% gerade noch gehen. Für eine sichere Übertragung sollte die 
Geschwindigkeit aber besser (2%) stimmen, damit etwas Reserve für 
Laufzeitfehler und ähnliches da ist. Die Anforderungen sind so, dass es 
mit dem internen Takt der meisten µCs oft geht, aber nicht immer 
zuverlässig. Um die RS232-Standart Baudraten (besonders die höheren) 
genau zu erreichen, gibt es spezielle Quarze mit krummen Frequenzen wie: 
3.6864 MHz, 7.3728 MHz, 11.0592 MHz.

Zitat Ende

rhf

P.S.
Wenn ich die serielle Schnittstelle nutze, verwende ich immer einen 
dieser krummen Quarze.

von Einer K. (Gast)


Lesenswert?

Robert schrieb:
> Kann sich das jemand erklären, warum der ausgelesene Wert (OSCCAL)
> (mit dem Programmer),von 0x9F, nicht übereinstimmt,
> wenn ich den Wert direkt per Programm in das OSCCAL Register schreibe ?
> (Dann bekomme ich 780hHz, satt original 820kHz)

Dir ist schon klar, dass der AVR selber nur den Wert für 1MHz da rein 
schreibt....

Um die anderen Frequenzen musst du dich schon selber kümmern..

Siehe:
"The ATmega8 stores four different calibration values for the internal 
RC Oscillator. These bytesresides in the signature row High byte of the 
ddresses 0x0000, 0x0001, 0x0002, and 0x0003 for 1MHz, 2MHz, 4MHz, and 
8Mhz respectively. During Reset, the 1MHz value is automatically loaded 
into the OSCCAL Register. If other frequencies are used, the calibration 
value has to be loaded manually, see “Oscillator Calibration Register – 
OSCCAL” on page 31 for details."

von Sebastian S. (amateur)


Lesenswert?

Eigentlich kann ich mir nicht vorstellen, dass es am Taktgeber liegt.
Würden die hohen Baudraten (115K oder so) verwendet, so sähe das schon 
ganz anders aus. Aber bei 9600 Baud?

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Sebastian S. schrieb:
> Eigentlich kann ich mir nicht vorstellen, dass es am Taktgeber
> liegt.
> Würden die hohen Baudraten (115K oder so) verwendet, so sähe das schon
> ganz anders aus. Aber bei 9600 Baud?

2% sind 2% Prozent.
Da macht die Baudrate nichts dran.
Wird nicht besser, durch langsamer.

von Stefan F. (Gast)


Lesenswert?

Die Empfänger von seriellen Schnittstellen warten auf das Start-Bit. 
Danach warten sie eine halbe Bitlänge ab und lesen von da an 10 Bits ein 
(Start, 8x Daten, Stopp).

Dabei darf die Länge jedes einzelnen Bits maximal 5% vom Soll abweichen, 
denn 10x 5% sind zusammen 50%. Da das Signal im idealfall in der Mitte 
abgetastet wird, muss es weniger als 50% verschoben sein.

Wenn Sender das Signal um 3% zu langsam sendet und der Empfänger um 2% 
zu schnell abtastet, hat man die kritischen 5% schon erreicht.

Quarz Oszillatoren sind so genau, daß man vereinfacht mit 0% Abweichung 
rechnen kann. Bei Keramik Resonatoren rechne ich mit 1%.

Da die elektrischen Signale niemals perfekt übertragen werden, wird der 
Empfänger das Startbit typischerweise etwas später erkennen. Selbst wenn 
die Bitrate exakt stimmt. Alle Bits werden etwas später als genau in der 
Mitte abgetastet. Auderdem wird der Wechsel von High nach Low nicht 
abrupt stattfinden, sondern mit abgeflachter Flanke. Es ist unbedingt zu 
vermeiden, daß das Signal genau in dem Moment abgetastet wird, wo es 
weder eideutig High noch eindeutig Low ist. Deswegen kann man in der 
Praxis nicht mit maximal 5% Abweichung rechnen, sondern deutlich weniger 
nämlich 4%. Und das auch nur bei guten kurzen Kabeln.

Es ist hilfreich, Daten mit 2 StoppBits zu senden, aber den Empfänger so 
einstellen, daß er nur 1 Stoppbit verlangt (bei AVR ergibt sich das von 
selbst, wenn man 2 Stopp-Bits einstellt). Dann hat man eine kleine Pause 
zwischen den bytes die dem Empfänger helfen, das nächste Startbit 
korrekt zu erkennen.

Ein weiterer Aspekt ist der Timer, der die Baudraten generiert. Wenn er 
die Bitrate nicht exakt erzeugt, muss dessen Abweichung auch noch 
berücksichtigt werden. Wenn Sender und Empfänger nicht von der gleichen 
Bauart sind (zum Beispiel ein ATmega <--> USB-UART Adapter) können diese 
Abweichungen in umgekehrte Richtung gehen und sich somit addieren. Der 
AVR sendet zum Beispiel mit 9655 Baud, während der Empfänger auf 9560 
Baud eingestellt ist.

Alles Abweichungen zusammen betrachtet führen zu der sinnvollen 
Empfehlung, daß der Baudraten-Generator + Taktquelle zusammen maximal 2% 
abweichen sollen. Mit dem R/C Oszillator eines ATmegas ist das kaum 
zuverlässig machbar. Auf jeden Fall sind beim R/C Oszillator Baudraten 
zu bevorzugen, die der AVR mit rein rechnerisch ganz ohne Abweichung 
erzeugen kann. Also zum Beispiel 250.000 baud. Allerdings unterstützt 
nicht jede Gegenstelle diese Baudrate.

von Auh Weia (Gast)


Lesenswert?

Robert schrieb:
> Aber in diesem Fall, muss ich bei der bestehenden Schaltung bleiben
> und das beste daraus machen.

Lieber mal über den Tellerrand hinausschauen.

Selbst bei einer bestehenden Schaltung ist es meist ein
Leichtes nachträglich noch einen Quarz und zwei Kondensatoren
einzubringen, zumal die Frequenz keine Ansprüche an ein
extrem pingeliges Layout stellt. Die Quarze sind heute so
klein dass Platzprobleme keine sein sollten.

von Stefan F. (Gast)


Lesenswert?

Das nützt alles nichts, wenn die beiden Pins schon belegt sind und man 
nicht auf andere Pins ausweichen kann.

von neuer PIC Freund (Gast)


Lesenswert?

Wenn es nur um das Senden geht, kann evtl. eine Soft-UART vorteilhaft 
sein. Da fällt zwar die Nebenläufigkeit weg, aber ebenso das DIV8 des 
txclk.

von Robert (Gast)


Lesenswert?

Hallo

@Arduino Fanboy
mmmhh.. (kann leider nicht gut englisch :-(  )

Also schreibt der AVR immer die Korrekturwerte von einem 1MHZ RC-Takt in 
das OSCCAL Register ?!
Egal ob man per Programmer den 8 MHz Takt einstellt oder einen anderen 
?!

Sehr sinnvoll :-(

Wenn ich die Korrekturwerte auslese bekomme ich:
für : 1MHz = 0xA9 (169)
      2MHz = 0xA8 (168)
      4MHz = 0xA0 (160)
      8MHz = 0x9F (159)

Eperimentell ermittelt brauche ich für genau 8MHz einen Wert von 164

Also läuft bei mir der 8Mhz Takt, eigentlich mit den 8,2MHz, weil
der AVR immer die Korrekturwerte von dem 1MHz Takt reinschreibt...


Habe mal die Messungen bei der RS232 gemacht. (Kabel ist kurz)

Normal müsste ein BIT bei 9600Baud, 104µs lang sein.
(http://www.sprut.de/electronic/interfaces/rs232/rs232.htm)

Bei RT habe ich jetzt 101µs
Bei kälte zwischen 99 und 98,5µs wobei bei 98,5µs habe ich schon Fehler
bei Wärme zwischen 101 und 104µs


mein Fazit:
Mein Takt ist einfach zu hoch!
Wen ich den Takt mit OSCCAL auf 8MHz bringe,
habe ich vermutlich genug Luft nach oben und unten (wärme/kälte)

von Einer K. (Gast)


Lesenswert?

Robert schrieb:
> Also schreibt der AVR immer die Korrekturwerte von einem 1MHZ RC-Takt in
> das OSCCAL Register ?!
> Egal ob man per Programmer den 8 MHz Takt einstellt oder einen anderen
> ?!
Das hast du gut erkannt.

Robert schrieb:
> Sehr sinnvoll :-(
Bei der Bewertung halte ich mich raus.
Das überlasse ich gerne dir.

von Jobst M. (jobstens-de)


Angehängte Dateien:

Lesenswert?

Wieso eigentlich der olle mega8?
Die RC-Oszillatoren der neueren mega48/88/168/328 sind stabiler!

Stefan U. schrieb:
> Es ist hilfreich, Daten mit 2 StoppBits zu senden

Empfänger warten in der Regel nicht die volle Zeit des Stopbits ab, 
bevor sie das nächste Startbit empfangen können. (Siehe Bild)


Gruß
Jobst

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

Robert schrieb:
> Aber in diesem Fall, muss ich bei der bestehenden Schaltung bleiben
> und das beste daraus machen.

Dann mußt Du damit leben, daß es nicht zuverlässig funktioniert.
Wo ist das Problem?

von S. Landolt (Gast)


Lesenswert?

Robert schrieb:
> @Arduino Fanboy
> mmmhh.. (kann leider nicht gut englisch :-(  )

Mmhh - also spontan hätte ich das mit "von Arduino begeisterter Knabe" 
übersetzt ...

von Robert (Gast)


Lesenswert?

@Arduino Fanboy
mmhh..
Siehst Du das anders ?

---
Mit meinen Wert von 164 (OSCCAL)mit dem ich genau auf 8 MHz Takt komme,
habe ich jetzt bei RT eine Bit Zeit von 104µs
Bei Kälte 101-100,5µs
Bei Wärme 106,5 - 107,5µs

Sind damit ca. 3% Abweichung und funktioniert alles mit dem RC-Generator

Also ist es möglich, mit dem RC-Generator auch gut zu Arbeiten.
Vorrausgesetzt, er ist gut Kalibriert.
(Natürlich ist der Quarz besser und werde ich nächstes mal auch 
einplanen ;-)




Danke für den Tipp mit dem OSCCAL Register :-)

l.G. Robert

von Herbert B. (herbert_b)


Lesenswert?

S. Landolt schrieb:
> Mmhh - also spontan hätte ich das mit "von Arduino begeisterter Knabe"
> übersetzt ...

Wie ich solche Sprüche übersetzen würde, kann und darf ich hier nicht 
schreiben. Das empfinde ich als Manko.

Herbert

Robert schrieb:
> Mit meinen Wert von 164 (OSCCAL)mit dem ich genau auf 8 MHz Takt komme,
> habe ich jetzt bei RT eine Bit Zeit von 104µs
> Bei Kälte 101-100,5µs
> Bei Wärme 106,5 - 107,5µs
>
> Sind damit ca. 3% Abweichung und funktioniert alles mit dem RC-Generator
>
> Also ist es möglich, mit dem RC-Generator auch gut zu Arbeiten.
> Vorrausgesetzt, er ist gut Kalibriert.

Richtig.
Laß Dich nicht beirren. Hier sitzt seit Jahren ein Mega 8 mit internem 
Takt und mit Ds1820 (Temperatusensor) dran in einer Abzweigdose an der 
westlichen Hauswand und sendet unverdrossen und fehlerfrei per Uart 
seine Daten.

: Bearbeitet durch User
von Duennwandiger Troll (Gast)


Lesenswert?

Ein Quarz kostet um die 24 cents, was soll der Aufwand ? Geht's um 1000 
Stueck ? Dann kostet der Quarz noch 21 cents. Auch fuer die 210 euro 
wuerd ich mir keinen Aufwand machen. Vielleicht mit Keramikresonatoren, 
6 cents das Stueck ?

von Robert (Gast)


Lesenswert?

Aber das war nicht die Frage ;-)

von Axel R. (Gast)


Lesenswert?

Schick ihm ein "HALLO_TEST" auf der seriellen und stelle im Programm am 
OSCCAL-Register, bis im RX-Puffer "HALLO_TEST" steht. dann einen zurück 
(oder zwei hoch) und fertig.

von Robert (Gast)


Lesenswert?

mmmh..
Das wäre wohl zu ungenau..?!
Wenn ich das bei RT mache, läuft das vielleicht.
Läuft dann aber vielleicht nicht, wenn es heiß oder kalt ist.
Eventuell diesen Test bei kälte und bei Hitze machen und dann einen 
Mittelwert bilden.

Aber ich denke da ist das Messen mit dem Testprogramm (Frequenz)
und dann den optimalen OSCCAL-Wert reinscheiben, sicherer.. ?!

von Robert (Gast)


Lesenswert?

mmmhh..
vielleicht  die Prozessortakte zählen, die bei einem Bit von einem 
kommenenden RS232, reinpassen.
(Steigende Flanke, bis zur fallenden Flanke)
Dann das OSCCAL Register so lange verstellen, bis die richtige Anzahl 
der Takte (für ein Bit) rauskommen.
Dann müsste man die Takte für die 104µs kennen ?!?!

von Auh Weia (Gast)


Lesenswert?

ROFL wenn ich lese wie hier herumgefrickelt wird.

Auh Weia schrieb:
> Und die Kalibrierung ist ein
> richtig schönes Gebastel (oder hätte ich Gepfusche schreiben
> sollen?) und braucht ja auch überhaupt keinen Zusatzaufwand.

Der Aufwand treibt sich so in die Höhe dass die Kreation eines
neuen Designs wohl das sicherere und einfachere Vorgehen darstellt.

Auch eine nachträgliche Befreiung der Oszillator-Pins wäre wohl
noch eine bessere Alternative.

Aber ich glaube es handelt sich um eine Gross-Serie von 11 Stück,
da macht man solche Kleinigkeiten nicht ....

von M. K. (sylaina)


Lesenswert?

Robert schrieb:
> int main (void)
> {
> DDRD = 255;
> PORTD = 0;
>
> Loop:
> PORTD ^= (1<<PD2);
> goto Loop;
> }
>
> (ich weiß, Goto wird nicht so gerne gesehen... ;-)  )

Hättest du mit
1
int main (void)
2
{
3
DDRD = 255;
4
PORTD = 0;
5
6
for(;;){
7
  PORTD ^= (1<<PD2);
8
  }
9
return 0;
10
}

sogar noch besser (und ohne goto) lösen können da das nicht mal ein 
Warning gibt (dein fehlendes "return" müsste eigentlich im Warning 
münden). ;)

Zum Thema selbst: Würde das Gezumpel auch mit einem Quarz lösen, ist 
stressfreier ;)

: Bearbeitet durch User
von Auh Weia (Gast)


Lesenswert?

M. K. schrieb:
> Würde das Gezumpel auch mit einem Quarz lösen, ist stressfreier ;)

Ich habe gerade bei Gezumpel das Wort Stümperei gelesen.

von M. K. (sylaina)


Lesenswert?

Auh Weia schrieb:
> Ich habe gerade bei Gezumpel das Wort Stümperei gelesen.

Da musst du noch mal die Mustererkennung im Oberstübchen nachjustieren, 
die beiden Worte sehen sich jetzt ja mal so gar nicht ähnlich :D

von Auh Weia (Gast)


Lesenswert?

M. K. schrieb:
> die beiden Worte sehen sich jetzt ja mal so gar nicht ähnlich

Das lief nicht über Mustererkennung sondern über Assoziationen.

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.