Hallo, es geht darum eine Led per Taster anzusteuern.. Code_2 ist aus einem Buch. Code_1 habe ich selber erstellt. Ich wollte fragen, ob "mein" Code für die Aufgabe ebenso geeinget ist wie der aus dem Buch. Ich habe keine Ein/Ausgänge im DDRx konfiguriert . Wäre das für diesen Fall schlimm? Bei meinem Code, habe ich immer einen Port direkt mit sbi/cbi angesteuert. Im Buch wird wird die Info ins Register geladen und dann an den Port ausgegeben. Bitte nur elementare Sachverhalte ansprechen, da es mir sonst nichts nützt. :) Es geht mir nicht darum ob mein Code besser ist, sondern lediglich darum zu lernen das es mehrere Möglichkeiten gibt.
:
Bearbeitet durch User
Ostap A. schrieb: > Ich habe keine Ein/Ausgänge im DDRx konfiguriert . > Wäre das für diesen Fall schlimm? Dann kannst Du über PORTx auch nichts ausgeben, also Deine LED steuern.
Ostap A. schrieb: > Ich wollte fragen, ob "mein" Code für die Aufgabe ebenso geeinget ist > wie der aus dem Buch. a) Nein. > Ich habe keine Ein/Ausgänge im DDRx konfiguriert . > Wäre das für diesen Fall schlimm? b) Ja. Zu a) Dein Code ist "ungeeigneter" weil ständig ein- und ausgeschaltet wird und der PullUp auch noch zusätzlich ständig (und unnötig) eingeschaltet wird. Zu b) Ein Ausgang muss als solcher konfiguriert werden. So wird das ganz einfach nix.
Jeff schrieb: > Ostap A. schrieb: >> Ich habe keine Ein/Ausgänge im DDRx konfiguriert . >> Wäre das für diesen Fall schlimm? > > Dann kannst Du über PORTx auch nichts ausgeben, also Deine LED steuern. Aber es funktioniert...wenn ich den Taster drücke leuchtet die LED. Also was genau meinst du?
Ostap A. schrieb: > Aber es funktioniert...wenn ich den Taster drücke leuchtet die LED. Also > was genau meinst du? Ja, es funktioniert, wenn zufällig gerade der richtige Wert im DataDirectionRegister steht, das ist aber nicht garantiert, deshalb solltest Du es initialisieren.
Ostap A. schrieb: > Aber es funktioniert ... nur mit ganz ganz wenig Strom, der für Deine LED aber reicht um was zu erkennen. Du "mißbrauchst" quasi den internen Pullup-Widerstand, der einen Eingang nur auf High halten soll.
Heinz V. schrieb: > wenn zufällig gerade der richtige Wert im > DataDirectionRegister steht Nach Reset ist das immer Null, also alles auf Eingang. So groß kann der "Zufall" gar nicht sein :)
Ostap A. schrieb: > Bei meinem Code, habe ich immer einen Port direkt mit sbi/cbi > angesteuert. > Im Buch wird wird die Info ins Register geladen und dann an den Port > ausgegeben. sbi/cbi kann I/O Ports nur bis 31 adressieren. in/out geht schon bis 63
Hallo, die Aufgabe sollte erweitert werden um einen zweiten Taster und eine zweite Led. Ich habe es nun so porgrammiert, wie im Buch von Aufgabe1 (1 Taster, 1 Led) vorgestellt. Ich habe leider keine Lösung aus dem Buch, deshalb wollte ich mal hier meinen Code zeigen und fragen ob der geeignet ist. Auf dem Board funktioniert es. Taster1 schaltet die erste Led, Taster2 schaltet die zweite Led. Beide Taster gleichzeitig schalten beide Leds. vielen dank fürs Anschauen.
Zum vollständigen Verständnis obs funktionieren kann gehört eigentlich auch immer ein Schaltplan. Wenn z.B. die LEDs und Schalter gegen VCC geschaltet wären kann man sich im Programm einen Wolf suchen. Dein Programm selber mag funktionieren (habs jetzt nicht geprüft), ist aber noch reichlich umständlich und unnötig groß. Das Register r17 kannst Du Dir z.B. vollkommen schenken da Du die PortB Eingangspins direkt mit sbis/sbic abfragen kannst.
O. A. schrieb: > Ich habe leider keine Lösung aus dem Buch, deshalb wollte ich mal hier > meinen Code zeigen und fragen ob der geeignet ist. Hmmm. So etwa ?
1 | mainloop: |
2 | ldi r16, 0b00000011 ; default (Leds aus) |
3 | in r17, PINB ; Eingabe Taster 1 und 2 (Speichern in r17) |
4 | sbrs r17, 0 |
5 | ori r16, 0b00000100 |
6 | sbrs r17, 1 |
7 | ori r16, 0b00001000 |
8 | lout: |
9 | out PORTB, r16 ; Ausgabe |
10 | rjmp mainloop |
Eine Mainloop ganz ohne Register:
1 | mainloop: |
2 | sbis PINB,0 |
3 | cbi PORTB,2 |
4 | sbic PINB,0 |
5 | sbi PORTB,2 |
6 | sbis PINB,1 |
7 | cbi PORTB,3 |
8 | sbic PINB,1 |
9 | sbi PORTB,3 |
10 | rjmp mainloop |
oder hier für den Fall Taster gegen Masse + Pullups
1 | mainloop: |
2 | sbic PINB,0 |
3 | cbi PORTB,2 |
4 | sbis PINB,0 |
5 | sbi PORTB,2 |
6 | sbic PINB,1 |
7 | cbi PORTB,3 |
8 | sbis PINB,1 |
9 | sbi PORTB,3 |
10 | rjmp mainloop |
> wenn zufällig gerade der richtige Wert im > DataDirectionRegister steht Die Buben und Mädels, beim Hersteller/Entwickler haben viel Grips dahingehend investiert, dass alle Ports nach einem Reset als Eingänge konfiguriert sind. Ist durch Zufall ein Pin als Ausgang geschaltet und mit einem Ausgang verbunden (Hardware vom Benutzer) kann das schlimmstenfalls zu einer miesen Geruchsbelästigung führen. Ist es wirklich so schlimm einen Pin, explizit als Ausgang zu schalten? Und zwar nicht Irgendeinen, sondern genau den Gewünschten?
Jeff schrieb: > Dein Programm selber mag funktionieren (habs jetzt nicht geprüft), ist > aber noch reichlich umständlich und unnötig groß. Das Register r17 > kannst Du Dir z.B. vollkommen schenken da Du die PortB Eingangspins > direkt mit sbis/sbic abfragen kannst. Das habe ich doch bei der ersten Aufgabe gemacht. Da habe ich kein register verwendet sondern direkt mit sbis abgefragt und mit sbi ausgegeben. Da sagtest du ich missbrauche den internen pullup. Also habe ich das so verstanden dass es die falsche Variante ist. Und jetzt machst du es genauso ...???? Ich kann dir nicht folgen. Und warum wurde das mit den Registern im Buch gemacht ? Die Autoren sind immerhin Dipl. Ing.
O. A. schrieb: > Da habe ich kein > register verwendet sondern direkt mit sbis abgefragt und mit sbi > ausgegeben. Da sagtest du ich missbrauche den internen pullup. Also habe > ich das so verstanden dass es die falsche Variante ist. Da verwechselst Du was. Wenn ein Pin (wie immer nach dem Reset) Eingang ist und Du dann das zugehörige Bit im PortB Register setzt wird zunächst der interne Pullup-Wiederstand zu diesem Eingang gesetzt. Damit ist dieser beim Einlesen immer 1, es sei denn Du schließt mit dem Taster nach Masse (diesen Schaltplan nehme ich mal an). Diesen Eingang kann man nun mit sbis/sbic abfragen und er ist immer dann Low=0 wenn der Schalter gedrückt ist. Die Ausgabe wiederum machst Du an den zwei anderen Portpins die zuvor als Ausgang geschaltet wurden. Hängen die LEDs an Plus, schaltet sie ein CBI auf den Portpin ein, hängen sie an Minus (Masse) dann ein SBI. Wiegesagt, solange Du keinen Schaltplan lieferst stochert man in dieser Frage im Nebel.
O. A. schrieb: > Und warum wurde das mit den Registern im Buch gemacht ? Die Autoren sind > immerhin Dipl. Ing. Das ist ja sehr schön für die Autoren, deshalb führen bei Assembler trotzdem sehr viele Wege zum Ziel. Gern möchte man da die kürzeste und schnellste Variante finden. Für ein Lehrbuch-Beispiel bevorzugt man aber vielleicht ein längeres Beispiel. Du hast hier zwei mögliche Alternativen aufgezeigt bekommen. Meine Variante benötigt keine Register, setzt aber nur die von Dir verlangte Funktionalität um und ist schlecht erweiterbar. Die Variante mit Registern ist da besser dran.
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.