







#define F_CPU 4000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
#define X_MIN 3500 // <
#define X_CENTER 5500
#define X_MAX 7500 // >
#define Y_MIN 3900 // v
#define Y_CENTER 5900
#define Y_MAX 7900 // ^
uint8_t servo=4;
unsigned volatile long int x_pos=X_CENTER;
unsigned volatile long int y_pos=Y_CENTER;
void PWM_Init(void);
void Output_Init(void);
void USART_Init(void);
int main(void)
{
sei();
PWM_Init();
Output_Init();
USART_Init();
x_pos=X_CENTER;
y_pos=Y_CENTER;
return 0;
}
void PWM_Init(void)
{
// Fast PWM (TOP value is ICR1)
// Clear OC1A/OC1B on compare match
// Prescaler 1
TCCR1A |= _BV(WGM11) | _BV(COM1A1);
TCCR1B |= _BV(WGM12) | _BV(WGM13) | _BV(CS10);
//Output Compare and Overflow 1B Interrupt Enable
TIMSK |= (1<<OCIE1A) | (1<<TOIE1);
// TOP = (fCLK / (fPWM * 2 * N)) - 1
ICR1 = 39999; //50Hz
}
void Output_Init(void)
{
DDRA |= (1 << 4); // Servo #1 X axis
DDRA |= (1 << 5); // Servo #2 Y axis
}
void USART_Init(void)
{
UCSRB |= _BV(RXCIE) | _BV(RXEN); // RX Interrupt & RX Enable
UCSRC |= _BV(URSEL) | _BV(UCSZ0) | _BV(UCSZ1); // Use 8-bit character sizes
UBRRL = BAUD_PRESCALE; // Load lower 8-bits of the baud rate value into the low byte of the UBRR register
UBRRH = (BAUD_PRESCALE >> 8); // Load upper 8-bits of the baud rate value into the high byte of the UBRR register
}
ISR(USART_RXC_vect) // USART Recieve Interrupt
{
switch(UDR) // USART Data Register
{
case 0x43: // RIGHT
x_pos+=250;
break;
case 0x44: // LEFT
x_pos-=250;
break;
case 0x41: // UP
y_pos+=250;
break;
case 0x42: // DOWN
y_pos-=250;
break;
default:
asm("nop");
break;
}
}
ISR(TIMER1_COMPA_vect) // Timer 1 Compare Match Interrupt
{
PORTA &= ~(1 << servo); // Clear port of current servo
if(servo==4)
{
/////// Servo #1 X axis
OCR1A = x_pos;
servo=5;
}
else
{
/////// Servo #2 Y axis
OCR1A = y_pos;
servo=4;
}
}
ISR(TIMER1_OVF_vect) // Timer 1 Overflow Interrupt
{
PORTA |= (1 << servo); // Set port of current servo
}





משתמשים הגולשים בפורום זה: Bing [Bot] ו 2 אורחים