Fortsetzung:
Von Bits, Bytes, Arrays & Co.
Bascom kennt verschiedene Variablentypen (siehe auch Bascom-Hilfe - lesen schadet nie)
Folgende Variablentypen werden im obigen Code genutzt:
Die kleinste Variable ist das
Bit, Es kann entweder einen Wert von 0 oder von 1 haben.
Das
Byte besteht aus 8 Bit, Wert 0 - 255 oder binär: &B00000000 - &B11111111. 1 = &B00000001
Das
Word besteht aus 2 Byte bzw. 16 Bit, Wert 0 - 65535 oder binär: &B0000000000000000 - &B1111111111111111. 1 = &B0000000000000001
Das
Array sind durchnummerierte Variablen
gleichen Namens und Typs: Ente(1), Ente(2), ... Ente(n)
Bascom legt Arrays standardmäßig von 1 - nicht von 0 - ausgehend an. Seltsam. Normalerweise gibt's keine Ente(0).
Das lässt sich mit dem Base-Befehl ändern - brauchen wir hier aber nicht.
Das wars auch schon.
Nun zum Programm:
Das Tralala in Zeilen 13 - 17 kennt Ihr schon. Wir haben den Tiny aber von der Leine gelassen und auf 8 MHz Takt eingestellt (siehe unten).
Neu ist die Deklaration von Variablen in Zeilen 21 - 24.
In Bascom müssen Variable wie folgt deklariert werden:
Dim <Variablenname> As <Variablentyp>
Ein Array so:
Dim <Variablenname>(<Anzahl>) As <Variablentyp>
Es folgt Eure Spielwiese (Zeilen 32 - 41), dazu später mehr.
Da wir die Pins 12 - 19 benutzen, die "zufällig" PB0 - PB7 sind, können wir in Zeile 51 mit
Config PortB = Output
den kompletten Port B für die Ausgabe konfigurieren.
Config PortB.0 = Output
Config PortB.1 = Output
Config PortB.2 = Output
...
Config PortB.7 = Output
würde aber auch funktionieren.
Im Folgenden bekommt unsere Led1 Geschwisterchen: Led2 - Led4 bzw. Led8 (Zeilen 53 - 59)
Danach haben wir eine Zählschleife in Zeilen 61 - 66:
For I = 1 To 4
...
Next I
Das bedeutet, dass der Variablen I der Wert 1 zugewiesen wird und sich bei Erreichen von Next I um eins erhöht.
Die Schleife läuft also viermal durch, dann geht es weiter. Aufpassen: nach Beendigung der Schleife hat I den Wert 5, nicht 4!
Macht hier nix aus, ist aber wissenswert.
Innerhalb der Schleife finden wir Bekanntes aus "WM Blinker1.bas".
Led1 wird also viermal im Sekundentakt blinken.
Wozu?
Weicht die Blinkfrequenz deutlich vom Sekundentakt ab, so stimmen
$crystal und der reale Controllertakt nicht überein.
Aufgaben nicht gemacht? 
Wenn der Takt stimmt, könnt Ihr diese Kontrolle natürlich aus dem Code löschen.
Danach geht's ins Hauptprogramm.
Endlosschleife und darin eine Zählschleife und sonst nix.
Was passiert da?
I fängt bei 0 an und zählt bis zum Wert der Variablen "Sequenz", voreingestellt auf 15. Also 16 Durchläufe, bis I wieder auf 0 gesetzt wird und wieder bis 15 zählt.
Ihr erinnert Euch noch an den Variablentyp Word? Eine Word-Variable besteht aus 16 Bits: Bit 0 - Bit 15. 1 = &B0000000000000001 Bit 0 ist also ganz rechts (aber nicht braun...).
In der Schleife schalten wir LedX an oder aus, je nach dem gelesenen Bit der Variable Led_sequenz(X): 1=an, 0=aus.
Dann warten wir eine Anzahl von Millisekunden, die durch die Variable "Impuls" festgelegt ist.
Beispiel:
Led_sequenz(1) = &B0000010100000101
Im ersten Zählschleifendurchlauf, bei dem I=
0 ist, wird Led1 mit
Led1 = Led_sequenz(1).I
eingeschaltet, weil das
Bit 0 (das ganz rechts) den Wert
1 hat.
Im zweiten Zählschleifendurchlauf, bei dem I=
1 ist, wird Led1 mit
Led1 = Led_sequenz(1).I
ausgeschaltet, weil das
Bit 1 (das zweite von rechts) den Wert
0 hat.
Im dritten Zählschleifendurchlauf, bei dem I=
2 ist, wird Led1 mit
Led1 = Led_sequenz(1).I
eingeschaltet, weil das
Bit 2 (das dritte von rechts) den Wert
1 hat.
... und so weiter, bis nach Bit 15 wieder Bit 0 abgefragt wird.
Dazu die "Spielwiese"
Hier könnt Ihr für 4 bzw. 8 LEDs individuelle Blinkmuster erzeugen:
Mit dem Wert von "Impuls" die Geschwindigkeit festlegen und mit dem Wert von "Sequenz" die Anzahl der abgefragten Bits (von rechts nach links, gelle!) festlegen.
Es könnte ja sein, dass jemand z. B. Rundumleuchten mit 5 LEDs baut. Dann holpert das mit 16 Schaltzuständen.
"Sequenz" dann besser den Wert 14 (15 Schaltzustände, wir zählen ab 0!) zuweisen.
Wem 16 Schaltzustände nicht reichen sollten - wir können auch ganz einfach auch 32 mit geringstem Aufwand realisieren. Einfach fragen.
Das wars auch schon - nix Besonderes.
8 MHz oder: Tiny unleashed
Hier zeigen wir Euch, wie der Tiny auf 8 MHz Takt eingestellt wird.
Wir "schrauben" an den sogenannten Fuse-Bits, der hardwareseitigen Einstellung des Mikrocontrollers.
Vorsicht! Hier kann man auch dem µC unbrauchbar machen!
Startet Bascom; WM Blinker2 sollte das aktuelle Programm sein.
Syntax checken, kompilieren, "Program chip", danach "Identify chip" klicken und im neuen Fenster auf "Fuse Bits" klicken
Der Tiny arbeitet intern schon mit 8 MHz; jedoch ist ein Divisor von 8 werksmäßig aktiviert.
Wählt bei Fuse Bit C statt "Divider by 8 enabled" "Divider by 8 disabled" aus.
Der vorher ausgegraute Button "Write FS" wird auswählbar. Draufklicken.
NICHT auf den Button "Write PRG" - der hat beim USBASP keine Wirkung und vermüllt nur das Programm.
Ein Klick auf den Button "Refresh" zeigt, ob die Änderung erfolgreich war.
Fertsch. Der Tiny läuft jetzt auf 8 MHz Nominaltakt.
Alle acht Kanäle freischalten
Um alle acht Kanäle freizuschalten, überweisen Sie bitte...
NEEEE.
Die M&Ms machen nur Spaß.
- Beschaltet PB.4 - PB.7 mit Vorwiderständen und low current-LEDs
- Speichert WM Blinker2.bas unter WM Blinker2_8Kanal.bas ab
- Entfernt die Hochkommata in Zeilen 56 - 59
- Entfernt die Hochkommata in Zeilen 74 - 77
Und? Wer ahnt es?
Genau.
- Ändert das Array von 4 auf 8 Words. Zeile 22 ist dann:
Dim Led_sequenz(8) As Word '
8 LED-Sequenzen à 16 Schaltzustände
Fertig. Syntax-Check, kompilieren, programmieren, freuen.
Und dann: Die Bundesblinkminister warnen: Suchtgefahr!
Nee, schlimmer!
OK. Aber jetzt!
SPIELEN! JAAAAA!
Schalten Sie auch nächstes Mal wieder ein, wenn sie die M&Ms sagen hören: "Mehr Licht!"
Viele Grüße
Mathias & Micha
P.S. Diesmal keine Hausaufgaben, weil Ihr wegen des Spielens eh' keine Zeit hättet.
Inhaltsverzeichnis aller Projekt-Posts in Post 1