1.2.2 Elektronischer Würfel mit Tasterbedienung
Einführende Erläuterungen
In den vorangegangenen Kapiteln haben wir uns intensiv mit dem Ansteuern derauf dem Experimentierboard vorhandenen LED´s und den Eingabetastern befasst. Dabei haben wir alle LED´s mit Ausnahme der "Würfelaugen- LED´s" verwendet und das hat seinen Grund:
Während Blink- und Lauflichter als selbstständig laufende Programme eine durchaus sinnvolle Anwendung darstellen, gibt es für den ständig eigenständig laufenden Würfel nur eingeschränkte Verwendungsmöglichkeiten.
Erst durch Verwendung eines Eingabetasters erhalten wir eine Schaltung,welche wir auch praktisch einsetzen können.
Problematisch (für unseren Attiny13) würde es werden, wenn wir jede der 7 LED´s die notwendig sind um alle 6 möglichen "Würfelbilder"darzustellen einzeln ansteuern wollten, denn wir haben ja nur 5 Aus- / Eingänge und müssen ja auch den Taster noch einbinden. Aus diesem Grunde sind auf demExperimentierboard 6 der 7 LED´s zu 3 Zweiergruppen zusammengeschaltet. Welche zwei LED´s jeweils auf einen Pin zusammengeschaltet sind können wir sehr leicht dem Bestückungsaufdruck entnehmen:
Würfel-500ms.gif
Mit diesen 4 Ansteuermöglichkeiten können alle 6 Würfelbilder erzeigt werden:
Wie funktioniert nun unser Würfel
Rein programmtechnisch wollen wir erreichen, dass alle möglichen Würfelbilder gleich oft gezeigt werden, solange wir den Taster gedrückt halten.Generell handelt es sich also um ein Lauflicht, welches nur solange "läuft", wie unser Taster gedrückt wird.
Damit man den Würfel nicht an gewünschter Stelle anhalten kann, muss unser Lauflicht so schnell die möglichen Zustände wechseln, dass wir die einzelnen Würfelbilder nicht mehr mit bloßem Auge erkennen können. Wir erhalten dadurch das charakteristische unregelmäßige Flackern aller 7 LED´s, da ja nicht alleLED´s gleich oft und in gleichem zeitlichen Abstand angesteuert werden.
Für unseren Controller alles kein Problem und auch wir haben bereits allesgelernt, um die gewünschten Funktionen in ein Programm umzusetzen.
Zunächst ändern wir die Jumper auf unserer Platine und stecken die benötigten Kabelverbindungen um die LED´s der Würfelsimulation anzusteuern.
Jumper Würfel.gif
Folgende Portverbindungen werden in unserem Beispiel verwendet:
Bleibt noch der 5. Portpin unseres Attiny 13 für den Taster, den wir wie gewohnt hinzufügen:
Config Portb.0 = Input
Taster Alias Pinb.0Portb.0 = 1
Fassen wir also unser bisheriges Programm zusammen und überlegen anschließend, wie wir die Funktion und Anzeige realisieren können:
Alles anzeigen
Da wir im "Ruhezustand" der Schaltung das gewürfelte Ergebnis sehen möchten und nur "gewürfelt" werden soll wenn der Taster gedrückt wird, müssen wir zunächst ausschließen, dass das Programm ohne Pause vor sich hinwürfelt. Das heißt im Gegenschluß, dass nur "gewürfelt" wird, wenn der Taster gedrückt wird und das geht natürlich über eine IF- Abfrage:
If Taster = 0 Then'Taster =0 'wir erinnern uns, wir fragen den Taster invertiert ab
... End If
Ein Würfel hat bekanntlich 6 Seiten, also haben wir auch 6 verschiedene "Augenmuster", welche wir darstellen möchten. Wenn wir den Taster nun betätigen sollen diese 6 möglichen Zustände in schneller Folge durchlaufen werden und zwar in so schneller Folge, dass die einzelnen Zustände nicht erkennbar sind. Wir benötigen also wieder eine Zählvariable, die von 1 bis 6 zählen kann. Der Zählerstand soll sich zudem beispielsweise alle 10 Milliskunden ändern. Das reicht aus, um die einzelnen Anzeigemöglichkeiten nicht mehr zu erkennen.
Fügen wir die notwendigen Zeilen dem Programm hinzu:
Alles anzeigen
Wie Ihr im Programm gesehen habt, zählen wir natürlich bis 7 und setzen die Variable I dann sofort zurück auf 1. Das geht so schnell, dass das Programm nur mit den Zählerständen 1 bis 6 arbeitet.
Auswertung und Umwandlung in die Würfelbilder
Bleibt als letzte Aufgabe die Zuordnung der Augenbilder zu den Zählerständen. Die könnten wir auf die bereits bekannte Art und Weise über eine IF- Abfrage realisieren. Da wir unsere Kenntnisse weiter vertiefen möchten gehen wir hier einen anderen Weg. Wir nutzen zurAuswertung den Befehl Select Case
WIKI-Logo Merktext.jpg
Mit Select Case können wir eine Variable auf mehrere unterschiedliche Werte, oder aber auch Wertbereiche (z.B.: 2 bis 5) abfragen und bei zutreffenden Bedingungen unterschiedliche Befehle ausführen lassen.
In unserem Fall verwenden wir ja die Zählvariable I, die wir auswerten möchten. Sehen wir uns einmal an, wie die Variable I auf die 6verschiedenen Zustände hin ausgewertet werden kann:
Alles anzeigen
Der Befehl Select Case wird immer gefolgt von der auszuwertenden Variablen verwendet. Danach folgen die gewünschten Auswertungen. Hierbei müssen nicht alle Möglichkeiten Verwendung finden. Im unserem Beispiel wäre es auch möglich nur nach 1,3 und 6 abzufragen. Die Auswertung mit Select Case endet immer mit End Select
Ergänzen wir die Auswertung mit der passenden LED- Ansteuerung und fassen dies gleich im Programm zusammen:
Alles anzeigen
Somit ist unser Würfelprogramm fertig und kann auf der Platine erprobt werden.
Hier die Animation des laufenden Programmes, wenn der Taster gedrückt wird. Bei losgelassenem Taster wird natürlich eine der möglichen 6 Kombinationen angezeigt. (Auf der Platine geht das noch etwas schneller als hier in der Animation)
Würfel 10ms.gif
Verbesserte Ansteuerung der Augenbilder
Nachdem Ihr jetzt das Programm hoffentlich hinreichend ausprobiert habt,wollen wir uns einigen Veränderungen widmen. Hier wäre zuerst die Auswertung in Select Case. Das funktioniert zwar recht gut, aber wir möchten unseren Programmierstil noch etwas verfeinern.
Um mehrere Portpins gleichzeitig zu setzen gibt es in derMikrocontrollertechnik eine bequeme Möglichkeit, deren Erklärung nicht ganz einfach ist. Dazu müssen wir ein wenig ausholen und der Attiny 13 ist nicht das beste Beispiel um dies zu erklären, da er nicht genug Portpins besitzt. Aber davon lassen wir uns nicht abschrecken:
Die Controllervarianten der Attiny und Atmega- Familie von ATMEL sind in 8Bit- Technologie aufgebaut. Das bedeutet ein kompletter Port (zum Beispiel PortB, wie Ihr ihn aus unseren Programmen kennt) hat bei den "größeren" Controllern in seiner Gesamtgröße 8 Ein- oder Ausgänge. Die Portpins sind von rechts nach links aufsteigend durchnumeriert und das nicht von 1 bis 8, sondern von 0 bis 7.
WIKI-Logo Wichtig.jpg
Numerierungsrichtung und deren Wertigkeit sind für unsere Verwendung von größter Wichtigkeit, denn anderenfalls passt das Ergebnis nicht zu unseren Vorstellungen
Anhand einer Tabelle läßt sich das gut erkennen:
Wie wir wissen, kann eine Ausgang entweder eingeschaltet oder ausgeschaltet sein, also entweder 0 oder 1 sein. Darüber hinaus wissen wir, dass man für die ausschließliche Schreibweise mit 0 und 1 das Binärsystem verwendet und genau diese Schreibweise können wir uns bei der Ausgabe unserer Würfelbilder zu Nutze machen.
WIKI-Logo Merktext.jpg
Um einen Wert in BASCOM binär darzustellen, stellt man der Null- Einserkette die Kombination &B voraus
Um jetzt beispielsweise alle Ausgänge an PortB einzuschalten schreiben wir einfach:
PortB= &B11111111
Um alle Ausgänge gleichzeitig auszuschalten:
PortB= &B00000000
Selbstverständlich sind auch alle Kombinationen erlaubt. Beispielsweise:
PortB=&B00110101
PortB=&B11100010
PortB=&B01011111
PortB=&B11111001
Nun habe ich zu Anfang dieses Kapitels erklärt, dass der Attiny 13 nicht so gut für die Erklärung geeignet ist, da er nicht alle 8 Ausgänge von Port B zur Verfügung stellt. So schwer ist es jetzt aber auch nicht, denn wie Ihr derTabelle oben entnehmen könnt beginnen wir rechts mit PortB.0 und gehen weiternach links zu PortB.4. Lediglich PortB.5 bis PortB.7 sind nicht vorhanden. Da BASCOM eine Binärzahl, die weniger als 8 Stellen hat von rechts beginnend (also von 0 an) verarbeitet, lassen wir in unserem Programm die fehlenden 3 Stelleneinfach weg:
Wenn wir bei unserem Attiny 13 alle Ausgänge einschalten wollen schreiben wir:
&B11111
Alles ausschalten geht analog dazu:
&B00000
Was passiert mit Eingängen beim binären setzen von Ausgängen?
Auf etwas müssen wir bei unserem Programm noch achten:
PortB.0 ist in unserem Fall ja kein Ausgang, sondern ein Eingang. Was nun? -Kein Problem, für PortB.0 setzen wir in unserem Programm immer eine 1.
Warum schreiben wir für PortB.0 keine 0? -Weil wir den Taster mit If auf 0 abfragen und das Programm bei jeder Ausgabe in der Annahme wäre, derTaster wäre gedrückt.
So sehen die einzelnen binären Ausgaben für unsere 6 verschiedenenWürfelbilder aus:
Schauen wir uns das veränderte Programm einmal an. Wie Ihr seht benötigen wir die Aliasbezeichnungen W1, W2, W3 und W4 nicht mehr. Diese können folglich entfallen.
Über die binäre Schreibweise wird nun bei jeder Case- Auswertung das entsprechende LED- Muster angesteuert. Kurz und kompakt.
Alles anzeigen
Von der ehrlichen Anwendung zum Mogelwürfel ist es nur ein kleiner Schritt
Manche Zeitgenossen schaffen es nicht, sich bei "Mensch ärgere Dich nicht" doch nicht zu ärgern, zumal die dringend benötigten Sechsen einfach nicht kommen wollen. Wer den elektronischen Würfel benutzt, kann dem leicht nachhelfen und ich habe damit die Gelegenheit eine weitere Variation von Select Case vorzustellen.
Statt bis 6 (7) lassen wir den Würfel einfach bis 8 (9) zählen und ergänzen Select Case für die Anzeige der 6 einfach ein klein wenig. Mit Case 6 to 8 wird sowohl bei Zählerstand 6, als auch bei Zählerstand 7 und 8 das Augenbild der 6 angezeigt.
Alles anzeigen
Jetzt meckert aber nicht, wenn Ihr trotzdem verliert, weil Ihr für das letzte Püppchen eine Eins benötigt aber lauter Sechsen würfelt.
Einführende Erläuterungen
In den vorangegangenen Kapiteln haben wir uns intensiv mit dem Ansteuern derauf dem Experimentierboard vorhandenen LED´s und den Eingabetastern befasst. Dabei haben wir alle LED´s mit Ausnahme der "Würfelaugen- LED´s" verwendet und das hat seinen Grund:
Während Blink- und Lauflichter als selbstständig laufende Programme eine durchaus sinnvolle Anwendung darstellen, gibt es für den ständig eigenständig laufenden Würfel nur eingeschränkte Verwendungsmöglichkeiten.
Erst durch Verwendung eines Eingabetasters erhalten wir eine Schaltung,welche wir auch praktisch einsetzen können.
Problematisch (für unseren Attiny13) würde es werden, wenn wir jede der 7 LED´s die notwendig sind um alle 6 möglichen "Würfelbilder"darzustellen einzeln ansteuern wollten, denn wir haben ja nur 5 Aus- / Eingänge und müssen ja auch den Taster noch einbinden. Aus diesem Grunde sind auf demExperimentierboard 6 der 7 LED´s zu 3 Zweiergruppen zusammengeschaltet. Welche zwei LED´s jeweils auf einen Pin zusammengeschaltet sind können wir sehr leicht dem Bestückungsaufdruck entnehmen:
Würfel-500ms.gif
- Pin W1 steuert die LED´s oben, rechts (LED 14) und unten links (LED 12)
- Pin W2 steuert die beiden mittleren LED´s rechts (LED 11) und links (LED 15)
- Pin W3 steuert die einzelne, mittlere LED alleine (LED 13)
- Pin W4 steuert die verbleibenden LED´s oben, links (LED 10) und unten, rechts (LED 16).
Mit diesen 4 Ansteuermöglichkeiten können alle 6 Würfelbilder erzeigt werden:
- Würfelbild 1: Pin W3
- Würfelbild 2: Pin W1 oder Pin W4
- Würfelbild 3: Pin W3 und Pin W1 oder Pin W4
- Würfelbild 4: Pin W1 und Pin W4
- Würfelbild 5: Pin W1 und Pin W3 und Pin W4
- Würfelbild 6: Pin W1 und Pin W2 und Pin W4
Wie funktioniert nun unser Würfel
Rein programmtechnisch wollen wir erreichen, dass alle möglichen Würfelbilder gleich oft gezeigt werden, solange wir den Taster gedrückt halten.Generell handelt es sich also um ein Lauflicht, welches nur solange "läuft", wie unser Taster gedrückt wird.
Damit man den Würfel nicht an gewünschter Stelle anhalten kann, muss unser Lauflicht so schnell die möglichen Zustände wechseln, dass wir die einzelnen Würfelbilder nicht mehr mit bloßem Auge erkennen können. Wir erhalten dadurch das charakteristische unregelmäßige Flackern aller 7 LED´s, da ja nicht alleLED´s gleich oft und in gleichem zeitlichen Abstand angesteuert werden.
Für unseren Controller alles kein Problem und auch wir haben bereits allesgelernt, um die gewünschten Funktionen in ein Programm umzusetzen.
Zunächst ändern wir die Jumper auf unserer Platine und stecken die benötigten Kabelverbindungen um die LED´s der Würfelsimulation anzusteuern.
Jumper Würfel.gif
Folgende Portverbindungen werden in unserem Beispiel verwendet:
- Config Portb.1 = Output
- Config Portb.2 = Output
- Config Portb.3 = Output
- Config Portb.4 = Output
- W1 Alias Portb.1
- W2 Alias Portb.2
- W3 Alias Portb.3
- W4 Alias Portb.4
Bleibt noch der 5. Portpin unseres Attiny 13 für den Taster, den wir wie gewohnt hinzufügen:
Config Portb.0 = Input
Taster Alias Pinb.0Portb.0 = 1
Fassen wir also unser bisheriges Programm zusammen und überlegen anschließend, wie wir die Funktion und Anzeige realisieren können:
BASCOM-Quellcode
- '************************************************************
- ' Kleiner Mikrocontroller Einsteigerkurs
- ' (c) 2013-2015 ceperiga
- '------------------------------------------------------------
- ' Projektinfos: www.bascomforum.de
- '------------------------------------------------------------
- ' Stufe 1: Attiny 13
- '------------------------------------------------------------
- 'Informationen zur CC-Lizensierung:http://creativecommons.org
- '============================================================
- ' Name:
- ' Unit: 1.2.3
- '------------------------------------------------------------
- 'Beschreibung: Einfaches Würfelprogramm
- '************************************************************
- $regfile = "attiny13.dat" 'verwendeter Controller
- $crystal = 1200000 'Taktfrequenz
- $hwstack = 6
- $swstack = 6
- $framesize = 28
- '==============================================================================
- 'Ausgänge / Eingänge deklarieren / Aliasvergabe
- '------------------------------------------------------------------------------
- '
- '==============================================================================
- Config Portb.1 = Output
- Config Portb.2 = Output
- Config Portb.3 = Output
- Config Portb.4 = Output
- W1 Alias Portb.1
- W2 Alias Portb.2
- W3 Alias Portb.3
- W4 Alias Portb.4
- Config Portb.0 = Input
- Taster Alias Pinb.0
- Portb.0 = 1
If Taster = 0 Then'Taster =0 'wir erinnern uns, wir fragen den Taster invertiert ab
... End If
Ein Würfel hat bekanntlich 6 Seiten, also haben wir auch 6 verschiedene "Augenmuster", welche wir darstellen möchten. Wenn wir den Taster nun betätigen sollen diese 6 möglichen Zustände in schneller Folge durchlaufen werden und zwar in so schneller Folge, dass die einzelnen Zustände nicht erkennbar sind. Wir benötigen also wieder eine Zählvariable, die von 1 bis 6 zählen kann. Der Zählerstand soll sich zudem beispielsweise alle 10 Milliskunden ändern. Das reicht aus, um die einzelnen Anzeigemöglichkeiten nicht mehr zu erkennen.
Fügen wir die notwendigen Zeilen dem Programm hinzu:
BASCOM-Quellcode
- '************************************************************
- ' Kleiner Mikrocontroller Einsteigerkurs
- ' (c) 2013-2015 ceperiga
- '------------------------------------------------------------
- ' Projektinfos: www.bascomforum.de
- '------------------------------------------------------------
- ' Stufe 1: Attiny 13
- '------------------------------------------------------------
- 'Informationen zur CC-Lizensierung:http://creativecommons.org
- '============================================================
- ' Name:
- ' Unit: 1.2.3
- '------------------------------------------------------------
- 'Beschreibung: Einfaches Würfelprogramm
- '************************************************************
- $regfile = "attiny13.dat" 'verwendeter Controller
- $crystal = 1200000 'Taktfrequenz
- $hwstack = 6
- $swstack = 6
- $framesize = 28
- '==============================================================================
- 'Ausgänge / Eingänge deklarieren / Aliasvergabe
- '------------------------------------------------------------------------------
- '
- '==============================================================================
- Config Portb.1 = Output
- Config Portb.2 = Output
- Config Portb.3 = Output
- Config Portb.4 = Output
- W1 Alias Portb.1
- W2 Alias Portb.2
- W3 Alias Portb.3
- W4 Alias Portb.4
- Config Portb.0 = Input
- Taster Alias Pinb.0
- Portb.0 = 1
- Dim I As Byte
- I = 1 'Die 0 brauchen wir nicht, wir beginnen bei 1
- '==============================================================================
- 'Hauptprogramm
- '------------------------------------------------------------------------------
- Do
- If Taster = 0 Then
- I = I + 1
- If I = 7 Then I = 1
- Waitms 10
- End If
- Loop
Wie Ihr im Programm gesehen habt, zählen wir natürlich bis 7 und setzen die Variable I dann sofort zurück auf 1. Das geht so schnell, dass das Programm nur mit den Zählerständen 1 bis 6 arbeitet.
Auswertung und Umwandlung in die Würfelbilder
Bleibt als letzte Aufgabe die Zuordnung der Augenbilder zu den Zählerständen. Die könnten wir auf die bereits bekannte Art und Weise über eine IF- Abfrage realisieren. Da wir unsere Kenntnisse weiter vertiefen möchten gehen wir hier einen anderen Weg. Wir nutzen zurAuswertung den Befehl Select Case
WIKI-Logo Merktext.jpg
Mit Select Case können wir eine Variable auf mehrere unterschiedliche Werte, oder aber auch Wertbereiche (z.B.: 2 bis 5) abfragen und bei zutreffenden Bedingungen unterschiedliche Befehle ausführen lassen.
In unserem Fall verwenden wir ja die Zählvariable I, die wir auswerten möchten. Sehen wir uns einmal an, wie die Variable I auf die 6verschiedenen Zustände hin ausgewertet werden kann:
BASCOM-Quellcode
Der Befehl Select Case wird immer gefolgt von der auszuwertenden Variablen verwendet. Danach folgen die gewünschten Auswertungen. Hierbei müssen nicht alle Möglichkeiten Verwendung finden. Im unserem Beispiel wäre es auch möglich nur nach 1,3 und 6 abzufragen. Die Auswertung mit Select Case endet immer mit End Select
Ergänzen wir die Auswertung mit der passenden LED- Ansteuerung und fassen dies gleich im Programm zusammen:
BASCOM-Quellcode
- '************************************************************
- ' Kleiner Mikrocontroller Einsteigerkurs
- ' (c) 2013-2015 ceperiga
- '------------------------------------------------------------
- ' Projektinfos: www.bascomforum.de
- '------------------------------------------------------------
- ' Stufe 1: Attiny 13
- '------------------------------------------------------------
- 'Informationen zur CC-Lizensierung:http://creativecommons.org
- '============================================================
- ' Name:
- ' Unit: 1.2.3
- '------------------------------------------------------------
- 'Beschreibung: Einfaches Würfelprogramm
- '************************************************************
- $regfile = "attiny13.dat" 'verwendeter Controller
- $crystal = 1200000 'Taktfrequenz
- $hwstack = 6
- $swstack = 6
- $framesize = 28
- '==============================================================================
- 'Ausgänge / Eingänge deklarieren / Aliasvergabe
- '------------------------------------------------------------------------------
- '
- '==============================================================================
- Config Portb.1 = Output
- Config Portb.2 = Output
- Config Portb.3 = Output
- Config Portb.4 = Output
- W1 Alias Portb.1
- W2 Alias Portb.2
- W3 Alias Portb.3
- W4 Alias Portb.4
- Config Portb.0 = Input
- Taster Alias Pinb.0
- Portb.0 = 1
- Dim I As Byte
- I = 1
- '==============================================================================
- 'Hauptprogramm
- '------------------------------------------------------------------------------
- Do
- If Taster = 0 Then
- I = I + 1
- If I = 7 Then I = 1
- Waitms 10
- End If
- Select Case I
- Case 1: 'LEDs für die 1 leuchten
- W1 = 0
- W2 = 0
- W3 = 1
- W4 = 0
- Case 2: 'LEDs für die 2 leuchten
- W1 = 1
- W2 = 0
- W3 = 0
- W4 = 0
- Case 3: 'LEDs für die 3 leuchten
- W1 = 1
- W2 = 0
- W3 = 1
- W4 = 0
- Case 4: 'LEDs für die 4 leuchten
- W1 = 1
- W2 = 0
- W3 = 0
- W4 = 1
- Case 5: 'LEDs für die 5 leuchten
- W1 = 1
- W2 = 0
- W3 = 1
- W4 = 1
- Case 6: 'LEDs für die 6 leuchten
- W1 = 1
- W2 = 1
- W3 = 0
- W4 = 1
- End Select
- Loop
- End 'end program
Hier die Animation des laufenden Programmes, wenn der Taster gedrückt wird. Bei losgelassenem Taster wird natürlich eine der möglichen 6 Kombinationen angezeigt. (Auf der Platine geht das noch etwas schneller als hier in der Animation)
Würfel 10ms.gif
Verbesserte Ansteuerung der Augenbilder
Nachdem Ihr jetzt das Programm hoffentlich hinreichend ausprobiert habt,wollen wir uns einigen Veränderungen widmen. Hier wäre zuerst die Auswertung in Select Case. Das funktioniert zwar recht gut, aber wir möchten unseren Programmierstil noch etwas verfeinern.
Um mehrere Portpins gleichzeitig zu setzen gibt es in derMikrocontrollertechnik eine bequeme Möglichkeit, deren Erklärung nicht ganz einfach ist. Dazu müssen wir ein wenig ausholen und der Attiny 13 ist nicht das beste Beispiel um dies zu erklären, da er nicht genug Portpins besitzt. Aber davon lassen wir uns nicht abschrecken:
Die Controllervarianten der Attiny und Atmega- Familie von ATMEL sind in 8Bit- Technologie aufgebaut. Das bedeutet ein kompletter Port (zum Beispiel PortB, wie Ihr ihn aus unseren Programmen kennt) hat bei den "größeren" Controllern in seiner Gesamtgröße 8 Ein- oder Ausgänge. Die Portpins sind von rechts nach links aufsteigend durchnumeriert und das nicht von 1 bis 8, sondern von 0 bis 7.
WIKI-Logo Wichtig.jpg
Numerierungsrichtung und deren Wertigkeit sind für unsere Verwendung von größter Wichtigkeit, denn anderenfalls passt das Ergebnis nicht zu unseren Vorstellungen
Anhand einer Tabelle läßt sich das gut erkennen:
A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
Portb.7 | Portb.6 | Portb.5 | Portb.4 | Portb.3 | Portb.2 | Portb.1 | Portb.0 |
Wie wir wissen, kann eine Ausgang entweder eingeschaltet oder ausgeschaltet sein, also entweder 0 oder 1 sein. Darüber hinaus wissen wir, dass man für die ausschließliche Schreibweise mit 0 und 1 das Binärsystem verwendet und genau diese Schreibweise können wir uns bei der Ausgabe unserer Würfelbilder zu Nutze machen.
WIKI-Logo Merktext.jpg
Um einen Wert in BASCOM binär darzustellen, stellt man der Null- Einserkette die Kombination &B voraus
Um jetzt beispielsweise alle Ausgänge an PortB einzuschalten schreiben wir einfach:
PortB= &B11111111
Um alle Ausgänge gleichzeitig auszuschalten:
PortB= &B00000000
Selbstverständlich sind auch alle Kombinationen erlaubt. Beispielsweise:
PortB=&B00110101
PortB=&B11100010
PortB=&B01011111
PortB=&B11111001
Nun habe ich zu Anfang dieses Kapitels erklärt, dass der Attiny 13 nicht so gut für die Erklärung geeignet ist, da er nicht alle 8 Ausgänge von Port B zur Verfügung stellt. So schwer ist es jetzt aber auch nicht, denn wie Ihr derTabelle oben entnehmen könnt beginnen wir rechts mit PortB.0 und gehen weiternach links zu PortB.4. Lediglich PortB.5 bis PortB.7 sind nicht vorhanden. Da BASCOM eine Binärzahl, die weniger als 8 Stellen hat von rechts beginnend (also von 0 an) verarbeitet, lassen wir in unserem Programm die fehlenden 3 Stelleneinfach weg:
A4 | A3 | A2 | A1 | A0 |
Portb.4 | Portb.3 | Portb.2 | Portb.1 | Portb.0 |
Wenn wir bei unserem Attiny 13 alle Ausgänge einschalten wollen schreiben wir:
&B11111
Alles ausschalten geht analog dazu:
&B00000
Was passiert mit Eingängen beim binären setzen von Ausgängen?
Auf etwas müssen wir bei unserem Programm noch achten:
PortB.0 ist in unserem Fall ja kein Ausgang, sondern ein Eingang. Was nun? -Kein Problem, für PortB.0 setzen wir in unserem Programm immer eine 1.
Warum schreiben wir für PortB.0 keine 0? -Weil wir den Taster mit If auf 0 abfragen und das Programm bei jeder Ausgabe in der Annahme wäre, derTaster wäre gedrückt.
So sehen die einzelnen binären Ausgaben für unsere 6 verschiedenenWürfelbilder aus:
Schauen wir uns das veränderte Programm einmal an. Wie Ihr seht benötigen wir die Aliasbezeichnungen W1, W2, W3 und W4 nicht mehr. Diese können folglich entfallen.
Über die binäre Schreibweise wird nun bei jeder Case- Auswertung das entsprechende LED- Muster angesteuert. Kurz und kompakt.
BASCOM-Quellcode
- '************************************************************
- ' Kleiner Mikrocontroller Einsteigerkurs
- ' (c) 2013-2015 ceperiga
- '------------------------------------------------------------
- ' Projektinfos: www.bascomforum.de
- '------------------------------------------------------------
- ' Stufe 1: Attiny 13
- '------------------------------------------------------------
- 'Informationen zur CC-Lizensierung:http://creativecommons.org
- '============================================================
- ' Name:
- ' Unit: 1.2.4
- '------------------------------------------------------------
- 'Beschreibung: Einfaches Würfelprogramm mit binärer Ausgabe
- '************************************************************
- $regfile = "attiny13.dat" 'verwendeter Controller
- $crystal = 1200000 'Taktfrequenz
- $hwstack = 6 'Stackwerte und Framesize weisen
- $swstack = 6 'Speicherbereiche zu
- $framesize = 28
- '==============================================================================
- 'Ausgänge / Eingänge deklarieren / Aliasvergabe
- '------------------------------------------------------------------------------
- '
- '==============================================================================
- Config Portb.1 = Output
- Config Portb.2 = Output
- Config Portb.3 = Output
- Config Portb.4 = Output
- Config Portb.0 = Input
- Taster Alias Pinb.0
- Portb.0 = 1
- Dim I As Byte
- I = 1
- '==============================================================================
- 'Hauptprogramm
- '------------------------------------------------------------------------------
- Do
- If Taster = 0 Then
- I = I + 1
- If I = 7 Then I = 1
- Waitms 10
- End If
- Select Case I
- Case 1
- Portb = &B01001 'LEDs für die 1 leuchten
- Case 2
- Portb = &B00011 'LEDs für die 2 leuchten
- Case 3
- Portb = &B01011 'LEDs für die 3 leuchten
- Case 4
- Portb = &B10011 'LEDs für die 4 leuchten
- Case 5
- Portb = &B11011 'LEDs für die 5 leuchten
- Case 6
- Portb = &B10111 'LEDs für die 6 leuchten
- End Select
- Loop
- End 'end program
Von der ehrlichen Anwendung zum Mogelwürfel ist es nur ein kleiner Schritt
Manche Zeitgenossen schaffen es nicht, sich bei "Mensch ärgere Dich nicht" doch nicht zu ärgern, zumal die dringend benötigten Sechsen einfach nicht kommen wollen. Wer den elektronischen Würfel benutzt, kann dem leicht nachhelfen und ich habe damit die Gelegenheit eine weitere Variation von Select Case vorzustellen.
Statt bis 6 (7) lassen wir den Würfel einfach bis 8 (9) zählen und ergänzen Select Case für die Anzeige der 6 einfach ein klein wenig. Mit Case 6 to 8 wird sowohl bei Zählerstand 6, als auch bei Zählerstand 7 und 8 das Augenbild der 6 angezeigt.
BASCOM-Quellcode
- '************************************************************
- ' Kleiner Mikrocontroller Einsteigerkurs
- ' (c) 2013-2015 ceperiga
- '------------------------------------------------------------
- ' Projektinfos: www.bascomforum.de
- '------------------------------------------------------------
- ' Stufe 1: Attiny 13
- '------------------------------------------------------------
- 'Informationen zur CC-Lizensierung:http://creativecommons.org
- '============================================================
- ' Name:
- ' Unit: 1.2.5
- '------------------------------------------------------------
- 'Beschreibung: Mogelwürfel mit binärer Ausgabe
- '************************************************************
- $regfile = "attiny13.dat" 'verwendeter Controller
- $crystal = 1200000 'Taktfrequenz
- $hwstack = 6 'Stackwerte und Framesize weisen
- $swstack = 6 'Speicherbereiche zu
- $framesize = 28
- '==============================================================================
- 'Ausgänge / Eingänge deklarieren / Aliasvergabe
- '------------------------------------------------------------------------------
- '
- '==============================================================================
- Config Portb.1 = Output
- Config Portb.2 = Output
- Config Portb.3 = Output
- Config Portb.4 = Output
- Config Portb.0 = Input
- Taster Alias Pinb.0
- Portb.0 = 1
- Dim I As Byte
- I = 1
- '==============================================================================
- 'Hauptprogramm
- '------------------------------------------------------------------------------
- Do
- If Taster = 0 Then
- I = I + 1
- If I = 9 Then I = 1 'wir zählen einfach bis 8 (aus 9 wird ja sofort 1)
- Waitms 10
- End If
- Select Case I
- Case 1
- Portb = &B01001 'LEDs für die 1 leuchten
- Case 2
- Portb = &B00011 'LEDs für die 2 leuchten
- Case 3
- Portb = &B01011 'LEDs für die 3 leuchten
- Case 4
- Portb = &B10011 'LEDs für die 4 leuchten
- Case 5
- Portb = &B11011 'LEDs für die 5 leuchten
- Case 6 To 8 'Die Anzeige gilt jetzt für 6,7 und 8 !!!
- Portb = &B10111 'LEDs für die 6 leuchten
- End Select
- Loop
- End 'end program
14.310 mal gelesen