V27 - Mikrocontroller Christian Wagner 13. Mai 2008 Protokoll von und Datum, Uhrzeit: Betreuer: Michael Dieblich Christian Wagner 07.05.2007, 8:00-15:00 Uhr Herr DI Axel Fechner
Inhaltsverzeichnis 1 Einleitung 2 2 theoretische Vorbereitung 2 2.1 allgemeine Bemerkungen.............................. 2 2.2 benötigte Untensilien................................ 3 2.3 Versuchsaufbau................................... 3 3 Durchführung 3 3.1 der erste Versuch: ein Lauflicht bzw. ein Schrittmotor............. 3 3.2 Das erweiterte Lauflicht.............................. 5 3.3 Temperaturmessung und Ausgabe auf dem Display............... 5 3.4 Auswertung einer Fernbedienung mit Soundausgabe und vielen Extras.... 6 3.5 Visionen....................................... 10 4 Zusammenfassung 12 5 Anhang, letzte Angaben, Literaturverzeichnis 12 1
1 Einleitung Braucht man für eine automatisierte Messung immer einen ganzen Computer, der alles steuert? Oder wie ist das mit einfachen, Schaltungen, die über einen Lautsprecher Musik abspielen? Dazu wird offensichtlich nicht immer ein ganzer Rechner benötigt. Nicht jeder will 900 für eine Geburtstagskarte ausgeben, die einfach nur happy birthday abspielen soll. Genausowenig für ein einfaches, digitales Thermometer, das hierzulande weniger als 5 kostet. Oder braucht man für eine Netzwerkanbindung eines Druckers oder einer Internetcamera immer einen funktionierenden Computer, an den das Gerät angeschlossen ist? Der Schlüssel zum ganzen sind programmierbare Mikrocontroller, die auch in unseren PCs herumwerkeln. Sie erledigen kleine, lästige Arbeiten völlig unabhängig von anderen Komponenten und können fast alles, was ein Computer auch kann - aber nur eine spezielle Aufgabe innerhalb einer Schaltung. 2 theoretische Vorbereitung Die Theorie zu diesen Mikrocontrollern ist entweder sehr kurz oder sehr lang, je nachdem, welche Bedürfnisse gestillt werden sollen. Man könnte Bücher schreiben oder auch einfach eine kurze Doku zur Programmiersprache. Weil es das alles schon gibt, soll in diesem Protokoll keine grundlegende Einführung dieser Sprache geschrieben werden, sondern nur die grundlegendsten Befehle anhand von Anwendungen dargestellt werden. 2.1 allgemeine Bemerkungen Ein AVR ist ein Mikrocontroller, der von der Firma Atmel vertrieben und weiterentwickelt wird. Ursprünglich wurde er an der Universität Trondheim/Norwegen entwickelt. Der Name AVR hat an sich keine Bedeutung, laut Entwickleraussagen (siehe [2]). Der Kern eines AVRs ist der Prozessor, der nur etwa 4000 Gates besitzt (im Vergleich zu einem aktuellen Prozessor: Intel Itanium 2 Montecito mit 1.720.000.000 Gates, 2006 entwickelt, siehe [1]). In Ihm steckt also nicht die Rechenleistung von heutigen PCs, aber dennoch ausreichend viel, um sehr viele Anwendungen zu ermöglichen. Der Prozessor ist ein RISC-Prozessor ( Reduced Instruction Set Computer ), d.h. er arbeitet mit einem vereinfachten Befehlssatz. Dadurch wird der Prozessor so schnell und komplexe Befehle werden softwareseitig aus diesen einfachen zusammengesetzt. Man kann den AVR also auch direkt in Assembler programmieren mit dem Nachteil, dass der Aufwand zu groß und die Anwendung des Codes auf einen AVR spezifiziert ist. Deshalb wurde die Software BASCOM entwickelt (Programmiersprache basierend auf BASIC), die einen Compiler besitzt und dadurch die Programmierung deutlich erleichtert. Außerdem kann man durch Abändern einer Zeile das Programm auf einem anderen AVR laufen lassen. Der Nachteil dieser Methode ist, dass für extrem schnelle und kleine Anwendungen mehr Code erzeugt und durchlaufen wird, sodass schnellere Chips als eigentlich nötig wären herangeschafft werden müssen. 2
2.2 benötigte Untensilien Bei diesem Versuch benötigt man grundlegend folgende Geräte: ˆ einen Computer mit einer Anbindung zum Programmiergerät und Programmiersoftware ˆ ein Programmiergerät für den AVR ˆ den AVR selbst ˆ Peripherie um den AVR wie LEDs, Schrittmotor, IR-Sensor und Lautsprecher 2.3 Versuchsaufbau Wir verwendeten einen ATmega16. Das ist ein recht großer Prozessor mit 16 kb Programmspeicher. Dieser wird über den Computeranschluss und der Programmiereinheit mit dem Programm bespielt. Anschließend wird der AVR in der Testschaltung verbaut, sodass das gewünschte Ergebnis zu sehen ist. Die Schaltung für einen AT90S1213 sieht folgendermaßen aus: Abbildung 1: Der Aufbau eines Testschaltkreises für einen AVR: Den Baustin MAX232ACPE gibt es bei uns nicht. Die Anbindung an den Rechner zum Brennen besteht aus den 5 Pins 1 und 17-20, die Pins 2-5 sind für die Kommunikation mit dem Rechner vorgesehen und die freien Pins können beliebig als Ein- oder Ausgänge in den AVR benutzt werden, z.b. für die 3 LEDs 3 Durchführung 3.1 der erste Versuch: ein Lauflicht bzw. ein Schrittmotor Das erste Programm stellt ein Lauflicht dar und sieht folgendermaßen aus: 3
$regfile = "m16def.dat" $crystal = 1000000 Config Lcd = 24 * 2 Config Lcdpin = Pin, Db4 = Portd.4, Db5 = Portd.5, Db6 = Portd.6, Db7 = Portd.7, E = Portd.3, Rs = Portd.2 Config Portd = Output Config Portb = Output Deflcdchar 1, 32, 10, 32, 14, 18, 18, 14, 32 replace? with number (0-7) Deflcdchar 2, 32, 10, 32, 17, 17, 17, 17, 31 replace? with number (0-7) Config Rc5 = Pinc.0 Enable Interrupts Dim A As Integer Dim B As Integer Portb = 0 Lcd "Chrisware presents" Lowerline Lcd "Lauflicht Nr. 1" A = 1 B = 0 Do Portb = A A = A * 2 Verschiebung des Bits nach rechts Rücksetzung des Bits If A = 256 Then A = 1 Waitms 100 Loop End Mit $regfile wird gekennzeichnet, um welchen AVR es sich handelt, mit $crystal legt man die Taktfrequenz fest. Config Lcd = 24*2 wird ein Display konfiguriert, das 24 Zeichen in 2 Zeilen besitzt. Mit den Zeilen Config Lcdpin = Pin, Db4 = Portd.4, Db5 = Portd.5, Db6 = Portd.6, Db7 = Portd.7, E = Portd.3, Rs = Portd.2 Config Portd = Output Config Portb = Output werden die Pins konfiguriert, sodass die Ports Portd und Portb als Ausgang dienen. Ports sind sozusagen Untereinheiten der Pins der AVR. Auf der Schaltung werden die LEDs also an den Portb angeschlossen und das LCD-Display an den Portd. Die Zeilen Dim A As Integer Dim B As Integer legen zwei ganzzahlige Variablen fest. Dafür wird im AVR Speicherplatz reserviert. Nun beginnt das eigentliche Programm. Mit wird der Bildschirm des Displays gelöscht und es erscheint der Text Chrisware presents auf der ersten Zeile, gefolgt von Lauflicht Nr. 1 auf der zweiten Zeile. 4
Durch die Do... loop - Schleife wird nun eine Endlosschleife erzeugt, die das Lauflicht zum Leuchten bringt. Die Binärzahlen der variablen A, auf die hier nicht weiter eingegangen werden soll, stellen den Leuchtzustand der 8 LEDs dar. Dabei ist die Augabe jedoch invertiert, d.h. an der Stelle, wo eine 1 steht, wird die LED ausgeschalten. Zum Schluss wird der AVR dazu gezwungen, 100 ms zu warten und schließlich die Schleife erneut zu durchlaufen. Das Ergebnis ist ein Lauflicht, wobei 8 LEDs in Reihe angeschaltet sind und immer eine ausgeschaltet wird. Die ausgeschaltete LED läuft sozusagen Vom Anfang ans Ende uns springt zurück an den Anfang. Die Schrittmotorsteuerung erfolgte analog, aber nur mit 4 LEDs, sodass im Quellcode If A = 16 Then A = 1 steht. Der Schrittmotor kennt insgesamt 4 Stellungen zwischen Rotor und Stator. Je nachdem, welcher Ausgang angesteuert wird, richtet sich der Rotor in Richtung des stromdurchflossenen Spule aus. Lässt man die Ausgänge wie beim Lauflicht durchlaufen, dann dreht sich der Schrittmotor entsprechend. Dadurch kann man diesen sehr gut steuern. 3.2 Das erweiterte Lauflicht Man kann nun mit der Programmierung herumspielen, sodass sich andere Lauflichter ergeben bzw. variierende Schrittmotorgeschwindigkeiten. Die Quellcodes dazu sind reine Platzverschwendung und zeigen keine neuen Erkenntnisse - sie sind mehr Spielerei. 3.3 Temperaturmessung und Ausgabe auf dem Display Nun soll die Temperatur dargestellt werden. Die Temperatur wird durch einen Heißleiter gemessen, der eine Spannung zwischen 0 und 5V zurückgibt. Dieser Wert gibt die absolute Temperatur, wobei T = 0.1V/K ist. Dazu kommt die AD-Wandlung. Die 5V werden in 1024 Teile unterteilt, weshalb die AD-Wandlung einen Integer zwischen 0 und 1024 erzeugt. 5
$regfile = "m16def.dat" $crystal = 1000000 LCD Config Config Lcd = 24 * 2 Config Lcdpin = Pin, Db4 = Portd.4, Db5 = Portd.5, Db6 = Portd.6, Db7 = Portd.7, E = Portd.3, Rs = Portd.2 LED Config Config Portb = Output Led Alias Portb Config Adc = Single, Prescaler = Auto Start Adc Dim W As Word, Channel As Byte Dim Temp As Long Temp = 0 Led = 255 Channel = 0 Do W = Getadc(0) Temp = 5 * 100 Temp = Temp * W Temp = Temp / 1024 Temp = Temp - 273 Lcd "Temperaturfuehler" Lowerline Lcd "Temperatur: " ; Temp ; " Grad C" Waitms 1000 Loop End In diesem Programm muss zuerst die AD-Wandlung vollzogen werden. Sie muss vorerst eingestellt werden mit den Kommandos Config Adc = Single, Prescaler = Auto Start Adc Die erste Zeile bedeutet, dass ein einzelner Wert übergeben wird und der erhaltene Integerwert automatisch skaliert werden soll, d.h. dass die Länge des Binärstrings automatisch bestimmt werden soll. In der 2. Zeile wird die AD-Wandlung gestartet. Mit der Zeile W = Getadc(0) wird der Variablen W der Wert zwischen 0 und 1024 zugewiesen. Diese Zahl wird in den folgenden Rechenschritten in eine Temperatur umgerechnet. Wichtig hierbei ist, dass der Temperatureingang an dem Eingang (= Channel) 0 hängt. Unser AVR besitzt 8 Eingangskanäle, die alle separat ausgelesen werden können. Man kann also viel mehr Sensoren einbauen. 3.4 Auswertung einer Fernbedienung mit Soundausgabe und vielen Extras Nun stellt sich die Aufgabe, das Signal einer Fernbedienung auszuwerten. Dazu muss es dekodiert werden, was uns der Schaltkreis (unter Förderung der Programmierfaulheit) automatisch abnimmt. Wichtig ist immer, den richtigen Pin für die richtige Aufgabe auszuwählen. Ein Hochfrequenzausgang für das Samplen der Tonsequenz, den Decodereingang für das Fernbedienungssignal,... 6
$regfile = "m16def.dat" $crystal = 1000000 LCD Config Config Lcd = 24 * 2 Config Lcdpin = Pin, Db4 = Portd.4, Db5 = Portd.5, Db6 = Portd.6, Db7 = Portd.7, E = Portd.3, Rs = Portd.2 Config Adc = Single, Prescaler = Auto, Reference = Internal Start Adc LED Config Config Portb = Output Led Alias Portb Fernbedienung an Pina.1 Config Rc5 = Pina.1 Enable Interrupts Dim Address As Byte Dim Command As Byte Dim A As Integer A = 1 Dim W As Word Dim Temp As Long Dim C As Integer Dim X As Integer Dim Y As Integer Temp=0 Lcd "Warte Auf Eingangssignal..." Do Getrc5(address, Command) If Command = 1 Then For A = 1 To 3 Sound Porta.6, 1000, 10 Led = 0 Lcd "Techno-Sound!" Waitms 125 Led = 255 Waitms 125 Next End If If Command = 2 Then W = Getadc(0) Temp = 5 * 100 Temp = Temp * W Temp = Temp / 1024 Temp = Temp - 273 Lcd "Temperaturfuehler" Lowerline Lcd "Temperatur: " ; Temp ; " Grad C" Waitms 1500 End If If Command = 3 Then For C = 1 To 10 Lcd C Lowerline Lcd "Lauflicht Extended" 7
Toggle Portb.0 Waitms 1 Toggle Portb.1 Toggle Portb.0 Waitms 2 Toggle Portb.2 Toggle Portb.1 Waitms 4 Toggle Portb.3 Toggle Portb.2 Waitms 8 Toggle Portb.4 Toggle Portb.3 Waitms 16 Toggle Portb.5 Toggle Portb.4 Waitms 32 Toggle Portb.6 Toggle Portb.5 Waitms 64 Toggle Portb.7 Toggle Portb.6 Waitms 128 Toggle Portb.6 Toggle Portb.7 Waitms 64 Toggle Portb.5 Toggle Portb.6 Waitms 32 Toggle Portb.4 Toggle Portb.5 Waitms 16 Toggle Portb.3 Toggle Portb.4 Waitms 8 Toggle Portb.2 Toggle Portb.3 Waitms 4 Toggle Portb.1 Toggle Portb.2 Waitms 2 Toggle Portb.1 Next End If If Command = 4 Then Lcd "Musik aus der" Lowerline Lcd "Konserve" Sound Porta.6, 1000, 23 Sound Porta.6, 1000, 17 8
Sound Porta.6, 1000, 23 Sound Porta.6, 1000, 17 Sound Porta.6, 1000, 23 Sound Porta.6, 1000, 17 Sound Porta.6, 1000, 23 Sound Porta.6, 1000, 23 Sound Porta.6, 1000, 23 Sound Porta.6, 1000, 17 End If If Command = 5 Then Getrc5(address, Command) Waitms 250 X = Address Lcd "Eingabe Zahl 1: " ; X Getrc5(address, Command) Y = Address Lowerline Lcd "Einagbe Zahl 2: " ; Y 0 Lcd "Berechne " ; X ; " + " ; Y 0 X = X + Y Led = 0 Lcd "Ergebnis: " ; X 0 End If Led = 255 Lcd "Warte auf Eingangssingal..." Waitms 100 Loop End 9
Dieses Programmbeispiel ist recht komplex; es enthält fast alles, was wir mit dem Mikrocontroller gemacht haben. Es realisiert folgendes: Wird aus der Fernbedienung die Taste 1 gedrückt, dann erscheint der Text TTechno-Soundäuf dem Display und die LEDs gehen komplett aus. Taste 2 startet die Temperaturmessung und Taste 3 startet ein Lauflicht. Über Taste 4 kann man sich eine kurze Techno-Sequenz anhören und Taste 5 bildet die Summe der beiden Kommandos der Fernbedienung. Neu ist das Auslesen der Fernbedienung: Zuerst muss der Eingang der Fernbedienung ausgewählt werden. Das erfolgt mit dem Kommando Config Rc5 = Pina.1. Dieses Pin ist also für den Fernbedienungseingang zuständig. Die Abfrage erledigt die Zeile Getrc5(address, Command). Dabei wird die Adresse (Videorekorder, Fernseher,... ) des Signals und das Kommando den ensprechenden Variablen, die als Byte definiert werden müssen, übergeben. Das Kommando wird nun mit mehreren If-Abfragen ausgewertet. Man kann mit dem Leuchtdiodenausgang auch einzelne LEDs ansprechen anstelle der Byteweisen Zuweisung. Das hat den Vorteil, dass man sofort weiß, welche LED angesprochen wird, erzeugt aber mehr Code. Ensprechend wird der Lautsprecher angeschlossen: Dieser hängt an Porta.6. Der Befehl Sound Porta.6, 1000,20 sagt dem Mikrocontroller, dass er an den Ausgang Porta.6 das Soundsignal 1000 µs lang mit einer An-Aus-Zeit von 2 ms (entspr. 500 Hz) übergeben soll. Dadurch entsteht ein Rechtecksignal, das an den Lautsprecher angelegt wird und den typischen, synthetischen Rechteckton erzeugt. Dieser wird als sehr unangenehm empfunden, weil bei einer Rechteckfunktion sehr viele, hochfrequente Oberwellen eine Rolle spielen, die mit relativ hoher Intensität gesendet werden. Dennoch ist die Soundsequenz, die das Programm liefert, so manchem Technofreak bekannt. [Auch andere Leute kennen diese Sequenz, empfinden sie aber nach einer bestimmten Einwirkzeit als unangenehm.] Ansonsten bietet dieses komplexe Programmbeispiel keine qualitativen Neuerungen zum alten. 3.5 Visionen Anstelle der Auswertung einer Fernbedienung können 2 AVRs Sender und Empfänger spielen. Der eine sendet ein Signal mit der IR-Diode, die an einen Ausgang angeschlossen wird und der andere empfängt das Signal. Diese IR-Übertragung ist recht langsam, aber funktioniert dennoch, wenn es z.b. um das Übertragen einer Temperatur geht. Dieses Projekt wollten wir jedoch nicht in Angriff nehmen, sondern nur die grundlegende Funktionalität des Programms zeigen. Hier der Quellcode für den Sender: $regfile = "m16def.dat" $crystal = 1000000 LCD Config Config Lcd = 24 * 2 Config Lcdpin = Pin, Db4 = Portd.4, Db5 = Portd.5, Db6 = Portd.6, Db7 = Portd.7, E = Portd.3, Rs = Portd.2 LED Config Config Portb = Output Led Alias Portb 10
Enable Interrupts Dim Togbit As Byte, Command As Byte, Address As Byte Do Address = 1 Command = 1 Togbit = 0 Rc5send Togbit, Address, Command Waitms 1 Loop End Der Befehl Rc5send Togbit, Adress, Command sendet einen Command über eine Adresse ( Adress) mit einem speziellen Togbit. Das ist sozusagen ein Fernbedienungssignal. Dieses wurde mit folgendem Testprogramm empfangen: $regfile = "m16def.dat" $crystal = 1000000 Config Lcd = 24 * 2 Config Lcdpin = Pin, Db4 = Portd.4, Db5 = Portd.5, Db6 = Portd.6, Db7 = Portd.7, E = Portd.3, Rs = Portd.2 Config Portd = Output Config Portb = Output Config Rc5 = Pina.2 Enable Interrupts Dim A As Integer Dim B As Integer Dim C As Integer Dim Adress As Byte, Command As Byte Lcd "Kommando:" Portb = 0 Do Getrc5(adress, Command) Locate 1, 10 Lcd Command ; " " If Not(command = 255) Then For A = 1 To 5 Portb = 255 Sound Porta.6, 300, 50 Waitms 100 Portb = 0 Waitms 100 Next Waitms 300 End If Waitms 100 Loop End Sobald ein reguläres Signal empfangen wurde, blinkt die LED-Anzeige und ein Ton wird ausgegeben. Dazu wird das Kommando auf dem Display angezeigt. Dieser Teil konnte mit der Fernbedienung ohne Probleme getestet werden. Schließlich probierten wir die IR-Übertragung aus, die nach mehreren Fehlschlägen endlich funktionierte. Unsere kollektive Vermutung ist, 11
dass die Sender-LED sehr schwach war und durch die Verringerung des Vorwiderstands an der LED die Lichtausbeute erhöht werden könnte. Möchte man nun eine beidseitige Temperaturübertragung basteln, muss man sich erst auf ein Übertragungsprotokoll einigen, bevor man das Projekt beginnen kann. Das sollte einfach gehalten sein, damit die Kommandos möglichst schnell übertragen werden bzw. um Störungen so wenig Chancen wie möglich zu geben. 4 Zusammenfassung Dieser Versuch ist hervorragend dafür geeignet, um zu sehen, was mit einzelnen Bauteilen der Mikroelektronik möglich ist und auszuprobieren, was man alles machen kann. Er kann eine Grundlage dafür sein, später an Messapparaturen einzelne, günstige Sensoren zu basteln und damit ganz spezielle Messanforderungen zu erfüllen. Man kann damit auch problemlos Nachbarn ärgern, indem man einen IR-Sender baut, der ständig ein Signal zum An- und Ausschalten des Fernsehers sendet und damit jedem Fernsehvergnügen eine Absage erteilt. Diese Anwendung verbietet sich, wenn man nette Nachbarn hat. Wie man sieht, sind der Kreativität keine Grenzen gesetzt. Folgende Aufgaben konnten von uns bewältigt werden: ˆ Ansteuerung einzelner LEDs und Erzeugung von Blinkmustern ˆ Textausgabe auf einem Display ˆ Ansteuerung eines Schrittmotors ˆ Auswertung von Signalen einer Fernbedienung und Ausführung bestimmter Befehle ˆ Ausgabe von Geräuschen auf einem Lautsprecher ˆ Infrarotübertragung eines Signals 5 Anhang, letzte Angaben, Literaturverzeichnis Unterschrift:................................................13. Mai 2008 (Christian Wagner) Unterschrift:................................................13. Mai 2008 (Michael Dieblich) Literatur [1] http://de.wikipedia.org/wiki/transistor [2] http://www.rowalt.de/mc/index.htm 12