Einführung



Nachdem an unserer Schule mehrere Jahre das Attiny-Projekt mit großem Erfolg durchgeführt wurde, war es an der Zeit das Projekt von einigen Schwächen zu befreien. Der Attiny 2313 verfügt nicht über genügend Ausgabeports, so dass ein LCD-Display und ein kompletter Port nicht gleichzeitig betrieben werden kann. Das LCD-Display kann daher nur extern angeschlossen werden. Auch hat der Attiny2313 keinen Analog-Digitalwandler. Und zuletzt ist die Übertragung per serieller Schnittstelle nicht mehr zeitgemäß, da kaum noch PCs über diese verfügen.
Aus diesen Gründen greift das Projekt auf den ATMEGA8 zurück. Dieser verfügt über genügend I/O-Ports, das gleichzeitig ein LCD-Display, ein kompletter I/OPort (8bit), eine I2C und eine SPI-Schnittstelle zur Verfügung steht.

Das Grundboard verfügt über ein fest installiertes 2x16 Zeichen LCD-Display (HD44780 kompatibel), eine standardisierte SPI Schnittstelle (10polig) die auch die Spannungsversorgung gewährleistet, einen komplett nach außen geführten I/O Port (PortD 8bit) mit LED-Steckleiste und einen herausgeführten ADC mit Schutzvorrichtung gegen Überspannung. Zusätzlich gibt es einen ADC-Eingang mit 50V Maximalspannung, der ebenfalls gegen Überspannung gesichert ist. Es gibt zwei Eingabetaster und zwei Taster für die Interrups INT0 und INT1. Ebenfalls ist ein EEPROM mit 512kbit das über I2C angesprochen werden kann vorhanden. Möchte man das Board unabhängig von einem PC betreiebn, so kann dieses mit einer 9V Blockbatterie oder einem Steckernetzteil 7,5 bis 9VDC geschehen.

Auf einem Zusatzboard sind eine Realtime-Clock (RTC) mit Batteriepuffer, eine 8bit-Porterweiterung, eine 4stellige 7-Segmentanzeige und ein Thermometer (LM75) vorhanden. Alle Geräte werden über die I2C-Schnittstelle angeprochen. Das Zusatzboard ist kompatibel mit dem Attiny-Zusatzboard.

Für weitere Projekte gibt es ein Messlabor. Dies verfügt über 2 hochpräzise AD und DA-Wandler sowie über Ausgangstreiber für AC und DC. Die  Ausgangstreiber lassen den Anschluss von Spulen und Lautsprechern zu. Die Eingänge sind alle gegen Überspannung geschützt.  Die Ansteuerung erfolgt über die I2C-Schnittstelle.

Die Programmierung erfolgt wie beim Attiny-Projekt mit dem Programm BASCOM, welches in der Demoversion kostenlos ist. Für die Ansteuerung des LCD-Display, der RTC, des Thermometers, der Porterweiterung und der 7-Segmentanzeige gibt es Beispielprogramme, welche leicht verändert werden können. Der Quellcode dafür ist im Download-Bereich zu finden.

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>


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
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

Für den Temperatursensor ist in der Datei LM75_atmega.bas ein Beispielprogramm zu finden.