Forum: Compiler & IDEs Datenstruktur bei vielen Ein/Ausgängen


von Tobi T. (teletrabi)


Lesenswert?

Moin ihrs,

vorweg - ich bin bislang doch eher ein noob, was das Mikrocontroller 
betrifft. Mal ein paar C/C++-Basics auf 'nem PC geproggt, aber das war 
doch recht oberflächlich. Hab in der letzten Zeit mal ein bisschen mit 
'nem Atmega16 gespielt, aber auch da eher im Stadium "kann mittels Timer 
blinken, kann Drehencoder lesen und mit Tastern was anfangen". aber das 
soll sich ja wenn möglich ändern ;o) Eine gewisse technische Kreativität 
attestiere ich mir da einmal, ebenso grundlegendes Verständnis von 
Digital- und Analogtechnik. Was hingegen fehlt ist die Erfahrung in 
hardwarenaher Programmierung und diverse Programmierkniffe.

Ziel des Ganzen soll es sein, ein Stellpult für eine Modellbahn etwas 
intelligenter erscheinen zu lassen. Statt ellenlanger Doppelknopfreihe 
halt Taster in einem kleinen Gleisplan angeordnet, mit Rückmeldung der 
Schaltzustände, ein wenig Verriegelung sich gegenseitig störender 
Funktionen usw. Erstmal nicht sooo anspruchsvoll, allerdings 'ne recht 
große Anzahl zu berücksichtigender Ein- und Ausgänge.

Und gerade die Vielzahl der Ein- und Ausgänge bringen mich etwas in 
Grübeln, wie man da am besten ansetzt. Hardwaremäßig kein Problem, 
diverse Schieberegisterchen und gut, Zeit hat man für die Anwendung ja 
erstmal massig. Nur wie setzt man das am besten in der SOftware um? Mir 
schwebt da zunächst einmal ein Ein- und Ausgangs-Abbild vor, um die 
Operationen mit den externen Schieberegistern zu bündeln.

Aus dem Eingangsabbild werden dann die Tastendrücke erkannt und 
dementsprechend die Ausgänge gesetzt, sofern keine 
Verriegelungsbedingung es untersagt. Und schon sind wir mit dem 
Eingangsabbild bei meiner ersten großen Frage - wie realisiert man am 
geschicktesten die Entprellung und Zustandsänderungserkennung der (mit 
reichlich Reserven) 128 Eingangstaster?

Lieber x für sich vollständige Abbilder als 128er Bitfeld-Structures 
nehmen, wo dann Abbild x-1 (x-2) das Abbild des (vor)vorherigen 
Schleifendurchlaufs enthält und zusätzlich Abbilder vor 1 und 2 
Sekunden, um lange Tastendrücke zu erkennen?

Oder statt 'nem zusammenhängenden Abbild aller Taster lieber für jeden 
Taster ein Statusbyte ansetzen, wo dann einzelne Bits den aktuellen, 
(vor)vorherigen Zustand usw. repräsentieren? Was ist bei solch vielen 
Eingängen die geschicktere Variante?

Unten sind mal meine bisherigen Überlegungen zu benötigten Ein- und 
Ausgängen aufgeführt.


Und mit der Frage der Eingänge verknüpft - wie am vorteilhaftesten 
entprellen? Es werden ja kaum mehr als zwei Taster zugleich gedrückt 
werden. Über mehrere Abbilder vergleichen, und wenn meinetwegen die 
letzten drei übereinstimmen den Zustand als endgültig ansehen? Oder 
lieber sobald man an einem geänderten Zustand ankommt, mehrfach einlesen 
und schauen, ob noch Änderungen auftreten? Mehrfach einlesen ist zwar in 
der eigentlichen verarebitung recht knapp, muss dafür aber ettliche Male 
einen ganz bestimmten Taster aus der langen Schieberegisterkette 
einlesen. Dritte Variante wäre, einfach bei nem geänderten Zustand ne 
kurze Pause einzulegen. Fragt sich nur, ob man die so bemessen kann, 
dass alle kurzen Tatendrücke noch erkannt werdn, aber sicher kein 
Prellen mehr wahrgnommen wird.


Schönen Gruß,
Tobi

1
Speicherbedarf Modellbahn:
2
3
Eingangsabbild = 1 Bit pro Taster
4
Ausgangsabbild = 2 Bit pro Magnetischem Aktor/Signal + 2 Bit für Rückmeldung, 
5
Entkuppler und Schalter 1 bit + ggf. 1 bit Rückmeldung.
6
7
Eingänge:
8
20 Weichenfunktionen => 32 bit
9
10 Signale =>16 bit (32 bit)
10
8 Kuppler => 16 bit
11
x Licht => 16 bit 
12
10 Fahrspannungschaltungen => 16 bit
13
-------------------------------------------------------
14
112 Bit => 128 Bit = 16 Byte
15
Hardwareansatz: 16 x 8er PISO
16
17
18
Ausgänge (benötigt => Bedarf inkl. Reserve):  Ausgangsbelegung pro Funktion
19
20 weichenfunktionen x 2 = 40 => 64 bit    Spule A, Spule B
20
10 Signale = 40 bit => 64 bit      Hp0/rot, Hp1/grün, Hp2/gelb, Fahrstrom, 
21
8 Entkuppler = 8 => 16 bit      Spule
22
0 Licht => 16 bit        Relais
23
20 Fahrspannung = 20bit => 32 bit    Relais
24
----------------------------------------------------------
25
144 bit => 256 Bit = 32 Byte
26
Hardwareansatz: zunächst reduziert 16x8er SIPO, 
27
optional zweiter Satz mit 16x 8 SIPOs in weiterem Ausbau.
28
29
30
Rückmeldung
31
20 Weichenfunktionen x 2 = 40 => 64 bit    LED Stellung A, LED Stellung B
32
10 Signale = 20 bit => 48 bit      LED rot, LED grün, 
33
10 Fahrspannung = 10bit => 16 bit    LED
34
----------------------------------------------------------
35
128 Bit => 16 Byte 
36
Hardware Zunächst als 8x8 SIPO. 
37
38
39
40
41
Verarbeitung:
42
Status_Taster:
43
Z_aktuell, Z_-1, Z_-2, Z_-3, Z_-1000ms, Z_-2000ms, Reserve, Reserve  
44
=> 1 Byte   128 Taster => 128 Byte
45
46
Status_Signal:      (Zh, Zl = 2 Bit für vier Zustände (Hp0, Hp1, Hp2, Dunkel))
47
Z_akt_h, Z_akt_l; Z_neu_h, Z_neu_l ; Vormerkung_Z_h, Vormerkung_Z_l; Z_-1_h, Z_-1_l;
48
Blockiert, Freigabe, Blinkmerker, Reserve,  Reserve, Reserve,  Reserve, Reserve 
49
= 16bit => 2 Byte => 16 Signale = 32 Byte
50
51
Status_Weiche:
52
Lage, blockiert, Freigabe, Vormerk, Z_-1, Z_-2, Reserve, Reserve 
53
= 1 Byte => 32 Byte
54
-----------------------------------------------------------------
55
192 Byte 
56
57
58
59
60
Funktionsschema als Pseudocode:
61
62
Tastendruck erkennen
63
Tastendruck speichern
64
if (neu_gedrückt)
65
{  
66
  if  (Schaltkritieren erfüllt)  //längere Abfrage diverser gegenseitiger Verriegelungen
67
68
    Ausgang in Ausgangsabbild setzen/toggeln;
69
  else 
70
  {
71
    vormerken;
72
    blinkmerker aktivieren;
73
  }
74
if (schon lange gedrückt)
75
  trotz Sperrkriterium Ausgang setzen;

von Klaus W. (mfgkw)


Lesenswert?

Willst du dann nicht vielleicht erstmal
a) halbwegs ordentlich C lernen (geht auf PC viel einfacher
   und nervenschonender)
b) dann hier das AVR-gcc-Tutorial durcharbeiten?

Dann macht es eher Sinn, etwas Konkretes auf dem AVR in Angriff zu 
nehmen.

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.