Einen halben Port zu rotieren geht nicht so einfach. Man muß dazu die benötigten Bits per AND separieren und den alten Bits die man stehen lassen will wieder zusammenfügen.
Guten Abend,
ich habe vollgendes Problem:
ich bin dabei ein Gerät zu reparieren, bzw mit einem atmega32 die Steuerung neu zu realisieren. Es handelt sich um eine Steuerung für ein Leinwandrack in einem Fotostudio.
Die Hardware sieht nun so aus:
PortA = output
PortC = input
PortA.0 und 1 sind nicht belegt
PortA.2 wählt mittels taster1 auf PortC.4 die drehrichtung nach oben
PortA.3 wählt mittels taster2 auf PortC.5 die drehrichtung nach unten
PortA.4 - 7 sind die motoren 1 - 4
Nun hab ich noch 2 Taster zur Verfügung mit denen ich im grunde PortA.4 -7 nach links und mit dem anderen nach rechts rotieren will.
Mit dem Rotate befehl hab ich bis jetzt aber immer nur den ganzen port rotieren können, das ist in diesem Fall aber nicht zu gebrauchen, selbst wenn ich hardwareseitig nen anderen port verwende brauche ich dennoch nur 4 Ausgänge und nicht die vollen 8.
Wenn jemand einen Rat weiß, bitte immer her damit
Viele Grüße, Basti
Einen halben Port zu rotieren geht nicht so einfach. Man muß dazu die benötigten Bits per AND separieren und den alten Bits die man stehen lassen will wieder zusammenfügen.
bigeggmc,
das kann man z.B. so machen (Rotation nach rechts):
Das Programmstück lässt sich leicht für die Linksrotation modifizieren .Code:in r16,PINA ; Input Pins von PortA nach r16 einlesen mov r17,r16 ; Arbeitskopie nach r17 lsr r17 ; schiebt alle 8 Bits um eins nach rechts, setzt Bit7 auf Null sbrc r17,3 ; nächste Anweisung überspringen, wenn Bit3 Null ist or r17,0x80 ; Bit7 auf 1 setzen andi r17,0xF0 ; untere 4 Bits in r17 löschen andi r16,0x0F ; oberer 4 Bits in r16 löschen or r16,r17 ; beide Halb-Bytes in r16 wieder zusammensetzen ; r16 enthält jetzt wieder den urspünglichen Port-Inhalt, aber die ; oberen 4 Bits sind um eins nach rechts rotiert.
mare_crisium
Lesezeichen