Forum: Mikrocontroller und Digitale Elektronik Porterweiterung Ausgänge via Bascom


von Matthias (Gast)


Lesenswert?

Hallo holde Gemeinde!

Vorab: Ich beneide Menschen, welche sich im Binärsystem und Assembler 
zuhause fühlen- ich schaffe sowas einfach partout nicht, Mathe und Logik 
sind nicht wirklich meine Welt.
Schlimm genug dass ich versuche, via Bascom und einer Porterweiterung 
via Schieberegister meine µC-Ausgänge erweitern zu wollen. :)

Die Anforderung mag für viele hier absolut banal und simpel sein, ich 
versuche seit Tagen, eine Lösung zu finden.

Ein Atmega16 soll mit wenigen Ausgängen in Summe 26 Relais ansteuern.
Das Einbinden eines Schieberegisters via händischer Programmierung (also 
ohne SPI(?)) bekomme ich gebacken- man schiebt quasi immer Nullen und 
Einsen in diese Register (es sind in Summer 4 Stk., also 32 Bit?), und 
lässt die Ausgänge danach schalten.

Nun aber das Problem:
Ich möchte meinetwegen Relais 1 + 5 ansteuern, dann umschalten auf 1+7, 
dann meinetwegen auf 4+3, etc...

WIE zum Henker muss ich das meinem Programmcode mitteilen?
Wenn ich die Relais direkt am µC hängen habe, ist es soweit kein Ding, 
ich gebe den Pins Namen:
Config PortA.0=Output
Name as Porta.0
Config PortA.1=Output
Test as Porta.1

Wenn ich nun "Name" schalten will, sage ich:
Name=1
Bei Test wäre es eben Test=1 usw...

Dies kann man im Progamm super verwenden.
Will ich nun aber mittels Drehencoder (die Routinen gibt es 
dankenswerterweise ja zum abkopieren ;)) diese 26 Relais schalten, 
müsste ich quasi irgendeine Art Zähler haben, welcher den ermittelten 
Wert dem Schieberegister so reinschiebt, dass was Brauchbares rauskommt.

In einer ersten Programmroutine wähle ich die Relais 1-8, dann betätige 
ich den Taster im Drehencoder und soll dann meinetwegen Relais 9-16 
zusätzlich auswählen können.

Nur wie gestalte ich dieses Thema in Bascom (andere Sprachen sind keine 
Option für mich, ehrlich)?
Den richtigen Ausgang des Registers bekomme ich zwar bestimmt einmalig 
geschalten, aber wie mache ich einen zweiten Schaltvorgang an einem 
anderen Ausgang, so dass der erste bestehen bleibt?

Ist jetzt etwas verwirrend beschrieben, aber mir fällt keine 
vernünftigere Problembeschreibung ein... :/

Hat jemand Rat für mich?

VIELEN Dank schonmal an alle, die sich hier erbarmen mögen...

Grüsse,
Matthias

von snowfly (Gast)


Lesenswert?

Mal ein Vorschlag ins blaue:

Wie wäre es damit ein Array aus Boolean einzurichten,
den einzelnen Werten kannst du mit #define array[x] Name
(oder wie immer das auch in Bascom geht) einen Namen geben
und mit z.B. Name=1 die passende Stelle im Array ändern.
Danach musst du nur noch das ganze Array auf das Schieberegister takten 
und valide schalten.

von JackFrost (Gast)


Lesenswert?

Hi,

Du könntest auch eine Long Variable nutzen und dann die Bits 0 - 25 für 
die Relais setzen und diese dann Byteweise an die Schieberegister 
senden.

Gruß JackFrost

von Matthias (Gast)


Lesenswert?

snowfly schrieb:
> Mal ein Vorschlag ins blaue:
>
> Wie wäre es damit ein Array aus Boolean einzurichten,
> den einzelnen Werten kannst du mit #define array[x] Name
> (oder wie immer das auch in Bascom geht) einen Namen geben
> und mit z.B. Name=1 die passende Stelle im Array ändern.
> Danach musst du nur noch das ganze Array auf das Schieberegister takten
> und valide schalten.

Hi und schonmal vielen Dank für deinen Ratschlag!

Ich weiß ja nichtmal, was ein Array aus Boolean ist... :/

Im Prinzip wäre es super, wenn ich jedem Relais eine Nummer zuteilen 
könnte.
Der Encoder zählt dann meinetwegen eine Variable hoch/runter.
Ich betätige den Taster, und kann einen zweiten Wert übergeben, welcher 
dann ein zweites Relais NEBEN dem ersten schaltet.
Kurzum: Irgendeine Routine/Befehle/Befehlskette, welche es mir 
ermöglicht, die Ausgänge der Schieberegister beliebig ein/auszuschalten- 
wie die Ausgänge des µC selbst.

Ich sag ja: Mathe war schon immer die Hölle- bin wohl mehr der 
"kreative" Künstlertyp. :D

µC-Technik ist echt was für Matheasse, bzw. Menschen, welchen logisches 
Denken einfach fällt.

von Matthias (Gast)


Lesenswert?

JackFrost schrieb:
> Hi,
>
> Du könntest auch eine Long Variable nutzen und dann die Bits 0 - 25 für
> die Relais setzen und diese dann Byteweise an die Schieberegister
> senden.
>
> Gruß JackFrost

Hi und natürlich ebenfalls vielen Dank!

Hmm, klingt plausibel, aber ich wüsste nicht, wie ich dies in 
Programmcode umsetzen kann.

Dazu fehlt mir einfach das logische Denken in diesen Belangen.
Einfach hingegen ist es, mit den vorhandenen Ausgängen zu arbeiten- nur 
komme ich in meiner Anwendung nicht um den Einsatz von Schieberegistern 
herum.... :/

von Matthias (Gast)


Lesenswert?

Hallo,

nochmals zur einfacheren Erläuterung:

Gut wäre, wenn ich eine Routine hätte, welcher ich sagen könnte:
Relais1 =1
Relais5= 1
Relais4= 0
usw, usf...

Also quasi so tun, als ob ich anstelle der vorhandenen 
Controller-Ausgänge eben zusätzliche weitere 26 habe, welche eben in den 
Schieberegistern sitzen.

Entweder ist die Lösung so einfach, dass ich nicht draufkomme- oder 
aber, und dass ist weitaus wahrscheinlicher: Ich raffe die Verwendung 
von minimal komplexeren Variablensystemen in Bascom einfach nicht. :)

Viele Grüsse,
Matthias

von kaktusbombe (Gast)


Lesenswert?

Hallo,

die Idee von JackFrost mit einer "long" Variablen (32 Bit) könnte man zB 
auf die folgende Art umsetzen:

Zunächst definiert man alle Relais als eine Zahl entsprechend ihrer 
Wertigkeit in der Variablen. D.h., wir haben das:
Relais_1 = 1
Relais_2 = 2
Relais_3 = 4
Relais_4 = 8
Relais_5 = 16
...
Relais_25 = 16.777.216

Dann errechnest du deine Long Variable als:
LongVar = Relais_1 | Relais_3 | Relais_4 | Relais_6 usw.
(Die vertikalen Striche sollen ein bitweises OR darstellen. Ich weiß 
grad nicht, ob das in Bascom auch so geschrieben wird, aber die 
Bascom-Hilfe weiß, was gemeint ist)

Und zuletzt schiebst du deine LongVar Stück für Stück in die 
Schieberegister.

von Michael K. (tschoeatsch)


Lesenswert?

Hi, nehme einfach 4 bytes, zB 'A', 'B', 'C' und 'D', lege dir alias an 
wie zB Rel_1 alias A.0, Rel_2 alias A.1... erkennst du schon die 
Systematik? Und diese 4 bytes schiebst du bei jedem Wechsel eines 
Relaisstatus in dein Schieberegister. Unveränderte Relaiszustände 
ergeben unveränderte bits.
Um Relais zu schalten, schreibst du Rel_1=1 und alle 4 bytes wieder in 
die Schieberegister. Du musst aber immer alle 4 bytes in gleicher 
Reihenfolge in die Schieberegister schreiben, am bessten in einer sub.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

> Das Einbinden eines Schieberegisters via händischer Programmierung
> (also ohne SPI(?)) bekomme ich gebacken- man schiebt quasi immer Nullen
> und Einsen in diese Register (es sind in Summer 4 Stk., also 32 Bit?),
> und lässt die Ausgänge danach schalten.

Wo liegt dann das Problem?
Du schiebst IMMER die Zustände ALLER Relais raus. Für jedes Relais hast 
du eine Variable, die zb 0 ist, wenn das Relais nicht geschaltet sein 
soll und 1 wenn das Relais geschaltet sein soll.

Trenn dich von der Vorstellung, du könntest im Schieberegister einzelne 
Bits wahlfrei setzen. Statt dessen besteht ein Ausgabezyklus immer 
darin, dass du alle Bits hinausschiebst. Ob im Endeffekt ein Pin auf 0 
oder auf 1 sein soll, dafür hast du Variablen (im einfachsten Fall 
einfach ein Array). Wenn du 1 Relais änderst (oder mehrere) dann setzt 
du in der betreffenden Variablen eine 0 oder eine 1 (je nachdem) und 
taktest ALLE Variablen erneut auf das Schieberegister raus. Mach dir 
keine Sorgen, das geht schnell genug und deinem µC ist es egal, wenn er 
mal schnell 32 Bits in Schieberegistern neu ausgeben soll.

Man kann natürlich vorher alles bitmässig in einer Long Variablen 
zurechtlegen. Man muss aber nicht. Zur einfach Bearbeitung reicht es 
auch ein Array zu benutzen. Also musst du dich mal damit beschäftigen, 
wie man in Bascom mit Arrays arbeitet. Das bleibt dir so und so nicht 
erspart. Vorteil: du brauchst dich dann nicht mit Bitpfriemelei beim 
Aufbau und der Zerlegung zur Übertragung rumschlagen.

: Bearbeitet durch User
von Stefan (Gast)


Lesenswert?

DIM Relais als dword
..
Relais.5 = 1
..
Relais.12 = 0
...

'Dann rausschieben

von Matthias (Gast)


Lesenswert?

Stefan schrieb:
> DIM Relais als dword
> ..
> Relais.5 = 1
> ..
> Relais.12 = 0
> ...
>
> 'Dann rausschieben

Hallo!

VIELEN HERZLICHEN DANK! So wird es klappen- zumindest im Simulator in 
Bascom sieht alles schonmal ganz gut aus.

Die Kette aus den Variablen Relais.1 - Relais.26 schiebe ich mittels 
For-Next-Schleife in die Schieberegister und schalte die Dinger danach 
ein.
Und die Einzelwerte bekomme ich ganz einfach, indem ich mit dem 
Drehencoder eine Variable (z.B. "x") hoch/runterzählen lasse, und diese 
dann via Knopfdruck entweder als "0" oder "1" in Relais.x ablege.

Sag ja: Es wäre so einfach, wenn man ein wenig mehr Logik im 
Oberstübchen unterbringen könnte. :)

Vielen Dank nochmals an Alle!
Matthias

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.