PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ausro.c Motoransteuerung verstanden?



bergowitch
18.09.2005, 08:14
Hallo ich kämpfe immer noch mit C. In der ASURO.c habe ich folgende Zeile gefunden:

PORTD = (PORTD &~ ((1 << PD4) | (1 << PD5))) | left_dir;

nehmen wir einmal an left_dir wäre 1 (FWD => vorwärts)
und PORTD 00100000

Dann ergibt: ((1 << PD4) | (1 << PD5)) 00110000

Dies mit PORTD &~ verknüpft ergibt
PortD 00100000
und nicht (&~) 00110000
ergibt 11011111

nun noch oder 1 => erbibt das: 11111111

Das kann ja nicht das gewünschte Ergebnis sein!?
Kann mir jemand erklären wo mein Denkfehler ist?

Zum ASURO eine Zusatzfrage: Die Motorbrücke funktioniert doch so wie die vom RN-Control. Das würde bedeuten, dass -will man vorwärts fahren - P4 1 sein muss und D5 0 sein soll. Richtig?

Gruß
Stefan

Dino Dieter
18.09.2005, 10:26
Hallo





Dann ergibt: ((1 << PD4) | (1 << PD5)) 00110000

OK


Dies mit PORTD &~ verknüpft ergibt
PortD 00100000

Falsch. Es wird PORTD in eine temp. Variable gespeichert, mit dem negierten 0011 0000 UND verknüpft ergibt --> 0000 0000 .

Also temp = PORTD , TEMP = TEMP AND 11001111 --- > temp = 0

Jetzt wird temp mit left_dir ODER Verknüpft und dann wieder auf PORTD ausgegeben.

Also werden die Bits PD4 & PD5 immer gelöscht und entsprechend von Wert left_dir oder right_dir gesetzt.

Normalerweise sollte der Wert von left_dir = 0010 0000 sein und von right_dir = 0001 0000 sein oder umgekehrt.



MFG
Dieter

bergowitch
18.09.2005, 10:37
Vielen Dank.
Also erst negieren dann UND anwenden. ok
Aber hier kommt dann immer (je nach Richtung) bei FWD (1) 0011 0000 und RWD (0)
0000 0000 raus?
Dh die Brückenschaltung beim ASURO unterscheidet sich von RN-Control?

Und das " | left_dir; " wird nur auf die beiden veränderten Bits angewendet?
Warum? Das OR bezieht sich doch auf PORTD oder nicht?
Gruß
Stefan

Dino Dieter
18.09.2005, 11:04
Hallo



Und das " | left_dir; " wird nur auf die beiden veränderten Bits angewendet?
Warum? Das OR bezieht sich doch auf PORTD oder nicht?

Kann man so nicht sagen, kommt halt auf die Werte von left_dir an.

TEMP = TEMP AND 11001111

sorgt ja dafür, das nur die Bits 4 und 5 gelöscht werden und die anderen Bits unverändert bleiben.

Von daher macht es ja nur Sinn, für Werte von left_dir und right_dir, die gerade diese Bits ändern.

Kenne den ASURO nicht, von daher weiß ich nicht, wie die Brücke angesteurt wird.

MFG
Dieter

bergowitch
18.09.2005, 15:46
Vielen Dank!
Um das ASURO spezifische zu verstehen Poste ich mal im anderen Forum...
Gruß Stefan