Ausgewählt wird <m8def.dat>
Als nächstes muss der richtige
Programmer (Schnittstelle zwischen PC und Board) ausgewählt werden. Wir
verwenden einen ISP-Programmer, der mit USBASP bezeichnet wird.
Hinweis:
|
Auf
dem Markt sind viele Programmer, die sich USB-ASP nennen. Viele dieser
Programmer sind leider billige China-Nachbauten, die nicht richtig
funktionieren. Ebenfalls funktionieren alle USB-ISP oder USB-SPI
Programmer nicht!
|
Für den Programmer muss ein
Treiber installiert werden. In Windows 7 und 8 geschieht das
automatisch. Für Nutzer von Windows10 gibt es hier eine Hilfe.
Erste Schritte
Zuerst sollte man sich die Datei Vorlage_atmega.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
Der Button, der mit der roten "1"
markiert ist, compiliert den Quelltext in einen für den Microcontroller
lesbaren Code. Bevor der Code auf den Microcontroller übertragen wird,
muss immer der Compile-Button betätigt werden.
Wichtig! Ganz unten erscheint der Hinweis "No errors found". Sollten im
Quelltext Fehler vorhanden sein, dann werden diese hier angezeigt.
Vor der Berichtigung aller(!) Fehler wird kein neuer Code erzeugt, bei
der Übertragung würde dann die letzte fehlerfreie Version übertragen
werden.
Der Button, der mit der roten "2" markiert ist, startet die Übertragung. Es öffnet sich ein neues Fenster.
Die Übertragung erfolgt durch das Anklicken des grünen "Chipbuttons".
Alle anderen Optionen sollte man erst mal nicht verwenden, sie können
u.U. den Chip unbrauchbar machen.
Die IO-Ports
Der Atmega8 hat insgesamt 4 Input/Output Port mit 8Bit Datenbreite,
die mit Port A bis Port D bezeichnet werden. Davon ist aber nur der
Port D 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 Atmega 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
DDRD=&BXXXXXXXX
Der Platzhalter X steht für die Zahlen 0 und 1
|
0=Ausgabe
1=Eingabe
|
&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_atmega.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
PortD =&B00000001
|
Bit0 wird auf 1 gesetzt, alle anderen Bis
auf 0
|
PortD.0 = 1
|
Nur das Bit0 wird auf 1 gesetzt, alle anderen
Bits werden nicht verändert
|
Mit diesen wenigen Befehlen kann man nun Lauflichter oder ähnliches Programmieren. Ein Beispile ist in der Datei led.bas zu finden.
Die Bedienung der Taster T1 und T2
Die Taster können mit PinC.2 (Taster T1) und PinC.3 (Taster T2)
abgefragt werden. Drückt man z.B. den Taster T1, so wird der PortC.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
PortC.2 = 1
|
PortC.2 wird auf High gesetzt
Alternativ: PortD =&Bxxxxx1xx (x = 0 oder 1)
|
I = PinC.2
|
Der Variabel I wird der Wert von PortD.2 zugewiesen.
1 = Taster offen
0 = Taster gedrückt
|
Verwendet man die Vorlage, sind alle Einstellungen schon richtig vorgegeben, man muss nur noch den PinC.2 bzw. PinC.3 abfragen.
Zur Tasterbedienung gibt es die Vorlage Taster_atmega.bas
Die 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. 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 Atmega hat hardwaremäßig eine
IIC-Schnittstelle eingebaut, wir verwenden aber die von BASCOM
softwaremäßi emulierte Version. 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) sind an
PortC.4 und PortC.5 fest verdrahtet. SCL und SDA müssen über
1,5kOhm-Pull-UP-Widerstände
ständig mit dem Pluspol verbunden werden, diese Widerstände sind auf
dem Board ebenfalls schon vorhanden.
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 Atmega 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 Sda = Portc.4
Config Scl = Portc.5
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
Für den Temperatursensor ist in der Datei LM75_atmega.bas ein Beispielprogramm zu finden.