Hallo,
wie kriege ich das hin, das PD7 als Ausgang den Zustand des PD4 als
Eingang anzeigt ??
Aus den Tutorien-Beispielen habe ich mir dieses geprutscht -
funktioniert aber nicht:
.include "4433def.inc" ;bzw.å2333def.inc
ldi r16,0b11000000
out DDRD, r16 ;PD7,PD6 - Ausgang, Rest als Eingang
loop:
in r16, PIND ;an PIN D anliegende Werte (Taster)r16
out PORTD, r16 ;Inhalt von r16 an Port D ausgeben
rjmp loop ;Sprung zu "loop:" -> Endlosschleife
man merkt vielleicht, das ich ein Neuling auf diesem Gebiet bin ;-)
Hi...
Solange du den eingelesenen Wert unverändert ausgibst, wirst du nix
sehen...
Wenn also PD7 den Zustand von PD4 annehmen soll, dann musst du schon
den Wert des Bits4 von r16 nach Bit7 des r16 kopieren.
Das geht z.B. mit Bit-Transfer über das T-Flag des Statusregisters
(BLD/BST).
...HanneS...
Was wird mit PIND überhaupt eingelesen ??
Wenn nur PD4 ein Signal hat ??
0, oder 1, oder 0b00010000 oder 0b011101111 ??
@HanneS: Wenn ich deine Aussage richtig deute heißt das, das
0b00010000 ins r16 kopiert wird ???
Hi,
mit PIND sind ALLE Pins des Port D gemeint. Du liest PD0-PD7 am Stück
ein.
Was Du einliest kommt ganz darauf an, was an den Pins gerade anliegt.
Gruß Bernd
Hi...
Dann nochmal langsamn zum Mitmeißeln:
Mit
IN R16,PIND
liest du den Zustand der 8 Pins von PortD in r16 ein.
Somit hat Bit 0 von r16 den Zustand von PD0,
Bit 4 von r16 den von PD4 und Bit 7 den von PD7.
Mit IN (und OUT) transferierst (kopierst) du also immer ein ganzes
Byte, welches 8 Bits enthält. Betrachtest du das Byte als Zahl
(0...255), dann ist das ja ok. Siehst du das Byte aber als einen
"Container", der die Zustände von 8 voneinander unabhängigen
Schaltern enthält, dann musst du dich auf die Bits konzentrieren.
In deinem Beispiel liest du den Ausgang PD7 mit ein, obwohl dich dessen
Zustand nicht interessiert, denn es ist ja kein Eingang. Da gibt es dann
die Möglichkeit des "Maskierens", mit dem man einzelne Bits setzen
oder löschen kann (andi, ori, sbr, cbr, and, or).
Nochmal zu deinem konkreten Programm:
- Du liest den Zustand von PD0...PD7 (PIND) in r16 ein
- Dich interessiert aber nur PD4 (das steht jetzt in Bit4 von r16)
- Du willst, dass PD7 den Wert von PD4 annimmt
- Also musst du Bit4 des r16 nach Bit7 des Registers kopieren,
welches du mit OUT an PortD ausgeben möchtest
- Da dies bei dir auch r16 ist, musst du Bit4 von r16 nach Bit7
von r16 kopieren
- Ein einzelnes Bit kopiert man vorteilhaft mit den Befehlen
bld und bst
- Du müsstest also zwischen IN R16,PIND und OUT PORTD,R16
einen Programmblock einfügen, mit dem du das benötigte Bit
kopierst
Grundprinzip der Datenverarbeitung: E V A (Eingabe, Verarbeitung,
Ausgabe), bei dir fehlt die Verarbeitung... 8-D
Stack solltest du künftig auch initialisieren (Stackpointer auf Ramende
setzen), auch wenn dein jetziges Programm keinen Stack nutzt. Aber
sobald du Unterprogramme oder Interrupts nutzt, muss das unbedingt
sein.
Viel Erfolg...
...HanneS...
Wenn Du in Deinem Code nach dem "in r16, PIND" den befehl "swap r16"
einfügen würdest, dann würden z.b. die oberen und unteren Bits von r16
vertauscht werden. Wenn der Befehl "in r16, PIND" den Wert
"00001111" nach r16 einlesen würde, dann wäre der Inhalt von r16 nach
dem swap Befehl "11110000". Auf diese Weise könntest Du also an
PD4-PD7 den Inhalt der Eingänge PD0-PD3 ausgeben (dabei würde Eingang
PD0 an Ausgang PD4 ausgegeben, PD1 an PD5, PD2 an PD6 und PD3 an PD7.
Da DDRD in deinem Code jedoch nur PD6 und PD7 als Ausgang definiert,
würde jedoch nur PD3->PD7 und PD2->PD6 stattfinden)
Probiers mal hiermit:
.include "4433def.inc" ;bzw.å2333def.inc
ldi r16,0b11000000
out DDRD, r16 ;PD7,PD6 - Ausgang, Rest als Eingang
loop:
in r16, PIND ;an PIN D anliegende Werte (Taster)r16
BST r16,4 ;Bit 4 von r16 in das T-Flag schreiben (Bit Store)
BLD r16,7 ;T-Flag in Bit 7 von r16 laden (Bit Load)
out PORTD, r16 ;Inhalt von r16 an Port D ausgeben
rjmp loop ;Sprung zu "loop:" -> Endlosschleife
Mit den beiden Befehlen die auch Hannes schon erwähnte, BLD (Bit Load
from T-Flag) und BST (Bit Store to T-Flag) kann man ein einzelnes Bit
von einem Register in ein anderes, in dem Fall das gleiche, ohne
aufwendige Abfragen, Bitschiebereien und Verknüpfungen kopieren.
Das T-Flag, welches sich im Status-Register befindet, dient dabei als
Puffer.
Gruß
Andi
Vieln Dank für die schnellen und zahlreichen Antworten,
welche mich enorm weitergebracht haben.
Wenn ich noch etwas wissen möchte melde ich mich bestimmt, wird sicher
nicht die letzte Frage gewesen sein ;-)