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