www.mikrocontroller.net

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


Autor: Daniel Seichter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

Autor: Jens Renner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Daniel Seichter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

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

Autor: Stefan Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Malte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Malte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Andreas & Stefan:

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

Autor: Stefan Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja, lieber es helfen zwei zu schnell als gar niemand!! :-)

Autor: Daniel Seichter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Stefan Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Daniel Seichter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jens Renner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.