Einführung



Installation von Bascom

Das Programm Bascom kann von der Herstellerseite MCS-Electronics als kostenlose Demoversion heruntergeladen werden.
Den Downloadlink findet man, wenn man die Hauptseite ein bisschen herunterscrollt unter diesem Button


Nach der Installation auf dem Rechner, muss das Programm noch eingerichtet werden. Dazu sind mehrere Schritte notwendig:

Bascom muss wissen, welchen Chip er programmieren soll. Dazu wählt man das Menue <Options> <Compiler> <Chip>


Aus der dann angebotenen Auswahl wählt man den Reiter <Chip> aus


Bascom bietet als Auswahl die Option <attiny2313.dat> an, die man wählt.


Alle anderen Einstellungen bleiben so, wie Bascom sie vorgibt. Mit <OK> bestätigen.

Nun muss noch die Kommunikation mit dem Controller-Board konfiguriert werden. Diese findet man unter <Options><Communication>



Den Reiter <Programmer> auswählen.


Und die Option <External Programmer> auswählen. Die Datei uploader.exe sollten man sich vorher herunterladen und ins Verzeichnis in das Bascom installiert wurde kopieren. Diesen Pfad muss man bei <Program> eingeben oder mit dem Dateisymbol rechts suchen. Als <Parameter> gibt man "{File}" ein und aktiviert das Kästchen <Use Hex File>. Alles wird mit <OK> bestätigt. Bascom ist nun fertig konfiguriert.




Installtion der USB-Treiber (XP, VISTA, WINDOWS 7)

Für die Benutzung des USB-Adapters werden Treiber benötigt. Ab Windows VISTA erkennt Windows den Adapter automatisch und installiert auch die Treiber automatisch. Dies kann aber u.U. aber lange dauern.
Verwendet wird der Chip PL2303HX . Der notwendige Treiber ist im Download zu finden. Die Installation ist einfach. Zuerst die Datei herunterladen und ausführen. Ist die Ausführung erfolgreich abgeschlossen, dann erst den Adaper einstecken. Alles Weitere geschieht automatisch.

Treiber für WINDOWS 8 bitte direkt bei  
www.prolific.com.tw/US anfragen.

Achtung: Der Treiber im Downloadbereich  ist Eigentum der Firma Prolific, die alle Rechte daran hat.


Erste Schritte

Zuerst sollte man sich die Datei Vorlage.bas herunterladen. Diese enthält schon alle wichtigen Einstellungen für die ersten Schritte und kann für alle weiteren Projekte immer als Grundlage verwendet werden.

Um die Kommunikation zu testen, empfiehlt es sich, einmal die nicht veränderte Datei auf das Board zu überspielen. Funktioniert das ohne Probleme, ist alles richtig installiert und eingerichtet.

Das Fenster von Bascom zeigt folgenden Inhalt


Bevor das Programm auf das Board übertragen werden kann muss man es compilieren. Dazu klickt man auf das schwarze Chipsymbol in der oberen Leiste von Bascom. Hat man keine Fehler gemacht, meldet Bascom in der unteren Statusleiste No errors found.
Wichtig --> Bei jeder Änderung muss man das Programm vor der Übertragung neu compilieren, ansonsten würde nur das alte Programm erneut übertragen!

Nun wählt man das grüne Chipsymbol aus. Es öffnet sich das Programm uploader.exe


Zeigt das Programm ein rotes Symbol <Com ?> an, muss der richtige COM-Port noch ausgewählt werden. Für Kabelbenutzer ist das meistens COM1 oder COM2. Wer einen USB-Adaper benutzt muss den richtigen COM-Port entweder suchen oder in der Systemsteuerung nachschauen.

Zuerst wird <Übernehmen> ausgewählt. Nun liegt die Datei im internen Speicher der Uploader und kann übertragen werden.



Von dem Controller-Board wird die Batterie abgetrennt. Bei gedrücktem Taster T2  (nicht wie in dem Programm Uploader angegeben T1) wird die Batterie wieder angeschlossen. Nun wird <Alles Übertragen> ausgewählt.


An dem Statusbalken unten im Fenster sieht man den Übertragungsfortschritt. Sollte die Fehlermeldung "Keine Antwort vom Bootloader" kommen kann das mehrere Gründe haben:
  • Der Taster wurde nicht richtig gedrückt, als die Batterie angeschlossen wurde. Einfach den Vorgang ab <Übernehmen> wiederholen.
  • Der COM-Port ist falsch gewählt. U.u. hat der Rechner mehrere COM-Ports. Dann muss durch ausprobieren der richtige ermittelt werden. Einfach die Übertragung von Anfang an neu beginnen.
  • Das Kabel ist nicht richtig fest eingesteckt. Den Vorgang einfach wiederholen.
  • Der Bootloader wurde abgeschossen. Das passiert besonders bei einigen USB-Adaptern schon mal (Lehrer fragen, was zu tun ist).


Die IO-Ports

Der Attiny 2313 hat insgesamt 4 Input/Output Port mit 8Bit Datenbreite, die mit Port A bis Port D bezeichnet werden. Davon ist aber nur der Port B komplett nach aussen geführt. Daher wird dieser Port fast für alle Aufgaben benutzt. Ein solcher Port kann zur Eingabe (Input) oder zur Ausgabe (Output) benutzt werden. Beim Attiny kann sogar jedes einzelne der 8 Datenbits entweder Eingabe oder Ausgabe sein. Damit der Attiny weiß, ob ein Bit Eingabe oder Ausgabe ist, gibt es ein Datenrichtungsregister für jeden Port.

Datenrichtungsregister
DDRB = &BXXXXXXXX
Der Platzhalter X steht für die Zahlen 0 und 1
0 = Eingabe
1 = Ausgabe

&B bedeutet dabei, dass eine Zahl im Binärcode eingegeben wird. Der Binärcode wird von Rechts nach Links gelesen, das heißt Bit0 steht ganz rechts und Bit7 ganz links.

Für alle Portspielereien werden alle 8 Bits immer als Ausgabeports benutzt. Daher ist in der Datei Vorlage.bas das Datenrichtungsregister schon richtig vorgegeben.

Auf dem Board besteht die Möglichkeit LEDs direkt einzustecken, um den Zustand eines Bits optisch anzuzeigen. Dazu müssen die LEDs mit dem längeren Ende (Anode / +Pol) zum Controller eingesteckt werden. Möchte man nun die LED am Bit0 zum leuchten bringen, muss man den Port auf High-Level ( = 1) legen. Dazu gibt es zwei Möglichkeiten

PortB = &B00000001
 Bit0 wird auf 1 gesetzt, alle anderen Bis auf 0
PortB.0 = 1
Nur das Bit0 wird auf 1 gesetzt, alle anderen Bits werden nicht verändert


Die Bedienung der Taster T1 und T2

Die Taster können mit PinD.2 (Taster T1) und PinD.3 (Taster T2) abgefragt werden. Drückt man z.B. den Taster T1, so wird der PortD.2 mit Masse verbunden. Damit der Attiny dies bemerkt, muss der Port am Anfang auf High = 1 gesetzt werden. Normalerweise ist jeder Port auf Low = 0 gesetzt. Vergisst man dies, funktoniert das Porgramm nicht!

Beispiel für den Taster T1
PortD.2 = 1
PortD.2 wird auf High gesetzt
Alternativ: PortD =&Bxxxxx1xx (x = 0 oder 1)
I = PinD.2
Der Variabel I wird der Wert von PortD.2 zugewiesen.
1 = Taster offen
0 = Taster gedrückt

Zur Tasterbedienung gibt es die Vorlage Taster.bas


Die Interrups IRQ

Der Attiny besitzt 2 Interrups die mit INT0 und INT1 bezeichnet werden. Interrups unterbrechen sofort ein Programm und lösen dann eine Aktion aus. Nach der Behandlung der Aktion kehrt das Programm wieder an den verlassenen Punkt zurück. Vorteil von Interrups sind, dass sie auch in einem laufenden Programm ständig Eingriffe ermöglichen. Das kann aber auch ein Nachteil sein. Daher ist es manchmal sinnvoll Interrups zu verbieten.

Der Attiny hat am PortD.2 und am PortD.3 seine Interrupteingänge. Dort liegen auch die Taster T1 und T2. Daher lassen sich die Interrups durch einen Tastendruck auslösen.

Beispiel für INT0
Enable INT0
Aktiviert den Interrupt INT0
Config Int0 = Falling
Interrupt wird ausgelöst, wenn T1 gedrückt wird
Alternativ =Rising Auslösen wenn T1 losgelassen wird
Enable Interrupts
Erst mit diesem Befehl sind Interrups zugelassen und zwar INT0 und INT1 wenn sie
vorher aktiviert wurden.
On Int0 Zaehlen
Wenn der Taster T1 gedrückt erfolgt sofort Sprung zur Marke Zaehlen:

Vorlagen-Beispiele für Interrups sind Zaehler_mit_Interrupt.bas und Lauflicht_mit_IRQ.bas

Pulsweitenmodulation und Timer

Der Attiny verfügt über zwei  Timer, die unabhängig der CPU laufen. Im Prinzip sind dies einfache Zähler, die immer von 255 zu 0 (Timer0) bzw. 64565 zu 0 (Timer1) herunterzählen. Die Taktfrequenz ist abhängig von dem Systemtakt, der in unserem Fall 4 MHz beträgt. Dieser Takt ist häufig zu hoch, daher kann er durch 8,64,256 und 1024 geteilt werden. Die Timer können Interrups auslösen.

Beispiel LED-Dimer am PortB.2
Tccr0a.wgm01 = 1
Tccr0a.wgm00 = 1
Diese beiden Befehle setzen die Timer0-Register
Tccr0a.wgm01 = 1
Tccr0a.wgm00 = 1
Der PortB.2 kann als Ausgang für das PWM-Signal des Timer0 genutzt werden. Dazu dienen
diese beiden Befehle. Der PortB.3 ist für den Timer1 nutzbar. Die Register heißen dann
Tccr1a.wgm01 und Tccr1a.wgm00.
Ocr0a = 200
Ocr0a ist der Wert, bei dem der rückwärtslaufende Timer einen Interrupt auslöst und wieder
bei 255 startet.
Tccr0b = &B00000010
Hiermit wird der Frequenzteiler eingestellt und der Timer gestartet
&B00000000 -->Timer gestoppt
&B00000001 --> Timer läuft mit Systemtakt
&B00000010 -->Timer läuft mit Systemtakt/8
&B00000011 -->Timer läuft mit Systemtakt/64
&B00000100 -->Timer läuft mit Systemtakt/256
&B00000101 -->Timer läuft mit Systemtakt/1024
&B00000110 -->Timertakt über Taster T1 (Taster wird gedrückt)
&B00000111 -->Timertakt über Taster T1 (Taster loslassen)

Im ersten Beispiel Dimmer.bas wird der Timer immer bis zum Stopwert heruntergezählt. In dieser Zeit ist die LED an. Dann wird sie ausgeschaltet und nach einem Takt wieder eingeschaltet. Je kürzer die Einschaltzeit ist, umso dunkler erscheint uns die LED. Eine Beispieldatei steht unter Dimer.bas zum Download bereit.

Beispiel 440Hz Sound (mit Timer-Interrupt)
Timsk.toie0 = 1 Der Timer0 löst beim Erreichen des Stopwertes einen Interrupt aus
Enable Interrupts
Interrups zulassen
On Timer0 Umschalten
Löst der Timer0 einen Interrupt aus wird nach Umschalten gesprungen
Tccr0b = &B00000011
Timer starten und Systemtakt durch 64 teilen
Tcnt0 = 185
Stopwert des Timers (dort wird der Interrupt ausgelöst)
Setzt man den Stopwert erneut auf 185 läuft der Timer wieder los. Die Berechnung
ist weiter unten erklärt.
Toggle Portb.0
Der Wert von PortB.0 wird umgeschaltet.
0 --> 1 = LED aus --> LED an
1 --> 0 = LED an --> LED aus

Möchte man einen Ton ausgeben, so kann man dies ebenfalls einfach tun. Benötigt wird ein Piezo-Schallwandler (eine Art Lautsprecher) der bei 440Hz 880mal ein und ausgeschaltet wird. Dieses Ein- und Ausschalten kann einfach mit dem Toggel-Befehl erfolgen.

Beispiel 440Hz
440Hz = 880mal An und Aus pro Sekunde mit dem Togglebefehl

Systemtakt = 4MHz
Der Timer läuft mit dem Systemtakt / 64 (Tccr0b = &B00000011)

4000000 / 880 = 4545,45Toggle Portb.0
4545,45 /64 = 71,02

Der Timer muss also nach 71 mal runterzählen den Interrupt auslösen. Da er mit 255 startet berechnet sich der Stopwert zu

256-71 = 185 (Tcnt0 = 185)

Der Interrupt wird ausgelöst, wenn der Wert erreicht wird, nicht erst wenn der nächste Impuls erfolgt. Daher muss von 256 an gezählt werden um genau 71 Impulse mitzunehmen.

Das Programm steht in der Datei 440Hz_Sound.bas als Download bereit.

Ist der berechnete Wert Tcnt0 größer 255 oder kleiner 1 dann muss ein anderer Systemtaktteiler im Register Tccr0b ausgewählt werden. Genauere Frequenzen ergibt der Timer1, da dieser 16bit Werte verarbeitet und nicht nur 8bit wie der Timer0. Die Programmierung ist vom Prinzip her gleich.

Die Piezosummer können nur einen gewissen Frequenzumfang ausgeben, störend ist ebenfalls eine, oder mehrere Resonazfrequenzen. Dort wird der Ton erheblich lauter. Eine Lautstärkeregelung ist ohne weitere Elektronik nicht möglich.

Die IIC (I2C)-Schnittstelle

In der Industrie sind zwei Faktoren von entscheidender Bedeutung - der Preis und die Zuverlässigkeit. Anders als in einem Büro sind in einem Industriewerk die Umweltbedingungen für elektronische Bauteile sehr rau. Große Temperaturunterschiede, elektromagnetische Störquellen und Verschmutzungen aller Art sind zu meistern. Gleichzeitig sollen die Bauteile möglichst preiswert sein. Ein weitere großer Kostenfaktor ist die Verkabelung. Gerade in großen Werkshallen ist es nicht mehr gleichgültig, ob mein Datenkabel 10 oder nur 4 Leiterungen besitzt. Speziell für den Industrieeinsatz wurde von der Firma Philipps der II2-Bus, auch als I-Quadrat-C-Bus bezeichnet entwickelt. Dieser kommt mit nur 2 Datenleitungen und 2 Stromversorgungsleitungen aus. Durch externe Beschaltungen kann die Leitungszahl sogar auf 2 reduziert werden. Man bezeichnet ein solches Systeme deshalb auch als 2-Wire-Interface.

Der Attiny 2313 hat hardwaremäßig keine IIC-Schnittstelle eingebaut, diese kann aber problemlos von BASCOM softwaremäßig emuliert werden. BASCOM benutzt eine Taktrate von 400kHz, hardwaremäßig lassen viele Bausteine sogar eine Taktrate von 1MHz zu. Die beiden Leitungen SCL (Taktleitung) und SDA (Datenleitung) können an jeden beliebigen PORT des Attiny2313 angeschlossen werden. Damit wir das LCD-Display gleichzeitig benutzen können, werden die beiden übrig gebliebenen Ports B5 und B7 benutzt. Dies muss man Bascom am Anfang des Programms mitteilen.
Um die Beschaltung einfach zu halten, wird die Stromversorgung durch 2 weitere Kabel realisiert, wir schließen unseren Temperatursensor LM75 oder die RTC PCF8583 daher mit 4 Kabeln an dem Attiny-Board an. SCL und SDA müssen über 1,5kOhm-Pull-UP-Widerstände ständig mit dem Pluspol verbunden werden. Dies würde bei anderen Projekten ohne IIC-Bus aber stören. Daher können diese Pull-Up-Widerstände mit zwei Jumpern zugeschaltet oder abgetrennt werden. Vor der Benutzung der IIC-Schnittstelle müssen daher die beiden Jumper eingesteckt werden.



Die Zuverlässigkeit des IIc-Buses wird dadurch erreicht, dass die Signale nicht spannungsgesteuert sondern stromgesteuert sind. Bei langen Leitungen können durch Motoren oder anderen elektrischen Geräten leicht  Störspannungen induziert werden, die zu fehlerhaften Daten führen. Um dies zu verhindern müssen Datenkabel aufwendig geschirmt werden, was den Preis erheblich verteuert. Die Induktion eines nennenswerten Stroms in ein langes Kabel ist aber so gut wie ausgeschlossen. Daher werden die Datenbits beim IIC-Bus nicht als Spannungs an / Spannung aus sondern als Strom fließt / fließt nicht dargestellt. Dafür werden die 1,5kOhm-Widerstände benötigt. Wird die Datenleitung mit dem Minuspol (GND) verbunden, fließt ein Strom. Wird diese Verbindung gelöst fließt kein Strom. Allerdings müssen die Widerstandswerte ggf. bei längeren Datenleitung verringert werden um eine sichere Datenübertragung zu gewährleisten. Wir verwenden nur kurze Datenkabel. Wie zuverlässig dieses System arbeitet sieht man daran, dass man ohne Probleme die RTC oder den Temperatursensor in die Hand nehmen und die nicht isolierte Platine dabei anfassen kann, ohne das es zu einem Abbruch der Kommunikation kommt.

Der IIC-Bus ist ein Master-Slave System. In unserem Fall ist der Attiny 2313 der Master und der Temperatursensor bzw. die RTC die Slaven. Es gibt auch sogenannte Multi-Master-System, diese werden hier nicht behandelt.
Der Master bestimmt dabei alles. Er gibt den Takt vor und fordert Daten an bzw. sendet Daten an den Sklaven. Diese können nur gehorchen, aber nicht selber eine Datenanfrage stellen oder Daten senden. Wenn wir also nicht nach Daten fragen, bekommen wir auch keine, das muss man bei den Programmen beachten. BASCOM stellt alle benötigten Befehle zur Steuerung zur Verfügung. Möchte man ein Multimaster-System betreiben, ist eine zusätzlich Programmbibliothek erforderlich.

Zuerst müssen wir BASCOM mitteilen, an welchen Leitungen unser IIC-Bus angeschlossen wird. Die dazu notwendigen Befehle lauten:

Config Scl = Portb.5
Config Sda = Portb.7
I2cinit

Der Befehl I2cinit richtet die IIC-Schnittstelle automatisch ein, wir müssen uns keine Gedanken über EIN- oder Ausgaberichtung der Ports machen. Allerdings richtet der Befehl die Schnittstelle nur ein, öffnet sie aber nicht.

Wichtige I2C-Befehle
I2cstartÖffnet die Schnittstelle und leitet die Startsequenz ein
I2cwbyteDer Attiny sendet ein Byte
I2crbyteDer Attiny fordert ein Byte an
I2cstopDie Datenübertragung wird beendet und die Schnittstelle wird freigegeben
ACKDer Attiny fordert ein weiteres Byte an ohne die Kommunikation zu unterbrechen
NACKDer Attiny beendet die Datenübertagung,  gibt aber die Schnittstelle nicht frei

Jeder Sklave hat eine individuelle Schreib- und Leseadresse. Diese ist entweder hardwäremäßig vorgegeben oder kann am IC eingestellt werden. Bevor der Attiny ein Byte an einen Sklaven senden kann, muss er die individuelle Adresse auf den Bus senden. Durch diesen Vorgang wird der richtige Sklave angesprochen, alle anderen Sklaven verhalten sich ruhig. Die Leseadresse ist immer um 1 größer als die Schreibadresse. Möchte der Attiny also ein Byte vom Skaven empfangen, so sendet er zuerst die Leseadresse mit dem I2cwbyte-Befehl. Danach empfängt er das Byte mit dem I2crbyte. Möchte er ein weiteres Byte empfangen, so sendet er ein ACK-Signal, ansonsten ein NACK.  Ein typisches Programm sieht dann so auch:

I2cstart                              Die Schnittstelle öffnen
I2cwbyte &B10010001    Leseadresse auf den Bus senden
I2crbyte Wert , Nack        Ein Byte vom Sklaven empfangen
I2cstop                              Die Schnittstelle wieder freigeben

Möchte der Attiny ein Byte an den Sklaven senden, wird zuerst die Schreibadresse auf den Bus gegeben. Danach sendet der Attiny das Byte. Ein ACK bzw. Nack-Befehl ist nicht erforderlich. Ein typisches Programm sieht dann so aus:

I2cstart                              Die Schnittstelle öffnen
I2cwbyte &B10010000    Schreibadresse auf den Bus senden
I2cwbyte Wert                  Ein Byte an den Sklaven senden
I2cstop                              Die Schnittstelle wieder freigeben