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;
|
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.
|