So wieder da

Ich habe jetzt 2 IC. Aber geht trotzdem nicht
Ich habe das Programm umgeschrieben und fahre jetzt nur mit 100%

z.B. wenn ich den Befehl dafür geben vor/zurück/links/rechts zu drehen, drehen sich die 2 Getriebemotoren aber bleiben nicht stehen, muss paar mal drücken dann erst…
Manchmal klappt die Funktion! <- Dachte zu erst Probleme mit Kommunikation (Max232)

Aber:
Die 2 Servos (Werden auch gesteuert) drehen sich ohne Probleme!
Also ist die Kommunikation zwischen PC und µC in Ordnung.

Was ich auch Bemerkt habe:
Wenn ich den Befehl gebe vor/zurück/links/rechts zum drehen, werden die 2 Servos kurz mit bewegt.

Hier der aktuelle Code:

Code:
#include <stdint.h> 
#include <string.h> 
#include <avr/io.h>          
#include <stdbool.h> 
#include <stdlib.h> 
#include <avr/io.h> 
#include <AVR/iom8.h> 
#include <inttypes.h> 
#include <avr/interrupt.h> 
#include <util/delay.h> 

#define F_CPU 8000000    // clock 
#define   BAUD   9600 
#define bauddivider (unsigned int)(F_CPU / BAUD / 16 - 0.5) 
volatile unsigned char rxwert=0x30; 
volatile uint8_t takt;    

// Timer1 initialisieren 
void timer1_init(void) 
{ 
 TCCR1A = (1<<WGM11)|(1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0); // initalize mega8 Timer1  
 TCCR1B = (1<<CS12); 
   
 OCR1A =490; // Servo1 auf Mittelposition vorstellen (477-502) 
 OCR1B =478; // Servo1 auf Mittelposition vorstellen (477-502) 
} 

// Timer0 initialisieren 
ISR(TIMER0_OVF_vect){ 
takt++; 
} 

// UART initialisieren
ISR(USART_RXC_vect){ 
rxwert= UDR; 
} 

// COM1 initialisieren
void usart_init(void){ 
UBRRL = bauddivider;         //set baud rate 
UBRRH = bauddivider >> 8; 
UCSRB = (1<<RXCIE)|(1<<RXEN); 
UCSRC = (1<<URSEL)|(3<<UCSZ0); 
} 

// Servo1 initialisieren
void Servo1_init(void){
switch(rxwert){ 
   case 0x51 : 
      if(OCR1A > 477){ /* Servo1 dreht bis min 477 dann stop */
        OCR1A--;      /* Pulsbreite verkürzen */ 
		 _delay_ms(250);} /* 250ms warten */ 
		      UDR = 'H';
 
      break; 
   case 0x52 : 
      /* Servo1 nichht drehen */  
	  break; 
	  
   case 0x57 : 
       OCR1A =490; // Servo1 auf Mittelposition 
      break; 
   case 0x58 : 
      /* Servo1 nichht drehen */  
	  break; 

   case 0x45 : 
      if(OCR1A < 502){ /* Servo dreht bis min 502 dann stop */
        OCR1A++;      /* Pulsbreite verlängern */ 
		 _delay_ms(250);} /* 250ms warten */
      break; 
   case 0x46 : 
      /* Servo1 nichht drehen */  
      break; 
        }  
      
    }

// Servo2 initialisieren
void Servo2_init(void){
switch(rxwert){ 
   case 0x41 : 
      if(OCR1B > 472){ /* Servo2 dreht bis min 472 dann stop */
        OCR1B--;      /* Pulsbreite verkürzen */ 
		 _delay_ms(250);} /* 250ms warten */ 
      break; 
   case 0x42 : 
      /* Servo2 nichht drehen */  
      break; 
	  
   case 0x53 : 
       OCR1B =478; // Servo2 auf Mittelposition 
      break; 
   case 0x54 : 
      /* Servo2 nichht drehen */  
	  break; 

   case 0x44 : 
      if(OCR1B < 490){ /* Servo dreht bis 490 dann stop */
        OCR1B++;      /* Pulsbreite verlängern */ 
		 _delay_ms(250);} /* 250ms warten */
      break; 
   case 0x43 : 
      /* Servo2 nichht drehen */  
      break; 
        }  
      
    }

// Getriebe 100% drehzahl initialisieren
void Getriebe100(void){
    PORTC|=(1<<PC2)|(1<<PC5); // Motor läuft mit 100% 
	 }	  

// Getriebe 50% drehzahl initialisieren
void Getriebe50(void){
   if(takt>=10){ //Takt bis 10 zählen 
      takt=0; 
      PORTC^=(1<<PC2)^(1<<PC5); //PortD3 toggelt 50%   
	  }
}	

// Getriebemotoren initialisieren
void Getriebe(void){
switch(rxwert){ 
   case 0x32 : 
      Getriebe100(); //Geändert auf 100%
	  PORTC|=(1<<PC0); // GLRückwärts 50%
      PORTC|=(1<<PC3); // GRRückwärts 50%	  
      break; 
   case 0x33 : 
      PORTC&= ~(1<<PC0); // GLRückwärts Stop 
      PORTC&= ~(1<<PC3); // GRRückwärts Stop	  
	  break;

   case 0x34 : 
      Getriebe100();
	  PORTC|=(1<<PC4); // GRVorwärtsRechts 100%
      break; 
   case 0x35 : 
      PORTC&= ~(1<<PC4); // GRVorwärtsRechts Stop 	  
      break; 
	  
   case 0x36 : 
      Getriebe100();
	  PORTC|=(1<<PC1); // GLVorwärtsLinks 100%
      break; 
   case 0x37 : 
      PORTC&= ~(1<<PC1); // GLVorwärtsLinks Stop 
      break; 
 
    case 0x38 : 
      Getriebe100();
	  PORTC|=(1<<PC1); // GLVorwärts 100%
  	  PORTC|=(1<<PC4); // GRVorwärts 100%
      break; 
   case 0x39 : 
      PORTC&= ~(1<<PC1); // GLVorwärts Stop 
      PORTC&= ~(1<<PC4); // GRVorwärts Stop	  
      break; 
      }    
	}
  
 
int main(void) { 

usart_init();

DDRB = (1<<PB1)|(1<<PB2); // Pin PB1 und PB2 als Ausgang für Servo1/2       
DDRC=(1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5);// PC0=M2Z,PC3=M1Z, PC2=Getriebe1, PC5=Getriebe2, PC1=M2V,PC4=M1V
TCCR0=(1<<CS00); //kein Prescaler 
TIMSK|=(1<<TOIE0); // Overflow Interrupt en 

timer1_init(); 
sei(); 

for(;;){ 

Getriebe(); 
Servo1_init();
Servo2_init();  
   
} 
}