KiCom » 10 янв 2006, 08:20
Вот код программы:
//ICC-AVR application builder : 11.12.2005 18:05:21
// Target : 2313
// Crystal: 11.059Mhz
#include <io2313v.h>
#include <macros.h>
#define CENTER 2880
int mks_g=CENTER;
int del_0=CENTER;
int del_1=CENTER;
int del_2=CENTER;
int del_3=CENTER;
int del_4=CENTER;
int del_5=CENTER;
void go_servo (char,char,char,char);
char in,i=0,sum;
char n_servo,vector,alfa,summ,ver;
void delaysa(unsigned int mks)
{
if (mks<1400)
mks=1400;
if (mks>4450)
mks=4450;
while(mks>0)
{
mks--;
}
}
void port_init(void)
{
PORTB = 0xFF;
DDRB = 0xFF;
PORTD = 0x00;
DDRD = 0x00;
}
void timer0_init(void)
{
TCCR0 = 0x00; //stop timer
TCNT0 = 0x29; //set count
TCCR0 = 0x05; //start timer
}
#pragma interrupt_handler timer0_ovf_isr:7
void timer0_ovf_isr(void)
{
TCNT0 = 0x29; //TIMER0 has overflowed
PORTB |=BIT(0);
delaysa(del_0);
PORTB &=~BIT(0);
PORTB |=BIT(1);
delaysa(del_1);
PORTB &=~BIT(1);
PORTB |=BIT(2);
delaysa(del_2);
PORTB &=~BIT(2);
PORTB |=BIT(3);
delaysa(del_3);
PORTB &=~BIT(3);
PORTB |=BIT(4);
delaysa(del_4);
PORTB &=~BIT(4);
PORTB |=BIT(5);
delaysa(del_5);
PORTB &=~BIT(5);
//reload counter value
}
void uart0_init(void)
{
UCR = 0x00; //disable while setting baud rate
UBRR = 0x47; //set baud rate
UCR = 0xD8; //enable
}
#pragma interrupt_handler uart0_rx_isr:8
void uart0_rx_isr(void)
{
in=UDR;
PORTB^=BIT(7);
if (i==0)
n_servo=in;
if (i==1)
vector=in;
if (i==2)
alfa=in;
if (i==3)
ver=in;
i++;
if (i==4)
{
PORTB^=BIT(6);
go_servo(n_servo,vector,alfa,ver);
}
}
#pragma interrupt_handler uart0_tx_isr:10
void uart0_tx_isr(void)
{
}
void go_servo (char n_sevro, char vector, char alfa, char ver)
{
i=0;
sum=alfa-n_servo-vector;
if (sum==ver)
{
if (n_servo==0)
{
if (vector==1)
del_0=2880-alfa*6;
if (vector==2)
del_0=2880+alfa*6;
}
if (n_servo==1)
{
if (vector==1)
del_1=2880-alfa*6;
if (vector==2)
del_1=2880+alfa*6;
}
if (n_servo==2)
{
if (vector==1)
del_2=2880-alfa*6;
if (vector==2)
del_2=2880+alfa*6;
}
if (n_servo==3)
{
if (vector==1)
del_3=2880-alfa*6;
if (vector==2)
del_3=2880+alfa*6;
}
if (n_servo==4)
{
if (vector==1)
del_4=2880-alfa*6;
if (vector==2)
del_4=2880+alfa*6;
}
if (n_servo==5)
{
if (vector==1)
del_5=2880-alfa*6;
if (vector==2)
del_5=2880+alfa*6;
}
}
}
//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer0_init();
uart0_init();
MCUCR = 0x00;
GIMSK = 0x00;
TIMSK = 0x02;
SEI(); //re-enable interrupts
//all peripherals are now initialized
}
//
void main(void)
{
init_devices();
while(1)
{
}
}
Как работать с ШИМ я не разобрался поэтому сделал в лоб.
P.s. Пытался использвать кнопку Code но не получилось.