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
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
Dein Programm ist viel zu umständlich, schau dir mal Beispiel 2 auf http://www.mikrocontroller.net/tutorial/io-basics.htm an.
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
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...
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.
Wenn du die LEDs invertieren willst, dann schreibst du zwischen die Befehle in und out einfach noch ein "com r17".
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
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)
@ Andreas & Stefan: ich habe es beim Verfassen meines Beitrags schon fast vermutet, dass jemand schneller ist ;-)))
Tja, lieber es helfen zwei zu schnell als gar niemand!! :-)
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?
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!
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
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.
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.