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(); } }







Zitieren
Lesezeichen