Feuerwerkszündanlage mit Arduino schrieb:
> Hallo liebe Gemeinde!
>
> Will mir ne voll programmierbare Feuerwerkszündanlage aufbauen.
>
> Als Sw. auf dem Laptop bietet mir PyroingnitionControll eine gute Basis.
>
> Allerdings ein "Gründschnabel" in der Digitaltechnik.
>
> Die Verbindung erfolgt per RS 485
>
> Das Standart Protokoll von PIC. schaut so aus:
>
Standard.
Das hat nichts mit der Kunst (=engl. "Art") zu stehen (to stand) zu tun.
Oder der Kunst einen Verkaufsstand zu betreiben.
> 255 AA BB CCC
>
> 255: Startbedingung
> AA: Zündkanal
> BB: Verteiler (Zündmodul ID)
> CCC: CRC8 Checksumme
>
> Also:
> 1111 1111 Alle Module "horchen" zu
Fast.
Es ist eher so, dass alle Module gleichgültig bleiben, egal was auf der
Schnittstelle reinkommt. Erst wenn sie dieses 0xFF sehen, 'denkt' sich
der µC: Holla die Waldfee, jetzt gehts los; das nächste Byte wird mir
sagen, ob ich gemeint bin oder nicht.
> 0000 0001 Kanal 1 wird angesprochen
> 0000 0010 Zündmodul 2 zündet wenn die Checksumme paast?
> 1111 1111 Checksumme?
Das wäre ein grossartiger Zufall, wenn die Checksumme ausgerechnet 0xFF
ergeben würde. Die Checksumme dient dir als Bestätigung, dass die
Übertragung einigermassen zuverlässig fehlerfrei war.
> Wie sollte das C-Programm für den Arduino ausschauen?
Das Programm arbeitet grundsätzlich in einem von 2 Modi
* entweder es ist passiv. In diesem Modus holt es 1 Byte von der
Schnittstelle ab, wenn eines da ist. Der Inhalt des Bytes interessiert
aber nicht weiter. Mit einer Ausnahme. Wenn das Byte den Wert 0xFF (=255
dezimal) hat, dann wird in den anderen Modus geschaltet
* in diesem Modus ist das Programm soweit aktiv, dass es sich ein auf
der Schnittstelle einlangendes Byte holt und auch auswertet. Dabei zählt
das Programm mit, das wievielte Byte das war. Das erste Byte nach dem
Umschalten in den Modus ist die Kanalnummer, das 2. Byte ist das
Zündmodul und das 3.te Byte ist die Checksumme.
Ist das Programm im 'aktiv' Modus beim 3.ten Byte angelangt, dann wird
verglichen, ob dieser Ardunio damit gemeint war und wenn ja, wird die
Aktion ausgeführt. War dieser Arduino nicht gemeint, dann passiert eben
nichts. Anschliessend geht das Programm wieder in den passiven Modus aus
dem es dann der Empfang eines 0xFF wieder in den aktiven Modus schaltet
ungefähr so
1 | uint8_t inMsg;
|
2 | uint8_t byteCount;
|
3 | uint8_t channel;
|
4 | uint8_t modul;
|
5 | uint8_t checksum;
|
6 |
|
7 | ...
|
8 |
|
9 | void setup()
|
10 | {
|
11 | ...
|
12 | inMsg = FALSE;
|
13 | }
|
14 |
|
15 | void loop()
|
16 | {
|
17 | if( serial.available() > 0 ) { // gibt es an der Schnittstelle was?
|
18 |
|
19 | uint8_t receivedByte = serial.read();
|
20 |
|
21 | if( !inMsg ) { // sind wir passiv?
|
22 | if( receivedByte == 0xFF ) { // holla die Waldfee!
|
23 | byteCount = 0; // noch nichts empfangen
|
24 | inMsg = TRUE; // und in aktiven Modus schalten
|
25 | }
|
26 | }
|
27 |
|
28 | else { // wir sind aktiv. Das empfangene Byte erst mal speichern
|
29 | if( byteCount == 0 )
|
30 | channel = receivedByte;
|
31 | else if( byteCount == 1 )
|
32 | modul = receivedByte;
|
33 | else if( byteCount == 2 )
|
34 | checksum = receivedByte;
|
35 |
|
36 | // war das schon alles ?
|
37 | if( byteCount < 2 )
|
38 | byteCount++; // nein war nicht alles. Zaehler weiterstellen
|
39 | // damit das nächste empfangene Byte richtig zugeordnet
|
40 | // wird.
|
41 |
|
42 | else { // ja das war alles. Alle Bytes sind da ... auswerten!
|
43 |
|
44 | // bin ich gemeint?
|
45 | if( channel == ...... ) {
|
46 |
|
47 | // hey, das war tatsächich für mich.
|
48 | // eigentlich sollte jetzt noch die Checksumme geprüft werden
|
49 | // und wenn die auch noch stimmt, dann rummst es beim Modul mit
|
50 | // der Modulnummer 'modul'
|
51 |
|
52 | ....
|
53 | }
|
54 |
|
55 | inMsg = FALSE; // Nachrichgt fertig abgearbeitet. Wieder passiv bleiben
|
56 | }
|
57 | }
|
58 | }
|
59 | }
|