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 |
I2cwbyte | Der Attiny sendet ein Byte |
I2crbyte | Der Attiny fordert ein Byte an |
I2cstop | Die Datenübertragung wird beendet und die Schnittstelle wird freigegeben |
ACK | Der Attiny fordert ein weiteres Byte an ohne die Kommunikation zu unterbrechen |
NACK | Der 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