Forum: Mikrocontroller und Digitale Elektronik Lichtschalter in Assembler/Atmega8


von O. A. (sokrates1989)


Angehängte Dateien:

Lesenswert?

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
von Jeff (Gast)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von O. A. (sokrates1989)


Lesenswert?

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?

von Heinz V. (heinz_v)


Lesenswert?

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.

von Jeff (Gast)


Lesenswert?

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.

von Jeff (Gast)


Lesenswert?

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

von trulla (Gast)


Lesenswert?

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

von O. A. (sokrates1989)


Angehängte Dateien:

Lesenswert?

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.

von Jeff (Gast)


Lesenswert?

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.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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

von Jeff (Gast)


Lesenswert?

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

von Jeff (Gast)


Lesenswert?

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

von Amateur (Gast)


Lesenswert?

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

von O. A. (sokrates1989)


Lesenswert?

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.

von Jeff (Gast)


Lesenswert?

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.

von Jeff (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.