Hallo Forum,

ich versuche nun schon seit 3 Wochen meinen Bot (rn-control mit zwei Getriebemotoren) mit einer eigenen PWM-Routine ans Laufen zu bringen.

Ich bin total verzweifelt !

Beispiel-Listings und Eure Hilfen hier in zahlreichen Themen haben leider noch nicht zum Ziel geführt.

Also .... das board scheint alles zu machen, was es soll (flashen und so) Beispielprogramme in Bascom laufen auch (UART und so). Allerdings drehen sich die Motoren keinen Millimeter.

Wenn ich eigene Funktionen teste, bei denen die PWM-Pins PD4 und PD5 auf 1 gesetzt werden, dann laufen die Motoren sehhr langsam. Irgendwie habe ich den Verdacht, dass da was kaputt ist im Controller oder im Motortreiber-Baustein.

Kann das denn sein ? Entweder funktionierts oder eben nicht. Aber nicht halb oder ?

Ich hab leider keinen Oskar mit dem ich mir was anschauen könnte.

Hier ist der Construktor meiner Robotter-Klasse in C++:
Code:
// --------------------------------------------------------------------------------
// Konstruktor
// --------------------------------------------------------------------------------
rncboard::rncboard()
{
// PORT B: Motortreiber: PB0 und PB1    // 7 6 5 4 3 2 1 0
  DDRB = 3;								// 0 0 0 0 0 0 1 1
  PORTB = 0;   
  
// PORT C: Motortreiber: PC7 und PC6
										// 7 6 5 4 3 2 1 0
  DDRC = 0xff;                  		// 1 1 1 1 1 1 1 1     	 
  PORTC = 0;							
  PORTC |= 0x3f;						// 0 0 1 1 1 1 1 1 
							// PORTC:      0 0 1 1 1 1 1 1

// PORT D: Motor-PWM: PD4 und PD5
//     7   6   5    4      3       2           1             0
// 			Sound      -       PWM Mot1    PWM Mot0    INT1     INT0     TXD RS232   RXD RS232
//			  1        0           1          1          0         0           1             0
										// 7 6 5 4 3 2 1 0 
   DDRD = 0xb2;	    					// 1 0 1 1 0 0 1 0
   PORTD = 0;							// 0 0 0 0 0 0 0 0 
//   PORTD |= 0x0c;				// PORTD:  0 0 0 0 1 1 0 0 

   initTimer1();
}
Die Timer1-Einstellungen sehen bei mir so aus:
Code:
// --------------------------------------------------------------------------------
// Timer1-Einstellung fr PWM-Betrieb
// --------------------------------------------------------------------------------
void initTimer1(void)
{
TCCR1A = 0;
TCCR1B = 0;
//              sel.       inv.         sel.        inv.         8-Bit-fast-PWM
TCCR1A |= (0<<COM1A1)|(1<<COM1A0)|(0<<COM1B1)|(1<<COM1B0)|(1<<WGM11)|(1<<WGM10);
//            8-Bit-fast-PWM          ---- Takt / 1024 ----
TCCR1B |= (1<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10);	

//
TIMSK |= (0<<TICIE1)|(0<<OCIE1A)|(0<<OCIE1B)|(0<<TOIE1);
sei();
}
Und die Motor-Richtungs- und Steuerungs-Funkion sieht im Moment noch so aus:
Code:
void rncboard::motor(uint8_t i, int8_t speed)
{ 
  if ((i!=0) || (i!=1)) return; // Entweder 0 oder 1

  if (i==0) {					// linker Motor: Motor0
    OCR1A = abs(speed);
    if (speed==0) {				// Stop
      cbi(PORTC, 6);   			// Kanal1  = 0
      cbi(PORTC, 7);   			// Kanal2  = 0
    }
    else if (speed>0) {		// vorw�ts drehen
      sbi(PORTC, 6);   			// Kanal1  = 1
      cbi(PORTC, 7);   			// Kanal2  = 0

    }
    else {						// rckw�ts drehen
      cbi(PORTC, 6);   			// Kanal1  = 0
      sbi(PORTC, 7);   			// Kanal2  = 1
    }
  }

  if (i==1) {					// rechter Motor: Motor1
    OCR1B = abs(speed);
    if (speed==0) {				// Stop
      cbi(PORTB, 0);   			// Kanal1  = 0
      cbi(PORTB, 1);   			// Kanal2  = 0
    }
    else if (speed>0){			// vorw�ts drehen
      sbi(PORTB, 0);   			// Kanal1  = 1
      cbi(PORTB, 1);   			// Kanal2  = 0
    }
    else {						// rckw�ts drehen
      cbi(PORTB, 0);   			// Kanal1  = 0
      sbi(PORTB, 1);   			// Kanal2  = 1    
    }
  }
}
Hier werden in Abhängigkeit vom Wert der Geschwindigkeit (und dem Vorzeichen) die Drehrichtung und der speed gesetzt.

Soweit jedenfalls meine Überlegungen.

Wenn ich das Register TIMSK auf 1 setze um alle 4 Interrupts zu setzen scheint allerdings gar nix mehr zu gehen. Also hab ich das besser gelassen.

Würde mich echt freuen, wenn Ihr mir dazu was sagen könntet.

Ich habe übrigens versucht, aus den Datenblättern den PWM-Modus 11 (Phasenkorrekt) zu benutzen. Eventuell ist hier ja was grundlegendes faul.

Bis denn.... Klaus