Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » Задержка вкл/выкл портов B6,B7

Страниц (1): [1]
 

1. ems2811 - 10 Мая, 2013 - 22:29:25 - перейти к сообщению
Здравствуйте. МК ATMega16. Пишу прогу для манипулятора и столкнулся с такой проблемой, в коде просто вкл/выкл порты с задержкой. Но порты B6,B7 тормозят странным образом. Иногда не успевают включится, иногда долго включаются (в другом куске кода). Вот проблемная часть кода:
CODE:
void delay(int ms){
for(;ms;ms--)
_delay_ms(1);
}
//------------------------------------------много case'ов----------------
case 11:
for(int i=0;i<steps;i++){
PORTD=(1<<PORTD3);
PORTB=(1<<PORTB7);
delay(time);
PORTD=(0<<PORTD3);
PORTB=(1<<PORTB6);
delay(time);
PORTB=(0<<PORTB7);
PORTD=(1<<PORTD2);
delay(time);
PORTB=(0<<PORTB6);
PORTD=(1<<PORTD3);
delay(time);
PORTD=(0<<PORTD2);
PORTD=(0<<PORTD3);
}
sendpc("ready");
break;

картинка осциллографа из протеуса прилагается (Порядок сигналов сверху вниз: D3,B7,B6,D2)
2. ems2811 - 12 Мая, 2013 - 20:55:13 - перейти к сообщению
Простите за незнание. Разобрался, нужно было использовать PORTD |= 1<<3;PORTD &= ~(1<<4);
3. cjA - 13 Мая, 2013 - 04:32:06 - перейти к сообщению
ems2811нет
4. ems2811 - 13 Мая, 2013 - 23:12:59 - перейти к сообщению
ну не только использование указанных способов вкл., но и алгоритм поправил. Шаг с ипользованием 2 фаз двигателя. вот такой получился:
case 10:
CODE:
case 11:
PORTD|=1<<PORTD3;
delay(time);
for(int i=0;i<steps;i++){
PORTB|=1<<PORTB7;
delay(time);
PORTD&=~(1<<PORTD3);
PORTB|=1<<PORTB6;
delay(time);
PORTB&=~(1<<PORTB7);
PORTD|=1<<PORTD2;
delay(time);
PORTB&=~(1<<PORTB6);
PORTD|=1<<PORTD3;
delay(time);
PORTD&=~(1<<PORTD2);
}
delay(time);
PORTD&=~(1<<PORTD3);
sendpc("ready");
break;