MCK 1.2.2 Elektronischer Würfel

This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

  • Elektronischer Würfel mit Tasterbedienung unter Verwendung von Select Case
    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:



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


    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 Source Code

    1. '************************************************************
    2. ' Kleiner Mikrocontroller Einsteigerkurs
    3. ' (c) 2013-2015 ceperiga
    4. '------------------------------------------------------------
    5. ' Projektinfos: www.bascomforum.de
    6. '------------------------------------------------------------
    7. ' Stufe 1: Attiny 13
    8. '------------------------------------------------------------
    9. 'Informationen zur CC-Lizensierung:http://creativecommons.org
    10. '============================================================
    11. ' Name:
    12. ' Unit: 1.2.3
    13. '------------------------------------------------------------
    14. 'Beschreibung: Einfaches Würfelprogramm
    15. '************************************************************
    16. $regfile = "attiny13.dat" 'verwendeter Controller
    17. $crystal = 1200000 'Taktfrequenz
    18. $hwstack = 6
    19. $swstack = 6
    20. $framesize = 28
    21. '==============================================================================
    22. 'Ausgänge / Eingänge deklarieren / Aliasvergabe
    23. '------------------------------------------------------------------------------
    24. '
    25. '==============================================================================
    26. Config Portb.1 = Output
    27. Config Portb.2 = Output
    28. Config Portb.3 = Output
    29. Config Portb.4 = Output
    30. W1 Alias Portb.1
    31. W2 Alias Portb.2
    32. W3 Alias Portb.3
    33. W4 Alias Portb.4
    34. Config Portb.0 = Input
    35. Taster Alias Pinb.0
    36. Portb.0 = 1
    Display All
    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:

    BASCOM Source Code

    1. '************************************************************
    2. ' Kleiner Mikrocontroller Einsteigerkurs
    3. ' (c) 2013-2015 ceperiga
    4. '------------------------------------------------------------
    5. ' Projektinfos: www.bascomforum.de
    6. '------------------------------------------------------------
    7. ' Stufe 1: Attiny 13
    8. '------------------------------------------------------------
    9. 'Informationen zur CC-Lizensierung:http://creativecommons.org
    10. '============================================================
    11. ' Name:
    12. ' Unit: 1.2.3
    13. '------------------------------------------------------------
    14. 'Beschreibung: Einfaches Würfelprogramm
    15. '************************************************************
    16. $regfile = "attiny13.dat" 'verwendeter Controller
    17. $crystal = 1200000 'Taktfrequenz
    18. $hwstack = 6
    19. $swstack = 6
    20. $framesize = 28
    21. '==============================================================================
    22. 'Ausgänge / Eingänge deklarieren / Aliasvergabe
    23. '------------------------------------------------------------------------------
    24. '
    25. '==============================================================================
    26. Config Portb.1 = Output
    27. Config Portb.2 = Output
    28. Config Portb.3 = Output
    29. Config Portb.4 = Output
    30. W1 Alias Portb.1
    31. W2 Alias Portb.2
    32. W3 Alias Portb.3
    33. W4 Alias Portb.4
    34. Config Portb.0 = Input
    35. Taster Alias Pinb.0
    36. Portb.0 = 1
    37. Dim I As Byte
    38. I = 1 'Die 0 brauchen wir nicht, wir beginnen bei 1
    39. '==============================================================================
    40. 'Hauptprogramm
    41. '------------------------------------------------------------------------------
    42. Do
    43. If Taster = 0 Then
    44. I = I + 1
    45. If I = 7 Then I = 1
    46. Waitms 10
    47. End If
    48. Loop
    Display All

    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




    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 Source Code

    1. Select Case I
    2. Case 1:
    3. 'LEDs für die 1 leuchten
    4. Case 2:
    5. 'LEDs für die 2 leuchten
    6. Case 3:
    7. 'LEDs für die 3 leuchten
    8. Case 4:
    9. 'LEDs für die 4 leuchten
    10. Case 5:
    11. 'LEDs für die 5 leuchten
    12. Case 6:
    13. 'LEDs für die 6 leuchten
    14. End Select
    Display All



    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 Source Code

    1. '************************************************************
    2. ' Kleiner Mikrocontroller Einsteigerkurs
    3. ' (c) 2013-2015 ceperiga
    4. '------------------------------------------------------------
    5. ' Projektinfos: www.bascomforum.de
    6. '------------------------------------------------------------
    7. ' Stufe 1: Attiny 13
    8. '------------------------------------------------------------
    9. 'Informationen zur CC-Lizensierung:http://creativecommons.org
    10. '============================================================
    11. ' Name:
    12. ' Unit: 1.2.3
    13. '------------------------------------------------------------
    14. 'Beschreibung: Einfaches Würfelprogramm
    15. '************************************************************
    16. $regfile = "attiny13.dat" 'verwendeter Controller
    17. $crystal = 1200000 'Taktfrequenz
    18. $hwstack = 6
    19. $swstack = 6
    20. $framesize = 28
    21. '==============================================================================
    22. 'Ausgänge / Eingänge deklarieren / Aliasvergabe
    23. '------------------------------------------------------------------------------
    24. '
    25. '==============================================================================
    26. Config Portb.1 = Output
    27. Config Portb.2 = Output
    28. Config Portb.3 = Output
    29. Config Portb.4 = Output
    30. W1 Alias Portb.1
    31. W2 Alias Portb.2
    32. W3 Alias Portb.3
    33. W4 Alias Portb.4
    34. Config Portb.0 = Input
    35. Taster Alias Pinb.0
    36. Portb.0 = 1
    37. Dim I As Byte
    38. I = 1
    39. '==============================================================================
    40. 'Hauptprogramm
    41. '------------------------------------------------------------------------------
    42. Do
    43. If Taster = 0 Then
    44. I = I + 1
    45. If I = 7 Then I = 1
    46. Waitms 10
    47. End If
    48. Select Case I
    49. Case 1: 'LEDs für die 1 leuchten
    50. W1 = 0
    51. W2 = 0
    52. W3 = 1
    53. W4 = 0
    54. Case 2: 'LEDs für die 2 leuchten
    55. W1 = 1
    56. W2 = 0
    57. W3 = 0
    58. W4 = 0
    59. Case 3: 'LEDs für die 3 leuchten
    60. W1 = 1
    61. W2 = 0
    62. W3 = 1
    63. W4 = 0
    64. Case 4: 'LEDs für die 4 leuchten
    65. W1 = 1
    66. W2 = 0
    67. W3 = 0
    68. W4 = 1
    69. Case 5: 'LEDs für die 5 leuchten
    70. W1 = 1
    71. W2 = 0
    72. W3 = 1
    73. W4 = 1
    74. Case 6: 'LEDs für die 6 leuchten
    75. W1 = 1
    76. W2 = 1
    77. W3 = 0
    78. W4 = 1
    79. End Select
    80. Loop
    81. End 'end program
    Display All
    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)



    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.





    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:


    A7A6A5A4A3A2A1A0
    Portb.7Portb.6Portb.5Portb.4Portb.3Portb.2Portb.1Portb.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.



    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:


    A4A3A2A1A0
    Portb.4Portb.3Portb.2Portb.1Portb.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:

    BASCOM Source Code

    1. 'PORTB. 43210
    2. Portb = &B01001 'LEDs für die 1 leuchten
    3. Portb = &B00011 'LEDs für die 2 leuchten
    4. Portb = &B01011 'LEDs für die 3 leuchten
    5. Portb = &B10011 'LEDs für die 4 leuchten
    6. Portb = &B11011 'LEDs für die 5 leuchten
    7. Portb = &B10111 'LEDs für die 6 leuchten

    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 Source Code

    1. '************************************************************
    2. ' Kleiner Mikrocontroller Einsteigerkurs
    3. ' (c) 2013-2015 ceperiga
    4. '------------------------------------------------------------
    5. ' Projektinfos: www.bascomforum.de
    6. '------------------------------------------------------------
    7. ' Stufe 1: Attiny 13
    8. '------------------------------------------------------------
    9. 'Informationen zur CC-Lizensierung:http://creativecommons.org
    10. '============================================================
    11. ' Name:
    12. ' Unit: 1.2.4
    13. '------------------------------------------------------------
    14. 'Beschreibung: Einfaches Würfelprogramm mit binärer Ausgabe
    15. '************************************************************
    16. $regfile = "attiny13.dat" 'verwendeter Controller
    17. $crystal = 1200000 'Taktfrequenz
    18. $hwstack = 6 'Stackwerte und Framesize weisen
    19. $swstack = 6 'Speicherbereiche zu
    20. $framesize = 28
    21. '==============================================================================
    22. 'Ausgänge / Eingänge deklarieren / Aliasvergabe
    23. '------------------------------------------------------------------------------
    24. '
    25. '==============================================================================
    26. Config Portb.1 = Output
    27. Config Portb.2 = Output
    28. Config Portb.3 = Output
    29. Config Portb.4 = Output
    30. Config Portb.0 = Input
    31. Taster Alias Pinb.0
    32. Portb.0 = 1
    33. Dim I As Byte
    34. I = 1
    35. '==============================================================================
    36. 'Hauptprogramm
    37. '------------------------------------------------------------------------------
    38. Do
    39. If Taster = 0 Then
    40. I = I + 1
    41. If I = 7 Then I = 1
    42. Waitms 10
    43. End If
    44. Select Case I
    45. Case 1
    46. Portb = &B01001 'LEDs für die 1 leuchten
    47. Case 2
    48. Portb = &B00011 'LEDs für die 2 leuchten
    49. Case 3
    50. Portb = &B01011 'LEDs für die 3 leuchten
    51. Case 4
    52. Portb = &B10011 'LEDs für die 4 leuchten
    53. Case 5
    54. Portb = &B11011 'LEDs für die 5 leuchten
    55. Case 6
    56. Portb = &B10111 'LEDs für die 6 leuchten
    57. End Select
    58. Loop
    59. End 'end program
    Display All

    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 Source Code

    1. '************************************************************
    2. ' Kleiner Mikrocontroller Einsteigerkurs
    3. ' (c) 2013-2015 ceperiga
    4. '------------------------------------------------------------
    5. ' Projektinfos: www.bascomforum.de
    6. '------------------------------------------------------------
    7. ' Stufe 1: Attiny 13
    8. '------------------------------------------------------------
    9. 'Informationen zur CC-Lizensierung:http://creativecommons.org
    10. '============================================================
    11. ' Name:
    12. ' Unit: 1.2.5
    13. '------------------------------------------------------------
    14. 'Beschreibung: Mogelwürfel mit binärer Ausgabe
    15. '************************************************************
    16. $regfile = "attiny13.dat" 'verwendeter Controller
    17. $crystal = 1200000 'Taktfrequenz
    18. $hwstack = 6 'Stackwerte und Framesize weisen
    19. $swstack = 6 'Speicherbereiche zu
    20. $framesize = 28
    21. '==============================================================================
    22. 'Ausgänge / Eingänge deklarieren / Aliasvergabe
    23. '------------------------------------------------------------------------------
    24. '
    25. '==============================================================================
    26. Config Portb.1 = Output
    27. Config Portb.2 = Output
    28. Config Portb.3 = Output
    29. Config Portb.4 = Output
    30. Config Portb.0 = Input
    31. Taster Alias Pinb.0
    32. Portb.0 = 1
    33. Dim I As Byte
    34. I = 1
    35. '==============================================================================
    36. 'Hauptprogramm
    37. '------------------------------------------------------------------------------
    38. Do
    39. If Taster = 0 Then
    40. I = I + 1
    41. If I = 9 Then I = 1 'wir zählen einfach bis 8 (aus 9 wird ja sofort 1)
    42. Waitms 10
    43. End If
    44. Select Case I
    45. Case 1
    46. Portb = &B01001 'LEDs für die 1 leuchten
    47. Case 2
    48. Portb = &B00011 'LEDs für die 2 leuchten
    49. Case 3
    50. Portb = &B01011 'LEDs für die 3 leuchten
    51. Case 4
    52. Portb = &B10011 'LEDs für die 4 leuchten
    53. Case 5
    54. Portb = &B11011 'LEDs für die 5 leuchten
    55. Case 6 To 8 'Die Anzeige gilt jetzt für 6,7 und 8 !!!
    56. Portb = &B10111 'LEDs für die 6 leuchten
    57. End Select
    58. Loop
    59. End 'end program
    Display All
    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.

    813 times viewed