Hallo zusammen, ich hänge gerade an einem etwas kniffligem Assemblerprogramm... An PortB und PortD sind LEDs angeschlossen und ich möchte nun so eine wandernde "Snake" mittels Timer2 über die LEDs huschen lassen. Die LEDs sind so angeordnet: PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7 PD0 PD1 PD2 PD3 PD4 PD5 PD6 PD7 Und die Schlange sollte sich so bewegen: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 dann 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 dann 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 dann 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 [usw] 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 dann 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 dann 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 dann 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 und so weiter. Am anderem Ende sollte sie wieder genau so umbrechen, wie schon vorgezeigt. Das sollte sich dann so lange wiederholen, bis Timer2 gestoppt wird. Ich habe versucht das Ganze mit 3 Registern zu lösen, aber noch läuft es nicht wirklich, habe auch eben wieder alles gelöscht, was ich schon hatte. Hat einer von euch eine Idee, wie man das relativ eleganz umsetzen kann? Ciao, Roland
z.B. mit Tabellen kann man das sehr gut umsetzen.
Gast
#2187414
Hi Das knifflige ist eigentlich nur der Anfang. Die drei Bits über zwei Register rotieren geht so:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
MfG Spess
Gast
#2187418
mit rotieren bzw. shift operationen und pb7 wird immer an pd7 kopiert pd0 immer an pb0. Das solte reichen.
Gast
#2187545
Hi Mit 'Softstart':
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
MfG Spess
Gast
#2187755
spess53 schrieb: > Das knifflige ist eigentlich nur der Anfang. Die drei Bits über zwei > Register rotieren geht so: und warum nicht nur so?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
Gast
#2187802
Kann man zweimal Rechtshift für negative machen? Wenn man zuerst 80 eingibt, und zweimal für negative shiftet, erhält man die Hexwerte 80->C0->E0. Dann normal nach rechts weiter shiften bis Übertrag ->Reg2. Reg1 normal weitershiften, reg2 wieder negativ shiften, dann normal, Übertrag nach reg1. Ansonsten wäre das elganteste wohl 1 Register + Ladebefehle, z.B. mov 80 nach reg1 mov C0 nach reg1 usw oder eben die Werte aus dem Speicher oder aus anderen Registern lesen.
Gast
#2187839
Hi >und warum nicht nur so? Weil dann die 'Snake' teilweise nur 2 LEDs lang ist. >xx: > rol r16 > rol r17 Das Bit, das aus r17 ins Carry-Flag geschoben wird taucht erst beim nächsten Durchlauf in r16 auf. Außerdem stimmt der Anfang nicht. Die Vorgabe fängt nicht mit drei LEDs an. MfG Spess
Gast
#2187964
Ich würde das so machen:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
Hier eine Lösung für beliebige Anfangsbitmuster:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
Kurzer, knackiger Code! Ist sowas Kunst? :-) Gruß, Thomas PS: Kommentare hinter den Befehlen bitte als Hausaufgabe ... :-)
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
> Kurzer, knackiger Code! Ist sowas Kunst? :-) > > Gruß, Thomas > > PS: Kommentare hinter den Befehlen bitte als Hausaufgabe ... :-) So in ETWA ist mir der Code jetzt klar. Habe mir ne Din A4-Seite geschnappt und die Bitmuster Befehl für Befehl aufgeschrieben :-D Wirklich sehr sehr clever, wie bist du auf diese Idee gekommen? Damit hat Thomas das Rennen gemacht, dieser Snippet ist meinem Programm gelandet :-D Vielen Dank für eure fleißige Hilfe :-)
Gerngeschehen! Wenn Bedarf besteht kann ich den Code gern Zeile für Zeile erklären. Aber erst morgen, ist schon spät (für mich...) Gruß, Thomas
Roland Moch schrieb: > OR r17,r18 ; Ab dem dritten mal ohne Einfluss Deine Kommentare sind leider nicht ganz korrekt. Hier wird z.B. das Anfangsbitmuster (die ersten drei "1"-Bits), aber auch das MSB der unteren Zeile eingesetzt. Und zwar immer! Nur nach dem dritten Durchgang gibt es für das Anfangsbitmuster ausschließlich "0"-Bits. Die MSB aus der unteren Zeile kommen jedoch immer wieder... Du solltest dir den Code wesentlich länger im Debugger (Simulator) anschauen... Gruß, Thomas
Das wäre nett. Ich hab zwar oben einige Kommentare geschrieben, aber ich glaube die sind nicht alle 100%ig treffend. Interessant wäre vielleicht auch dein Vorgehen gewesen, wie du auf diese Idee gekommen bist. Nochmal Danke und eine gute Nacht :-)
Gast
#2188269
Philipp Klostermann schrieb: > Ich würde das so machen: > ... Ist natürlich quatsch, da die LEDs links das LSB haben. Also logisch umdrehen:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
Habe das ganze gerade noch im Debugger getestet, und es scheint zu funktionieren. Ich frage mich nun, was an knibbels 9 Befehlen mit 5 involvierten Registern, die zu verstehen und zu kommentieren einigen schwer zu fallen scheint, so viel genialer (sorry: "knackiger") ist, als meine 6 Befehle, die mit 3 Registern klar und einfach ein paar Bits rotieren. und nicht mal einer Erwähnung wert zu sein scheinen. :-?
Gast
#2188441
Hi >Ich frage mich nun, was an knibbels 9 Befehlen mit 5 involvierten >Registern, die zu verstehen und zu kommentieren einigen schwer zu fallen >scheint, so viel genialer (sorry: "knackiger") ist, als meine 6 Befehle, >die mit 3 Registern klar und einfach ein paar Bits rotieren. und nicht >mal einer Erwähnung wert zu sein scheinen. :-? Geht mir mit 4 Befehlen und 2 benutzten Registern auch so. MfG Spess
Gast
#2188603
OK, Du hast ein Register weniger, aber einen bedingten Sprung. Das mit dem T-Flag ist natürlich eine Idee. :) Ich werde das mal im Hinterkopf köcheln lassen. Ich finde, dass sich die eigentliche Lösung zu vielen Threads irgendwo mittendrin befindet, und unbeachtet in Flame-Wars oder gegenseitigem Lobgehuddel anderer User untergeht. :D
Hey Leute, ganz ganz ruhig. Ich hab eure Lösungen auch zu Kenntnis genommen und mir überlegt sie einzubauen. Zumindest mit der Lösung von Spess ging es nicht soo einfach (da müsste ich noch ein zusätzliches Register einbauen), da ich das sonst mit meinem Timer nicht hinkriege. Die 6 Befehle mit 3 Register sind bei mir SO auch nicht so einfach unterzubringen, da ich keine AusgabeUndWarten-Funktion habe, sondern einfach alles über den Timer machen will und da bräuchte ich dann auch wieder ein Register und mehrere Branches, damit ich das benutzen kann. Natürlich ist das alles kein Aufwand das so umzubiegen, aber wozu, wenn Thomas Lösung quasi per Copy and Paste funktioniert... Versteht mich nicht falsch, ich bin für jeden Beitrag dankbar ;-)
Gast
#2188769
Roland Moch schrieb: > , da ich keine AusgabeUndWarten-Funktion habe, sondern > einfach alles über den Timer machen will und da bräuchte ich dann auch > wieder ein Register und mehrere Branches, damit ich das benutzen kann. Die mehreren Branches brauchst Du nur, um den Ablauf am Anfang zu realisieren. Ansonsten ist es doch egal, ob Du den Rumpf-Code in einer Schleife hast, oder aus einer ISR heraus aufrufst. Wozu brauchst Du dann ein zusätzliches Register? Als Flag, ob das Intro vorbei ist?
Philipp Klostermann schrieb: > Wozu brauchst Du dann > ein zusätzliches Register? Als Flag, ob das Intro vorbei ist? Ganz genau
Gast
#2188829
Hi >Philipp Klostermann schrieb: >> Wozu brauchst Du dann >> ein zusätzliches Register? Als Flag, ob das Intro vorbei ist? >Ganz genau Geht auch ohne. MfG Spess
spess53 schrieb: >>Philipp Klostermann schrieb: >>> Wozu brauchst Du dann >>> ein zusätzliches Register? Als Flag, ob das Intro vorbei ist? > >>Ganz genau > > Geht auch ohne. Und wie? Worum geht es hier überhaupt noch? :-D
Gast
#2188888
Es geht darum, auf ein unnötiges Flag zu verzichten. Schau Dir mal folgende Tabelle an:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
Die Bedingung in-Intro liegt vor, wenn r16 + r17 (vorzeichenlos) kleiner 4 ist.
Gast
#2188897
Roland Moch schrieb: > Worum geht es hier überhaupt noch? :-D Philipp Klostermann schrieb: > Es geht darum, auf ein unnötiges Flag zu verzichten. Jo, wenn schon Assembler dann gscheit.
Gast
#2188910
Hi
>Und wie?
In dem du eine RAM-Zelle benutzt. Das Ganze als Interrupt:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
Außerhalb der Routine wird kein Register benötigt. MfG Spess
Also, da ihr mir keine Ruhe gelassen habt und ich die Erklärung mit der Tabelle von Philipp so gut fand, hab ich mir die für mich logischste und am einfachsten zu verstehende Lösung zusammengebastelt:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
Um ehrlich zu sein, denke ich, dass ich mich jetzt lange genug mit diesem Thema aufgehalten habe, nehmt es mir nicht übel ;-)
Gast
#2188930
spess53 schrieb: > In dem du eine RAM-Zelle benutzt. Oder so. :) Roland M. schrieb: > Um ehrlich zu sein, denke ich, dass ich mich jetzt lange genug mit > diesem Thema aufgehalten habe, nehmt es mir nicht übel ;-) Wir auch. Dann kannst Du noch die paar Minuten investieren, meine abschließende Lösung zu inspizieren. :-) Ich habe es jetzt wie folgt: (Debugger-getestet)
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
Das komplette Programm wäre nicht nötig gewesen ;-)
1 | |
2 | |
Das hab ich jetzt noch übernommen (also eigentlich fast gleich :-D) Nochmals Danke an alle Antwortenden und ich denke wir sollten das Thema jetzt ruhen lassen ;-) Einen schönen, sonnigen Mittwoch an Alle :-)
Gast
#2188954
Was, schon aufgegeben? ;-) Wie sieht's mit einem Outro aus? duck und wech...
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.