Zuerst mal eine Warnung: Ich habe 0 Ahnung von ASM und werde deshalb vermutlich viele dumme Fragen stellen. Zu meinem eigentlichen Problem: Ich habe einen Z80, an dem ein LCD und eine Tastatur hängt. Nun möchte ich mein Programm aber auf einem STM32 laufen lassen, und die einzige Verbindung zwischen den zweien ist eine Open-Collector-Zweidraht Verbindung. Darüber möchte ich einerseits vom Z80 auf den STM32 ca. 50-100 mal ein paar Bytes für die Tastatur übertragen, aber viel wichtiger vom STM32 auf den Z80 das LCD-Bild. Da ich mit Graustufen arbeiten will währen 100 FPS anstrebenswert (Bitwinkelmodulation mit 4 Bit/25 FPS). Pro Frame müssen 768 Bytes an Bilddaten übertragen werden. CRC oder ähnliches brauche ich nicht, wenn ab und zu mal ein Pixel falsch ankommt ist das egal. Um das LCD anzusteuern brauche ich auf dem Z80 immer 8 Pixel in einem Register, danach muss ich eh auf das LCD warten, und kann ja in dieser Zeit die Kommunikation erledigen. Zugunsten hohen Durchsatzes wäre es ja gut, wenn ich immer 2 Bit aufs mal übertrage. Hier kommt aber mein Problem: Vom Port lese ich 1 Byte ein, die 2 LSBs enthalten 2 Bit an Daten. Doch wie bekomme ich jetzt 8 Bit von 4 aufeinanderfolgenden Lesevorgängen in ein Register? Also ich bekomme: XXXXXXAB XXXXXXCD XXXXXXEF XXXXXXGH und möchte das in ASM möglichst effizient (schnell) zu ABCDEFGH zusammensetzen. Eigentlich habe ich dafür vielleicht etwa 40 Takte zeit. Ist das überhaupt möglich? Und wenn ja wie? Vielen Danke euch allen, Sean
Warum das LCD nicht direkt mit dem STM32 ansteuern? Der könnte die gewünschte Operation jedenfalls mit "BFI" in insg. 4 Takten erledigen ;-)
Ja das ist mir schon klar, nur leider kommt das nicht in Frage, denn das LCD sitzt in einem Taschenrechner. Und ein auftrennen der Leitungen kommt nicht in Frage, weil dann die Originalfunktionalität nicht mehr gegeben ist. Sonst könnte ich auch gleich ein vernünftiges LCD nehmen, statt eines mit 64*96 Pixeln bei dem man die Graustufen in SW machen muss :(
Hi
>Eigentlich habe ich dafür vielleicht etwa 40 Takte zeit.
Ein einfaches Links shiften eines Registers (SLA r) dauert beim Z80 acht
Takte. Das bräuchtest du 12 mal, also 96 Takte und dazu noch ein paar
ORs.
Kannst du dir ja ausrechnen.
MfG Spess
spess53 schrieb: > Hi > >>Eigentlich habe ich dafür vielleicht etwa 40 Takte zeit. > > Ein einfaches Links shiften eines Registers (SLA r) dauert beim Z80 acht > Takte. Das bräuchtest du 12 mal, also 96 Takte und dazu noch ein paar > ORs. > Kannst du dir ja ausrechnen. > > MfG Spess Danke, dann muss ich meine Anforderungen wohl ändern: So schnell wie möglich, im Notfall übertakte ich den Z80 halt. Trotzdem komme ich nicht wirklich weiter. Mein Ansatz wäre so: (Pseudocode, wird nachher in HEX ASM geschrieben...) IN (data_port), b IN (data_port), c IN (data_port), d IN (data_port), e dann habe ich: xxxxABxx xxxxCDxx xxxxEFxx xxxxGHxx (Sorry, es sind gar nicht Bit 0/1 sondern 2/3!) aber shiften allein reicht ja nicht, denn die x können 0/1 sein, das ist nicht bekannt. Jetzt hat der Z80 ja aber opcodes für set/reset von einzelnen Bits. Wenn es jetzt eine einfache Möglichkeit gibt um zu testen ob z.B. im Bit 2 eine 1 steht könnte man ja dann die Bit-Set Instruktion in einem anderen Register anwenden, oder ist das der falsche Ansatz?
Hi Sean Goff, der Z80 hat ASM Befehle zum abfragen von einem einzelnen Bit (ob gesetzt oder nicht) und zum setzen von einem einzelnen Bit abfrage : BIT b,r (8 Takte) setzen : SET b,r (12 Takte) dazwischen brauchst du noch einen Jump (if Zero) der braucht 10 Takte aber mal ganz was anderes, warum überträgst du nicht gleich das komplette Byte in einem rutsch ? damit erspast du dir vieles (die Kommunikation muss ja auch irgendwie gesteuert werden...sprich wann darf der STM das neue Bit senden usw. Gruss Uwe
Uwe B. schrieb: > der Z80 hat ASM Befehle zum abfragen von einem einzelnen Bit > (ob gesetzt oder nicht) und zum setzen von einem einzelnen Bit Danke, jetzt wo dus sagst sehe ich es auch. Dann werde ich es wohl mit 8 BIT abfragen mit Jump machen. Uwe B. schrieb: > aber mal ganz was anderes, warum überträgst du nicht gleich > das komplette Byte in einem rutsch ? > > damit erspast du dir vieles (die Kommunikation muss ja auch irgendwie > gesteuert werden...sprich wann darf der STM das neue Bit senden usw. Also meinst du weshalb nicht 8 Parallele Datenleitungen? Die 2 Leitungen sind leider gegeben...
> Also meinst du weshalb nicht 8 Parallele Datenleitungen? Die 2 Leitungen > sind leider gegeben... und wie machst du da die Synchronisation mit nur zwei Leitungen in eine Richtung ?
Uwe B. schrieb: >> Also meinst du weshalb nicht 8 Parallele Datenleitungen? Die 2 Leitungen >> sind leider gegeben... > > und wie machst du da die Synchronisation mit nur zwei Leitungen in eine > Richtung ? Nunja, das müsste ich ausprobieren aber die Idee war, dass am Anfang des Frames synchronisiert wird (Z80 gibt Signal --> IR auf STM32) und danach hoffen dass die clocks nicht auseinander laufen. Je nach dem wäre es auch möglich, dass der Z80 den Clock vom STM32 bekommt, dann können sie ja nicht mer weglaufen.
Sean Goff schrieb: > auch möglich, dass der Z80 den Clock vom STM32 bekommt, dann können sie > ja nicht mer weglaufen. Wie - Du hast nicht noch mal eine seperate Clock-Leitung, sondern willst 780 Bytes dadurch übertragen, dass das Timing 2-er unterschiedlicher Prozessoren absolut synchron verläuft? Noch dazu mit einer Z80 Gurke, mit der du Anweisungen so anordnen musst, dass alles aufgrund der internen OpCode-Zyklen taktgenau rauskommt. Und das alles dann auch noch mit einem gewissen Speed, der den Nachteil hat, dass du dir in das Timing nicht sehr große Reserven einbauen kannst, die dir akkumulierte Zeitfehler abfangen könnten. Ich muss sagen: Du hast Gottvertrauen. Wenn du das zuverlässig hinkriegst, dann setze ich Himmel und Hölle in Bewegung, dass dich der Papst nach deinem Ableben 'heilig' spricht. Das wäre dann wenigstens mal ein Heiliger mit einem echten Wunder.
:
Bearbeitet durch User
Karl Heinz schrieb: > Sean Goff schrieb: > > >> auch möglich, dass der Z80 den Clock vom STM32 bekommt, dann können sie >> ja nicht mer weglaufen. > > Wie - Du hast nicht noch mal eine seperate Clock-Leitung, sondern willst > 780 Bytes dadurch übertragen, dass das Timing 2-er unterschiedlicher > Prozessoren absolut synchron verläuft? Noch dazu mit einer Z80 Gurke, > mit der du Anweisungen so anordnen musst, dass alles aufgrund der > internen OpCode-Zyklen taktgenau rauskommst. > > Ich muss sagen: Du hast Gottvertrauen. > Wenn du das zuverlässig hinkriegst, dann setze ich Himmel und Hölle in > Bewegung, dass dich der Papst nach deinem Ableben 'heilig' spricht. Das > wäre dann wenigstens mal ein Heiliger mit einem echten Wunder. Ganz einfach: Den Taktgeber durch einen Draht ersetzen, und den an einen Pin des STM32 löten sollte kein Ding sein (grosses Pad, einfach zugänglich). Alles andere ist aber schon nicht mehr so leicht zugänglich, und ein Sync auf Z80 Seite braucht ja auch wieder Zeit die ich nicht habe. Dass es ohne nicht geht glaube ich gerne, dann muss halt der Draht hin. Aber was meinst du mit > Noch dazu mit einer Z80 Gurke, > mit der du Anweisungen so anordnen musst, dass alles aufgrund der > internen OpCode-Zyklen taktgenau rauskommst. ? Die benötigten Zyklen sind ja bekannt, dann muss ich ja nur noch den genauen Takt kennen?!
Sean Goff schrieb: > Z80 gibt Signal --> IR auf STM32) und danach > hoffen dass die clocks nicht auseinander laufen. Je nach dem wäre es > auch möglich, dass der Z80 den Clock vom STM32 bekommt, dann können sie > ja nicht mer weglaufen. hmmm, wenn das mal gutgeht :-) event. könntest du auch jedes Bit einzeln übertragen und die zweite Leitung als "Clock-Signal" benutzten also eine Art SPI-Bus (halt nur in eine Richtung) aber ob du da auf die gewünschte Geschwindigkeit kommst ? Wenn du mehr Leitungen zum STM hättest, könntest du 4 verschiedene Adressen zum lesen benutzen der STM müsste dann die zwei untersten Adressleitungen ausdekodieren und das gewünschte Bitpaar ausgeben zusätzlich noch den IORQ-Pin um die IO-Anfrage vom Z80 zu erkennen egal wie, viel spass beim programmieren Gruss Uwe
Sean Goff schrieb: > Die benötigten Zyklen sind ja bekannt, dann muss ich ja nur noch den > genauen Takt kennen?! Hast du das schon mal gemacht? Einen Code so hinzutrimmen, dass er EXAKT eine bestimmte Anzahl an Taktgeneratorzyklen braucht? Und zwar in allen überhaupt möglichen Pfaden durch den Code. Inklusive unterschiedlicher Anzahl an Taktzyklen für bedingte Sprünge, die du zur Schleifenbildung brauchst. Bei nur 1 Byte hat man noch einen gewissen Spielraum, wenn das Timing nicht allzu eng ist. Aber bei 780 Bytes hintereinander ohne jegliche Synchronisation? Da summiert sich jeder einzelne Taktzyklusfehler auf. Viel Spass dabei.
:
Bearbeitet durch User
Sean Goff schrieb: > aber shiften allein reicht ja nicht, denn die x können 0/1 sein, das ist > nicht bekannt. Wieso das? Du liest einen Port, bei dem nur zwei Bits aktiv sind. Was hindert dich, die restlichen Bits auf einen definierten Pegel zu setzen? Im Zweifelsfall genügt ein HC125 dafür (dekodiertes /IORD auf Enable, Eingänge an GND, Ausgänge an die unbenutzten Bits des Datenbus). Und noch ein Vorschlag: Nimm ein Schieberegister und hämmere damit die 4 Doppelbits zusammen, lies sie 8 Bit Wert ein. Dann kommst du deinen 40 Zyklen langsam näher.
Karl Heinz schrieb: > Hast du das schon mal gemacht? Nein, wie gesagt, das ist mein erster Kontakt mit Z80 und ASM. Der Teil des codes dessen Taktzyklen ich kennen muss ist aber sehr klein. Es geht wirklich nur ums Port lesen, Bits setzen, schreiben. Der Rest ist egal! Also entweder mache ich NOPs rein bis alles gleich schnell ist, oder aber der STM berechnet wie lange der Z80 brauchen wird. Vermutlich eher ersteres. Der Programmablauf ist auch hardcoded, ausser bei der Bitabfrage selbst, und das sollte ja zum Glück überschaubar sein.
Oder der lesende Z80 gibt den Takt vor. STM32 muss dann schnell genug reagieren. - Z80 zieht die Leitung kurz auf low. - STM reagiert sofort auf diesen Impuls. - 0 übertragen: STM zieht Leitung auf auf Low. - 1 übertragen: STM macht nichts. - Z80 gibt die Leitung wieder frei. - Z80 liest das Bit auf der Leitung
... danach ist etwas Zeit. - STM wartet ein paar Takte - STM gibt die Leitung wieder frei - Z80 verarbeitet das Bit - Z80 springt wieder an den Anfang der Schleife
Kein Name schrieb: > Oder der lesende Z80 gibt den Takt vor. STM32 muss dann schnell genug > reagieren. > > - Z80 zieht die Leitung kurz auf low. > - STM reagiert sofort auf diesen Impuls. > - 0 übertragen: STM zieht Leitung auf auf Low. > - 1 übertragen: STM macht nichts. > - Z80 gibt die Leitung wieder frei. > - Z80 liest das Bit auf der Leitung Ja, diese Idee gefällt mir. Ich werde in dem Fall mal schauen wie oft man den Sync machen muss, damit keine Fehler entstehen. Zeit braucht er ja trotzdem, dann währe es besser wenn man nur alle paar Bytes syncen müsste.
Ich habe jetzt mal den Code ohne die Synchronisation gemacht, komme aber nur auf 25 Updates pro Sekunde! Hat jemand von euch eine Idee wie ich da optimieren könnte? Hier mein Code (definitiv nicht Standardkonform, ich habe eigentlich direkt in Opcode programmiert, das ist nur eine parallelgeführte Stütze...) Zwischen lbl1 und jp nz, lbl1 ist der kritische code (muss 768 mal pro frame ausgeführt werden) den Rest habe ich der Vollständigkeit halber drin gelassen, ist aber vermutlich fast unverständlich.
1 | di |
2 | (lbl3) |
3 | |
4 | ld a,FF |
5 | out (00),a |
6 | ld h,FC |
7 | |
8 | ld c,01 |
9 | ld a,FF |
10 | out (01),a |
11 | |
12 | ld a,FE |
13 | out (01),a |
14 | in(c),b |
15 | ld a,b |
16 | AND h |
17 | out (00),a |
18 | SRA b |
19 | SRA b |
20 | ld a,b |
21 | AND h |
22 | out (00),a |
23 | |
24 | ld a,FD |
25 | out (01),a |
26 | in(c),b |
27 | ld a,b |
28 | AND h |
29 | out (00),a |
30 | SRA b |
31 | SRA b |
32 | ld a,b |
33 | AND h |
34 | out (00),a |
35 | SRA b |
36 | SRA b |
37 | ld a,b |
38 | AND h |
39 | out (00),a |
40 | SRA b |
41 | SRA b |
42 | ld a,b |
43 | AND h |
44 | out (00),a |
45 | |
46 | ld a,FB |
47 | out (01),a |
48 | in(c),b |
49 | ld a,b |
50 | AND h |
51 | out (00),a |
52 | SRA b |
53 | SRA b |
54 | ld a,b |
55 | AND h |
56 | out (00),a |
57 | SRA b |
58 | SRA b |
59 | ld a,b |
60 | AND h |
61 | out (00),a |
62 | SRA b |
63 | SRA b |
64 | ld a,b |
65 | AND h |
66 | out (00),a |
67 | |
68 | ld a,F7 |
69 | out (01),a |
70 | in(c),b |
71 | ld a,b |
72 | AND h |
73 | out (00),a |
74 | SRA b |
75 | SRA b |
76 | ld a,b |
77 | AND h |
78 | out (00),a |
79 | SRA b |
80 | SRA b |
81 | ld a,b |
82 | AND h |
83 | out (00),a |
84 | SRA b |
85 | SRA b |
86 | ld a,b |
87 | AND h |
88 | out (00),a |
89 | |
90 | ld a,EF |
91 | out (01),a |
92 | in(c),b |
93 | ld a,b |
94 | AND h |
95 | out (00),a |
96 | SRA b |
97 | SRA b |
98 | ld a,b |
99 | AND h |
100 | out (00),a |
101 | SRA b |
102 | SRA b |
103 | ld a,b |
104 | AND h |
105 | out (00),a |
106 | SRA b |
107 | SRA b |
108 | ld a,b |
109 | AND h |
110 | out (00),a |
111 | |
112 | ld a,DF |
113 | out (01),a |
114 | in(c),b |
115 | ld a,b |
116 | AND h |
117 | out (00),a |
118 | SRA b |
119 | SRA b |
120 | ld a,b |
121 | AND h |
122 | out (00),a |
123 | SRA b |
124 | SRA b |
125 | ld a,b |
126 | AND h |
127 | out (00),a |
128 | SRA b |
129 | SRA b |
130 | ld a,b |
131 | AND h |
132 | out (00),a |
133 | |
134 | ld a,BF |
135 | out (01),a |
136 | in(c),b |
137 | ld a,b |
138 | AND h |
139 | out (00),a |
140 | SRA b |
141 | SRA b |
142 | ld a,b |
143 | AND h |
144 | out (00),a |
145 | SRA b |
146 | SRA b |
147 | ld a,b |
148 | AND h |
149 | out (00),a |
150 | SRA b |
151 | SRA b |
152 | ld a,b |
153 | AND h |
154 | out (00),a |
155 | |
156 | ld a,7F |
157 | out (01),a |
158 | in(c),b |
159 | ld a,b |
160 | AND h |
161 | out (00),a |
162 | SRA b |
163 | SRA b |
164 | ld a,b |
165 | AND h |
166 | out (00),a |
167 | SRA b |
168 | SRA b |
169 | ld a,b |
170 | AND h |
171 | out (00),a |
172 | SRA b |
173 | SRA b |
174 | ld a,b |
175 | AND h |
176 | out (00),a |
177 | |
178 | |
179 | |
180 | |
181 | |
182 | ld a,80 |
183 | out (10),a |
184 | |
185 | EX SP,(HL) |
186 | EX SP,(HL) |
187 | |
188 | ld a, FC |
189 | out(00),a |
190 | ld e,20 |
191 | (lbl2) |
192 | ld c,10 |
193 | out (c),e |
194 | |
195 | EX SP,(HL) |
196 | EX SP,(HL) |
197 | |
198 | ld c,11 (zur optimierung wäre auch inc c möglich, weil c vorher 10 ist!) |
199 | ld b,64(dezimal) |
200 | |
201 | (lbl1) |
202 | ld d,0 |
203 | |
204 | IN a,(00) |
205 | BIT 3,a |
206 | jr z,2 |
207 | SET 7,d |
208 | BIT 2,a |
209 | jr z,2 |
210 | SET 6,d |
211 | IN a,(00) |
212 | BIT 3,a |
213 | jr z,2 |
214 | SET 5,d |
215 | BIT 2,a |
216 | jr z,2 |
217 | SET 4,d |
218 | IN a,(00) |
219 | BIT 3,a |
220 | jr z,2 |
221 | SET 3,d |
222 | BIT 2,a |
223 | jr z,2 |
224 | SET 2,d |
225 | IN a,(00) |
226 | BIT 3,a |
227 | jr z,2 |
228 | SET 1,d |
229 | BIT 2,a |
230 | jr z,2 |
231 | SET 0,d |
232 | |
233 | out(c),d |
234 | |
235 | dec b |
236 | jp nz, (lbl1) |
237 | |
238 | inc e |
239 | ld a,e |
240 | cp 2F |
241 | jp nz, (lbl2) |
242 | jp (lbl3) |
ich glaube zwar immer noch nicht das es ohne synchronisation funktioniert aber hier das ganze "etwas" schneller : (mit Angabe der Taktzyklen)
1 | --------------------------------------- |
2 | |
3 | LD D,0 |
4 | LD E,12 // Maske fuer Bit2 und Bit3 |
5 | |
6 | IN A,(00) 11 |
7 | AND E 4 |
8 | RLA 4 |
9 | RLA 4 |
10 | RLA 4 |
11 | RLA 4 // hier wäre ein "SWAP" schneller |
12 | LD D,A 4 // aber ich glaube den gibts beim Z80 nicht |
13 | |
14 | IN A,(00) 11 |
15 | AND E 4 |
16 | RLA 4 |
17 | RLA 4 |
18 | OR D 4 |
19 | LD D,A 4 |
20 | |
21 | IN A,(00) 11 |
22 | AND E 4 |
23 | OR D 4 |
24 | LD D,A 4 |
25 | |
26 | IN A,(00) 11 |
27 | AND E 4 |
28 | RRA 4 |
29 | RRA 4 |
30 | OR D 4 |
31 | LD D,A 4 |
32 | |
33 | --------------------------------------- |
34 | |
35 | Summe = 120 Takte |
P.S. dein Code braucht 188 bis 252 Takte also viel schneller ist es nicht Gruss Uwe
WOW, danke vielmals, ich werde es gleich mal ausprobieren. Uwe B. schrieb: > P.S. dein Code braucht 188 bis 252 Takte > > also viel schneller ist es nicht Oh doch es ist mehr als doppelt so schnell, denn in meinem Code fehlen noch die NOPs um alle Pfade gleich schnell zu machen (ja, ohne das wäre ja "asynchron" unmöglich) und mit dauert es immer 252 Takte. Die Synchronisation werde ich noch je nach Bedarf öfter, oder seltener machen deshalb ist sie nicht drin. Vielleicht ist es so schon schnell genug, und sonst gehe ich von 6Mhz auf 14 oder so, und dann ist es sicher schnell genug. Vielen Dank, ich werde bald Bericht erstatten :) (kann dauern ohne Compiler :D )
Sean Goff schrieb: > (kann dauern ohne > Compiler :D ) So etwas gibt es als Freeware, kein Grund, sich zu quälen
Georg G. schrieb: > Sean Goff schrieb: >> (kann dauern ohne >> Compiler :D ) > > So etwas gibt es als Freeware, kein Grund, sich zu quälen Ich weiss, aber ursprünglich wollte ich einen, der für den TI 82 Stats gemacht ist, damit ich auch ROM Funktionen direkt nutzen kann. Leider konnte ich den aber in der VM nicht zum laufen bekommen, und für <500 Bytes ist von hand schreiben ja noch machbar. Ich denke ich hätte länger gehabt den Compiler zum laufen zu bekommen und zu verstehen. Sean Goff schrieb: > WOW, danke vielmals, ich werde es gleich mal ausprobieren. Ich habe zwar noch keinen vernünftigen Code zum Senden geschweige denn einen Sync Mechanismus, aber so wies aussieht bin ich jetzt auf ca. 50 FPS! Das ist schon ziemlich gut, möglicherweise Übertakte ich einfach noch ein bisschen, denn bis zu 15MHz ist scheinbar stabil, und im moment läuft er auf 6MHz.
hier nochmal ein Nachtrag damit ist der Code zwar um 4 Takte langsamer, aber dafür sind die Stellen an denen gelesen wird gleich lange auseinander (je 20 Takte) das macht das synchronisieren vlt etwas einfacher wobei ich bezweifle ob du das du auf der STM Seite so Taktgenau hinbekommst
1 | --------------------------------------- |
2 | |
3 | LD D,0 |
4 | LD E,12 // Maske fuer Bit2 und Bit3 |
5 | |
6 | IN A,(00) 11 |
7 | AND E 4 |
8 | RLA 4 |
9 | RLA 4 |
10 | LD D,A 4 |
11 | NOP 4 |
12 | |
13 | IN A,(00) 11 |
14 | AND E 4 |
15 | OR D 4 |
16 | RLA 4 |
17 | RLA 4 |
18 | LD D,A 4 |
19 | |
20 | IN A,(00) 11 |
21 | AND E 4 |
22 | OR D 4 |
23 | LD D,A 4 |
24 | NOP 4 |
25 | NOP 4 |
26 | |
27 | IN A,(00) 11 |
28 | AND E 4 |
29 | RRA 4 |
30 | RRA 4 |
31 | OR D 4 |
32 | LD D,A 4 |
33 | |
34 | --------------------------------------- |
35 | |
36 | Summe = 124 Takte |
Uwe B. schrieb: > hier nochmal ein Nachtrag > > damit ist der Code zwar um 4 Takte langsamer, > aber dafür sind die Stellen an denen gelesen wird > gleich lange auseinander (je 20 Takte) Spricht irgend etwas dagegen die unteren zwei Blöcke zu vertauschen? Weil dann könnte ich ja die 2 NOPs weglassen, und die Daten dort aufs LCD übertragen. > das macht das synchronisieren vlt etwas einfacher > wobei ich bezweifle ob du das du auf der STM Seite > so Taktgenau hinbekommst Ja, das macht es sicher einfacher. Ich wollte einfach ein oder mehrere Sync Punkte pro Frame haben, und der STM32 zählt dazwischen mit einem Timer mit. Danke nochmals, Sean
Sean Goff schrieb: > Spricht irgend etwas dagegen die unteren zwei Blöcke zu vertauschen? dann muss es beim senden aber auch vertauscht werden
1 | --------------------------------------- |
2 | |
3 | LD D,0 // D = xxxxxxxx |
4 | LD E,12 // Maske fuer Bit2 und Bit3 |
5 | |
6 | IN A,(00) 11 // STM sendet Bit 7+6 |
7 | AND E 4 |
8 | RLA 4 |
9 | RLA 4 |
10 | LD D,A 4 // D = xx76xxxx |
11 | NOP 4 |
12 | |
13 | IN A,(00) 11 // STM sendet Bit 5+4 |
14 | AND E 4 |
15 | OR D 4 |
16 | RLA 4 |
17 | RLA 4 |
18 | LD D,A 4 // D = 7654xxxx |
19 | |
20 | IN A,(00) 11 // STM sendet Bit 1+0 |
21 | AND E 4 |
22 | RRA 4 |
23 | RRA 4 |
24 | OR D 4 |
25 | LD D,A 4 // D = 7654xx10 |
26 | |
27 | IN A,(00) 11 // STM sendet Bit 3+2 |
28 | AND E 4 |
29 | OR D 4 |
30 | LD D,A 4 // D = 76543210 |
31 | |
32 | --------------------------------------- |
33 | |
34 | Summe = 116 Takte |
Uwe B. schrieb: > Sean Goff schrieb: >> Spricht irgend etwas dagegen die unteren zwei Blöcke zu vertauschen? > > dann muss es beim senden aber auch vertauscht werden Ja das ist mir klar. Ich habe es jetzt mal so gestartet, und es scheint zu gehen, ich mach mich dann mal an den sendenden Teil.
DANKE an alle, speziell an derexponent! Das mit den Graustufen musste ich leider verwerfen, oder sagen wir mal vertagen ;), denn es flackerte zu fest. Dafür habe ich jetzt eine hohe Updaterate, und das mit der Synchronisation funktioniert auch. Ich habe jetzt alle 64 Bytes (256 "Takte") einen Synchpuls Z80-> STM32. Genaue tests mit verschiedenen Rechnern (Typenstreuung) habe ich noch nicht, aber zumindest an dem einen Testobjekt sitzt die Synchronisation, sodass jeder Pixel perfekt ankommt. Bilder folgen dann später, sobald ich eine vernünftige Demo habe. Und dabei auch noch ein bisschen ASM Verständnis bekommen :) Danke nochmals, Sean PS: Ich benutze jetzt http://clrhome.org/asm/ als Assembler, echt cool die Seite (man MUSS es ja nicht für TR`s verwenden, aber allgemein als Z80 Assembler)
:
Bearbeitet durch User
Ich habe jetzt das mit der Synchronisation doch nochmals geändert, ich habe gemerkt, dass damit es mit allen Taschenrechnern ohne Clock-Kalibrierung funktioniert ein Synchronisieren bei jedem Byte sinnvoll ist. Jetzt funktioniert der Teil super, ich habe mal ein Video angehängt was es bis jetzt kann (LCD Ansteuern, Tasten abfragen mit gedrückt Erkennung, was zum Beispiel das TI-Basic ausser bei den Pfeiltasten nicht kann.)
Karl Heinz schrieb: > Sean Goff schrieb: > > >> auch möglich, dass der Z80 den Clock vom STM32 bekommt, dann können sie >> ja nicht mer weglaufen. > > Wie - Du hast nicht noch mal eine seperate Clock-Leitung, sondern willst > 780 Bytes dadurch übertragen, dass das Timing 2-er unterschiedlicher > Prozessoren absolut synchron verläuft? Noch dazu mit einer Z80 Gurke, > mit der du Anweisungen so anordnen musst, dass alles aufgrund der > internen OpCode-Zyklen taktgenau rauskommt. Und das alles dann auch noch > mit einem gewissen Speed, der den Nachteil hat, dass du dir in das > Timing nicht sehr große Reserven einbauen kannst, die dir akkumulierte > Zeitfehler abfangen könnten. > > Ich muss sagen: Du hast Gottvertrauen. > Wenn du das zuverlässig hinkriegst, dann setze ich Himmel und Hölle in > Bewegung, dass dich der Papst nach deinem Ableben 'heilig' spricht. Das > wäre dann wenigstens mal ein Heiliger mit einem echten Wunder. Wird leider doch nichts damit :( Obwohl, auf dem einen bestimmten Z80, für den ich das eingestellt hatte ist es absolut zuverlässig gelaufen! Nicht einen einzigen Pixelfehler... Die Tatsache, dass man das aber für jeden einzeln einstellen hätte müssen, hat dem aber den Garaus gemacht.
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.