Lernpaket Mikrocontroller Kap 3       

Elektronik-Labor  Lernpakete  AVR  LPmikros                  

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.  



Elektronik-Labor  Lernpakete  AVR  LPmikros