Forum: Mikrocontroller und Digitale Elektronik Anfänger: Vereinfachung von 1 zu 1 umsetzung (STK500)


von Daniel Seichter (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich bin totaler Anfänger in Sachen Mikrokontroller und Assembler und
spiele deswegen ein wenig umher.
Gerade bin ich dabei, mich mit Eingabe/Ausgabe zu beschäftigen und habe
mein erstes Programm geschrieben, das die LEDs an PortB leuchten lässt,
je nachdem, an welchem Pin ich ein Signal anlege (Schalter). D.h.
Taster1=PIN1=LED1

Meine Fragen hierzu sind nun:
Wann nehme ich PORTB und wann DDRB (hab ein wenig von einem anderen
Beispiel mir den Kopf genommen)?

Ist es möglich, gleich sowas wie z.B. Werteübergabe zu machen, woebi
ich sage, wenn an PortD-Pin1 ein Signal kommt, dann auch an PortB-Pin1
Signal ausgeben.

Es ist mir klar, dass man bei einer 1:1 Schaltung keinen
Mikrokontroller verwendet, jedoch ist dies nur für mich ein Beispiel um
das E-(V)-A Prinzip zu verstehen und um damit ein wenig rumzuspielen.

Danke im Voraus für Eure Hilfe

von Stefan Peter (Gast)


Lesenswert?

Hallo!
DDRB ist das DataDirictionByte für Port B, wird nur verwendet um dem uC
mitzuteilen ob es sich bei dem Port um einen Ein-bzwAusgang handelt.
Mit PortB kannst du ein Byte an den Port B senden oder ein Byte
einlesen

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Dein Programm ist viel zu umständlich, schau dir mal Beispiel 2 auf
http://www.mikrocontroller.net/tutorial/io-basics.htm an.

von Jens Renner (Gast)


Lesenswert?

Beispiel:

ser r16
out DDRB, r16 ; Port als Ausgabe
out PORTB, r17 ; Inhalt von r17 ausgeben

clr r16
out DDRB, r16 ; Port als Eingabe
in r17, PINB ; Zustände an den Pins in r17 einlesen

von Stefan Peter (Gast)


Lesenswert?

Hab das Programm gar nicht angeschaut, ich würde um die ganze Routine
noch eine Schleife machen, denn dieses Programm ist durchlaufen bevor
du überhaupt daran gedacht hast, dass es begonnen haben könnte...

von Daniel Seichter (Gast)


Lesenswert?

Hab es nun soweit geändert, dass ich nur noch

.include "8515def.inc"

in r17, PIND
out DDRB, r17

im Programm stehen habe.
Das Problem:
a) ich weiss nicht, ob das richtig ist
b) es leuchten nun alle LEDs und sie gehen aus, wenn ich den Taster
betätige.

Danke im Voraus

Daniel

P.S.: Hier wird einem echt schnell geholfen, das hat ein RIESEN LOB
verdient.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Wenn du die LEDs invertieren willst, dann schreibst du zwischen die
Befehle in und out einfach noch ein "com r17".

von Stefan Peter (Gast)


Lesenswert?

ldi r16, 0xFF
out DDRB, r16    ;das musst du machen um Port B als Ausgang zu
definieren

ldi r16,0x00
out DDRD, r16  ;;das musst du machen um Port D als Eingang zu
definieren

loop:
in r17, PIND
out PORTB, r17      ;was bei PortD gelesen wurde wird bei PortB
ausgegeben
rjmp loop

so sollte es eigentlich funktionieren

Grüsse

von Malte (Gast)


Lesenswert?

erstens das und zweitens funktioniert dein beispiel nict wenn du mehrere
tasten gleichzeitig drückst :)
es wird immer nur eine LED leuchten.

Hast übrigens noch vergessen, DDRD als Eingang zu definieren:

.include "8515def.inc"
.def Temp = r16

RESET:
ser Temp
out DDRB,Temp
clr Temp ; temp=0
out DDRD, Temp ; PORT D zur Eingabe definieren

loop:
 IN  temp, PIND  ; PORT D einlesen
 OUT PORTB, temp ; und original auf PORT B ausgeben
 RJMP loop       ; und das ganze wieder von vorne


Und wenn du zu diesem EA Prinzip noch das V dazu bringen willst, dann
kannst du zwischen die Zeilen IN und OUT auch noch

 COM temp

schreiben und schon hast du einen 8bit Inverter gebaut.
Zwar als inverter ein wenig teuer, aber macht ja nichts :) (nix für
ungut, sollte ein scherz sein)

von Malte (Gast)


Lesenswert?

@ Andreas & Stefan:

ich habe es beim Verfassen meines Beitrags schon fast vermutet, dass
jemand schneller ist ;-)))

von Stefan Peter (Gast)


Lesenswert?

Tja, lieber es helfen zwei zu schnell als gar niemand!! :-)

von Daniel Seichter (Gast)


Lesenswert?

Hallo Stefan, Hallo Malte,

ok, danke, beide Lösungen funktionieren.*g*

Aber nun mal eine theoretische Frage:
Stefan schreibt, ich soll DDRD mit 0x00 und DDRB mit 0xFF als Eingang
bzw. Ausgang definieren und Malte schreibt nur etwas vom definieren des
Einganges.

Warum bzw. wo gibt es die Unterschiede bzw. ist es nötig beide (Ein und
Ausgang) zu definieren?

Was bewirkt das 0xFF und 0x00? Nach welchem Stichwort/Schlagwort suche
ich da, um mehr darüber zu erfahren?

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?


von Stefan Peter (Gast)


Lesenswert?

Eigentlich ist nur eines nötig, da das andere standardmässig so ist,
frag mich aber nicht ob es standardmässig als Ein- oder Ausgang
eingestellt ist. Weil ich es selbst nicht weiss habe ich zur Sicherheit
beides definiert!

von Daniel Seichter (Gast)


Lesenswert?

Danke, den Link hab ich vorhin besucht, aber er hat sich nicht
vollständig geladen, jetzt sehe ich auch, warum DU vorhin Beispiel 2
geschrieben hast und jetzt sehe ich auch, dass es da noch ein wenig
weiter geht.

Werde mir das dann mal zu gemüte führen

So, jetzt habt Alle vielen Dank für die schnelle Hilfe

von Jens Renner (Gast)


Lesenswert?

Du musst jedem Port sagen, ob er als Eingang oder Ausgang betrieben
werden soll.
Ein Byte wie 0xff (= 0b11111111 ) beschreibt den Zustand jedes
einzelnen Pins des DDR.

Mit 0x0f (= 0b00001111) werden folglich nur die vier niederwertigen
Pins als Ausgang definiert, die anderen als Eingang. Näheres steht im
Datenblatt zu Deinem µC.

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.