[avrsm] variables Bit manipulieren

OP #2944647
Lesenswert?

Hi @all,

Ich versuche ein Lauflicht in Assemblersprache im Attiny2313 zu 
animieren.
Es sollen immer 3 LEDS gleichzeitig aktiv sein.
Die vorderste (1. LED) soll heller werden.
Die mittlere  (2. LED) soll einfach leuchten.
Die hinterste (3. LED) soll dunkler werden.

sobald 1. und 3. LED ihr Ziel erreicht haben, soll dieses
Muster sich um 1 nach vorne verschieben und das ganze wieder passieren.
Der Einfachheit halber, werden nur insgesamt 8 LEDS angesteuert -> 1 
Register.

Ich habe bereits eine Schleife geschrieben, die die LEDS durchs Register 
schiebt.
Ich habe ebenfalls bereits eine Schleife geschrieben, in der 1 
festgelegte LED heller wird. -> dunkler wird somit auch kein Problem 
sein.

Mein Problem liegt daran, dass ich nicht weiß, wie ich das Verschieben 
realisieren soll. D.h. bit 0 bis 2 werden angesteuert. Jetzt wirds 
verschoben, aber wie erkläre ich dem Teil der software, der die LEDS 
heller / dunkler macht, dass er jetzt ein Bit weiter links das machen 
soll?

Ich hoffe ich konnte mich verständlich ausdrücken, sonst bitte nochmal 
nachfragen
OP #2944669
Lesenswert?

welchen Teil nicht kapiert?

Ich will 3 LEDS gleichzeitig ansteuern. Die 1. davon geht an, die 2. 
leuchtet dauerhaft, die 3. LED geht aus. Dieses Muster, sobalds beendet 
ist (also 1. LED leuchtet, 3. LED ist aus) wird verschoben und wieder 
von vorne angefangen.

Gibt quasi ein Lauflicht, das nicht "hart" umläuft, sondern die erste 
LED eben angeht und die letzte immer aus.
(Firma: guloshop.de) #2944689
Lesenswert?

Fabian S. schrieb:
> Mein Problem liegt daran, dass ich nicht weiß, wie ich das Verschieben
> realisieren soll. D.h. bit 0 bis 2 werden angesteuert. Jetzt wirds
> verschoben, aber wie erkläre ich dem Teil der software, der die LEDS
> heller / dunkler macht, dass er jetzt ein Bit weiter links das machen
> soll?

Hallo Fabian, ich weiß auch nicht genau, ob ich dich richtig verstanden 
habe.

Wahrscheinlich brauchst du parallel drei Register, die rotiert werden 
müssen:

r1 für die LED, die dunkel wird, Startwert 0b00000001
r2 für die LED, die leuchtet, Startwert 0b00000010
r3 für die LED, die heller wird, Startwert 0b00000100

Die Hellerwerden-Prozedur verwendet dann z.B. das Register r3 zum 
Maskieren des hellerzuschaltenden Pins im Port.

Alle drei Register werden taktweise nach links rotiert.
Gast #2944691
Lesenswert?

Nehmen wir mal an, du das hast das heller/dunkler werden
schon zum Laufen bekommen:

- Mit Hardware-PWM?
  Das geht nur an den dafür geeigneten Port-Pins,
  lässt sich also nicht einfach an 8 aufeinander folgende
  Port-Pins verschieben.

- Mit Software-PWM?
  Dann ist es machbar, allerdings etwas aufwändiger.

Wie hast du denn dem µC gesagt, dass er genau eine LED zum
heller/dunkler werden ansteuert?

Wo ist das Problem, dies an einem anderen PortPin zu machen?
OP #2944698
Lesenswert?

im moment kann ich 1 LED an einem Ausgang, heller oder dunkler machen.
Ich glaube nicht, dass es schwer ist dieses in ein Register zu 
übertragen.
Aber nun habe ich in 1 Register stehen, ob diese LED leuchten soll oder 
nicht. Angenommen im 1. Bit von temp und ich habe deine 3 Register zum 
Cluster ausgeben, wie schaffe ich es nun, mein 1. Bit von temp in das 
entsprechende Bit des Clusterregisters zu geben? Da dieses Bit sich ja 
immer wieder ändert.
Hier kommt eben mein Problem ins Spiel, ich will ein Bit, das sich 
ändert, ansteuern / verändern.
(Firma: guloshop.de) #2944704
Lesenswert?

Fabian S. schrieb:
> im moment kann ich 1 LED an einem Ausgang, heller oder dunkler machen.
> Ich glaube nicht, dass es schwer ist dieses in ein Register zu
> übertragen.
> Aber nun habe ich in 1 Register stehen, ob diese LED leuchten soll oder
> nicht. Angenommen im 1. Bit von temp und ich habe deine 3 Register zum
> Cluster ausgeben, wie schaffe ich es nun, mein 1. Bit von temp in das
> entsprechende Bit des Clusterregisters zu geben? Da dieses Bit sich ja
> immer wieder ändert.
> Hier kommt eben mein Problem ins Spiel, ich will ein Bit, das sich
> ändert, ansteuern / verändern.

Ich glaube, das Problem liegt in Zeile 42.
Falls du verstehst, was ich damit sagen will... ;-)

Es würde helfen, wenn du uns den Code-Ausschnitt zeigst...
#2944707
Lesenswert?

Fabian S. schrieb:
> im moment kann ich 1 LED an einem Ausgang, heller oder dunkler machen.
> Ich glaube nicht, dass es schwer ist dieses in ein Register zu
> übertragen.

Die Sache ist die, dass du die LED nicht mehr direkt am Port dimmen 
kannst, sondern du dir ein entsprechendes Byte im Speicher vorbereiten 
musst, welches dann als ganzes auf den Port gegeben wird. Und in diesem 
Byte sind dann genau die Bits gesetzt du zum jeweiligen Zeitpunkt 
benötigt werden.
OP #2944714
Lesenswert?

und genau hier liegt mein Problem, bei dem ich die Hoffnung hatte, dass 
ihr mir weiter helfen könnt:

Die Sache ist die, dass du die LED nicht mehr direkt am Port dimmen
kannst, sondern du dir ein entsprechendes Byte im Speicher vorbereiten
musst, welches dann als ganzes auf den Port gegeben wird. Und in diesem
Byte sind dann genau die Bits gesetzt du zum jeweiligen Zeitpunkt
benötigt werden.

Wie kann ich sagen, verschiebe nun Bit1 aus Register1 in Bit1 von 
Register2, das nächste mal aber in Bit2 von Register2 und danach in Bit3 
von Register2.

Ich bin im moment am schreiben vom code. Es sind alles nur Fetzen, aus 
einzelnen Programmen. Deswegen kann ich schlecht etwas vorweisen. Sry.
#2944717
Lesenswert?

Fabian S. schrieb:
> und genau hier liegt mein Problem, bei dem ich die Hoffnung hatte, dass
> ihr mir weiter helfen könnt:

Langsam.
So einfach ist das jetzt auch nicht aus dem Ärmel zu schütteln.


> Wie kann ich sagen, verschiebe nun Bit1 aus Register1 in Bit1 von
> Register2, das nächste mal aber in Bit2 von Register2 und danach in Bit3
> von Register2.

Du bist am falschen Dampfer.
Das muss man ganz anders angehen.
Markus hat da weiter oben schon eine prinzipiell brauchbare rudimentäre 
Idee geliefert. Aber eine Idee ist noch kein Programm.
#2944734
Lesenswert?

Fabian S. schrieb:
> ich hatte die Hoffnung, dass es eine Möglichkeit gibt, wie in [c]. Dort
> hab ich gelesen, dass man Variablen für die Bits einsetzen kann und dann
> diese Variable einfach verändert.
>
> Wenn ich am falschen Dampfer bin, wie muss ich dann umdenken, damit ich
> es sinnvoll schreiben kann?

Die grundsätzliche Idee besteht darin, dass man wie schon gesagt 3 
Register hat, in denen das jeweilige Bit für je eine der LEDs stehen. 
Nennen wir sie mal LED_d, LED_k, LED_h (für dunkler, konstant, heller. 
Also die LED deren Bit in einem dieser Register zb auf 1 ist, ist 
diejenige, welche dunkler, konstant bzw. heller gedimmt werden soll.

Die Idee geht weiter mit:
Aus diesen 3 Registern verodert man sich jetzt 2 Bytes.
Byte 1 besteht aus
   LED_d verodert mit LED_k
Byte 2  besteht aus
   LED_h verodert mit LED_k

diese beiden Bytes werden jetzt im Wechsel ausgegeben. Byte 1 wird n mal 
ausgegeben, Byte 2 wird m mal ausgegeben. Wobei n und m gegengleich 
erhöht bzw. verringert werden. (und n + m eine konstante Zahl, im 
folgenden 11 ergibt).

Die Dimmung beginnt zb damit, dass Byte 1 10 mal ausgegeben wird und 
Byte 2 nur 1 mal. Danach wird Byte 1 9 mal ausgegebn und Byte 2 2 mal. 
Dann Byte 1 8 mal und Byte 2 3 mal. etc. Solange bis man durch ist und 
Byte 1 1 mal ausgegeben wurde und Byte 2 10 mal.

Der Effekt ist jetzt der, dass die 1 im Byte 1, die durch LED_d 
eingebracht wurde zeitmässig immer weniger Anteil bekommt, während die 1 
von LED_h in Byte 2 immer mehr zeitmässigen Anteil bekommt.

(die 10 sind jetzt nur eine Zahl. Je nach Geschwindigkeit wird man das 
natürlich öfter machen)

Ist ein Dimmvorgang durch, dann werden alle 3 Ausgangsregister LED_d, 
LED_k und LED_h um 1 Bit nach links rotiert und das ganze Spiel beginnt 
wieder von vorne
   die beiden Bytes zusammenodern
   und im Wechsel mit laufend veränderten Verhältnissen ausgeben.
OP #2944907
Lesenswert?

ich habe meine Idee inzwischen ausgeschrieben. Wenn sie jetzt auch noch 
auf Anhieb fast klappt, dann bin ich stolz :D

Wenn nicht, leg ich sie bei Seite und programmiere deine Idee.
Ja ich habe sie verstanden, glaub ich zumindest. Ich denke öfters um 
viele Ecken, statt den geraden Weg zu nehmen

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren