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 ;-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.