Forum: Mikrocontroller und Digitale Elektronik geht das überhaupt?


von jaja...derhenne (Gast)


Lesenswert?

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 ;-)

von Sebastian Wille (Gast)


Lesenswert?

Stack initialisziert?!?

Sebastian

von Johannes M. Richter (Gast)


Lesenswert?

Stack sollte fuer rjmp doch nicht notwendig sein, oder?

von ...HanneS... (Gast)


Lesenswert?

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...

von jaja...derhenne (Gast)


Lesenswert?

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 ???

von Bernd (Gast)


Lesenswert?

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

von Tobi (Gast)


Lesenswert?

nimm mal für ein und ausgang unterschiedliche ports, dann klappt das
auch

von ...HanneS... (Gast)


Lesenswert?

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...

von Joachim Schäfer (Gast)


Lesenswert?

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)

von Andi (Gast)


Lesenswert?

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

von jaja...derhenne (Gast)


Lesenswert?

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 ;-)

von thkais (Gast)


Lesenswert?

SBIS PIND,4
CBI PORTD,7
SBIC PIND,4
SBI PORTD,7

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.