Wie programmiert man einen Microcontroller?
lima-city → Forum → Sonstiges → Technik und Elektronik
assembler
betreiben
chip
code
compiler
computer
controller
http
methode
mikrocontroller
programm
programmieren
programmiersprache
schleife
sekunde
spannung
sprache
taster
transistor
url
-
Ich habe schon seit einiger Zeit immer wieder mit verschiedenen Lima-Usern per PN, Jabber, usw. darüber geredet, jedoch konnte mir leider keiner weiter helfen. Deswegen eröffne ich jetzt dieses Thema. Wahrscheinlich ist es sowieso für viele Hobbyelektroniker interessant.Ich will von meiner PC aus einen Microcontroller programmieren. Dieser muss (für mein Beispiel, das ich dann auch als erstes programmieren und bauen werde) mindestens 7 verschiedene Ausgänge haben. Ich kann aber auch mit weniger leben, weil 7 wirklich eine schlechte Zahl ist. Zwischen Masse und den Ausgängen muss mindestens eine Spannung von 3V anliegen. 4V oder mehr währen mir aber lieber. Die ersten 5 Ausgänge führen zu roten LEDs, die natürlich mit den passenden Widerständen in Reihe geschaltet sind (welche ich jetzt aber nicht immer erwähnen werde). Diese 5 LEDs sind in einer Reihe auf einer Platine aufgelötet. Der 6. Ausgang führt zu einer blauen LED. Der 7. führt zu einem kleinen Relais. Weiter braucht der Microcontroller einen Eingang. An diesem ist ein Taster zwischen dem Eingang und Masse angebracht. Drückt man auf den Taster, dann beginnt ein Prozess: Nach einer Sekunde erleuchtet die erste LED. Nach 2 die 2., usw. Eine Sekunde, nachdem die 5. LED erleuchtet ist, geht sie wieder aus. Eine weitere Sekunde später erlischt auch die 4. wieder. Ist die 1. LED erloschen, so leuchtet die blaue auf und das ganze passiert nochmal. Wenn dann wieder die 1. LED erloschen ist, wird das Relais geschaltet.Wird aber, während der Prozess im Gang ist, der Taster erneut gedrückt, dann soll der Prozess beendet werden. Anschließend sollen alle LEDs, die bereits leuchten, erlöschen. Und alles wieder zum erneuten Start klar gemacht werden.Was jetzt noch kommt ist nicht so wichtig: Nachdem man den Taster zum Deaktivieren gedrückt hat, sollen alle LEDs 2 mal eine halbe Sekunde lang und im Takt einer halben Sekunde aufleuchten.Das alles soll getrennt vom Computer erfolgen. Zum OS, unter dem ich das programmieren und auf den Microcontroller spielen will: Ich verwende Linux Ubuntu 9.04, hätte aber auch einen Computer der unter Windows XP läuft zur Verfügung. Als Spannung wäre mir 9V oder 4,8V lieb. Das ließe sich dann einfach mit kleinen Akkus ausstatten.Wie kann ich das realisieren? Welche Programmiersprache muss ich dafür beherrschen? Wie kann ich das an den Computer anschließen? Welchen Microcontroller soll ich verwenden?
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Soso... Mikrocontroller.
Lang ists her, seit ich mich damit befasst habe. :D
http://www.mikrocontroller.net/ - Die Seite ist an sich ganz gut.
Bei der Ausgangsspannung kannst du ja notfalls etwas schummeln, nicht wahr? Transistoren oder so. :D
Bei der Eingangsspannung musst du auch mal schaun, aber es gibt sicherlich welche, die deinen Ansprüchen genügen.
Welche Sprache du wählst hängt zu einem großen Teil auch von dem verwendeten Controller ab. Es gibt sogar welche, die sich mit einer C ähnlichen Sprache programmieren lassen.
Wie man es an den Computer anschließen kann... Mh, da müsste es Anleitungen auf Microcontroller.net geben.
Schau dir doch einfach mal die AVR an.
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Equipment
Das ist eigentlich sehr gut gemacht und dürfte dir einen guten Einstieg bieten.
Der Controller müsste auch deinen Ansprüchen genügen. -
>>Welcher Chip:
>Ich programmiere PICs, welcher Chip der Beste ist, muss jeder für sich selbst entscheiden. AVRs sind auch sehr beliebt, und es gibt viel Lesestoff dazu. Für PICs gibt es eine gute Seite, mit der man gut einsteigen kann: http://www.sprut.de/. Ich würde dir auch empfehlen, ein Buch für Einsteiger zum Mikrokontrollerprogrammieren kaufen. Das hat mir wirklich gut geholfen.
>>Programmiersprache:
> Jeder Mikrokontroller ist in Assembler Programmierbar. Assembler ist eine Hardwarenahe Programmiersprache, darum musst du dich vor dem Programieren. mit den Technischen Daten auseinandersetzen. Ist meines Wissen bei den anderen Sprachen auch so, bei Assembler musst du aber die Daten aber besonders genau durchlesen. Es ist nicht nachteilig, Assembler zu beherschen, da man damit sehr Effizient programmieren kann.
>C ist eine Sprache, für die es warscheinlich für jeden Autonnormalverbraucher Chip einen Compiler gibt. Ich steige auch gerade in das PIC-C um, was dem Computer C gleichgestellt ist. Du musst aber noch manche Register setzen. Aber nicht so viele wie in Assempler.
>Andere Hochsprachen: Etwa das gleiche wie in C, es ist aber nicht für jede Sprache ein Compiler erhältlich
>Basic gut zum einsteigen, da sie sehr leicht ist. Ich habe noch keine Programme für Mikrokontroller in Basic geschrieben, aber für Computer. Der größte nachteil von Basic ist die Unübersichtlichkeit des Codes, bei größeren Programmen. Zum Einsteigen soll sie, nachdem ich gehört habe aber sehr gut geeignet sein.
>>Verbindung Computer, Chip:
>Ich verwende immer ein Programmiergerät, um den Chip zu programmieren. Der Nachteil dabei ist, dass man den Chip immer aus der Fassung nehmen muss, wenn man ein neues Programm auf ihn schreiben will. Man kann aber auch nur die 5 Leitungen (Bei PICs) die zum Programmieren nötig sind herrausführen, um dein Chip zu beschreiben. Das ist aber nur in Entwicklungsboards richtig nützlich, da man bei gelöteten Schaltungen irgendwie die zusätzlichen Anschlüsse herrausführen muss.
>Die 2 Möglichkeit wäre ein Bootlader. Da auf den meisten Chips noch keiner Vorhanden ist, muss man ihn zuerst hineinschreiben. Dafür bräuchte man wieder ein Programmiergerät. Bei oftmaligen Beschreiben des Cipes in schneller Abfolge (Programmentwicklung) ist er aber sehr nützlich.
Ich hoffe ich konnte helfen.
mfg. eap
Beitrag zuletzt geändert: 2.6.2010 14:34:38 von eap -
Ich habe das Gefühl, dass die Seite, die Eap gepostet hat eher für die kompliziertere Entwicklung ist und dass ein Einstieg in die Materie über die Seite, die Adrians gepostet hat, einfacher ist. Es gibt bei beiden Methoden teurere und billigere Angebote. Da ich in diesem Gebiet (Microcontrollerprogrammierung) keinerlei Erfahrung aufweisen kann, entscheide ich mich einfach für die goldene Mitte, welche durch das Pollin ATMEL Evaluations-Board dargestellt wird, und hoffe auf mein Glück.
Bei diesem Produkt wird einem gleich der AT Mega 32-16PU angeboten. Dieser hat 40 Pins. Ich denke, dass ich dann sogar 10 rote LEDs verwenden kann und 2 oder 3 Taster einbauen kann:
1.) Start für 40 Sekunden
2.) Start für 20 Sekunden (blaue LED wird weg gelassen)
3.) Abbrechen
Ich werde mir noch zusätzlich für spätere Versuche den ATMEGA48-20PU mit bestellen. Wie oft ich die beiden kaufe, weiß ich aber noch nicht.
Die max. Stromaufnahme des Boards beträgt 250 mA, ich werde mir also dieses Steckernetzteil kaufen. Weiter lege ich mir ein Sub-D-Kabel zu. Einige Halterungen für die Microcontroller brauche ich auch noch. Habe ich etwas vergessen?
Edit:
Ich habe jetzt 34 DIN A 4 Seiten eines rein englischen Assembler-Tuts gelesen. Bis jetzt kam kaum ein kleiner Anfang dran. Ich habe das gefühl, dass ich bei C besser aufgehoben währe. Ich möchte Assembler jetzt nicht nach dem Motto "dauert mir zu lang" oder "schaff ich sowieso nicht" hin schmeißen, jedoch wird es wahrscheinlich lange dauern, bis ich alle 319 DIN A 4 Seiten gelsen habe. Und dann habe ich erst den Grundstoff drin. Den Grundstoff von PHP kann man beispielsweise auf ca. 100-120 Seiten lernen. Bei C stelle ich mir etwa 150 Seiten vor. Entspricht diese Vorstellung der realen Situation?
Der Hauptgrund, weswegen ich Assembler nicht sooo gut finde ist, dass man diese ganzen Zuweisungen machen muss. Ich habe gelesen, dass diese bei C größtenteils wegfallen. Ist das korrekt? Kann ich dann, wenn ich den Quellcode in C schreibe und compilieren lasse, einigermaßen präßise Zeitangaben planen und parallel zu einem laufenden Prozess Aktionen durchführen, wie beispielsweise, diesen auf ein Kommando von außen (Beispielsweise Stromkreis schließen) ab zu brechen? Kann man sich das so vorstellen, wie z.B. in JS (oder ist das sogar so?), dass man sagt
und dass dann in 10000 Millisekunden, also 10 Sekunden diese Funktion ausgeführt wird? Oder kann man es (jetzt so geschrieben, wie in PHP) so regel?window.setTimeout("andere_funktion()", 10000);
$start_time = time(); while($time + 10 > time()) { // leere schleife } andere_funktion();
Beitrag zuletzt geändert: 7.6.2010 17:39:09 von drafed-map -
Bei PICs muss man die Zeitschleife selber programmieren. Hier ein Bsp. in Assembler:
; Mögliche Standardwarteschleife für 1 ms bei 4MHz Systemtakt ; PAUSE1ms ; Label, wo die Standardwarteschleife beginnt movlw D'199' ; Dezimalwert für die Zeitkonstante damit PAUSE = 1ms ist movwf schleife ; Schieben des Wertes 199 in die Variable "schleife" ; Ende der Start-Einstellungen für "PAUSE1ms" PAUSEE ; Einsprungstelle für Pausenschleifen nop nop ; Taste nicht gedrückt, springe zur Marke "HAUPT" DECFSZ schleife,1 decfsz schleife,1 ; Dekrementiere die Variable "schleife" um 1 und schreibe das Ergebnis zurück in "schleife" goto PAUSEE ; Ist die Zeit verstrichen? Nein, dann springe zurück zu "PAUSEE" ; Neuer Durchlauf bis "schleife" = 0 return ; Mögliche Standardwarteschleife für Zeit 255 ms ; PAUSE250ms movlw D'200' movwf help PAUSE250 call PAUSE1ms decfsz help,1 ; Dekrementiere die Variable "help" um 1 und schreibe das Ergebnis zurück in "schleife" goto PAUSE250 ; Ist die Zeit verstrichen? Nein, dann springe zurück zu "PAUSE250ms" ; Neuer Durchlauf bis "schleife" = 0 return
Dabei Besteht das Programm aus einen Unterprogramm, das 1ms Wartet (Jeder Befehl benötigt eine bestimmte zeit zum abarbeiten), und ein 2. Programm, das das erste so oft, wie benötigt aufruft. Der Nachteil dabei ist, das kein CODE während der Zeitschleife ausgeführt werden kann, und wenn man einen Timer verwendet, dass er die Genauigkeit stark einschränkt. Diese Methode ist normalerweise nicht sehr genau.
Die 2. Methode wäre, ein Timer-Interrupt. Wird meistens auf benutzt. Ich hätte ein funktionierendes Beispiel in C, das ist aber am anderen Computer. Werde es aber nachposten.
Das Entwicklungsboard schaut nicht schlecht aus. Die Stromaufnahme wird aber steigen, wenn du noch LEDs anhängst. Standartleds benötigen 20mA(rot, gelb)-40mA(grün) Dabei musst du auf die max. Belastbarkeit achten. die meisten PICs darf ich mit maximal 20mA belasten. Weiß nicht, wie das bei den AVR ist, wird wohl aber nicht anders sein. Normalweise sollte man die PINs mit max. 3 mA high, und 8mA low belasten. Wie bei Vielen sachen in der Elektronik ist das aber vorsichtig bemessen. ich belast meistens mit 20mA, und die Chips haben mir es nicht übel genommen.
mfg. eap
INFO: Die Seite, die ich gepostet habe ist für anfänger gedacht. Es wird ca. Schritt für Schritt erklärt, wie man einen PIC Programmiert. Am anfang ist halt viel Terorie, die man mehr oder weniger zum Assemblerprogrammieren braucht. Bei C, wird das meiste schon vom Compiler erledigt, manches sollte man aber trotzdem wissen. z.b.: Das die kleinen Chips nicht zum 16Bit rechnen gebaut wurden, und das sehr viel rechenleistung und Programmspeicher benötigt, da es normalerweise kein 16 Bit, sondern ein 8 Bit Controller ist. Ist man halt auf die Zahlen von 0-255 Beschränkt, statt bis 65535 bei 16 Bit (müsste richtig gerechnet worden sein) -
Also diese Methode mit der langen Schleife (und nur einem Prozessorkern) bringt mir nichts, da ich ja den Abbrechen-Befehl eingebaut haben möchte. Dieser würde dann nicht aufgenommen werden.
Dass du das Entwicklungsboard gut findest, freut mich . Ich will das aber nicht auf dem Entwicklungsboard betreiben, sondern getrennt davon. An einer DC-Quelle. Geht das?
Dass du mir das mit der max. Belastbarkeit sagst ist sehr gut, da ich neben den 11 LEDs ja noch das Relais + Freilaufdiode (die ja nichts mit dem ausgehenden Stromfluss zu tun hat, die ich aber lieber erwähne) daran hängen will. Es handelt sich um ein 1,5V-Relais mit einem Spulenwiderstand von 12 Ohm. Es müssen also 125 mA durch. Alles zusammen sind das ca. 360 mA. Das kann ich dem Microcontroller nicht zumuten. Die empfindlichsten Transistoren, die ich da haben, werden dafür nicht ausreichen, ich suche nach den empfindlichsten, die ich finden kann. Eine Spannung, die aus dem Microcontroller heraus kommt währe auch wissenswert. Ich wälze gleich mal das technische Datenblatt.
Den Assembler-Einstieg auf der von dir geposteten Seite habe ich mir noch garnicht angeschaut, aber dafür wahrscheinlich alles andere . Ich habe per Google ein Assembler-Tut im PDF-Format gefunden und in diesem gelesen. Näheres ist glaube ich unwichtig, da ich mich ja jetzt für C entschieden habe. In der technischen Beschreibung des Entwicklungsboards wird einem auch einiges Beschrieben. Darin sind sogar Links zum Compilern zu finden. Einen solchen werde ich mir herunter laden und anschauen, nachdem ich die oben erwähnten Transistoren gefunden habe. -
Hallo,
wenn du Anfänger bist, dann fang mit Atmel bzw. AVR an.Die sind billig einfach zu programmieren und zu debuggen.Also Programmiersprache würde ich Bascom AVr empfehlen der Code ist simple und schnell erlernt.Es gibt massenhaft Beispiele im Netz.Auch zu Brenner(Programmiergeräten) siehe Dongel nur 3 Widerstände am Parallelport.
http://www.mcselec.com/ Mit der Demo kommste schon sehr weit,und die Hilfe ist auch gut verständlich geschreiben.
http://www.rowalt.de/mc/avr/progd.htm dieser Adapter ist einfach und bringt bei kurzen Übertragungswegen gute Ergebnisse. -
Dieser Stick bekommt man laut der Seite mit Glück für 10 Euro. Bei dem, was ich bei Pollin raus gesucht habe, muss ich 15 Euro zahlen und habe dann mehrere Chipgrößen und noch kleine Schaltteile zum Testen dabei.
Ich habe mir jetzt ein kleines C-Tut gesucht. Schon nach wenigen Seiten bin ich um vieles schlauer. Das hat wirklich viel Ähnlichkeit mit anderen Sprachen, wie PHP. Es sind nur einzelne "Formalitäten", bei denen sich die Sprachen differenzieren. So sieht es zumindest demnach aus, so weit, wie ich bis jetzt bin. Ich gehe aber davon aus, dass sich das noch ändern wird, z.B., wenn auf Signale reagiert werden soll.
Was mir noch wichtig ist: Kann ich einen Microcontroller getrennt von Entwicklungsboard mit einer Gleichspannung betreiben? -
Sicherlich kannst Du den Mikrocontroller getrennt vom Entwicklungsboard betreiben. Je nach dem welchen Type du hast z.B. 5 Volt dran und es läuft. Vorausgesetzt du hast vorher ein Programm auf den Controller geladen.
-
Die empfindlichsten Transistoren, die ich da haben, werden dafür nicht ausreichen, ich suche nach den empfindlichsten, die ich finden kann.
Welche Transistoren hast du?
Bei mir läuft der BC547B ohne Probleme, und der kann bis zu 200mA schalten. Nachdem Was ich in dem Datenblatt gelesen habe, hat der Transistor einen Verstärkungsfaktor von 330, du kannst also 330 mal so viel Strom entnehmen, wie du hineinsteckst (nur in dem Bereich, für den der Transistor ausgelegt ist) für 200mA wird der Mikrokontroller mit nicht mal 1 mA belastet. Also mehr als genügend überdimensioniert.
Eine Spannung, die aus dem Microcontroller heraus kommt währe auch wissenswert.
Die Ausgangsspannung ist bei den meisten Mikrokontrollern ca. Die Eingangsspannung.
Beitrag zuletzt geändert: 8.6.2010 20:12:24 von eap -
restrictedarea schrieb:
Sehr gut, ich habe mich mal für den 2. Microcontroller, der ich hier verlinkt habe (3. Link im 1. Antwortpost von mir) erkundigt, da vom Händler selbst kein Datenblatt beigelegt wurde. Ich kann es von 1,8V bis zu 5,5V hin betreiben. Das ist ja ein gigantischer Spannungsraum! Ich habe mich auf die Suche nach möglichst kleinen Akkus gemacht, und nichts gefunden. Ich werde jetzt 2x1,2V AAA-Akku verwenden. Die sind sehr klein und 2,4V passt bestens, besonders, weil Akkus bei voller Ladung viel mehr Spannung aufweisen, als angegeben, kann ich diesen Spannungsraum ausnutzen.
Sicherlich kannst Du den Mikrocontroller getrennt vom Entwicklungsboard betreiben. Je nach dem welchen Type du hast z.B. 5 Volt dran und es läuft. Vorausgesetzt du hast vorher ein Programm auf den Controller geladen. -
C ist sicher die beste programmiersprache für MCs.
Besorge dir ein fertiges Board wo ein abgespeckter freier C-Compiler und Beispielprogramme mitgeliefert werden oder frei verfügbar sind. Da ist normalerweise der Startupcode in Assembler und ein Monitor zum debuggen dabei.
Nimm den MC lieber ein paar Nummern zu groß und benutze ihn als Entwicklungssystem. Dein "Produkt" kannst hinterher immer noch in einen kleineren MC packen.
Wenn an dein MC LEDs, Schalter und sonstiges Zeug angeschlossen wird nimm lieber einen "alten" 5V typ.
-
Also in diesem Zusammenhang muss ich dir geradezu das Portal www.roboternetz.de empfehlen!! Dort gibt es auch ein Tutorial für AVR's im Wiki welches auf recht einfacher Ebene gehalten wird. Außerdem wird dort im Forum auch über das von Dir erwähnte Pollin-Board geschrieben. Allein durch die Forumsuche kannst Du da viel über das Board und die Programmierung von AVR's finden. Und Fragen werden dort gut und gerne beantwortet.
Eine klare Empfehlung!!! -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage