Anfänger: Vereinfachung von 1 zu 1 umsetzung (STK500)

Gast #46112
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
Angehängte Dateien:
Gast
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
Gast
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
Gast
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...
Gast
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.
Gast
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
Gast
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)
Gast
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?
Gast
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!
Gast
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
Gast
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.

Antwort schreiben

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.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.