Microcontroller-Tutorial für Anfänger - Teil I - Grundlagen

  • Ok, is mal wieder was dazwischen gekommen, aber nun ist sie fertig - die erste Lektion µC für LED-Styler....


    1 - Einstieg & erstes Lauflicht


    Grundausstattung
    Am einfachsten wirds mit einem fertigen Entwickler-Board - ich persönlich benutze das von Pollin - kostet 15,- Euro und kann alles was man soweit braucht (und noch mehr)...
    Ansonsten Lochrasterplatine + Lötkolben.. geht auch.


    Softwaremäßig dürft ihr euch schonmal auf leichte Basic-Kost einstellen - kapiert soweit jeder. Zum Einsatz kommt Bascom Basic. Wers nicht erwarten kann, darf schonmal das Handbuch durchstöbern... Die Demoversion funktioniert einwandfrei, mann kann nur keinen Code über 4kB erzeugen und darf keine kommerziellen Produkte damit erstellen.


    Funktionsweise eines µC


    Im Prinzip können µC erstmal nicht viel mehr als meist nur einen Großteil ihrer Pins entweder auf VCC (Versorgungsspannung) oder Masse zu schalten.
    Das können sie allerdings extrem schnell und sehr genau.
    Mit diesen digitalen Schaltzuständen öffnen dann verschiedenste Dinge gemacht werden - Displays ansteuern, RS232, USB - eben all die Dinge die digitale Geräte ausmachen.


    Die hier besprochenen Microcontroller haben alle eine interne Taktquelle - das reicht für erste Versuche voll aus, wer mehr Rechenpower benötigt kann an die passenden Pins einfach einen Quarz oder Resonator anklemmen.
    Interne Taktquelle bedeutet in unserem Fall (ATiny2313) bis zu 8MHz - wer wie ich mal mit einem Atari ST angefangen hat, der weiß, dass 8MHz nicht gerade wenig sind.


    Schauen wir uns mal einen der einfacheren aber weitverbreitetsten Atmel AVR Chips an - ATiny2313 Datasheet (das Datasheet direkt auf die Platte speichern, braucht ihr später noch)


    Der Tiny2313 ist als DIP- und als SMD- Package erhältlich - letzteres ist für Endprodukte sicherlich toll - weil klitzeklein - aber zum testen eher hinderlich - daher werden in diesem Tutorial nur bedrahtete Komponenten verwendet.
    [Blockierte Grafik: http://img231.imageshack.us/img231/5393/atiny2313pinoutaw7.png]
    Der Chip hat 20 Pins - zwei davon sind GND (10) und VCC (20). Die anderen Pins lassen sich quasi frei als In-/Output belegen. Input wäre z.B. ein Schalter, der zwischen einem Pin und VCC geschlossen wird. Output ein Pin, der z.B. eine LED mit der Versorgungsspannung verbindet.


    Im Bild ist zu erkennen, dass die Pins alle mehrfach belegt sind/werden können: Pin 4 ist sowohl PortA1 (dazu später mehr) als auch XTAL2 (2. Anschluss für einen externen Quarz). Die Belegung(en) in der Klammer können teilweise durch sogenannte Fusebits beeinflusst werden, teilweise auch per Programmierung.
    Man könnte zum Beispiel zuerst bestimmte Pins als Lauflicht nutzen, bei Bedarf aber auch zum flashen des Chips oder als RS232.


    Wir werden uns aber zuerst auf die Grundfunktion der Pins beschränken - ihr Dasein als schnöde Ports.


    Jeder AVR hat Ports - mal mehrere oder auch nur einen halben - ein voller Port besteht aus 8 Pins, die verschiedenen Ports werden durch Buchstaben gekennzeichnet, ihre Pins mit Zahlen von 0-7.
    Der 2313 hat einen kompletten Port (B) und einen mit nur 7 Pins (D). Zusätzlich gibt es noch Port A mit drei Pins.


    Einfacher Programmieradapter


    Diesem Chip muss jetzt natürlich Leben eingehaucht werden - das geschieht mit Hilfe von Maschinencode der in den Chip geflasht wird.
    Dazu muss der Chip an den Rechner angeklemmt werden (aus Gründen der Einfachheit hier nur für Windows beschrieben)...
    Die simpelste Methode besteht aus einem Druckerkabel (Centronics) und ein paar Widerständen (zur Sicherheit, sonst könnte die Schnittstelle am PC leiden.)
    Hier der Schaltplan:
    [Blockierte Grafik: http://img114.imageshack.us/img114/2412/ispcablemx8.th.gif]
    Die Widerstände können relativ frei gewählt werden - 1KOhm geht auch soweit ich weiß...
    Die Pinbezeichnungen am ISP finden sich am Chip wieder:
    RST(RESET)-Pin 1
    MISO - Pin 18
    MOSI - Pin 17
    SCK(USCK) - Pin 19
    GND - Pin 10


    ISP ist ein InSystemProgrammer - man führt in seiner Schaltung lediglich die 5 o.g. Pins auf einem praktischen Stecker raus und dann kann der Chip beliebig umgeflasht werden, ohne dass man irgendwas ausbauen muss.


    Zum Flashen benutze ich PonyProg2000
    Wer das Pollinboard hat, der schließt die ISP vom Board per 9-poligem Kabel an die Serielle Schnittstelle des PCs an. An den Einstellungen von PonyProg muss man u.U. schonmal etwas rumschrauben - wenn mans einmal hat, ist aber alles gut ;) Testweise versucht man den Chip mal zu löschen - wenn das glatt geht, dann sollte man auch seinen Speicher auslesen können - natürlich ist der noch leer.


    Die Programmierung


    Zum Füllen des Chips brauchen wir also ein Programm.
    Das erstellt man mit einem passenden Interpreter und Compiler - Basic, C oder Assembler.
    Ich benutze Bascom Basic - mit Sicherheit die einfachste Lösung für Anfänger.


    Fangen wir einfach an:


    An Pins 12-19 (PortB) schließt der geneigt Leser bitte je eine normale LED mit passendem Vorwiderstand an. Und zwar die Anode (langes Bein), da der AVR ja VCC liefert. (Da ich ein Schwein bin, mach ichs immer ohne Widerstände und dreh einfach das Netzteil passend runter - die AVRs vertragen 2,7 - 5,5V bei unter 10MHz) - Batterie geht natürlich auch, der ganze Aufbau verbrauch nicht wirklich viel Strom.
    Entweder Integriert ihr eine ISP Schnittstelle zum Flashen oder sockelt den Chip einfach.


    In Bascom folgenden Code schreiben/pasten:
    [code:1]
    '---------------Dieser Teil überschreibt die Compilereinstellungen - braucht man nicht zwingend
    $regfile = "2313def.dat" 'Beschreibungsdatei für benutzten Chip
    $crystal = 8000000 'Frequenz des Taktgebers - in diesem Fall 8MHz
    $hwstack = 32 'Einstellungen für Stacksize usw... erstmal unwichtig - nicht ändern
    $swstack = 10
    $framesize = 40
    '---------------



    Config PortB = Output 'Den gesamten PortB als Output definieren
    Dim Warten as Byte 'Variablen müssen am Anfang definiert + dimensioniert werden!


    Warten = 150 'Zu wartende Zeit zwischen den einzelnen Schritten in Millisekunden (1/1000 sek)


    Do 'Startet eine Schleifen (am Ende steht Loop)
    PortB = &B00000000 'Setzt PortB komplett auf AUS
    Waitms Warten 'Wartet in diesem Fall 150 Millisekunden
    PortB = &B00000001 'Aktiviert einen Pin
    Waitms Warten
    PortB = &B00000011 'Jetzt noch einen 2.
    Waitms Warten
    PortB = &B00000110 'Es bewegt sich!
    Waitms Warten
    PortB = &B00001100
    Waitms Warten
    PortB = &B00011000
    Waitms Warten
    PortB = &B00110000
    Waitms Warten
    PortB = &B01100000
    Waitms Warten
    PortB = &B11000000
    Waitms Warten
    PortB = &B10000000
    Waitms Warten
    Loop 'Wieder zurück zum 1. Schritt... für immer!


    End 'Der guten Form halber ein END am Ende.
    [/code:1]


    Eventuell müssen noch die Fusebits des Controllers gesetzt werden, damit er den internen Taktgeber verwendet. Das kann man in PonyProg machen - wie man die Bits am besten setzt findet man mit Hilfe dieser Seite raus: AVR Fusebit Calculator


    Allerdings sollte der Lieferzustand schon passen. Im Zweifelsfall erstmal auslesen und mit dem Calculator vergleichen. Wilde Änderungen können den Chip unbrauchbar machen (im schlimmsten Fall).


    Den Code dann compilieren und - sofern keine Fehlermeldungen angezeigt werden - das entstandene HEX File mit PonyProg2000 öffnen.
    Ladet Euch aber bitte die neueste Version!
    Schließlich in den Chip flashen und wenn alles gut ging, dann läuft das erste Lauflicht.


    Schaltplan & Board zu Teil 1


    Aufgrund der Nachfrage hier noch Schaltplan und ein mögliches Board-Layout...
    Teileliste ist schnell gemacht: 8x LED und passenden Widerstand für die verwendete Versorgungsspannung (s. Datenblatt des Chips und der LEDs + Widerstandsrechner), den Chip, den Sockel und einen Taster - wenn man das Ding reseten will. (für den Reset wird einfach Pin1 auf GND gelegt) - daher wird noch ein sogenannter Pull-Up-Widerstand benötigt: Der zieht im Normalzustand den Reset-Pin auf VCC, damit der Port nicht "flattert".
    Einen Schaltplan für den Programmieradater findet ihr oben, ein Layout dafür mach ich nicht - hab keine Centronics in meiner Eagle-Lib gefunden und wer sowas nicht hinkriegt sollte vielleicht das Pollin Board kaufen ;)
    Die Eagle-Datei versende ich gerne auf PM - ist ja nicht wirklich was besonderes.
    Den Chip am besten sockeln, so kann man ihn immer fein rausnehmen und neu flashen und er muss keinen Lötstress ertragen...
    [Blockierte Grafik: http://img63.imageshack.us/img63/84/tutorial1schaltungneuqe9.th.png] [Blockierte Grafik: http://img57.imageshack.us/img57/9760/tutorial1layoutneusp6.th.png]


    Stefan Z

  • Zitat von "Danny"

    Also ich nutze den GCC-Compiler für C!
    Habe einen Atmel 89C51ED2 ;) für das LCD in meinem Kicker!
    Mag die 8051 lieber als AVR's!


    Ich wüsste jetzt nichtmal nen Unterschied zwischen den beiden zu nennen - für die hier angedachten Sachen isses echt Latte glaub ich - und die ATinys gibts (fast) überall fürn Apple und n Ei. (und Bascom Basic auch für beide ;) ).
    Falls du Lust hättest, könnten wir die Quellcodes auch gerne als Dual-Version rauspeitschen - 1x Basic, 1x GCC. Was meinste?


    Stefan Z

  • Jaaaaaaaaa Stefan,


    sehr sehr nice das du unsere gebete erhört hast.Ich suche für meine anwendung eine timerschaltung -> Doppelblitz und Lauflicht.Kann zwar die schaltung so aufbauen, aber die ist zu groß und soviel ich weiss,gibt es den atmel auch in smd?!?!


    Achja,mein problem ist eigentlich das flashen,was ist besser,selber bauen oder programmer platine kaufen?


    Also ich freu mich schon auf das tutorial.


    bye bye Oli

  • Zitat von "Lappy"

    Achja,mein problem ist eigentlich das flashen,was ist besser,selber bauen oder programmer platine kaufen?


    geht beides gut... Platine is halt sicherer - die tuts - einmal getestet - immer zuverlässig.
    Altes Druckerkabel + Sockel + Widestände geht aber auch super.
    Kommt drauf an was man da hat und ob man grad bei Pollin bestellt oder nicht ;)


    Stefan Z

  • Kommt immer drauf an was man realisieren will!
    Ich sag mal wenn du ein uC-Board aufbauen willst, sollte man schon wissen wie man diesen beschalten muss vom Quarz bis zu einem Festspannungsregler, Max323 (Serielle schnitstelle zum pc)!
    Ob die ausgänge Pullups benötigen usw.
    Gibt schon einige sachen zu beachten.


    Grundsätzlich unterscheiden sich die Controllertypen von der Architektur.
    Da sind die geschmäcker verschieden.
    Und dann gibt es eben noch innerhalb der Controllertypen unterschiede... wieviel Ports man hat, timer, watchdog, wie schnell und wieviel speicher...
    Hängt eben davon ab was man realisieren will (zb. mein AT89C51ED2 kostet ca.8,90€)


    @ Lappy
    Am besten ist ein Chip mit Flashspeicher und ISP!
    Das heißt er wird in der schltung geflasht besser und einfacher gehts nicht!
    Ich schreibe mein Programm um schliesse mein Board an den PC und nach 10 sekunden ist alles fertig! PIC's Brennen usw find ich viel zu zeit aufwendig und stressig!

  • Zitat von "Danny"


    @ Lappy
    Am besten ist ein Chip mit Flashspeicher und ISP!
    Das heißt er wird in der schltung geflasht besser und einfacher gehts nicht!
    Ich schreibe mein Programm um schliesse mein Board an den PC und nach 10 sekunden ist alles fertig! PIC's Brennen usw find ich viel zu zeit aufwendig und stressig!


    Das heißt,man könnte die schaltung immer wieder ohne größeren aufwand verändern?!


    bye bye Oli

  • Könnte/Kann man...
    Dazu mußt eben auf der Platine nur eine Serielle Schnittstelle und den dazu gehörigen Baustein mit verbauen und du kannst Sie jeder Zeit ändern, Kabel an den PC und Fertig.
    Ist eben besonders von Vorteil wenn man in der entwicklung ist.
    Hingegen wenn du den uC einmal Programmierst und dann bleibt er immer so wäre es unsinnig! Ich habe ein uC-Board und habe es allgemein gebaut. Da heißt habe die Ports nach aussen gelegt und un kann dran anschließen was ich will und für alles nutzen, weil er universel einsetzbar ist. Wenn du ih nur auf ein Projekt ausrichjtest, bekommst das ganze eben etwas kleiner und vll günstiger hin!


    Kannst ja mal in den Thread Kicker Beleuchtung gucken da sind auch bilder... (leider nur lochraster platine, sher chaotisch!)

  • Kann es kaum erwarten das es los geht.
    Was ich mal geil fände, wenn man eine RGB-Applikation entwickeln könnte die nach der Temperatur geht. Zum Beispiel wenn es kalt es wird es rötliches Licht geben und wenn es warm wird ein geiles Blau!!!
    Aber ich denke damit geht es schon in die High-Professional Area :)

  • Wer noch kein EAGLE besitzt, kann sich die free version laden, die kann schon einiges was man am anfang brauch. Vor man benutzt es für nicht-komerzielle sachen. was das genau heißt kann man auch auf der HP erfahren, einfach mal googeln.

  • Hi Stefan_Z...
    ist echt gut geworden... =D>
    Ließt sich gut.
    Doch eine Sache hat mich etwas verwundert... oben sagtest etwas von Druckerkabel und weiter unten dann Serrielle-Schnittstelle. Also wenn ich nicht ganz auf den Kopfgefallen bin ist ein Druckerkabel (Port) eine Parallele-Schnittstelle.... :-k


    Achso und vll hat ja nicht jeder ein passendes Netzteil was stabile bsp. 5V liefert, in diesem fall benötigt man nur einen Festspannungsregler.... Wäre vll gut das zu erwähnen... (sollte man Praktischer weise ambesten immer einbauen) Dann kann man auch einfach ein 12 V Netzteil dran hauen... (kostenpunkt vll 30 cent, günstiger als ein neues netzteil :D )


    Ansonsten TOP!

  • Du brauchst:
    Ein Steckbrett oder ne Lochrasterplatine mit Draht und Lötzinn.
    5V Festspannungsregler (zu empfehlen) + Kühlkörper
    Dann die LED's und dazu passend die Vorwiderstände (hängt von der LED ab). Dann den uC Chip (Tiny...). Einen Taster...
    Und je nach dem das Kabel... zum Programmieren.
    Hab leider gerade nicht die Zeit es genau auf zu listen!


    Da fällt mir noch etwas ein..
    @ Stefan_z
    Wie programmierst du den Chip, klar mit dem Kabel! aber habe in deiner schaltung keinen Anschluss dafür entdeckt!