Archiv verlassen und diese Seite im Standarddesign anzeigen : ASM: Registerbits spiegeln
Import-Script
12.10.2003, 11:07
Hi @ all <BR> <BR>Habe aus Layouttechnischen Gründen einen Port des AVR gespiegelt angeschlossen (also PB0..7 => DATA7..0) <BR> <BR>Nun meine Frage: <BR>gibt es einen Assemblerbefehl zum Spiegeln von Registern oder kann ich folgendes verwenden, um r16 nach r17 zu spiegeln: <BR> <BR>LDI r18, 8 <BR>Spiegeln: <BR> ROR r16 <BR> ROL r17 <BR> DEC r18 <BR> TST r18 <BR> BRNE Spiegeln <BR> <BR> <BR>Gruss, Malte
Import-Script
12.10.2003, 12:23
hat der 80xx keinen ExOR Befehl?<img src="http://progshop.com/elektronik/diskussion/clipart/smile.gif" border=0> <BR> <BR>11011011 XOR 11111111 = 00100100 <BR> <BR>Das ist doch genau das was Du willst... oder?
Import-Script
12.10.2003, 12:55
ne, nicht invertieren... spiegeln: <BR>bit 0 -> bit 7 <BR>bit 1 -> bit 6 <BR>bit 2 -> bit 5 <BR>bit 3 -> bit 4 <BR>bit 4 -> bit 3 <BR>bit 5 -> bit 2 <BR>bit 6 -> bit 1 <BR>bit 7 -> bit 0 <BR> <BR>müsste doch mit rollen durch carry funktionieren... quelle rechts rollen (ROR) dann ist ein bit im carry und dieses wird dann im zielbyte links eingerollt... damit müssten die bytes gespiegelt sein, wenn man das 8 mal macht, oder? (ist im moment nur theorie, da ich das im vorveld mal abklären wollte, wie das zu programmieren ist, bevor ich die platine ätze...)
Import-Script
12.10.2003, 14:34
Hast Recht, das geht mit rechts raus -links rein rotieren am einfachsten. Aber nicht vergessen!!! Vorher carry löschen!!!, nicht dass noch was drinsteht von wem anders. <img src="http://progshop.com/elektronik/diskussion/clipart/smile.gif" border=0>
Import-Script
12.10.2003, 14:51
Noch eine Variante wenn´s schnell gehen muss: <BR>Tabellenzugriff: Dazu 256Byte Tabelle anlegen und zwar in absteigender Folge: <BR>Tabanfang: <BR>DB 255 <BR>DB 254 <BR>DB 253 <BR>.. <BR>DB 2 <BR>DB 1 <BR>DB 0 <BR> <BR>Dann mit Index drauf zugreifen, also <BR>Zahl ins Indexregister und Wert = Inhalt der Speicherzelle(Tabanfang + Index); <BR> <BR>Wie das beim 80xx geht weiss ich nicht, beim 6502 ging das saugut und beim 68000 allemal. <BR>Kostet halt 256 Byte Speicher, dafür nur einen Load-Befehl und nicht 8 Schleifenläufe a zig Befehle. <img src="http://progshop.com/elektronik/diskussion/clipart/smile.gif" border=0>
Import-Script
12.10.2003, 14:57
Stopp: Error: Tabelle muss zur Mitte, Bit 3,4 spiegelsymmetrisch sein <BR>also <BR>0 = 255 <BR>1 = 128 <BR>2 = 64 <BR>3 = 128+64 <BR>4 = 32 <BR> <BR>eben <BR>00000000 = 11111111 <BR>00000001 = 10000000 <BR>00000010 = 01000000 <BR>00000011 = 11000000 <BR>00000100 = 00100000 <BR> usw., aber das macht man halt nur einmal. <BR>
Import-Script
12.10.2003, 15:37
nö, diese lösung ist mir zu ungesund, wegen viel speicherverbrauch... <BR>dass es da 8x4 = 32 befehle für braucht zum spiegeln ist mir schnuppe... so arg schnell muss die umwandlung nicht sein <IMG SRC="http://progshop.com/elektronik/diskussion/clipart/happy.gif" ALT=":-)" BORDER=0> <BR>merci aber trotzdem für deine bestätigung! <BR>du weisst ja selbst dass es in der theorie oft klappt, aber in der praxis probleme macht <IMG SRC="http://progshop.com/elektronik/diskussion/clipart/happy.gif" ALT=":-)" BORDER=0>
Import-Script
12.10.2003, 21:14
Ich kenn' mich mit den AVR's nicht aus, aber bei den MCS-51 würde ich z. B. nach links ins Carry schieben, das Bit im Bit-Speicher ablegen, alles natürlich 8 mal wiederholen und dann das gesamte Byte an die gewünschte Stelle kopieren. Bei diesen Bausteinen kann man ohnehin nur den Akku schieben. <BR> <BR>Dein Beipiel oben kann ich nicht ganz nachvollziehen. Wenn Du die Register schiebst, schiebst Du sie doch im Kreis, wie soll dann ein Bit von dem einen Register in ein anderes kommen? <BR> <BR>Hier nur ein Teil meiner Idee, zu spiegelndes Byte steht im Akku: <BR> <BR><font color="0000ff">CLR C</font> 'lösche Carry <BR><font color="0000ff">RLC A</font> 'Rotiere Akku nach links durch Carry <BR><font color="0000ff">MOV badr,C</font> 'Kopiere Carry nach Bit-Adresse <BR> <BR>Hierbei wird das LSB zum MSB (Bit 08 bis Bit 00, zusammen Byte 20h) so dass der Akku gespiegelt im Byte 20h steht. Jetzt nur noch <BR><font color="0000ff">MOV A,Rr</font> 'Akku in Register oder Speicherstelle <BR> <BR>Gruß Winnie <BR> <BR>
Import-Script
12.10.2003, 22:42
ROR schiebt bits rechts raus ins carry und ROL schiebt bits links raus ins carry und holt für das rechteste bit das zuvor gesetzte Carry... oder etwa 0? das muss ich doch glatt nochmal im Commandset nachsehen. muesste aber stimmen.
Import-Script
12.10.2003, 23:30
Ja stimmt schon, was im Carry steht wird rotiert, nicht immer 0. Null nur wenn vorher CLR C ausgeführt wurde. Nach SETB C ists natürlich eine 1. <BR> <BR>C-------Akku <BR>x-11001111 <BR>RLC <BR>1-1001111x <BR>RLC <BR>1-001111x1 <BR>RLC <BR>0-01111x11 <BR>RLC <BR>0-1111x110 <BR> <BR>usw. wobei x z. B. 0 ist wenn vorher CLR C ausgeführt wird. <BR> <BR>Es wird also nichts rausgeschoben, sondern nur durch das Carry-Flag rotiert (egal welche Richtung). Wenn Du das immer weiter machst wird ihm auch schwindelig<img src="http://progshop.com/elektronik/diskussion/clipart/wink.gif" border=0>. Wie gesagt bei den MCS-51 ist das so, von AVR's habe ich keine Ahnung. Und die 4 Schiebe- bzw. Rotationsbefehle funktionieren nur mit dem Akku. Diese sind: <BR><font color="0000ff">RL</font>---Rotate Left <BR><font color="0000ff">RR</font>---Rotate Right <BR><font color="0000ff">RLC</font>--Rotate Left with Carry <BR><font color="0000ff">RRC</font>--Rotate Right with Carry <BR> <BR>Und nur bei den beiden Letzten kommt man an die einzelnen Bits. Carry wird z. B. auch in Verbindung mit dem I<sup>2</sup>C Bus verwendet. <BR> <BR>Gruß Winnie
Import-Script
12.10.2003, 23:36
Ach ja, es ist egal in welche Richtung Du die Bits schiebst. Es kommt nur drauf an wie Du sie im Bit-Speicher (falls im AVR vorhanden) ablegst. Dieses am Besten so, das 8 Bit genau eine Byte Adresse ergeben um das Byte dann an einen Port zu senden oder was auch immer. <BR> <BR>Das Carry Bit wird jeweils wie oben gesagt in die Bitspeicher geschrieben. <BR> <BR>Gruß Winnie <BR> <BR>PS. Weiter oben muß es natürlich MOV Rr,A 'Akku in Register heißen.
Import-Script
13.10.2003, 00:27
@Malte <BR> <BR>laß Dich nicht verunsichern, Dein Code ist vollkommen richtig. <BR>Man könnte ihn nur etwas optimieren: <BR> <BR> <BR>LDI r17, 1 <BR>Spiegeln: <BR>ROR r16 <BR>ROL r17 <BR>BRCC Spiegeln <BR> <BR>Nach dem 8. "ROL r17" ist C = 1 und fertig. <BR> <BR> <BR>Peter <BR> <BR> <BR>
Import-Script
13.10.2003, 16:33
@Peter <BR> <BR>Aber bei den 51ern gibt es sowas doch gar nicht, sind AVR's und MCS-51 wirklich so verschieden? Wie oben schon gesagt von AVR's habe ich keinen Schimmer. <BR> <BR>Gruß Winnie
Import-Script
13.10.2003, 19:46
@ all: <BR>mittlerweile habe ich das board geätzt und die routine mal getestet. mit dem ROL / ROR und BRCC auf dem Carry bit funktioniert es... <BR> <BR>@peter: merci für die Beschleunigung! <BR> <BR>@winnie: <BR>und ich habe keinen schimmer von 51ern... also kann ich dazu nichts sagen <IMG SRC="http://progshop.com/elektronik/diskussion/clipart/happy.gif" ALT=":-)" BORDER=0> <BR>kenne nur x86er und AVRs
Import-Script
13.10.2003, 19:54
8031 Serie hat <BR>"RLC" = rotate left thru carry und "RRC" eben rechtsrum. Dto. "JNC" = Jump if not Carry, also alles was man braucht für dieses Spielchen. <BR>Ich kenne ehrlich gesagt keine CPU die das nicht hat in irgendsoeiner Form. Ausser PIC, denen traue ich alles zu. Was man braucht fehlt garantiert!!! <BR>"PissInstruchtionComputer"..<img src="http://progshop.com/elektronik/diskussion/clipart/smile.gif" border=0>
Import-Script
13.10.2003, 20:51
@Winnie, <BR> <BR>"sind AVR's und MCS-51 wirklich so verschieden?" <BR> <BR>Ja. <BR>Schau doch mal auf die Atmel Seite unter AVR. <BR> <BR> <BR>Hier sind noch einige Spiegelungsvarianten für den 8051: <BR> <BR><a href="http://www.specs.de/users/danni/appl/soft/mirror/index.htm" target=_top>http://www.specs.de/users/danni/appl/soft/mirror/index.htm</a> <BR> <BR> <BR> <BR>Peter <BR>
Import-Script
13.10.2003, 22:08
Ja, ich habe mal nachgesehen und einiges auch bei google überflogen. Jetzt ist mir die Brille beschlagen weil da ja wohl offensichtlich Welten zwischenliegen. <BR> <BR>Wenn's jemanden interessiert, hier ein link über die AVR-Befehle (Tutorial): <BR> <BR> <a href="http://www.avr-asm-tutorial.net/avr_de/beginner/commands.html" target=_top>http://www.avr-asm-tutorial.net/avr_de/beginner/commands.html</a> <BR> <BR>Gruß Winnie
Powered by vBulletin® Version 4.1.12 Copyright ©2012 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.