.include "m8def.inc" ; Definitionsdatei für den Prozessortyp einbinden
2
3
ldi r16, 0xFF ; lade Arbeitsregister r16 mit der Konstanten 0xFF
4
out DDRB, r16 ; Inhalt von r16 ins IO-Register DDRB ausgeben
5
6
ldi r16, 0b11111100 ; 0b11111100 in r16 laden
7
out PORTB, r16 ; r16 ins IO-Register PORTB ausgeben
8
9
ende: rjmp ende ; Sprung zur Marke "ende" -> Endlosschleife
In dem Kapitel heißt es unter dem Teilkapitel "Assemblieren" wie folgt:
"Das Programm muss mit der Endung ".asm" abgespeichert werden, z. B. als
"leds.asm". Diese Datei können wir aber noch nicht direkt auf den
Controller programmieren. Zuerst müssen wir sie dem Assembler füttern.
Bei wavrasm funktioniert das z. B., indem wir ein neues Fenster öffnen,
den Programmtext hineinkopieren, speichern und auf "assemble" klicken.
Wichtig ist, dass sich die Datei "m8def.inc" (wird beim Atmel-Assembler
mitgeliefert) im gleichen Verzeichnis wie die Assembler-Datei befindet.
Der Assembler übersetzt die Klartext-Befehle des Assemblercodes in für
den Mikrocontroller verständlichen Binärcode und gibt ihn in Form einer
sogenannten "Hex-Datei" aus. Diese Datei kann man dann mit der
entsprechenden Software direkt in den Controller programmieren. "
Diese ".asm" Datei wird ja beim Anlegen eines Projekts automatisch als
Initial file erzeugt.
Bloß finde ich nur im "AVR Simulator" den ATmega8515...
Kann ich dann trotzdem das kleine Progrämmchen auf den 8515 auf dem
Board spielen?
Falls ja, wie?
Ich bedanke mich für hilfreiche Antworten schon einmal im Voraus.
Gruß
Max
Wenn ich auf "Build and Run" klicke, dann kommt bei mir folgende
Fehlermeldung:
LED.asm(9): error: Undefined symbol: ende
Edit:
Warum muss man vor dem Befehl
Moin Moin,
als allerstes fällt mir auf, du hast da die m8def.inc drinne, willst
aber ganicht den Mega8 benutzen. An der Stelle musst du dir die für
deinen Prozessor entsprechende definitionsdatei einbinden.
Und zeig mal dein ganzes Programm, dann kann man was zu dem Fehler
sagen. Vermutlich hast du einfach vergessen, ende zu definieren, aber
mehr dazu, wenn dein Programm hier steht.
MfG und frohe Weihnachten,
Chaos
Edit:
Das ist genau das was ich meinte, wenn du rjmp benutzt, musst du ja
deine Sprungmarke definieren, damit er auch weiß, wo er hin soll, das
machst du, indem du "ende:" schreibst. =)
nocheinmal
> ende: schreiben?
Weil "ende:" das Label ist, an welche mit dem rjmp gesprungen werden
soll. Das ganze ist an dieser Stelle eine gewollte Endlosschleife.
Mach mal in die letzte Zeile noch einen Zeilenumbruch rein, so dass die
Zeile definitiv abgeschlossen ist.
Und ändere das m8def.inc gegen eines aus, das zu deinem Prozessor passt.
m8 ist für einen Mega 8. Du hast aber keinen Mega 8
Ach ... ich schreibe "ende:", damit das Programm auch weiß, dass dort
Schicht im Schacht ist??
Aber irgendwie ist mir das Programm noch nicht geläufig... sollen da die
LEDs automatisch von alleine rauf zählen oder per Tastendruck?
Martin Müller schrieb:> Ach ... ich schreibe "ende:", damit das Programm auch weiß, dass dort> Schicht im Schacht ist??
nein.
Du schreibst
1
ende:
um damit eine Stelle im Programm mit einem Namen zu versehen. Um sie zu
markieren.
An anderer Stelle in deinem Programm kannst du dich dann auf diesen
Namen beziehen. Zum Beispiel indem du dein Programm an diese Stelle
springen lässt.
Bei dir ist eben diese Stelle und die Sprunganweisung in einer einzigen
Zeile, weil es nichts weiter zu tun gibt.
nein mit ende: weiß das programm nicht das schicht im schacht ist. Mit
ende: erzeugst du lediglich eine Sprungmarke. Du könntest es KarlPeter:
nennen.
Und um dann das auszuführen, was hinter der Sprungmarke kommt, rufst du
halt die Sprungmarke mit rjmp KarlPeter auf, und dann führt er aus, was
da kommt.
Martin Müller schrieb:> Aber irgendwie ist mir das Programm noch nicht geläufig... sollen da die> LEDs automatisch von alleine rauf zählen oder per Tastendruck?
Jetzt mach mal halblang.
Diese Programm schaltet einen Port auf ein bestimmtes Muster. Mehr
nicht. Und nachdem es das getan hat, gibt es für das Programm nichts
weiter zu tun.
Bring das erst mal zu laufen.
Karl Heinz schrieb:> Martin Müller schrieb:>>> Aber irgendwie ist mir das Programm noch nicht geläufig... sollen da die>> LEDs automatisch von alleine rauf zählen oder per Tastendruck?>> Jetzt mach mal halblang.> Diese Programm schaltet einen Port auf ein bestimmtes Muster. Mehr> nicht. Und nachdem es das getan hat, gibt es für das Programm nichts> weiter zu tun.>> Bring das erst mal zu laufen.
Wenn ich auf "Build and run" klicke, wird es im unteren Fenster zwar
grün aber der gelbe Pfeil bleibt bei "ldi r16, 0xFF" stehen
wenn der µC zum Befehl "Springe an das Ende" kommt muss es ja das Ziel
"Ende" auch geben, sonst kommt eine Fehlermeldung.
durchsuche mal das Verzeichnis bzw. die Unterverzeichnisse von
AVR-Studio, ich vermute die Datei die du einbinden musst heißt M8515.inc
im AVR Studio reicht "Build", dadurch wird die .hex Datei erstellt,
"Build and Run" brauchst du wenn du dein Programm danach noch simulieren
willst.
Ach jetzad...
Programm schreiben -> Programm abscheichern -> Klick auf Build -> auf
AVR Klicken -> die Hexdatei suchen für Flash
und dann wird die Datei ausgeführt.
Im Moment leuchten nur LED 0 und LED 1 auf ....
Soll anscheinend Sinn der Sache sein, dass nur diese beiden aufleuchten
da es ja in Zeile 6 heißt "0b11111100".
Ich kann mich wage daran erinnern, dass das mit dem Kompliment zu tun
hat, dass im Endeffekt 1 = 0 ist und 0 = 1...
Oder täusche ich mich da?
Martin Müller schrieb:> Ich kann mich wage daran erinnern, dass das mit dem Kompliment zu tun> hat, dass im Endeffekt 1 = 0 ist und 0 = 1...>> Oder täusche ich mich da?
Es hat mit der Beschaltung mit der Diode zu tun:
Wenn der Vorwiderstand der Diode (Vcc) an 5V liegt und die Diode an Pin
0 gelegt ist, fließt ja dann Strom , wenn Pin 0 auf Masse geschaltet
ist. Die Diode leuchtet eben nur, wenn Anode richtung Vcc geht und
Kathode richtung Null.
Diese Beschaltung mit R und der Diode bildet eine sog. nullaktive
Schaltung.
dh. eine Null am Pin lässt die Diode leuchten bzw. aktiviert sie. Mit
Komplement hat das weniger zu tun.
übrigens, die Diode ist nicht eitel, sie braucht keine Komplimente.
Es heißt Komplement ( lat. Ergänzung) so wie zum NPN-Transistor ein
PNP-Transistor die Aufbau-Möglichkeiten ergänzt.
Oder wie beim binären Zahlenpaar 0,1 die Null und die Eins gegenseitig
jeweils das komplementäre Signal sind.
Sorry, ich nehme alles zurück.
Im Tutorial heißt es wie folgt:
"Der nächste Befehl, ldi r16, 0b11111100 lädt den Wert 0b11111100 in das
Arbeitsregister r16, der durch den darauffolgenden Befehl out PORTB, r16
in das I/O-Register PORTB (und damit an den Port, an dem die LEDs
angeschlossen sind) ausgegeben wird. Eine 1 im PORTB-Register bedeutet,
dass an dem entsprechenden Anschluss des Controllers die Spannung 5V
anliegt, bei einer 0 sind es 0V (Masse). "
@Peter R.:
Damit verstehe ich Dich.
Folgendes Programm habe ich im AVR - Tutorial gefunden:
1
.include "m8def.inc"
2
3
ldi r16, 0xFF
4
out DDRB, r16 ; Alle Pins am Port B durch Ausgabe von 0xFF ins
5
; Richtungsregister DDRB als Ausgang konfigurieren
6
ldi r16, 0x00
7
out DDRD, r16 ; Alle Pins am Port D durch Ausgabe von 0x00 ins
8
; Richtungsregister DDRD als Eingang konfigurieren
9
loop:
10
in r16, PIND ; an Port D anliegende Werte (Taster) nach r16 einlesen
11
out PORTB, r16 ; Inhalt von r16 an Port B ausgeben
12
rjmp loop ; Sprung zu "loop:" -> Endlosschleife
In der Beschreibung heißt es wie folgt:
"Achtung: Auch wenn es hier nicht explizit erwähnt wird: Man kann
natürlich jeden Pin eines jeden Ports einzeln auf Ein- oder Ausgabe
schalten. Dass hier ein kompletter Port jeweils als Eingabe bzw. Ausgabe
benutzt wurde, ist reine Bequemlichkeit. "
Nun zu meiner Frage:
Wie kann ich einen einzelnen Pin auf Ein- oder Ausgabe schalten?
Danke für die Antworten im Voraus.
Gruß
Max
Martin Müller schrieb:> Nun zu meiner Frage:>> Wie kann ich einen einzelnen Pin auf Ein- oder Ausgabe schalten?
Lies im Tutorial weiter.
Es ist fast unvermeidlich, dass man in einem Tutoriumstext auch mal
einen Vorgriff auf die nächste Seite und/oder Kapitel einbaut. Das kommt
insbesondere dann vor, wenn mehrere Autoren am Text arbeiten und einer
das Gefühl hat, er müsse durch den Vorgriff etwas vorwegnehmen, damit
kein Leser denkt, das geht immer und überall so 'kompliziert'.
Ah ok... Dann wird das wohl noch kommen. Dann stelle ich die Frage nach
hinten.
Sorry für die vielleicht blöde und voreilige Frage.
Kann ich denn in diesem Thread hier die ersten Progrämmchen vom
AVR-Tutorial posten?
Irgendwie finde ich es blöd, wegen jedem einzelnen kleinen Progrämmchen
einen extra Thread aufzumachen.
Gruß
Max
Martin Müller schrieb:> Ah ok... Dann wird das wohl noch kommen. Dann stelle ich die Frage nach> hinten.>> Sorry für die vielleicht blöde und voreilige Frage.>> Kann ich denn in diesem Thread hier die ersten Progrämmchen vom> AVR-Tutorial posten?
Wozu? Brenn es auf den µC, probier sie aus, ändere sie um, sieh dir an
wie sich Dinge variieren lassen. Dein µC ist der beste Lehrer den es
gibt. Denn der lässt sich kein X für ein U vormachen, sondern arbeitet
dein Programm genau so (inklusive aller Nebeneffekte) ab, wie du sie
geschrieben hast. Wenn das mal nicht mit dem übereinstimmt, was du
eigentlich wolltest (und das wird öfter der Fall sein, als dir lieb
ist), dann lad sie in den Simulator und simulier sie dort durch, zum
Beispiel in Einzelschritten, wobei du dir in der simulierten Umgebung
ansiehst, was die Register machen bzw. wie sich die Bits dort verändern.
Das ist dein erster Ansatzpunkt. Alles was du damit dann nicht lösen
kannst (und auch das wird vorkommen), das kannst du natürlich hier
posten (oder auch in einem neuen Thread). Aber einfach ein paar Zeilen
hinschreiben und dann das Forum bitten, das zu korrigieren, das ist
nicht zielführend. Allerdings sind gerade die ersten Sachen im Tutorium
so, dass es eigentlich zu keinen Problemen kommen sollte, wenn man
wenigstens ein kleines Verständnis für die Dinge aufgebaut hat.
Du kannst gar nicht früh genug damit anfangen, dich mit deinen
Werkzeugen vertraut zu machen und eine gewisse Fertigkeit im Umgang
damit zu erhalten. Genauso Fehlermeldungen: gerade bei einfachen
Programmen lernt man recht gut, welche Fehlermeldung in welcher
Fehlersituation aus welchem Grund entsteht, so dass man später, wenn die
Dinge komplexer werden, in der Umkehrung dann auch anhand der vielleicht
nicht ganz eindeutigen Fehlermeldung den Rückschluss auf mögliche
Fehlerquellen schafft.
@Martin Müller,
die hex Schreibweise ist für die bildliche Darstellung suboptimal.
Du musst in die entsprechende Stelle des Datenrichtungsregisters = DDR
eine 1 für Ausgang und eine 0 für Eingang setzen.
z.B.
1
lditemp,0b11110000
2
outDDRB,temp
dadurch hast du am Port B 4 Ausgänge und 4 Eingänge Pin 7, 6, 5 und 4
sind die Ausgänge und 3, 2, 1 und 0 die Eingange.
oder in Hex Format