На днях решил научиться рулить сервой, поигрался чуть чуть, потом решил построить руку-манипулятор из аналоговых серв (4 штуки) на 3 таймера ШИМ. (Просто так, ради интереса). Построил софт, и всё такое. Потом задумался решил кнопочками поуправлять сервой. Теория простая: изменяем задержку и получаем поворот сервы. Теорию взял от сюда : http://cdxp.zx6.ru/archives/355 .начал работу.
Суть проги такая, есть изначальный массив a[2] = {1500, 1500} (у меня так по середине сервы становятся), при нажатии на кнопку значение массива или увелич. или уменьшается. При достижение предела (т.е. если >2000) мы ставим максимальную задержку, т.е. 2000мс. и наоборот.
при нажатии кнопкии мы увеличиваем или уменьшаем задержку на 10мс <= вот тут то у меня проблема, при нажатии на кнопку задержка становится или 2000мс или 1000мс. Я даже не хнаю что делатЬ:(
Я хотел бы что бы при нажатии на кнопку задержка увеличивал ИМЕННО на 10мс или уменьшалась на 10мс.
вот код, он предельно ясен.
- Код: Выделить всё • Развернуть
#include <avr/io.h> //Библиотека ввода/вывода
#define TOP 20000
int a[2] = {1500,1500};
/*void servo1_position(int pos)
{
OCR1A = pos;
}
void servo2_position(int pos)
{
OCR1B = pos;
}
*/
void main(void)
{
//настраиваем Timer1
TCCR1A=0xA0;
TCCR1B=0x12;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=TOP>>8;
ICR1L=TOP; //максимальное значение таймера
OCR1B=0x00;
OCR1A=0x00;
DDRA=0x00;
DDRD=0x30; //PORTD4 & PORTD5 сконфигурированы на выход
PORTA=0xff;
/*servo1_position(zos); //на PD5 появится ШИМ с частотой 50 гц и длительностью имлуьса 1000 мксек
servo2_position(zos); //на PD4 аналогично, но длительность импульса уже 1300 мксек*/
while(1){
if (!(PINA & (1<<PINA0))) {a[1]+=10;}// проверить "0" на линии 1 порта D
if (!(PINA & (1<<PINA1))) {a[1]-=10;}// проверить "0" на линии 1 порта D
if (!(PINA & (1<<PINA2))) {a[2]+=10;}// проверить "0" на линии 1 порта D
if (!(PINA & (1<<PINA3))) {a[2]-=10;}// проверить "0" на линии 1 порта D
if (a[1] > 2000) {a[1] = 2000;}
if (a[2] > 2000) {a[2] = 2000;}
if (a[1] <1000) { a[1] =1000;}
if (a[2] < 1000) {a[2] =1000;}
OCR1A = a[1];
OCR1B = a[2];
}
}
спасибо!