Lernpaket Mikrocontroller Kap 3
3 Bascom-Grundlagen und Portzugriffe
Bascom AVR ist eine einfach
zu bedienende Entwicklungsumgebung für die Programmiersprache Basic. Damit
fallen die ersten Schritte nicht schwer. Der Einstieg gelingt besonders einfach
und schnell. Aber auch komplexe Aufgaben sind mit Bascom lösbar. Und der
spätere Umstieg auf größere AVR-Controller bereitet keine Schwierigkeiten.
3.1 BASCOM-AVR
Laden Sie zunächst die
aktuelle Version des Bascom-Compilers von der Seite des Herstellers MCS
Electronics. Sie können die frei verfügbare Demoversion verwenden, die auf eine
Programmgröße von 4 KB beschränkt ist. Zwar kann der Tiny85 Programme bis zu 8
KB verarbeiten, durch den eingesetzten Bootloader verringert sich der
Speicherplatz jedoch auf 6 KB. Alle Beispiele aus dem Lernpaket sind wesentlich
kleiner, sodass Sie kaum an die Begrenzung von 4 KB stoßen werden.
Zum Laden der Demoversion
gehen Sie auf www.mcselec.com und dann auf Downloads. Wählen Sie dann den
Ordner BASCOM und darin den Unterorder BASCOM AVR. Laden Sie die Software
BASCOM AVR Demo und folgen Sie den Instruktionen. Geben Sie als Speicherort
z.B. den Ordner LPmikro85 an. Bascom erzeugt darin den Ordner BASCOM-AVR und
darin neben vielen weiteren Dateien das ausführbare Programm bascavr.exe. Nach
der Installation muss der PC neu gestartet werden. Beim ersten Start des
Programms bascavr.exe erscheint ein leeres Editorfenster (Abb. 3.1).
Abb. 3.1: Der Editor in
Bascom
Falls weitere Fenster
erscheinen, können sie im Interesse der besseren Übersicht entfernt werden. Im
Menü Options/Environment/IDE haben Sie die Möglichkeit, die
Entwicklungsumgebung (Integreated Devellopment Environment, IDE) nach Ihren
Wünschen zu gestalten. Im Falle einer Fehlermeldung beim Start des Programms
kann Reset Docking helfen. Das Option-Menü wird mit der Esc-Taste verlassen.
Abb. 3.2: Optionen zur
Entwicklungsumgebung
Laden Sie das erste
Beispielprogramm mit dem Dateinamen Bink1.bas aus dem Verzeichnis Bascom85/Ports
in den Editor.
Abb. 3.3: Der Quelltext im
Editor
Sie haben bereits das fertig
übersetzte Programm Blink1.hex verwendet und wissen, dass eine LED am Port B3
langsam blinkt. Nun sehen Sie den Quelltext und können das Programm auch selbst
verändern.
Am Anfang des Programms
stehen einige Compiler-Anweisungen, die Sie vorläufig nicht verändern sollten
und die auch in den folgenden Programmen auftauchen werden. Hier teilen Sie dem
Compiler mit, dass es sich bei dem Zielsystem um einen ATtiny85 handelt und
dass er mit einem Takt von 8 MHz läuft. Außerdem werden bestimmte
Speicherbereiche reserviert, die Bascom üblicherweise benötigt.
Es folgt die Einrichtung
eines Portpins als Ausgangsport: Config Portb.3 = Output. Das entspricht der
Einstellung ddrb.3=1, die Sie bereits mit dem Interface-Programm verwendet
haben Alle anderen Anschlüsse bleiben nun hochohmige Eingänge.
Das Programm besteht im Kern
aus einer Do-Loop-Schleife. Alles zwischen Do und Loop wird endlos wiederholt.
Die Schleife kann nur mit einem Reset verlassen werden. Auch wenn Sie ein neues
Programm laden, wird zunächst ein Hardware-Reset ausgeführt.
Innerhalb der
Do-Loop-Schleife wird nun immer wieder der Port B3 ein- und ausgeschaltet. Der
Befehl Portb.3 = 1 beeinflusst nur dieses eine Portbit, alle anderen bleiben
unverändert auf 0. Der Wartebefehl Delayms 500 erzeugt eine Verzögerung von 500
Millisekunden, also von einer halben Sekunde. Insgesamt wird eine an B3
angeschlossene LED also im Sekundentakt blinken. Genau das wurde ja auch
beobachtet.
Übersetzen Sie das Programm
mit Program/Compile. Sie können auch die Funktionstaste F7 verwenden oder das
entsprechende Symbol (schwarzes IC) anklicken. Bei erfolgreicher Übersetzung
erscheint eine Nachricht, wieviel Prozent des verfügbaren Speichers verwendet
wurde. Außerdem erhalten Sie nun ein neues Hex-File.
Abb. 3.4: Erfolgreiche
Übersetzung
Sie können anhand des
Datei-Datums erkennen, dass das Programm neu übersetzt wurde. Mit LPmikro85.exe
können Sie es nun in den Controller laden oder den im nächsten Abschnitt
beschriebenen Bootloader direkt aus Bascom heraus nutzen.
Ändern Sie das Programm
einmal, indem Sie andere Verzögerungszeiten einfügen. Erzeugen Sie ganz nach
Belieben ein schnelleres oder langsameres Rechtecksignal oder auch
unsymmetrische Zeiten z.B. für kurze Lichtblitze.
'Blink1.bas
$regfile
= "attiny85.dat"
$crystal
= 8000000
$hwstack
= 8
$swstack
= 4
$framesize
= 4
Config
Portb.3 = Output
Do
Portb.3 = 1
Waitms 100
Portb.3 = 0
Waitms 900
Loop
End
Listing 3.1: Das veränderte
Blinkprogramm
Bauen Sie auch einmal
absichtlich einen Fehler ein indem Sie z.B. an das Schlüsselwort Waitms noch
ein x anhängen. Der Compiler liefert dann eine Fehlermeldung. Wenn Sie darauf
klicken, wird die fehlerhafte Zeile im Quelltext markiert. Eine weitere Hilfe
zur Vermeidung von Fehlern bietet schon der Editor, indem gültige
Schlüsselworte farblich hervorgehoben werden. Man sieht daher oft schon bei der
Eingabe, dass man sich vertippt hat.
Abb. 3.5: Eine Fehlermeldung
Alle Fragen zur Syntax
beantwortet die Bascom-Hilfe. Für nähere Informationen setzen Sie den
Mauszeiger auf ein Schlüsselwort und drücken F1. Für das Wort „do“ erhalten Sie
das Thema Do-Loop mit einer genauen Definition der Syntax und einem
Programmbeispiel.
Abb. 3.6: Verwendung der
Bascom-Hilfe
Auch nach längerer Zeit und
gründlicher Einarbeitung bietet die Hilfe immer noch nützliche Informationen.
Bei der Entwicklung neuer Programme hat es sich als hilfreich erwiesen, immer
erst mit einem Code-Schnipsel aus der Hilfe zu beginnen und es dann anzupassen.
3.2 Der Bootloader
Erfolgreich kompilierte
Bascom-Programme können jederzeit mit dem allgemeinen Werkzeug LPmikro85.exe in
den Controller geladen werden. Bascom bietet jedoch auch die Möglichkeit,
Programme direkt aus der Entwicklungsumgebung zu übertragen. Unter
Options/Programmer erhält man eine Übersicht, welche Programmiergeräte und
welche Programme unterstützt werden. Darunter befindet sich auch der MCS
Bootloader. Dabei handelt es sich um ein in Bascom geschriebenes Programm zur
Selbst-Programmierung, das sich bereits im Controller befinden muss. Eine
angepasste Version für den ATtiny85 (vgl. Kap. 7.6) findet man im
Grundverzeichnis unter dem Dateinamen Bootloader85.hex. Laden Sie dieses
Programm mit LPmikros85.exe in Ihren Controller.
Abb. 3.7: Übertragung des
Bootloaders
Beim Einlesen des Programms
wird sichtbar, dass weite Speicherbereiche im unteren Bereich nur FF FF FF ...
enthalten, was für leere Speicheradressen steht. Der Bootloader selbst liegt im
oberen Viertel des 8-KB-Flash und ist dafür programmiert, Programmdaten von
Bascom entgegenzunehmen und in die unteren Bereiche zu programmieren. Der
Bootloader ist recht umfangreich, sodass der Upload einige Minuten dauert. Das
ist jedoch nur einmal zur Vorbereitung erforderlich, während im späteren
Einsatz mit dem Bootloader viel Zeit gespart wird, weil die Übertragung
wesentlich schneller wird als mit der ISP-Programmierung mit LPmikro85.exe.
Beenden Sei nun das Programm
LPmikro85.exe, um die virtuelle serielle Schnittstelle (meist: COM2)
freizugeben. In Bascom sind noch einige Einstellungen erforderlich, damit die
Kommunikation mit dem Bootloader funktioniert. Wählen Sie in Options/Programmer
den MCS Bootloader aus. Stellen Sie die richtige COM-Schnittstelle (COM2) ein
und wählen Sie die Übertragungsgeschwindigkeit 9600 Baud.
Abb. 3.8: Einstellungen für
den Bootloader
Unter der Registerkarte MCS
Loader verbirgt sich eine weitere wichtige Einstellung. Hier wird DTR als
Reset-Leitung festgelegt. Bascom kann dann jederzeit ein laufendes Programm
unterbrechen um den Bootloader zu starten und neue Programmdaten hochzuladen.
Abb. 3.9: DTR als
Reset-Leitung
Damit sind alle Einstellungen
vollständig. Zum Test soll nun das Programm Bink1 erneut geladen werden,
diesmal direkt mit dem Bootloader. Die Übertragung wird gestartet mit
Program/Send to Chip oder mit F4 oder dem entsprechenden Symbol (grüne
Platine). Der Bootlaoder verwendet übrigens nicht das Hex-File sondern das
Bin-File des Programms, das ebenfalls beim Kompilieren erzeugt wird.
Abb. 3.10: Starten des
Bootloaders
Abb. 3.11: Der Upload-Vorgang
Der Ladevorgang ist nun
wesentlich schneller als bisher. Ein Fenster informiert über den Fortschritt
der Übertragung. Falls hier eine Fehlermeldung erscheint, könnte eine falsche
Einstellung die Ursache sein. Oder die serielle Schnittstelle ist noch belegt.
In dem Fall muss man das entsprechende Programm vorher schließen.
Mit dem Bootloader ist die
Programmentwicklung schnell und bequem. Quelltext ändern, Kompilieren (F7),
Übertragen (F4), fertig. Man sieht das Ergebnis, ändert wieder etwas, F7, F4,
das neue Programm läuft. Bei kleinen Änderungen dauert jeder Test nur wenige
Sekunden. Rapid Prototyping, mal eben in vielen kleinen Schritten etwas
ausprobieren und sich an das Endergebnis herantasten, das funktioniert nun
einwandfrei.
3.3 Ein Wechselblinker
Das zweite Beispielprogramm
bildet einen Wechselblinker, bei dem genau zehn Mal abwechselnd Port B3 und B4
eingeschaltet wird. Die For-Schleife verwendet die Variable N, die am Anfang
des Programms dimensioniert werden muss. Mit Dim N As Byte wird der Typ Byte
mit einem Zahlenbereich von 0 bis 255 festgelegt.
Auch die Portausgaben
verwenden diesmal Byte-Konstanten. Deshalb soll hier der Aufbau binärer Zahlen
genauer betrachtet werden. Digitale Systeme arbeiten mit Bits oder Gruppen von
Bits. Ein Bit kann nur die Zustände 0 oder 1 annehmen. Mit zwei Bits lassen
sich bereits vier unterschiedliche Zustände darstellen: 00, 01, 10 und 11
Zu einem Byte gehören acht
Bit. Ganz rechts steht das kleinste Bit mit der Wertigkeit 1, links folgende
Bits haben jeweils die doppelte Wertigkeit.
1
|
1
|
1
|
1
|
1
|
1
|
1
|
1
|
= 255
|
128
|
64
|
32
|
16
|
8
|
4
|
2
|
1
|
= 255
|
|
|
|
|
|
|
|
|
|
0
|
0
|
0
|
1
|
1
|
0
|
0
|
0
|
= 24
|
|
|
|
16
|
8
|
|
|
|
= 24
|
In Bascom kann eine Zahl
wahlweise dezimal, binär oder hexadezimal geschrieben werden. 24 =
&B00011000 = &H18. Im Hexadezimalsystem steht jede Ziffer für vier Bit
und hat daher einen Wertebereich von 0 bis 15 (1111 = 8+4+2+1 = 15). Die
Ziffern 0 bis 9 entsprechen denen im Dezimalsystem, die fehlenden sechs Ziffern
bildet man durch die Buchstaben A bis F. A steht also für 10, F für 15. Die
höchste in einem Byte darstellbare Zahl heißt FF und steht für 15 * 16 + 15 =
255. Ganz gleich ob eine Zahl in einem Programm dezimal, binär oder hexadezimal
geschrieben wird, das Ergebnis bleibt gleich. Die Verwendung von Binärzahlen
oder Hexadezimal kann jedoch die Lesbarkeit verbessern und helfen, Fehler zu
vermeiden.
Im ersten Blinkprogramm wurde
mit Portb.3 nur ein Bit des gesamten Ports B angesprochen. Man kann jedoch auch
alle Bits gemeinsam als ein Byte programmieren. Die Ports aller AVR-Controller
sind 8 Bit breit, sodass theoretisch Bit 0 bis Bit 8 angesprochen werden kann,
wobei der ATTiny85 nur die unteren fünf Bits B0 bis B4 an Anschlüsse führt. Mit
einem einzelnen Befehl PortB = 0 kann man alle Portanschlüsse ausschalten.
Durch andere Zahlen lassen sich beliebige Bitmuster einschalten.
In diesem Beispiel sollen die
beiden Leitungen B3 und B4 als Ausgänge verwendet und wechselseitig
umgeschaltet werden. Mit Config Portb = &B00011000 werden die Bits 3 und 4
in den Ausgangszustand versetzt. Mit gleicher Wirkung könnte man eine Hexadezimalzahl
(&H18) oder eine Dezimalzahl (24) einsetzen. Und statt Config Portb kann
man auch direkt das zugehörige Register ansprechen: Ddrb = 24. Das Listing
zeigt auskommentierte Zeilen mit der alternativen Schreibweise.
'Blink2.bas
$regfile
= "attiny85.dat"
$crystal
= 8000000
$hwstack
= 8
$swstack
= 4
$framesize
= 4
Dim
N As Byte
Config
Portb = &B00011000
'Ddrb
= 24
For
N = 1 To 10
Portb = 8 'B3
'Portb = &B00001000
Waitms 500
Portb = 16 'B4
'Portb = &B00010000
Waitms 500
Next
N
End
Listing 3.2: Das Programm
Blink2.bas
3.4 Geschwindigkeitstest
Ein Blinken ganz ohne
Wartebefehle wird so schnell, dass man nur noch ein gleichförmiges Leuchten
einer angeschlossenen LED erkennen kann. Diesmal wird der Toggle-Befehl
verwendet, mit dem man ein Bit umschaltet. Damit wird die Schleife extrem kurz
gehalten.
'Blink3.bas
Maximale Geschwindigkeit
$regfile
= "attiny85.dat"
$crystal
= 8000000
$hwstack
= 8
$swstack
= 4
$framesize
= 4
Config
Portb = &B00001000
Do
Toggle Portb.3
Loop
End
Listing 3.3: Rechteckausgabe
mit 1000 kHz
Tatsächlich entsteht ein
Rechtecksignal mit einer Frequenz von 1 MHz. Bei einer internen Taktrate von 8
MHz bedeutet das, dass nur acht Taktzyklen für die Schleife gebraucht werden.
Das zeigt, dass Bascom sehr effektiv ist und sich für Echtzeitanwendungen
eignet. Auch mit Assembler oder einem C-Compiler hätte man Schwierigkeiten, ein
noch schnelleres Signal zu erzeugen.
Das HF-Signal kann in einem
nahen Mittelwellenradio empfangen werden. Man hört ein Rauschen, weil der
Controller nicht mit einem Quarz arbeitet sondern seinen internen RC-Oszillator
verwendet. Mit einem Frequenzzähler erkennt man leichte Abweichungen bis etwa
20 kHz, was einer Toleranz von 2% entspricht.
3.5 Digitale Eingänge
Ein Portanschluss des Tiny85
kann wahlweise als Ausgang oder als Eingang verwendet werden. Nach dem
Einschalten oder einem Reset sind alle Ports zunächst Eingänge mit hohem
Eingangswiderstand, die mit CMOS-Eingängen vergleichbar sind. Ein Ausgang muss
über das Port-Richtungsregister explizit eingerichtet werden.
Das folgende Programm wertet
den Zustand des Eingangs B4 aus und kopiert ihn auf den Ausgang B3. Wenn also
am Eingang B4 ein High-Signal erscheint, wird auch B3 eingeschaltet. Der aktuelle
Eingangszustand kann nur über das Register PINB gelesen werden, während der
Ausgang über PORTB gesteuert wird.
'In1.bas
HiZ an B4
$regfile
= "attiny85.dat"
$crystal
= 8000000
$hwstack
= 8
$swstack
= 4
$framesize
= 4
Config
Portb = &B00001000
Do
Portb.3 = Pinb.4
Waitms 21
Loop
End
Listing 3.4: Auswerten eines
Eingangs
Der Zustand eines offenen
Eingangs kann nicht vorhergesagt werden. Eine an B3 angeschlossene LED ist also
entweder an oder aus. Schließen Sie einen Draht oder einen Widerstand an B4 an.
Mit einer kurzen Berührung kann der Zustand umgeschaltet werden. Bei einer
längeren Berührung sieht man meist ein gleichförmiges Blinken. Wie bereits bei
den Vorversuchen mit dem Oszilloskop wird auch hier ein 50-Hz-Signal
eingekoppelt. Der Eingangszustand wechselt daher mit einer Periode von 20 ms.
Die Wartezeit von 21 ms in der Programmschleife führt daher zu einer versetzten
Abtastung der Eingangsspannung. Erst nach 20 Durchgängen ist eine Schwingung
vollständig durchlaufen. Daraus folgt eine verringerte Frequenz der Ausgabe mit
einer Periode von 20 * 20 ms = 400 ms.
3.6 Eingang mit Pullup
Digitale Eingänge werden oft
verwendet, um Schalter oder Kontakte abzufragen. Ein hochohmiger Eingang ist
dazu nicht geeignet, weil der Zustand bei offenem Schalter zufällig wäre. Mit
einem internen Pullup- Widerstand ergibt sich dagegen ein eindeutiger
High-Zustand. Um den internen Pullup einzuschalten muss das Portregister
gesetzt werden währen das zugehörige Datenrichtungsregister gelöscht bleibt.
'In2.bas
Pullup an B4
$regfile
= "attiny85.dat"
$crystal
= 8000000
$hwstack
= 8
$swstack
= 4
$framesize
= 4
Config
Portb = &B00001000
Portb.4
= 1 'Pullup
Do
Portb.3 = Pinb.4
Waitms 21
Loop
End
Listing 3.5: Einschalten des
Pullup-Widerstands
3.7 Die UND-Funktion
Logische Grundfunktionen wie
UND, ODER und NICHT sind die Grundlage der digitalen Elektronik. Aus diesen
Funktionen lassen sich auch komplexere Schaltungen wie Speicher Zähler und
ganze Mikroprozessoren zusammensetzen.
Ein UND-Gatter verknüpft zwei
Eingänge mit der logischen AND-Funktion zu einem Ausgang. Nur wenn Eingang 1
und Eingang 2 gesetzt sind wird auch der Ausgang eingeschaltet. Das Programm
nach Listing 3.6 verwendet die Eingänge PB0 und PB2 sowie den Ausgang PB1.
Diese Anschlüsse sind über die serielle Schnittstelle zugänglich, sodass die
Funktion direkt vom PC aus getestet werden kann. Das Programm LPmikro85 enthält
für diesen Zweck die Registerkarte Ports.
'LogikAnd.bas
B0 und B2 verknüpft zu B1
$regfile
= "attiny85.dat"
$crystal
= 8000000
$hwstack
= 8
$swstack
= 4
$framesize
= 4
Config
Portb = &B00000010
Do
'AND
If Pinb.0 = 1 And Pinb.2 = 1 Then Portb.1 = 1 Else Portb.1 = 0
'NAND
'
If Pinb.0 = 1 And Pinb.2 = 1 Then Portb.1 = 0 Else Portb.1 = 1
'OR
'
If Pinb.0 = 1 Or Pinb.2 = 1 Then Portb.1 = 1 Else Portb.1 = 0
'NOR
'
If Pinb.0 = 1 Or Pinb.2 = 1 Then Portb.1 = 0 Else Portb.1 = 1
'XOR
'
If Pinb.0 <> Pinb.2 Then Portb.1 = 1 Else Portb.1 = 0
'XNOR
'
If Pinb.0 = Pinb.2 Then Portb.1 = 1 Else Portb.1 = 0
Loop
End
Listing 3.6: Nachbilden der
AND-Funktion
Abb. 3.12: Test der
AND-Funktion
Laden Sie das Programm und
testen Sie es auf der Registerkarte Ports im Programm LPmikro85.exe. Schalten
Sie die Eingänge PB0 und PB2 ein. Dann erscheint auch PB1 als eingeschaltet.
Wenn einer der beiden Eingänge aus ist oder wenn beide aus sind, wird auch der
Ausgang low. Achtung, die Pegel der Portleitungen sind gegenüber der
Darstellung im Terminal-Fenster invertiert, weil ein aktiver Zustand einem
Low-Zustand am Ausgang des USB/Seriell-Wandlers entspricht. Hier dagegen
bedeutet ein Häkchen einen High-Zustand.
Das Programm enthält
zusätzliche auskommentierte Programmzeilen für die logischen Grundfunktionen
NAND, OR, NOR, XOR und XNOR. Um sie zu testen muss man die NAND-Zeile
auskommentieren und an anderer Stelle ein Kommentarzeichen entfernen. Achtung,
für den Download über den MSC-Bootloader muss die virtuelle serielle
Schnittstelle (COM2) frei sein. Man muss daher das Programm LPmikro85.exe
schließen oder vorübergehend auf COM1 umschalten.
3.8 Das RS-Flipflop
Ein Flipflop ist eine
rückgekoppelte Schaltung, die zwei stabile Zustände kennt. Ausgangszustände
können durch bestimmte Eingangszustände oder -Ereignisse geändert werden.
Das RS-Flipflop besitzt einen
Reset-Eingang R und einen Set-Ausgang S. Mit einem Impuls an R wird der Ausgang
Q ausgeschaltet, mit einem Impuls an S eingeschaltet. Außerdem gibt es oft noch
einen invertierten Ausgang /Q. Je nach Typ des Flipflops können die Impulse
positiv oder negativ sein.
Das Programm LogikRS.bas bildet
ein RS-Flipflop mit zwei Eingängen, die auf positive Impulse reagieren. PB0
bildet den Set-Eingang, BP2 den Reset-Eingang. Der Ausgang Q liegt an PB1.
Außerdem gibt es noch einen Q-Ausgang an PB3 und einen /Q-Ausgang an B4. Hier können
zwei LEDs angeschlossen werden. Mit R und S können dann die Farben umgeschaltet
werden.
'LogikRS.bas
B0/B2 RS-Flipflop B1/B3/B4
$regfile
= "attiny85.dat"
$crystal
= 8000000
$hwstack
= 8
$swstack
= 4
$framesize
= 4
Config
Portb = &B00011010
Do
If Pinb.0 = 1 Then
Portb.1 = 1
Portb.3 = 1
Portb.4 = 0
Do
Loop Until Pinb.0 = 0
End If
If Pinb.2 = 1 Then
Portb.1 = 0
Portb.3 = 0
Portb.4 = 1
Do
Loop Until Pinb.2 = 0
End If
Loop
End
Listing 3.7: Das
RS-Flipflop
Abb. 3.13: Eingangsimpuls am
R-Eingang
3.9 Das D-Flipflop
Ein D-Flipflop ist die
kleinste Einheit eines Datenspeichers. Der Zustand an der Datenleitung D wird
in Q übernommen, wenn der Clock-Eingang high wird. Bei einem Low-Zustand an
Clock bleibt der letzte Zustand erhalten. Im Falle eines flankengetriggerten
D-Flipflops wird der Zustand an D immer nur bei einer Low-High-Flanke
übernommen. Dagegen ist ein transparentes D-Flipflop offen für neue Zustände,
solange Clock high ist.
Das Programm LogikDff.bas bildet
ein transparentes D-Flipflop nach. Solange Clock high ist, wird der Zustand von
D an Q übernommen. Zusätzlich gibt es an B3 einen Ausgang zum Anschluss einer
LED.
'LogikDff.bas
B0/B2 D-Flipflop B1/B3
$regfile
= "attiny85.dat"
$crystal
= 8000000
$hwstack
= 8
$swstack
= 4
$framesize
= 4
Config
Portb = &B00001010
Do
If Pinb.2 = 1 Then
Portb.1 = Pinb.0
Portb.3
= Pinb.0
End If
Loop
End
Listing 3.8: Das D-Flipflop
Das Programm fragt zuerst den
Clock-Eingang PB2 ab. Solange er low ist, wird zum Anfang der Schleife
verzweigt, sodass keine Zustandsänderungen an den Ausgängen stattfinden können.
Bei Clock = 1 wird der Zustand des D-Eingangs PB0 auf die Ausgänge kopiert. Testen
Sie das Programm mit der Registerkarte Ports. Solange PB2 eingeschaltet ist,
ist das Flipflop offen für Pegelwechsel an PB0. Wenn Sie aber PB2 ausschalten,
bleibt der letzte Zustand gespeichert.
Abb. 3.14: Gespeicherter
1-Zustand
3.10 Das Toggle-Flipflop
Ein Toggle-Flipflop hat nur
einen Eingang und einen Ausgang. Mit jedem Eingangsimpuls wechselt der
Ausgangspegel. Das bedeutet zugleich, dass eine Impulsfolge am Eingang zu einem
Ausgangsignal mit der halben Frequenz führt.
Das Programm LogikToggleFF.bas
verwendet eine Do-Loop-Schleife zur Erkennung einer negativen Impulsflanke am
Clock-Eingang B2. Dann wird der Ausgang invertiert. Eine zweite
Do-Loop-Schleife wartet, bis der Clock-Pegel wieder auf Eins geht. So wird bei
jedem Clock-Impuls der Ausgangszustand an PB1 invertiert. Außerdem wird das
dazu invertierte Signal an PB3 ausgegeben, wo man eine LED anschließen kann. Damit
bekommt man effektiv eine Frequenzteilung durch 2, weil zwei Eingangsimpulse zu
einem Ausgangsimpuls führen.
'LogikToggleFF.bas
B2 Toggle-Flipflop B1/B3
$regfile
= "attiny85.dat"
$crystal
= 8000000
$hwstack
= 8
$swstack
= 4
$framesize
= 4
Config
Portb = &B00001010
Portb.1
= 0
Portb.3
= 0
Do
Do
Loop Until Pinb.2 = 0
Toggle Portb.1
Toggle Portb.3
Waitms 20
Do
Loop Until Pinb.2 = 1
Waitms 20
Loop
End
Listing 3.9 Das
Toggle-Flipflop
Das Programm enthält
Wartezeiten von 20 ms, die zur Entprellung von Eingängen eingesetzt werden. Ein
außen angeschlossener Schalter zeigt üblicherweise ein Zurückprellen der
Kontakte, wobei rund eine Millisekunde lang mehrere An und Aus-Zustände
erscheinen. Ein schnelles Toggle-Flipflop würde dann mehrmals umschalten und in
einem zufälligen Zustand stehenbleiben. Mit einer kurzen Wartezeit wird aber
nur jeweils die erste Flanke ausgewertet.
Abb. 3.15: Umschalten mit
Impulsen an TXD
Das Programm reagiert auf
Impulse am Ausgang TXD der seriellen Schnittstelle. Sie können diese Signale
mit der Registerkarte Ports erzeugen. Alternativ können Sie auch das Terminal
verwenden, wenn TXD in „Ports“ ausgeschaltet ist. Tippen Sie unterschiedliche
Zeichen ein. Eine angeschlossene LED blinkt dann. Ein seriell über TXD
gesendetes Zeichen besteht meist aus mehreren Impulsen und entspricht damit
etwa einem prellenden Schalter. Die wirksame Entprellung durch kurze
Wartezeiten führt aber dazu, dass jede Taste nur einen Pegelwechsel am Ausgang
auslöst. Der Umgang mit dem Terminalprogramm wird im folgenden Abschnitt noch
genauer behandelt.