Forum: Mikrocontroller und Digitale Elektronik Atmega32 mit Assembler und LED


von Marcel (Gast)


Lesenswert?

Hallo zusammen,

ich habe ein Pollin Eva.-Board V2.0.1 mit einem Atmega32 und über den 
JTAG Anschluss einen AVR Dragon angeschlossen.
Als Software benutze ich AVR Studio.

Da ich in Assembler-Programmierung gerade erst einsteige, habe ich 
einige Startschwierigkeiten. Ich habe zwar geschafft die beiden LEDs des 
Pollin-Boards mit Hilfe des Tutorials zum laufen zu bringen, aber ich 
bekomme es nicht hier über den Assembler-Code einzelne Ausgänge, und 
somit einzelne LEDs zum leuchten zu bringen, bzw. einen der drei Taster 
einzulesen.
Mir fehlt einfach der korrekte Quelltext wo Port D Pin 19 meine LED 
einschaltet. Ich finde nur Infos, wo alle Pin's von einem Port als 
Eingang oder Ausgang konfiguriert werden.
In C ist das keine große Sache, da findet man auch einige Informationen 
im Netz.
Ich hoffe, mir kann geholfen werden.

Gruß,
Marcel

von Achim M. (minifloat)


Lesenswert?

Zum Port einlesen nimmt man PINx(Port INput x) Register.
Auch nicht vergessen, die Datenrichtung mit DDRx(Data Direction Register 
x) einzustellen. x steht hier für einen Portnamen. Zum Ausgeben dann 
PORTx.

Aufgepasst: die Neueren Megas toggeln die ensprechenden Bits des PORTx, 
wenn man in PINx schreibt. Beim Mega32 m.W. aber nicht der Fall.

m32.inc oder wie sie auch immer heißen mag eingebunden?

mfg mf

PS: Pin 19 ist PD5? dann schreibst du (1 << PD5).
oder mit der B00101101- bzw. 0b00101010-Schreibweise, falls dein ASM das 
frisst.

In DDR ein Bit auf "1" heißt Ausgang.

Portausgaben gehen mit OUT. Die Konstante musst du erst mit LDI ausm 
Flash in dein Lieblings-Arbeitsregister laden.

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

von Marcel (Gast)


Lesenswert?

Guten Morgen,

vielen Dank schonmal für die Antwort.

Ich habe mich an diesem Code orientiert
1
.include "m8def.inc"         ; Definitionsdatei für den Prozessortyp einbinden
2
 
3
         ldi r16, 0xFF       ; lade Arbeitsregister r16 mit der Konstanten 
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

Wenn ich das richtig verstehe, sind in diesem Progrämmchen ja alle Ports 
von B als Ausgang geschaltet. Beim Pollinboard sind aber nur zwei 
Ausgänge von D als Ausgang und 3 als Eingang von D. Eben die LEDs und 
Taster.
Wenn ich das Programm nun laufen lasse leuchten ja folglich beide LEDs 
weil es alles Ausgänge sind, wenn ich das richtig verstehe.
Wie müsste ich denn jetzt diesen Quelltext ändern wenn ich an Port D 
einen Taster und eine LED angeschlossen habe?

Achja, die m32~~ hab ich eingebunden.

von Daniel M. (erfolgstyp)


Lesenswert?

servus

wenn du mit dem taster 1 der an pd 2 angeschlossen ist die led 1 pd5 
leuchten lassen willst wenn der taster gedrück ist sieht das prog z.b. 
so aus.



.include "m32def.inc"      ; Definitionsdatei für den Prozessortyp 
einbinden

ldi r16, 0b11110000       ; bit 0-3 als Ausgang, bit 4-7 als Eingang
out DDRB, r16             ; Inhalt von r16 ins IO-Register DDRB ausgeben


ende:                     ;Sprungmarke hier beginnt das prog zu 
wiederholen

sbis pinD, 2              ;überspringt den nächsten befehl wenn bit high
sbi portD, 5              ;schalted die led ein

rjmp ende                  ; Sprung zur Marke "ende" -> Endlosschleife



so ich hoffe ich habs gut auskommentiert bin mir aber nicht sicher ob 
die inc datei so heißt


frisch aus dem tutorial zitiert:

Man muss nicht immer ein ganzes Register auf einmal einlesen oder mit 
einem neuen Wert laden. Es gibt auch Befehle, mit denen man einzelne 
Bits abfragen und ändern kann:

    Der Befehl sbic ("skip if bit cleared") überspringt den 
darauffolgenden Befehl, wenn das angegebene Bit 0 (low) ist.
    sbis ("skip if bit set") bewirkt das Gleiche, wenn das Bit 1 (high) 
ist.
    Mit cbi ("clear bit") wird das angegebene Bit auf 0 gesetzt.
    sbi ("set bit") bewirkt das Gegenteil.

von Marcel (Gast)


Lesenswert?

ldi r16, 0b11110000       ; bit 0-3 als Ausgang, bit 4-7 als Eingang

Ich glaub, die Zeile hat mir (gedanklich) gefehlt.
Probier es zu Hause mal aus, sitz grad in der Vorlesung.
Danke schonmal.

Gruß,
Marcel

von spess53 (Gast)


Lesenswert?

Hi

>ldi r16, 0b11110000       ; bit 0-3 als Ausgang, bit 4-7 als Eingang

Entweder ist 'ldi r16, 0b11110000' oder der Kommentar falsch.

MfG Spess

von Daniel M. (erfolgstyp)


Lesenswert?

der kometar ist falsch herum muss nartürlich heißen

ldi r16, 0b11110000       ; bit 0-3 als Eingang, bit 4-7 als Ausgang

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.