/
README
74 lines (58 loc) · 2.73 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
RaumZeitLabor: Hausbus
======================
== Technisches
Wir benutzen RS-485, direkt mit der UART des Mikrokontrollers verbunden, als
Bus. Die serielle Schnittstelle (UART) betreiben wir mit 9N1 (9 Datenbits, kein
Paritybit, ein Stopbit). Das neunte Bit gibt hierbei an, ob es sich um ein
Adresspaket handelt. Das hat den Vorteil, dass man die ATmegas im
Multi-Processor Communication Mode betreiben kann. Hierbei werden alle
empfangenen Bytes in Hardware verworfen (generieren also keinen Interrupt), es
sei denn, sie wurden an den jeweiligen Mikrokontroller gesendet.
TODO: Die Baudrate ist noch unklar. Momentan 9600.
Als Kabel kommen CAT5-Ethernet-Kabel zum Einsatz. Wir benutzen die hintere
Stiftleiste (4 Adern) einer Ethernet-Buchse (ohne integrierten Übertrager) für
VCC (+5V), GND, A und B (A und B sind die differentiellen Datenleitungen des
RS-485-Bus).
Damit eine gewisse Performance garantiert wird und aufgrund der Empfehlungen in
[1] können maximal 30 Geräte an einem Bus hängen. Sollte man mehr Geräte
brauchen, kann man die Busmaster, welche ja nach Ethernet umsetzen, auf
Ethernet-Ebene zusammenschalten.
== Paketformat
01: destination address (1 byte)
02: source address (1 byte)
03: checksum (currently ignored)
04: packet length, high byte
05: packet length, low byte
06-xx: payload
maximale paketgröße für pakete, die der busmaster sendet und die clients empfangen: 32 byte
als c-struct:
struct buspkt {
uint8_t destination;
uint8_t source;
uint8_t checksum;
uint8_t length_hi;
uint8_t length_lo;
};
== Adressen
00: Busmaster
01-29: Teilnehmer am bus
50-100: Broadcast-Adressen als Rückkanal (werden auf IPv6-Multicast-Adressen umgesetzt)
101-254: reserviert
== Protokoll
• der busmaster schickt alle 1s eine ping-nachricht über den bus für jeden client
• der client antwortet darauf innerhalb von 15 ms. in der antwort ist
enthalten, wieviele pakete er für den busmaster hat (der einfachheit halber
fragt man derzeit einfach alle ab, könnte aber später dadurch über eine
bus-arbitration nachdenken).
• der busmaster holt sich das paket ab und schickt ein ethernet-paket mit dem
payload raus, als IPv6-multicast im lokalen Netz, damit mehrere Anwendungen
das Paket empfangen können (die einzelnen mc senden dann an bestimmte
broadcast-adressen)
== Implementation für Busteilnehmer
• man benutzt das makefile aus der vorlage und holt sich dadurch die library
mit ins projekt
• in der mainloop muss man nun auf neue pakete prüfen (pakete für andere
mikrokontroller werden verworfen) und diese entsprechend behandeln. außerdem
gibt es einen returncode für „der bus ist kaputt“
• bevor man pakete sendet, muss man zunächst schauen, ob das alte paket bereits
gesendet wurde