PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schieberegister über einen halben port?



bigeggmc
07.12.2008, 20:33
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

Besserwessi
07.12.2008, 21:02
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.

mare_crisium
07.12.2008, 21:50
bigeggmc,

das kann man z.B. so machen (Rotation nach rechts):



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.


Das Programmstück lässt sich leicht für die Linksrotation modifizieren ;-) .

mare_crisium