mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik geht das überhaupt?


Autor: jaja...derhenne (Gast)
Datum:

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

Autor: Sebastian Wille (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stack initialisziert?!?

Sebastian

Autor: Johannes M. Richter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stack sollte fuer rjmp doch nicht notwendig sein, oder?

Autor: ...HanneS... (Gast)
Datum:

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

Autor: jaja...derhenne (Gast)
Datum:

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

Autor: Bernd (Gast)
Datum:

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

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nimm mal für ein und ausgang unterschiedliche ports, dann klappt das
auch

Autor: ...HanneS... (Gast)
Datum:

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

Autor: Joachim Schäfer (Gast)
Datum:

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

Autor: Andi (Gast)
Datum:

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

Autor: jaja...derhenne (Gast)
Datum:

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

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SBIS PIND,4
CBI PORTD,7
SBIC PIND,4
SBI PORTD,7

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.