Forum: Mikrocontroller und Digitale Elektronik Erstes Programm vom AVR-Tutorial mit dem ATmega8515


von Martin M. (silent_max)


Lesenswert?

Hallo liebe Gemeinde.

Ich möchte mein erstes Programm aus dem AVR-Tutorial auf den ATmega8515 
spielen.

Hier der Link vom Tutorial:

http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen

Daraus das erste Programm:
1
.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

von Martin M. (silent_max)


Lesenswert?

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
1
rjump ende
 nocheinmal ende: schreiben?

: Bearbeitet durch User
von J. T. (chaoskind)


Lesenswert?

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. =)

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Martin Müller schrieb:

> Warum muss man vor dem Befehl
1
rjump ende
 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

von Martin M. (silent_max)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von J. T. (chaoskind)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Martin M. (silent_max)


Lesenswert?

Ah ok...

Aber dennoch habe ich noch nicht die Grundintention des Programmes 
verstanden...

von Martin M. (silent_max)


Lesenswert?

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

von Thomas (kosmos)


Lesenswert?

so muss das aussehen
1
ende: rjmp ende

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.

von Martin M. (silent_max)


Lesenswert?

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?

von Peter R. (pnu)


Lesenswert?

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.

von Martin M. (silent_max)


Lesenswert?

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.

von Martin M. (silent_max)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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'.

: Bearbeitet durch User
von Martin M. (silent_max)


Lesenswert?

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

von Stefanus (Gast)


Lesenswert?

Nein, eröffne lieber jedesmal einen neuen Thread, sonst wird es schnell 
unübersichtlich.

von Martin M. (silent_max)


Lesenswert?

Ja ok...

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Thomas (kosmos)


Lesenswert?

@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
ldi temp, 0b11110000
2
out DDRB, 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
1
ldi temp, F0
2
out DDRB, temp

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.