Forum: Mikrocontroller und Digitale Elektronik UART mit USI nach AVR307


von Mathias G. (mgiaco)


Lesenswert?

Bekommt man die UART auch mit dem internen Oszillator zum laufen? Oder 
braucht man einen externen?

Danke.

mfg mathias

von Falk (Gast)


Lesenswert?

@Math Giaco

>Bekommt man die UART auch mit dem internen Oszillator zum laufen? Oder
>braucht man einen externen?

Man braucht einen ausreichend genauen. Der interen RC-Oszillator ist zu 
ungenau. Bleibt nur ein externer Takt.

MFG
Falk


von Mathias G. (mgiaco)


Lesenswert?

Auch wenn man Sie ganz langsam macht?

von Mathias G. (mgiaco)


Lesenswert?

Gibt es eine 8 Pin µC wo man eine UART mit internem Oszillator 
hinbekommt?

mfg
mathias

von Falk (Gast)


Lesenswert?

@Math Giaco

>Auch wenn man Sie ganz langsam macht?

Nein. 5% Frequenzfehler sind immer 5%, egal ob bei 115k2 oder 75 Baud.

MFG
Falk

von Falk (Gast)


Lesenswert?

Warum 8Pin uC? Platz? Wäre vielleicht auch ein 20 Pinner möglich (SO20)? 
ATtiny 2313, hat sogar Hardware-UART.

MFG
Falk

von Mathias G. (mgiaco)


Lesenswert?

Ich möchte meher kleine µC´s mit einem großen verbinden, mit meheren 
meine ich so ca. 30 Stk. Beim 2312 bräuchte man dann doch auch eine 
Quarz oder nicht?

mfg mathias

von Falk (Gast)


Lesenswert?

@Math Giaco

>Ich möchte meher kleine µC´s mit einem großen verbinden, mit meheren
>meine ich so ca. 30 Stk. Beim 2312 bräuchte man dann doch auch eine
>Quarz oder nicht?

Den brauchst du so oder so. Anders ist ein genauer Takt nicht 
erreichbar.
Soll das ein kleines Netzwerk ala RS485 werden?

MFG
Falk

von Mathias G. (mgiaco)


Lesenswert?

Also ich will mit einem ARM7 eben so ca. 30 kleine µC´s verbinden. Ich 
brauche bei den kleinen einen ADC und eine PWM und eben einen Bus um 
alle miteinander zu verbinden. Zudem brauche ich bei der Verbindung eine 
galvanische Trennung.

Auch sollte das ganze billig sein weil 30 Stk usw.

So was könnte ich da machen?

mfg mathias

von Falk (Gast)


Lesenswert?

@Math Giaco

>Also ich will mit einem ARM7 eben so ca. 30 kleine µC´s verbinden. Ich
>brauche bei den kleinen einen ADC und eine PWM und eben einen Bus um
>alle miteinander zu verbinden. Zudem brauche ich bei der Verbindung eine
>galvanische Trennung.

Wie weit sind die 30 uC voneinander entfernt? 1m? 10m? 100m?

Bei 1m geht einfach 3.3V CMOS mit Optokopplern. Bei mehr eher RS485 + 
Optokoppler.

MfG
Falk

von Mathias G. (mgiaco)


Lesenswert?

kleiner 1m.

von Mathias G. (mgiaco)


Lesenswert?

jo das mit dem galvanischen Trenne geht schon aber eben zum Probelm 
welche Schnittstelle am besten.

von Mathias G. (mgiaco)


Lesenswert?

Würde es gehen wenn man den RC-Oszillator kalibrieren würde?

Besten Dank

mfg
mathias

von Mathias G. (mgiaco)


Lesenswert?

Ach noch eine Frage mit einem Resonator würde es gehen?

mfg
mathisa

von Andi (Gast)


Lesenswert?

Mit einem Resonator gehts auf jeden Fall. Für einen UART braucht man 
etwa 2% Genauigkeit des Taktes und das erfüllt ein Resonator.

Aber so eine Kommunikation ist auch mit den internen Oszillatoren der 30 
AVRs möglich, wenn man ein entsprechendes Protokoll mit 
Taktsynchronisierung wählt. Schau dir z.B. mal den LIN-Bus an (dazu 
gibts Application Notes bei ATMEL). Bei LIN beginnt jeder Frame mit 
einem Break-Signal danach ein Byte (55h) mit dem sich alle Empfänger auf 
die genaue Baudrate synchronisieren können, und erst dann folgen die 
Bytes mit Inhalt (Adresse, Daten, Checksumme).
Wie in der Application Note ersichtlich braucht man dazu ein 
Software-UART mit fein-programmierbarer Baudrate.

Gruss Andi

von Mathias G. (mgiaco)


Lesenswert?

Danke Andi,

Werde ich mir mal anschauen.

mfg mathias

von Mathias G. (mgiaco)


Lesenswert?

@ Andi So ich habe mir nun das mit dem Lin Bus angeschaut. Irgendwie ist 
das ganze do recht kompliziert für meine Anwendung oder vielleicht sehe 
ich das auch nur so. Zudem muss ich ja dann auch einen Master Code 
schreiben für den LPC. Gibt es vielleicht auch noch was anderes?

Ist das die einzige Möglichkeit oder hat jemand eine andere Idee meine 
30 Tinys mit eine ARM zu verbinden aber mit interem Oszillator und 
galvanischer Trennung.

Besten Dank im Voraus

mfg mathias

von Andi (Gast)


Lesenswert?

Ich dachte auch nicht dass du genau den LIN Bus implementieren sollst, 
es geht nur ums Prinzip der Baudratensynchronisation.
Ich habe mal für eine Klanginstallation in einer Galerie einen PC ca. 10 
PICs seriell ansteuern lassen, die alle mit internem Oszillator liefen. 
Dabei haben die PICs beim Einschalten des Ganzen auf das erste Byte vom 
PC gewartet, davon die Startbitlänge gemessen, und damit ihre Baudraten 
eingestellt. Danach konnten sie ganz normal seriell kommunizieren. Das 
lief den ganzen Tag ohne Probleme, da sich die Temperatur im Raum kaum 
änderte, und die Spannung stabil war.
Aber auch das geht nur mit einem Software-UART, der seine Baudrate an 
einen gemessenen Bitdauer anpassen kann.

Gruss Andi

von mgiaco (Gast)


Lesenswert?

Okay, aber keine Ahnung wie man sowas macht. Kannst du mir vielleicht 
ein paar Tipps geben wie du das genau meinst mit Startbitlänge messen 
usw. Oder gibts dazu vielleicht was zum lesen.

Habe ich das richtig verstanden. Master sendet irgend eine definierte 
Nachricht. Alle Slaves versuchen die Baudrate zu messen und stellen 
diese dann eine.

Besten Dank im Voraus

mfg mathias

von Andi (Gast)


Angehängte Dateien:

Lesenswert?

Also ich hab dir mal ein Code-Beispiel für AVR-Assembler angehängt. Das 
ist allerdings zusammenkopiert, unvollständig und ungestestet (SerIn und 
SerOut sind getestet). Die Routinen basieren auf Delays die genau 10 
Cycles dauern, das ist so nur in Assembler möglich.

Wichtig ist, dass der Master nach dem alle Slaves gestartet sind das 
Byte 0xFF  mit der gewünschten Baudrate sendet (Code ist für 9600 Baud 
gedacht). Bei diesem Wert ist nur das Starbit auf LOW, alle Daten und 
Stopbits auf HIGH. Die Slaves messen die Zeit des Startbits, und 
verwenden diese auch für alle weiteren Bits beim Senden und empfangen.

Da du kein AVR mit Hardware-UART benötigst genügt z.B. ein Tiny13 mit 
internem 9.6MHz Oszillator (8 Pin und günstig).

übrigens der Main-Loop ist so gedacht, dass der Master ein Kommando 
sendet und damit einen der 30 AVRs auswählt. Nur dieser sendet danach 
seinen ADC Wert (oder was du willst) zum Master. Danach warten alle aufs 
nächste Kommando. So geht eine Leitung vom TX des Masters zu allen RX 
der Slaves, und alle TX der Slaves werden verODERt zusammen an RX des 
Masters geführt.

Gruss Andi

von Mathias G. (mgiaco)


Lesenswert?

Okay danke dann werde ich das in den nächsten Tagen mal versuchen zu 
Realisieren, ich habe mir erstmal ein paar Tinys bestellt.

Das ganze müsst in C auch zu realisieren sein oder ist doch Assembler 
besser ?

mfg mathisa

von Mathias G. (mgiaco)


Lesenswert?

Bzw. kann ich ja bis auf das Messen und die UART alles in C machen oder?

mfg mathias

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.