PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie programmiere ich eine Mutiprozessorkomunikation ü. UART?



HelgeK
24.07.2005, 14:41
Hallo Leute!
Hat einer von euch ein Codebeispiel, wie ich eine Mutiprozessorkomunikation über den UART des mega8 16MHz erstelle?
Ich habe bis jetzt nichtsdarüber gefunden! :-k

Viele Grüße und schönen Sonntag
Helge

linux_80
24.07.2005, 14:55
Such mal nach RS485 das ist seriell für mehrere Teilnehmer.

HelgeK
24.07.2005, 15:09
O.K. wie RS485 finktioniert ist mir soweit klar, jedenfalls rein HW mäßig. Aber wie mache ich das mit der SW? Wie stelle ich in BASCOM den UART ein und setze die Adresse des Controllers, usw.? :-k

Viele Grüße
Helge

25.07.2005, 08:29
du könntest auch so ne art matrix aus transistoren bauen, und damit jede tx an jede rx schalten, wenn einer sendet kannst du ihn dann die empfängeradresse senden lassen, damit nur der der es empfangen soll zuhört

chr-mt
25.07.2005, 08:38
Hi,
hast du mehrere Master oder nur einen Master und viele Slaves ?
Wenn's nur ein Master ist sendet der einfach eine Anfrage mit einer Adresse an alle Chips und nur der, der die richtige Adresse hat antwortet.
Wenn's mehrere Master sind, dann dürfte es schwierig werden, da man ja Kollisionen vermeiden muß.
Das Protokoll kannst du dir selber ausdenken..
Ich würde erst eine Startbdingung festlegen.
Also ein Byte oder zwei Byte, die den Empfängern sagen
"hallo, aufwachen, jetzt kommt eine Adresse"
danach käme die Adresse des Chips.
Je nach dem wie viele unterschiedliche Sachen der Chip zurückmelden muß, kannst du ihm ja mehrere Adresen geben, auf denen jeweils ein Wert abgelegt ist.

Es wäre hilfreich, wenn du sagen könntest, was du genau bauen willst..

Gruß
Christopher

HelgeK
26.07.2005, 07:25
Hi Christopher,
ich denke ein Master viele Slaves würden genügen (hoffe ich). :-)
Also was ich vor habe ist folgendes:
Ich habe vier Türen, die ich jeweils mit einen Türöffner öffnen möchte. Diese Türöffner sollen über Transpander geschaltet werden (Leser Typ 1 siehe Conrad). Die Auswertung des Keys möchte ich mit einen mega8 machen. Es sollen mind. 256 Keys möglich sein. Deshalb wollte ich die in ein I2C EEPROM abspeichern.
Desweiteren soll der m8 auch noch Daten von einem Zentralrechner(PC) empfangen können (ein m8 pro Tür). Diese Daten sollen einerseits Befehle zur Transonder HW starten können(an/aus) und auch das I"C EEPROM mit einer neuen Keyliste überschreiben können.
Ich hatte mit gedacht, das der UART(s) auf Nachricht vom PC warten und eine SW serielle Schittstelle sich mit der Transponder HW unterhält. Ich weiß, das ist für einen Anfänger ein großes Stück. :-)
Hinzu kommt noch das ich das "Netzwerk" noch weiter aufbauen möchte(nachdem die Türöffnersache funktioniert).
Das wird ein Projekt werden, wo ich Wechstromzähler((n) mind. 128) über einen optischen Sensor den Stromverbrauch ablesen möchte. Diese Systeme soll dann auch an den Zentralrechner angeschlossen werden.

Ihr könnt mir auch gerne Ratschläge geben, wie ich das am Besten anpacken kann. :-) Besonders der Sensor bereitet mir noch Kopfschmerzen( soll nichts kosten).

Viele Grüße
Helge

27.07.2005, 13:00
Also ich habe mich jetzt ein wenig schlauer gelesen. Nenn ich nun nur ein Master(PC) habe, so müssen alle meine avr's die Slave sein. Nun Frage ich mich, wie ich den Datenempfang richtig einstelle. Ich habe hier was vom Befehl config com 1 Befehl gelesen. Was muß ich jetzt schreiben für 9N1 bei 9600 Baud mit einen 16MHz Quartz? Und wie weiß ich was das die empfangene Adresse für mich ist?
Und da ich gerade dabei bin, wie richte ich den SW UART ein?
:-k
Viele Grüße
Helge

HelgeK
27.07.2005, 13:02
Sorry, ich hatte mich mal wieder vergessen einzuloggen!
:-)
Viele Grüße
Helge

albundy
27.07.2005, 15:51
Ich habe hier einen guten Artikel über den RS485 Bus gefunden.

http://www.elektronik-projekt.de unter "Artikel"

Dort wird auch ein Beispiel für einen Single Master / Multislave Bus softwaremäßig erklärt.

HelgeK
27.07.2005, 18:13
Hi,
also der Artikel ist nicht schlecht! :-)
Jetzt weiß ich schon mal wie der Bus aufzubauen ist und wie alles im Prinzip funktioniert. Leider bleibt meine Frage nach Beispiel Code offen. Besonders schwierig scheint mir die Verarbeitung des Frames, also wie mache ich die Checksumme und wie gehe ich mit der unterschiedlichen Datenlänge um? Wieviel Platz kostet sowas?
:-k

Viele Grüße und Danke für den Artikel
Helge

albundy
27.07.2005, 19:04
Vielleicht hilft dir das weiter ?

http://www.mcselec.com/an_30.htm

HelgeK
27.07.2005, 20:17
Ja, das sieht doch gut aus!!! :-)

Ich glaube damit kann ich fürs erste Leben! Jetzt werde ich erstmal ein wenig rumprogrammieren. Bin mal gespannt, ob der ganze Kram den auch noch reinpasst.
Wieso habe ich noch garnicht bei diesen Link vorbeigeschaut?! Hmm :-k

DANKE und viele Grüße
Helge

HelgeK
27.07.2005, 21:30
So, da bin ich schon wieder!
Ich wollte gerade den UART einstellen mit CONFIG COM1 wie in der Hilfe. Aber dort habe ich jetzt das Problem was
CONFIG COM1 = dummy , synchrone=0|1,parity=none|disabled|even|odd,stopbi ts=1|2,databits=4|6|7|8|9,clockpol=0|1
bedeuten soll.
Konkret, was ist für dummy,sysnchrone und clockpol zu setzen? Der Rest ist klar.
Desweiteren habe ich einen SW UART mit :
'öffne einen Kanal für die Ausgabe(TxD) Pin 24/PC1
Open "comc.1:9600,8,n,1" For Output As #1
'öffne Einen Kanal für die Eingabe(RxD) Pin 23/PC0
Open "comc.0:9600,8,n,1" For Input As #2
gesetzt. Ist das so richtig? Ich möchte den HW UND SW Uart benutzen.
:-k
Viele Grüße
Helge

chr-mt
27.07.2005, 21:52
Hi,
die Config COM Befehle sind eigentlich nur für Controller mit zweitem UART sinnvoll.
Für den Hardware UART reicht ein einfaches "Baud=9600"
Das stellt den Hardware UART auf 9600,n,8,1 ein.

Gruß
Christopher

HelgeK
28.07.2005, 06:56
Hi Christopher,
ich wollte den HW UART mit dem Config COM auf sowas wie 19200,n,9,1 setzen(mit Interrupt), da ich darüber ja mein kleines Netzwerk von AVR's aufbauen wollte. Deshalb reicht die Standardeinstellung dafür nicht aus.
Desweiteren wollte ich einen SW UART einrichten der sich mit meiner Transponderplatine nach 9600,n,8,1 unterhält. Zudem muß ich noch eine TWI-EEPROM Routine einbauen zum lesen und schreiben von Transponderschlüsseln. Über das "Netzwerk" soll das EEPROM(I2C) überschrieben werden können(Keys löschen und hinzufügen vom MASTER) und Steuerbefehle für die Transponderplatine aktiviert werden.
Deshalb sind der SW UND HW Uart von zentraler Bedeutung.
:-k
Viele Grüße aus dem sonnigen München :Strahl
Helge

chr-mt
28.07.2005, 08:19
Hi,
stimmt, 9 Datenbits geht bei der Standardeinstellung nicht.

Gruß
Christopher

HelgeK
28.07.2005, 12:19
Was ich noch nicht so richtig raus habe, ist diese Framebearbeitung/Erzeugung. Wie deklariere ich die Variablen, wenn ich die Länge des Frames noch nicht weiß. Die Steuerbefehl haben eine feste Länge und die Daten für das EEPROM auch. Die Längeninformationen bekomme ich ja mit den empfangen Frame. Wie mache ich das nun dynamisch? :-k

Viele Grüße
Helge

HelgeK
28.07.2005, 12:37
Was muß ich nun für Config Com1 eingeben bei meinen Vorgaben? :-k

19200,9n1

Viele Grüße
Helge

chr-mt
28.07.2005, 13:23
Hi,
ich hab's bei meinem MEGA 128 so gemacht:
$baud = 19200
$baud1 = 19200
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Com2 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

Bei dir wäre es also:
$baud = 9600
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 9 , Clockpol = 0 .


Was das Dummy soll weiß ich auch nicht..
Ist auch nicht in der Hilfe beschrieben
Synchrone braucht man für synchronen Betrieb des UARTs (mit Clock)
Dementsprechend brauch man noch die Polarität des Clock Signals.
Da du aber eh' asynchron arbeiten wirst, brauchst du das nicht.
Also synchrone=0
Clockpol =0 (oder 1 , dürfte egal sein wenn man's nicht benutzt)

Gruß
Christopher

HelgeK
28.07.2005, 13:54
Oh, Danke Christopher, :-)
ja das mit dem Dummy habe ich auch nicht raus bekommen. Ich werde heute abend mal ein wenig weiter machen, da kommen bestimmt noch ein paar Fragen auf. Die Eintrichtung für die SW UART ist aber richtig so oder?

Viele Grüße und Danke
Helge

HelgeK
28.07.2005, 21:05
Und da bin ich auch schon wieder. :-)
Wie bekomme ich eigentlich dieses 9 Bit heraus?
Also bei 8 Bit geht das ja einfach durch:
dim empf_byte as byte
if ucsra.rxc then 'arbeite mit Interrupt
empf_byte = udr

Tja und wie sieht das so bei 9 Bit Daten aus?
Habe bis jetzt kein Beispiel gefunden.
:-k

Viele Grüße aus dem "kochenden" Ingolstadt
Helge

HelgeK
28.07.2005, 21:40
So jetzt habe ich mich mal schlau gelesen. Ich muß das UCSRB.RXB8 Bit auswerten. Dort wird das 9 Bit reingeschrieben.
Dann wollen wir mal weitermachen. :-)

Viele Grüße
Helge

HelgeK
29.07.2005, 06:55
Heute mal eine andere Frage zu Thema. [-o<
Ich möchte nur mal nachfragen, ob folgendes geht.
Annahme, ich habe mehr als 256 Slaves. Dann bräuchte iich doch nur 2 Adressbytes übertragen und ich kann bis 65535 Slaves haben oder auch Teilnehmer Gruppen bilden. Nun ist ja der RS485 Bus auf max. 255 Teilnehmer beschränkt oder? Wäre es möglich dann mehrere Bussysteme zu haben, die dann jeweils einen Baustein haben, der eine Brücke zum anderen Bus herstellt? Wenn das gehen sollte, wie sollte die Brücke aussehen?
:-k
Vielleicht zwei RS485 Baustein über einen Optokoppler verbinden? Kann die Welt so einfach sein?
\:D/
Viele Grüße
Helge

HelgeK
30.07.2005, 20:07
Hi, :-)
Ich fasse nochmal bei meiner letzte Nachricht nach.
Ist es wirklich nur die physikalisch Grenze des Busses, der die Teilnehmerzahl einschrängt?
Dann sollten doch wirklich mehr als 255 möglich sein oder?
Ich möchte viele Controller für Steuerungszwecke über ein großes Gelände verteilen.
RS485 kommt schon mal wegen der Leitungslänge in Frage und auch die normale RS232 für Kurzstrecken. Auch Funkstrecken muß ich wohl aufbauen. Hat einer mit einer hohen Anzahl von Controllern schon Erfahrung? :-k

Viele Grüße
Helge