Arkon
23.01.2012, 15:02
Moin,
ich spiele grade mit einem Mega8 und einem L298N rum um zwei Motoren anzusteuern.
Ich versuche dabei das Prinzip (in Hard- wie Software) vom einem vorhandenen Board / Programm nachzuvollziehen.
Verdrahtet ist der L298N wie folgt mit dem Mega8 (nur Logik):
L298N -> Mega8
IN1 -> PB5
IN2 -> PB4
ENA -> PB2 (OC1B)
IN3 -> PD4
IN4 -> PD5
ENB -> PB1 (OC1A)
Die Drehrichtung wird ja über H(igh) und L(ow) an den Input(IN)-Pins vorgegeben. Über die PWM-Pins an ENA und ENB wird die Geschwindigkeit geregelt. Die Geschwindigkeit funktioniert auch und wurde auch von mir verstanden. Aber bei der Richtungswahl komme ich grade nicht weiter:
Die Funktion dafür sieht wie folgt aus (wurde scheinbar vom Asuro adoptiert)
void MotorDir(unsigned char left_dir, unsigned char right_dir)
{
PORTD = (PORTD &~ ((1 << PD4) | (1 << PD5))) | left_dir;
PORTB = (PORTB &~ ((1 << PB4) | (1 << PB5))) | right_dir;
}
Beim Funktionsaufruf werden “Schlüsselwörter” übergeben (FWD,RWD,BREAK,FREE) welche wie folgt definiert werden:
#define FWD (1 << PB5) /* (1 << PD5) */
#define RWD (1 << PB4) /* (1 << PD4) */
#define BREAK 0x00
#define FREE (1 << PB4) | (1 << PB5) /* (1 << PD4) | (1 << PD5)*/
So viel zur Theorie und den Grundlagen. Mein Problem ist jetzt folgendes:
Um die Drehrichtung zu bestimmen wird einer der beiden IN-Pins pro Motor auf H der andere auf L gezogen (BREAK und FREE mal außen vor). Da aber die Pins PD4 und PD5 in der Definition auskommentiert sind, werden diese doch bei einem Funktionsaufruf gar nicht geändert, bzw. ein
MotorDir(FWD,FWD);
würde doch ein
PORTD = (PORTD &~ ((1 << PD4) | (1 << PD5))) | (1<<PB5);
erzeugen.
Wie ist es jetzt also Möglich, dass mit dem Aufruf der Funktion die Pegel von PD4 und PD5 beeinflusst werden?
Haben die /* */ hinter einem #define vielleicht eine andere Wirkung als das auskommentieren des dazwischen befindlichen Codes?
ich spiele grade mit einem Mega8 und einem L298N rum um zwei Motoren anzusteuern.
Ich versuche dabei das Prinzip (in Hard- wie Software) vom einem vorhandenen Board / Programm nachzuvollziehen.
Verdrahtet ist der L298N wie folgt mit dem Mega8 (nur Logik):
L298N -> Mega8
IN1 -> PB5
IN2 -> PB4
ENA -> PB2 (OC1B)
IN3 -> PD4
IN4 -> PD5
ENB -> PB1 (OC1A)
Die Drehrichtung wird ja über H(igh) und L(ow) an den Input(IN)-Pins vorgegeben. Über die PWM-Pins an ENA und ENB wird die Geschwindigkeit geregelt. Die Geschwindigkeit funktioniert auch und wurde auch von mir verstanden. Aber bei der Richtungswahl komme ich grade nicht weiter:
Die Funktion dafür sieht wie folgt aus (wurde scheinbar vom Asuro adoptiert)
void MotorDir(unsigned char left_dir, unsigned char right_dir)
{
PORTD = (PORTD &~ ((1 << PD4) | (1 << PD5))) | left_dir;
PORTB = (PORTB &~ ((1 << PB4) | (1 << PB5))) | right_dir;
}
Beim Funktionsaufruf werden “Schlüsselwörter” übergeben (FWD,RWD,BREAK,FREE) welche wie folgt definiert werden:
#define FWD (1 << PB5) /* (1 << PD5) */
#define RWD (1 << PB4) /* (1 << PD4) */
#define BREAK 0x00
#define FREE (1 << PB4) | (1 << PB5) /* (1 << PD4) | (1 << PD5)*/
So viel zur Theorie und den Grundlagen. Mein Problem ist jetzt folgendes:
Um die Drehrichtung zu bestimmen wird einer der beiden IN-Pins pro Motor auf H der andere auf L gezogen (BREAK und FREE mal außen vor). Da aber die Pins PD4 und PD5 in der Definition auskommentiert sind, werden diese doch bei einem Funktionsaufruf gar nicht geändert, bzw. ein
MotorDir(FWD,FWD);
würde doch ein
PORTD = (PORTD &~ ((1 << PD4) | (1 << PD5))) | (1<<PB5);
erzeugen.
Wie ist es jetzt also Möglich, dass mit dem Aufruf der Funktion die Pegel von PD4 und PD5 beeinflusst werden?
Haben die /* */ hinter einem #define vielleicht eine andere Wirkung als das auskommentieren des dazwischen befindlichen Codes?