UART mit USI nach AVR307

Gast #482987
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

Gast #483018
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
OP #483026
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
Gast #483037
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
Gast #483222
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
OP #485873
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
Gast #485890
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
Gast #485895
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
Gast #485924
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren