PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit PORTC - Motoren und Leds



Basti_x
07.02.2006, 11:22
Hallo,

Ich habe gerad anfängliche Probleme mit meinem Controller...
Wenn ich auf dem PORTC nur mit den LEDs arbeite klappt alles. Arbeite ich nur mit den Motoren klappt alles. Nur wenn ich beides kombinieren will geht es nicht mehr....

also mein code für allgemeines INIT


void init(void)
{
DDRA = 0x00; /* Port als Eingang deklarieren ( A/D-Wandler Eingänge ) */
PORTA = 0x80;

DDRB = 0xff; /* Port als Ausgang deklarieren */
PORTB = 0x00;

DDRC = 0xff; /* Port als Ausgang deklarieren */
PORTC = 0x00;

DDRD = 0xff; /* Port als Ausgang deklarieren */
PORTD = 0x00;


ADMUX = 0;
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1);

/* Spezialfunktionen ausschalten */
SFIOR = 0;
}


Wenn ich diesen lade kann ich mit meinen LEDs mit folgendem Befehl arbeiten: PORTC = ~((1<<3)|(1<<4));
habe auch schon PORTC &= ~((1<<3)|(1<<4)); probiert

wenn ich nun noch mein MotorInit machen geht das nicht mehr. Es liegt an der gemeinsamen Nutzung und ich weiß auch, dass ich PC7 und PC6 nicht mehr zur Verfügung habe. Wie muss ich das anstellen damit ich meinen Motor verwenden kann aber trotzdem eine LED anschalten kann

Mein Code für die MotorInit:

void motorInit(void){
DDRD= (1<<PD4) | (1<<PD5); // PWM Pins als ausgang
DDRC= (1<<PC6) | (1<<PC7); // 6=Motor 1 Kanal 1 7= Motor 1 Kanal 2
DDRB= (1<<PB0) | (1<<PB1); // 0=Motor 2 Kanal 1 1= Motor 2 Kanal 2
TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<COM1A0) | (1<<COM1B0) | (1<<WGM11) | (1<<WGM10); // 10 Bit Pwm, invertierend
TCCR1B = (1<<CS11) | (1<<CS10); // Prescaler 64
OCR1A=1; // Mindestzeit für PWM1
OCR1B=1; // Mindestzeit für PWM2
}


Mein Motor wird später mit folgendem Befehl gesetzt: Portc |= (1<<PC6)

Wie ich das sehe liegt mein Denkfehler an der AND und OR-Verknüpfung. Habe jedoch schon einiges probiert und bin bis jetzt noch auf keine Lösung gekommen.

Vielen Dank für einen Tipp

Basti

michaelb
07.02.2006, 11:51
Hi Basti,
Hast du die LEDs gegen VCC oder Masse geschaltet?
Ich sehe deinen Fehler hier:



DDRC= (1<<PC6) | (1<<PC7); // 6=Motor 1 Kanal 1 7= Motor 1 Kanal 2


da du deine LEDs an diesem PortC hast!! Mit dem Befehl werden nur PC6 und PC7 Ausgang!! PC0 bis PC5 werden Eingänge!!! Die Pins an denen die LEDs hängen sind dann also als Eingang geschaltet, du willst aber dass sie ja Ausgänge bleiben!! Also muss es so heißen:



DDRC|= (1<<PC6) | (1<<PC7); // 6=Motor 1 Kanal 1 7= Motor 1 Kanal 2


bei den anderen Ports auch so verfahren mit dem | Operator! Damit nicht verändert wird sondern nur hinzugefügt wird!
Am besten so:


DDRD|= (1<<PD4) | (1<<PD5); // PWM Pins als ausgang
DDRC|= (1<<PC6) | (1<<PC7); // 6=Motor 1 Kanal 1 7= Motor 1 Kanal 2
DDRB|= (1<<PB0) | (1<<PB1); // 0=Motor 2 Kanal 1 1= Motor 2 Kanal 2


Gruß Michi

Basti_x
07.02.2006, 12:03
Danke

es war der Fehler mit den Ausgängen :-)

Ich habe mir schon gedacht, dass ich sowas irgendwo vergessen habe.

Jetzt habe ich noch ein kleines anderes Problem mit den Motoren(also den Ausgangsports) und zwar ist die Ausgangsspannung bei beiden nicht gleich. Ich habe das RN Control von Robotikhardware.
Wenn ich beide voll einschalte hat der eine 7,2V und der andere 8,6V. sollte doch eigentlich nicht normal sein. Meine Stromzuführung sind 10V.