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
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
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
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...
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.
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
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)
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?
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!
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
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.
Eine eigene Frage?
Dieser Thread ist über 23 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.