Einstieg in µC??? Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
|
|
|
BID = 482590
Chillin Stammposter
Beiträge: 203 Wohnort: Karlshuld
|
|
da ich in letzter zeit des öfteren kleine projekten habe bei denen mir ein µC verdammt hilfreich wäre, ich aber immer auf eine "notlösung" umsteigen muss da ich kein µC kann.
mir wurde allerdings gesagt, dass es verdammt lange dauert sich da einzuarbeiten.
darum wollte ich mal wissen wie lange es wohl dauern würde bis man ein paar kleine progs (nix besonderes) selber schreiben kann.
keine vorkenntnisse in prog sprachen, bei einem zeiteinsatz von ca. 1 std. pro tag
dacht z.B. an avr und einen atmega8 bzw. attiny 2313 oder so
_________________
|
|
BID = 482595
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
|
Moin,
Das geht eigentlich schnell.
Ich denke, so nach 2-3 Tagen wird das erste Programm, sehr einfach, laufen.
Typisch sind LED-Blinker oder auch Taster-drücken-LED-anmachen-Programme.
Das Ganze hängt aber auch damit zusammen, wie du programmieren willst:
1. sehr leicht, aber für absolute Programmieranfänger schon schwierig: Bascom Basic
2. wesentlich komplexer, aber extrem vorteilhafter, da sehr gut implementiert und getestet von einer großen Community: C (avr-gcc und binutils)
3. Wesentlich umständlicher, aber nicht unbedingt schwerer, wenn grundsätzliche digitale Schaltungsgrundlagen (Register, Latche, größere Speicher, Zähler, Bitmanipulation etc.) vorhanden sind: Assembler (-> Instruktionen, die dann nur noch durch den Assembler kodiert werden. Du musst quasi genau das machen, was du sonst rein diskret aufbauen würdest. Z.B. gibt es Instruktionen, die man auch quasi als Baustein der diversen Digitalschaltkreisfamilien erwerben kann)
Ich würde entweder direkt Maschinensprache/Assembler oder Basic empfehlen. C kann man später lernen, da die Sprache ansich einen größeren Lernaufwand darstellt. Dafür ist der erzeugte Kode quasi so perfekt, dass man nur selten Assembler benötigt, was mit C übrigens kein Problem ist, kann man mit C verbinden.
Die von dir genannten Bausteine sind gut, habe ich beide schon öfters benutzt.
_________________
|
|
BID = 482612
Chillin Stammposter
Beiträge: 203 Wohnort: Karlshuld
|
@DonComi
hm, also ich dachte bisher an einen assambler (avr) (bisher nur wenig grundlagen vorhanden)
denkst du Bascom Basic wäre da sinnvoller?
dann hab ich ja zumindest schon mal die richtigen controller
wie lernt man sich sowas denn am besten?
bzw. wo gibts ein gutes tutorial dafür?
_________________
|
BID = 482617
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Tutorial habe ich nicht benutzt, ich habe zuerst AVR-Assembler gelernt ( die Assemblersprache gibts eh nicht); und zwar anhand der Datenblätter. Dort sind alle vorhandenen Mnemonics (so heißt ein Symbol für einen Maschinenbefehl) samt Operanden wie Register, Adressen, Konstanten oder Bitnummern und benötigte Ausführungszeit aufgelistet.
Mit Bascom Basic habe ich mich ca. 1-2 Wochen herumgeschlagen, dann habe ich es gelassen, gefällt mir einfach nicht.
Basic konnte ich vorher, setze aber grade alles daran, es wieder zu verlernen .
Wenn du Windows nutzt kann ich nur AVR Studio empfehlen, wenn du Linux nutzt dann sowas wie avra und avr-dude als Brennerinterface.
Sonst sollten sich aber Tutorials finden lassen, nur kann ich nicht so nachvollziehen, wie man damit vernünftig lernen kann.
_________________
|
BID = 482619
hajos118 Schreibmaschine
Beiträge: 2453 Wohnort: Untermaiselstein
|
Evtl. ist das Evual-board von pollin ganz hilfreich ...
da ist einiges an peripherie schon verbaut, ganz gut dokumentiert und jeder weis, was Du für eine Hardware hast...
Und mega8/16 und tiny2313 werden (u.a.) auch unterstützt!
Mit weniger als €20 bist Du dabei!
Pack's an!
|
BID = 482849
BjörnB Stammposter
Beiträge: 242 Wohnort: Dortmund
|
Hallo,
ich habe damals in Assembler (im AVR-Studio) angefangen. Dadurch konnte ich den Aufbau des Controllers (ATmega16) sehr gut kennen lernen, was sehr praktisch ist, um für den Controller möglichst gut verarbeitbare und damit schnelle Programme zu schreiben. Für umfangreiche Projekte wird Assembler aber schnell unübersichtlich und lang. Irgendwann bin ich daher auf C (WinAVR) umgestiegen (konnte ich aber schon vorher). Ich würde Dir empfehlen, im Zweifelsfall lieber mit C anzufangen, da Du so von vornherein gezwungen bist, sauber und strukturiert zu programmieren. Für den Einstieg gibt es auch ein praktisches Wikibook ( http://de.wikibooks.org/wiki/C-Programmierung). Von Basic würde ich hingegen eher abraten, so vermeidest Du, dass Du dir irgendwelche unschönen programmiertechnischen Marotten angewöhnst, die Dir hinterher beim Umstieg auf C Schwierigkeiten bereiten. Und wie sagte damals noch mein Prof. in der C-Einführungsvorlesung: "Wer mit Basic gelernt hat zu programmieren, ist für sein Leben verdorben."
Schönen Gruß,
Björn
|
BID = 482852
Her Masters Voice Inventar
Avatar auf fremdem Server ! Hochladen oder per Mail an Admin
Beiträge: 5308 Wohnort: irgendwo südlich von Berlin
|
Pollinboard und das AVR Studio sind erstmal ein guter Einstieg. Wenn man noch garkeine Kenntnisse hat ist es auf jeden Fall sinnvoll erstmal dern Controller von Grund auf zu lernen und das geht am Besten mit Assembler. Wenn man dann die Funktionen des Chips einigermassen drauf hat kann man dann auch auf C umsteigen, um sich z.B. einiges zu vereinfachen. Gleich in C einsteigen halte ich für nicht so optimal, da man bei der Fehlersuche ggf auch mal in Assemblercodes rumsuchen muss und dann ist es nützlich das auch zu können. Wer sich garnicht um den Controller kümmern will und auch keine tieferen Einblicke in irgendwelche Funktionen wünscht kann auch ruhig mit BASIC anfangen. Das ist aber der schlechteste Einstieg. Zumindest mit BASCOM. FastAVR ist auch nicht viel besser, gibt aber als Zwischenschritt das erzeugte Assemblerprogramm aus, sodass eine eventuelle Fehlersuche erheblich erleichtert wird.
_________________
Tschüüüüüüüs
Her Masters Voice
aka
Frank
***********************************
Der optimale Arbeitspunkt stellt sich bei minimaler Rauchentwicklung ein...
***********************************
|
BID = 483208
Chillin Stammposter
Beiträge: 203 Wohnort: Karlshuld
|
erstmal danke für die zahlreichen hilfestellungen!
hab mir das board von pollin mal angesehen.
kann ich da direkt über die serielle schnittstelle prog. oder geht das nur über ISP?
kenne die programmierung bisher nur über den AVR-Prorgrammer und da wird über den 10-poligen (bzw. 6-poligen) ISP programmiert.
ist der programmer also notwendig oder geht das auch über die serielle schnittstelle?
dann werd ich wohl mal mit AVR anfangen.
nach weihnachten hoffe ich, dass ich zeit habe mich da etwas einzulesen
_________________
|
BID = 483311
Chillin Stammposter
Beiträge: 203 Wohnort: Karlshuld
|
so, ich habe mich mal ein bisschen in das datenblatt des tiny2313 und in dieses Tutorial vertieft. http://www.mikrocontroller.net/articles/AVR-Tutorial
hab zwar noch ein bisschen probleme damit die ganzen zusammenhänge zu verstehen, aber ich denke das gibt sich noch.
eine frage hab ich jetzt noch:
Es gibt doch beim AVR-Studio 4 die möglichkeit ein geschriebenes programm ohne µC zu "testen"
wie funktioniert das denn, bzw. kann man diese funktion überhaupt sinnvoll nutzen?
_________________
|
BID = 483324
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Oh ja, das kann man.
Lass mich nachdenken, ist etwads her, aber es geht etwa so:
1. Parameter einstellen, wie Taktfrequenz, genutzter µC
2. Schritt-für-Schritt-Simulation mit STRG+F11 (oder F9-F12, irgendwas da oben ) starten.
3. Mit F11 (oder F10?) kannst du nun jede einzelne Zeile ausführen lassen.
Es gibt bei der Simulation die Möglichkeit, alle IO-Ports (Ein-/Ausgängen, Timer, UART, ...), Speicherinhalte und Registerinhalte (ist eigentlich das selbe, ist aber unwichtig) anzeigen zu lassen und zu manipulieren (Simulation eines Tastendrucks o.ä.).
_________________
|
BID = 486457
Chillin Stammposter
Beiträge: 203 Wohnort: Karlshuld
|
so, habe mal ein kleines programm geschrieben zum "led mittels taster an und ausschalten" das klappt.
möchte jetzt gerne ein prog. schreiben.
dieses sollte so aussehen:
wenn an PIN x eine 1 anliegt dann soll für ca. 0,5 sekunden an pin Y eine 1 anliegen
ändert sich PIN x von 1 auf 0 dann soll an Pin Z für 0,5 sekunden eine 1 anliegen.
weiß aber noch nicht genau wie ich das angehe.
kann ich ein einzelnes bit überprüfen (vergleichen) oder nur ein ganzes register?
dachte daran den wert eines bits in ein register zu schreiben, beim nächsten programmdurchlauf das eine bit prüfen ob es sich verändert hat (also z.B. Pin x von 1 auf 0 geändert)
wenn es sich geändert hat einen timer anlaufen lassen der mir für 0,5 sekunden eine 1 an einen bestimmten pin liefert?
hoffe ich konnt mich einigermaßen verständlich ausdrücken!
Kann mir da jemand behilflich sein?
_________________
|
BID = 486470
bastler16 Schreibmaschine
Beiträge: 2140 Wohnort: Frankreich
|
Ich versuchs mal. Bin aber auch Anfänger, also ohne Garantie.
Zitat :
| 1. Parameter einstellen, wie Taktfrequenz, genutzter µC
2. Schritt-für-Schritt-Simulation mit STRG+F11 (oder F9-F12, irgendwas da oben ) starten.
3. Mit F11 (oder F10?) kannst du nun jede einzelne Zeile ausführen lassen. |
Programm schreiben, Strg+F7 für "Build and Run", F11 für Einzelschritt.
Zitat :
| kann ich ein einzelnes bit überprüfen (vergleichen) oder nur ein ganzes register? |
Bei solchen Fragen hilft das Instruction Set.
Guck dir mal SBRC, SBRS, SBIC und SBIS an.
Ich würde das ungefähr so lösen (auch Anfänger!):
Code : |
1. Includes, Registerdefinitionen,...
2. Pins als Eingänge/Ausgänge definieren (Register DDRx)
3. PinX einlesen, prüfen:
Wenn PinX=1:
4a. PinY=1
5a. 0,5 Sekunden warten (Google: AVR delay loop generator)
6a. PinY=0
7a. zurück zu 3.
Wenn PinX=0:
4b. PinZ=1
5b. 0,5 Sekunden warten
6b. PinZ=0
7b. zurück zu 3.
|
|
(Als Code ist das besser zu formatieren.)
Wenn die Version erstmal läuft kann man das ganze mit Unterprogrammen (RCALL) probieren, vorher Stack definieren! Danach anfangen mit Interrupts zu basteln, soweit bin ich noch nicht gekommen.
Viel Erfolg!!!
PS und OT:
Ich hab auch mit Bascom angefangen, bin nach sehr kurzer Zeit aber auf ASM umgestiegen. Da sind wenigstens alle Befehle in einem Dokument zu finden, man muss sich nicht mit irgendwelchen Hilfe-Dateien rumschlagen. Ich find ASM mittlerweile einfacher als Hochsprachen wie Bascom oder andere (außerhalb des µC-Bereichs).
|
BID = 486479
Chillin Stammposter
Beiträge: 203 Wohnort: Karlshuld
|
ich habe das jetzt mal so gelöst:
ich arbeite mit AVR
.include "2313def.inc"
loop:
ldi r16, 0b00000011 ;Datenrichtung PORTB
out DDRB, r16
ldi r16, 0b00000000 ;Datenrichtung PORTD
out DDRD, r16
in r16, PIND ;r16 mit wert PIND laden
cp r16, r18 ;r16 mit r18 vergleichen
brne nicht_gleich ;wenn nicht gleich springen
rjmp loop
nicht_gleich:
mov r18, r16 ;r18 mit wert von r16 laden
ldi r17, 0b00000001 ;r17 mit 0b00000001 laden
cbi PORTB, 0 ;Bit 0 von PORTB auf 0 setzen
out PINB, r17 ;r17 an PINB ausgeben
nop ;0,5s Pause (Fehlt!!!)
cbi PORTB, 0 ;Bit 0 von PINB auf 0 setzen
in r16, PORTB ;PINB auf 0 setzen
out PINB, r16
damit würde es prinzipiell funktionieren, ich brauche nur noch eine 0,5 s Pause (in der nichts geschieht)
wie man oben sehen kann vergleiche ich 2 register miteinander (r16 und r18)
kann ich an dieser stelle nur bit 0 von r16 mit bit 0 von r18 vergleichen?
_________________
EDIT: sorry, die formatierung meines programmcodes ist leider verloren gegangen.
kann mir trotzdem jemand mit meiner letzten frage weiterhelfen?
[ Diese Nachricht wurde geändert von: Chillin am 31 Dez 2007 16:12 ]
|
BID = 486480
bastler16 Schreibmaschine
Beiträge: 2140 Wohnort: Frankreich
|
Les mal mein oberes Posting, da steht was zu den Bit-Vergleichen und der Pause.
EDIT: Hab mal dein Prog. in den Simulator geschmissen. Irgendwie stimmt das nicht mit dem überein was du oben geschrieben hast:
Zitat :
| wenn an PIN x eine 1 anliegt dann soll für ca. 0,5 sekunden an pin Y eine 1 anliegen
ändert sich PIN x von 1 auf 0 dann soll an Pin Z für 0,5 sekunden eine 1 anliegen. |
Bei deinem Programm sind PinY und PinZ dasselbe und es wird ein ganzer Port überwacht.
Das Programm erzeugt also einen kurzen Puls an einem bestimmten Pin sobald sich PortD verändert.
[ Diese Nachricht wurde geändert von: bastler16 am 31 Dez 2007 16:20 ]
|
BID = 486491
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Moin,
1. Die Register PINx sind readonly, also nur lesbar
2. innerhalb von loop wird teilweise immer das Gleiche gemacht, das kann man "ausklammern", also vor loop schreiben. Spart rechenzeit, wenn auch wenig.
Mit welcher Taktfrequenz läuft deine CPU?
Wenn es 1MHz sind, dann verursacht folgendes Konstrukt eine halbe Sekunde Verzögerung:
delay:
push r30
push r31
ldi r31, 0xC3
ldi r30, 0x50
loop_:
nop
nop
nop
nop
nop
nop
sbiw r30, 1
brne loop_
pop r31
pop r30
ret
Die ganzen nops sind wichtig, weil sonst eine 16-Bit-Zahl zu klein wäre, um die Taktfrequnez von 1MHz auf 0.5Hz runterzuteilen.
push und pop sowie ret benötigen auch etwas Zeit, ist aber eher vernachlässigbar.
Du beginnt nun so mit deinem Programm:
.include "2313def.inc"
reset:
ldi r16, low(RAMEND)
ldi r17, high(RAMEND)
out SPL, r16
out SPH, r17
(hier wurde der Stackpointer initialisiert, damit du Unterprogramme starten und beenden kannst.)
dann dein restlicher Kode. Du kannst nun mit
rcall delay
etwa eine halbe Sekunde verzögern.
6x nop sind je ein Taktzyklus plus 2 Taktzyklen (2µs) der sbiw-Instruktion und 2 Zyklen (erneut 2µs) für brne. Macht pro Durchgang 10µs * 50000 (=0x0xC350).
_________________
[ Diese Nachricht wurde geändert von: DonComi am 31 Dez 2007 16:35 ]
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 20 Beiträge im Durchschnitt pro Tag heute wurden bisher 8 Beiträge verfasst © x sparkkelsputz Besucher : 182395021 Heute : 2217 Gestern : 7548 Online : 527 25.11.2024 11:36 7 Besucher in den letzten 60 Sekunden alle 8.57 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0695450305939
|