Forum: Projekte & Code Serielle DATEN (UART) ATmega8 , ohne Quarz


von Bernhard (Gast)


Angehängte Dateien:

Lesenswert?

einfach und genial !!

ein atmega8 mit internen Oszillator (1MHz)

kann problemlos 4800 2400 und 1200 Baud übertragen.

9600 Baud funktioniert nicht, kann bei 1 MHz nicht funktionieren.

Ursache ist die Formel: (Frequenz/16*Baud)-1

Das Ergebnis sollt möglichst ganzzahlig sein!!!!

Noch was, bitte beachtet, dass der com-Port am PC die sogenannte
negativ-Logik besitzt, d.h. logisch 0 sind +3...+15 Volt
und logisch 1 ist -15....+2 volt.

Beim ATmega ist es genau umgekehrt, also das Signal muss physikalisch
invertiert werden, geht durch einen einfachen Transistor in
Emitterschaltung.

von Rufus T. Firefly (Gast)


Lesenswert?

"Noch was, bitte beachtet, dass der com-Port am PC die sogenannte
negativ-Logik besitzt, d.h. logisch 0 sind +3...+15 Volt
und logisch 1 ist -15....+2 volt.

Beim ATmega ist es genau umgekehrt, also das Signal muss physikalisch
invertiert werden, geht durch einen einfachen Transistor in
Emitterschaltung."

Der PC verwendet RS232-Pegel, der µC verwendet TTL-Pegel. Das ist
überhaupt nicht ungewöhnliches; durch Verwendung eines
RS232-Treiber-Bausteines wie dem beliebten Max232 ist das Problem aus
der Welt.

von Michael (Gast)


Lesenswert?

"einfach und genial !!
ein atmega8 mit internen Oszillator (1MHz)"

... und bringt es nicht !

Den Traum hatten schon viele, bis sie dann feststellen mußten, daß der
interne RC-Oszillator nicht stabil genug arbeitet: ausgeträumt.

von peter dannegger (Gast)


Lesenswert?

"... und bringt es nicht !"


zumindest nicht im gesamten Temperatur- und Betriebsspannungsbereich.

Es gibt da allerdings Tricks:

Z.B. wenn jemand sowieso eine stromsparende RTC benötigt (32kHz Quarz
an T2), dann kann man damit den RC-Oszillator nachregeln.

Oder ein Autobauding wie in meinem Bootloader.

Da könnte man dann auch sagen "genial !!", ohne das es überheblich
klingt.


Ich verstehe Deine Freude über Dein erstes laufendes Programm durchaus.
Es ist aber wirklich nur sehr simpel gestrickt ohne jegliche
Genialität.

Sich selber ein "genial !!" zuzuschreiben, bringt nichts. Erst wenn
es von anderen kommt, hat es auch einen Wert.


Peter

von Michael (Gast)


Lesenswert?

Nur, wenn ich eh einen Quarz brauche und nicht noch zusätzliche
Eigenschaften wie Uhr, Low-Power Standby, usw., nehme ich gleich einen
16MHz Quarz und spare mir jeden potentiellen Ärger.

von Bernhard (Gast)


Angehängte Dateien:

Lesenswert?

.... ich wollte durch meinen Beitrag nur zeigen, dass es auch mit den

einfachsten Mitteln hinreichend funktioniert und problemlos verfeinert
werden kann.....

Natürlich kann man sich auch ein Starter-Kit kaufen für über 100 Euro.

Ich stell Euch mal eine Übersicht zur Verfügung, die die Baudrate und
die Oszillatorfrequenz mal etwas untersucht.

Das Ergebnis ist sehr interessant, oder?

von peter dannegger (Gast)


Lesenswert?

"Das Ergebnis ist sehr interessant, oder?"


Nö, überhaupt nicht.

Es gibt im Web doch schon nen Haufen wesentlich gründlichere
Untersuchungen dazu.
Sowie diverse Baudratenrechner mit Angabe der Abweichung.


Als Faustformel gilt folgendes:

Abweichung:
0% ... 1%:      fast keine Abhängigkeit der Fehlerrate
1% ... 2,5%     merkbare Zunahme der Fehlerrate
>2,5%           sehr hohe Fehlerrate
>3,5%           nur noch Mist


Übrigens kann man das Rechnen ruhig dem Assembler überlassen:

.equ xtal = 8000000
.equ baud = 9600
.equ divider = (xtal / baud - 8) / 16

ldi r16, low(divider)
out UBRRL, r16
ldi r16, high(divider)
out UBRRH, r16


Peter

von Bernhard (Gast)


Lesenswert?

...habe mal eine Fehlerate von 10% simuliert

(einfach die Betriebsspannung nach unten hin verändert)


und siehe da, es funktioniert auch.....


Mit anderen Worten, der ATmega8 ohne Quarz,

ist etwas für Geizkragen  :)

von Michael (Gast)


Lesenswert?

...habe mal eine Fehlerate von 10% simuliert
ist etwas für Geizkragen  :)

so. so.
Halt 'mal den Lötkolben drauf oder Kältespray, dann wird Dir der
Kragen schon platzen.

von Bernhard (Gast)


Lesenswert?

...habe ich auch gemacht, aber das half nicht sehr viel,

eine Temperaturerhöhung, ich würde sagen, auf ca. 50 C brachte nur 1%
Abweichung....  ich staunte selber, hatte mehr erwartet

Gruß

von Peter D. (peda)


Lesenswert?

"...habe mal eine Fehlerate von 10% simuliert
(einfach die Betriebsspannung nach unten hin verändert)"


Wenn Du hier was veröffentlichst, dann mach es bitte nachvollziehbar,
damit andere damit auch was anfangen können.

"Betriebsspannung nach unten" ist Wischiwaschi, also bitte ganz
konkret "von xx V auf yy V".


Eine "Fehlerrate von 10%" sagt überhaupt nichts aus. Du mußt schon
die gemessene (mit Frequenzmesser) Änderung der RC-Oszillator Frequenz
angeben.
Die Fehlerrate ist natürlich auch vom Daten-Byte abhängig, also alle
Werte von 0x00..0xFF müssen getestet werden.
Auch spielt die Signalverformung durch die Treiber-Ics und die Leitung
eine wesentliche Rolle.


Trotzdem kann es sein, daß alles nur für Dein ganz konkretes Exemplar
zutrifft, wenn Du die Messungen nicht mit mehreren AVRs und von
verschiedenen Chargen durchführst.


Man sollte bei Veröfentlichung in der Codesammlung schon möglichst
sorgfältig arbeiten und daran denken, daß Anfänger kaum unterscheiden
können, ob etwas nachbausicher ist oder nicht.


Ich zahle lieber die paar Eurocent für einen Quarz und weiß dann aber
auch, daß es immer klappt.


Peter

von Basti (Gast)


Lesenswert?

Hallo vielleicht einer kann mir helfen.
Versuche einen Atmega8 ohne externes Quarz mit der seriellen
Schnittstelle zu verbinden. Hab nicht die große elektronik erfahrung
und kenn mich bisher mit seriellen Schnittstellen nicht besonders aus.
Hab leider auch keine Fachliteratur in der ich nachsehen kann.
Ich hab den Max232N und die Pins so belegt, wie es im Tutorial erklärt
wird. Der Microcontroller sendet Daten auf der TXD Leitung, die
allerdings vom PC nicht erkannt werden ( Hyperterminal). Allerdings
kann der PC über Hyperterminal Zeichen an den Mikocontroller senden.
Ich besitzt leider auch kein Oszilloskop um genauere Messungen
durchführen zu können. Der Mikrokontroller soll später lediglich daten
zum PC senden. Die Baudrate ist auf 110 eingestellt, da ich hier noch
High-Low änderungen an den I/O pins wahrnehmen kann. Ich hab das
Programm senden auf den Mikrocontroller aufgespielt und hab USCZ1 und
USZC0 auf 1 gelegt, damit im 8-bit Modus übertragen wird. Hab auch
schon mit den verschiedenen Protokollen im Hyperterminal und mit yaap
probiert irgendwie Daten zu bekommen, hatte aber keinen ERfolg. Die
Emulation in Hyperterminal hab ich auf Automatisch stehen.
Würde mich sehr freuen, wenn mir einer n bischen unter die Arme greifen
könnte, wie habt ihr eure Mikrokontroller mit der seriellen schnitstelle
verknüpft?
Gruß Basti

von Peter D. (peda)


Lesenswert?

Ich denke mal, es dürfte hier eigentlich klar geworden sein:

Bei Problemen immer erst mit einem Quarz probieren.

Das es bei einem funktioniert ist numal kein Beweis, daß es bei jedem
funktioniert !!!

Wenn also wirre Zeichen ankommen sind die paar Eurocent für einen Quarz
kein rausgeschmissenes Geld.

Und da ich Geräte für den industrieellen Einsatz baue, ist ein Quarz
bei RS-232 Anwendungen praktisch Pflicht.

Gerade für Anfänger ist ein Quarz generell der sicherste Weg.


Peter

von Peter D. (peda)


Lesenswert?

P.S.:

Ein Attribut "genial" ist totale Scheiße und bedeutet absolut nichts,
wenn man es sich selbst vergibt.


Peter

von Gerhardt (Gast)


Lesenswert?

Hallo Peter,
findest du nicht du solltest dich mit deinen
"Ausdrücken" etwas mäßigen.
Was hast du eigendlich für eine Kinderstube??
MfG Gerhardt !!

von Simon Küppers (Gast)


Lesenswert?

Naja, wo er doch eigentlich Recht hat?

Immerhin behauptet Bernhardt, irgndwelche Sachen ohne sie wirklich
belegen zu können.

und von "genial" kann hier nun wirklich nicht die Rede sein. Man
benutze nur die Suchfunktion.. Und in der Tat: Nur weil etwas klappt,
heißt es nicht dass es bei andern genausotoll klappt. Denn überall sind
die Ansprüche verschieden.

von komisch (Gast)


Lesenswert?

> Ein Attribut "genial" ist totale Scheiße und bedeutet absolut nichts,
> wenn man es sich selbst vergibt.

> ... wie in meinem Bootloader.

> Da könnte man dann auch sagen "genial !!", ohne das es überheblich
> klingt.

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Bernhard schrieb:
> einfach und genial !!
>
> ein atmega8 mit internen Oszillator (1MHz)
>
> kann problemlos 4800 2400 und 1200 Baud übertragen.
>
Habs trotzdem mal versucht, weil ich so etwas zum Debuggen brauch.
Und zwar die 4800 Baud Variante, weil die Warteschleife ja darauf 
abgestimmt ist. An OSCCAL habe ich nichts geändert.

Bei mir funktioniert es schon mal nicht.

Ich weiß, das lesen die " Genialen " nicht gerne, aber kann nicht 
Einer von Euch hier mal so einen Code in ASM verfassen, den man 
überwiegend mit Copy & Paste nutzen kann ?


Bernd_Stein

von Bernhard S. (bernhard)


Lesenswert?

Hallo Bernd,


> ....4800 Baud Variante... Bei mir funktioniert es schon mal nicht.


Ja, RS232 ohne Quarz hat so seine Tücken und funktioniert eventuell 
nicht korrekt, da die einzelnen Bits zeitlich zu ungenau generiert 
werden.

Es kann funktionieren, muss aber nicht.

Die RS232 Schnittstellen des PCs können eine gewisse Fehlerabweichung 
der einzelnen Bits korrigieren, aber irgendwann ist der Bogen überspannt 
und
die Datenübertragung funktioniert nicht mehr korrekt oder sehr 
fehlerbehaftet.

Nicht mit allen Taktfrequenzen lassen sich mathematisch gesehen alle 
Baudraten erzeugen.

Das "genial" hätte ich damals als Anfänger (Jahr 2005), nicht verwenden 
sollen, ich bitte um Entschuldigung.

Die Freude, dass es durch "Zufall"funktionierte, war zu groß.

Bernhard

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Bernhard S. schrieb:
> ...
> Das "genial" hätte ich damals als Anfänger (Jahr 2005), nicht verwenden
> sollen, ich bitte um Entschuldigung.
>
> Die Freude, dass es durch "Zufall"funktionierte, war zu groß.
>
Ja, das kenne ich.

Die Idee ist jedoch gut. Wenn man es durch leichte Änderungen hinkriegen 
könnte wärs nicht schlecht. Aber ich wüste nicht  wie und wo man da am 
Besten
ansetzt, um es durch ein paar Versuche zum Laufen zu bekommen. Meine 
Versuche sind leider alle gescheitert nicht eins von den 6 Zeichen war 
richtig.

Schade das sich keiner von den Genialen bisher die Mühe gemacht hat.
Es muss ja nicht auf Anhieb funktionieren. Es würde schon reichen wenn 
man wüste wie und wo man  " drehen " müsste und zwar nicht mit tausend 
Versuchen.

OSCCAL ist vielleicht eine Möglichkeit. Man müste nur eine Prozedur 
finden wie man sich da einschiesst. Aber der ATmega8 ist ja schon bei 
1Mhz vom Werk her auf das Optimum eingestellt, das kann doch gar nicht 
mehr viel zu weit vom passenden Wert entfernt sein.


Bernd_Stein

von Bernhard S. (bernhard)


Lesenswert?

@Bernd

Ich gehe davon aus, dass die Hardware der Datenübertragung funktioniert.

- wie hoch ist die exakte Taktfrequenz des µC bei internem RC-Generator?

- beschalte den µC mal versuchsweise mit eine 1MHz Quarz oder speise 
einen
  exakten 1MHz Takt extern ein

- Kannst du die RS232 Daten am Oszi darstellen?

- Stimmen die Pegel ?

- kommen keine oder nur fehlerhafte Bytes an?



Bernhard

von Bernhard S. (bernhard)


Lesenswert?


von Amateur (Gast)


Lesenswert?

@Bernhard
>Nicht mit allen Taktfrequenzen lassen sich mathematisch gesehen alle
>Baudraten erzeugen.

Das ist etwas, was man in der Grundschule bereits lernt - zumindest in 
allgemeiner Form.

Macht aber nichts, das ist ja gerade das Schöne am asynchronen Empfang.
Der Empfang via RS232 lässt einiges an Toleranzen (im %-Bereich) zu.
Natürlich nicht, wenn ich an den Grenzen lecke.

@Bernd
>aber kann nicht
>Einer von Euch hier mal so einen Code in ASM verfassen, den man
>überwiegend mit Copy & Paste nutzen kann ?

Reichen die viele Beispiele in den Handbüchern von Atmel nicht aus, oder 
ist Dein Problem wörtlich zu nehmen?
Also Probleme ein paar Zeilen abzutippen.

Jede Wette, dass eine vernünftige Suche allein hier im Forum, Beispiele 
im zweistelligen Bereich liefert. Egal ob Zäh oder Assembler.
Allerdings muss man dazu eine einfache Suchanfrage formulieren können.

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Bernhard S. schrieb:
> @Bernd
>
> Ich gehe davon aus, dass die Hardware der Datenübertragung funktioniert.
>
> - wie hoch ist die exakte Taktfrequenz des µC bei internem RC-Generator?
>
Das Thema hatte ich schon mal :
Beitrag "Wie findet man möglichst genau die Frequenz des internen RC-Oszilators heraus ?"
Weis aber bis heute nicht wie exakt solch eine Methode ist.
Ich besitze nur ein 20Mhz Analog Osziloskop. Den Frequenzzähler muss ich 
erst noch reparieren um es mit dem Ergbnis vom Multimeter vergleichen zu 
können. Weiß noch nicht wann ich dies mal machen werde.
>
> - beschalte den µC mal versuchsweise mit eine 1MHz Quarz oder speise
> einen
>   exakten 1MHz Takt extern ein
>
Finde ich nicht so eine gute Idee, denn wenn man eine Schaltung 
entwickelt hat, will man nicht mehr an der Hardware rummurksen.
>
> - Kannst du die RS232 Daten am Oszi darstellen?
>
> - Stimmen die Pegel ?
>
Der selbe Aufbau ( RS232 ) funktioniert mit anderer Soft,- bzw. Firmware 
im µC
>
> - kommen keine oder nur fehlerhafte Bytes an?
>
Jedes Zeichen Fehlerhaft.


Bernd_Stein

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Amateur schrieb:
>
> Jede Wette, dass eine vernünftige Suche allein hier im Forum, Beispiele
> im zweistelligen Bereich liefert. Egal ob Zäh oder Assembler.
> Allerdings muss man dazu eine einfache Suchanfrage formulieren können.
>
Was Du mit Zäh meinst weiß ich nicht.
Auch nicht, ob es sinnvoll ist Jemanden der sich unter dem Gastaccount 
einloggt auf solche Antworten zu antworten ;-)


Bernd_Stein

von Moby (Gast)


Lesenswert?

Ein Grund mehr auf die Xmegas mit besserer (quarzloser) Frequenzkonstanz 
umzusteigen! Als Konfiguration kann man es, so die Leistung langt, bei 
den 2 Mhz ab Reset belassen. Hatte bis hinauf zu 38400er Baudrate noch 
keine Probleme!

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.