Здравствуйте. Подскажите пож-та срезу для разработки ПО под PIC микроконтроллер PIC16F887 и программатор. ОС Linux (Ubuntu 9.10) Под Windows в комплекте идет компилятор microC + ПО для программатора - PICkit 2 v2.4 Комплект RoboPica
Сразу еще 1 вопрос: Вот моя библиотека для управления двигателем mator.h Code: char motor_duty_=127; char motor_init_=0; void Motor_Init() { if(motor_init_==0){ motor_init_=1; ANSELH.F0=0; ANSELH.F2=0; TRISB.F1=0; TRISB.F2=0; TRISD.F0=0; TRISD.F1=0; Pwm1_Init(5000); Pwm2_Init(5000); } } void Change_Duty(char speed) { if(speed!=motor_duty_) { motor_duty_=speed; Pwm1_Change_Duty(speed); Pwm2_Change_Duty(speed); } } void Motor_A_FWD(){ Pwm1_Start(); PORTD.F0=0; PORTD.F1=1; } void Motor_B_FWD(){ Pwm2_Start(); PORTB.F1=0; PORTB.F2=1; } void Motor_A_BWD(){ Pwm1_Start(); PORTD.F0=1; PORTD.F1=0; } void Motor_B_BWD(){ Pwm2_Start(); PORTB.F1=1; PORTB.F2=0; } void M_A_F(){ Pwm1_Stop(); PORTD.F0=0; PORTD.F1=0; } void M_B_F(){ Pwm2_Stop(); PORTB.F1=0; PORTB.F2=0; } void Forward(char speed){ Motor_Init(); Change_Duty(speed); Motor_A_FWD(); Motor_B_FWD(); } void Backward(char speed){ Motor_Init(); Change_Duty(speed); Motor_A_BWD(); Motor_B_BWD(); } void S_Right(char speed){ Motor_Init(); Change_Duty(speed); Motor_A_FWD(); Motor_B_BWD(); } void S_Left(char speed){ Motor_Init(); Change_Duty(speed); Motor_A_BWD(); Motor_B_FWD(); } void Motor_Stop(){ Motor_Init(); Change_Duty(0); M_A_F(); M_B_F(); } Код программы которую гружу в микроконтроллер: Code: #include "motor.h" void main(){ while(1){ Forward(255); Delay_ms(2000); S_Left(255); Delay_ms(800); Forward(255); Delay_ms(2000); S_Right(255); Delay_ms(800); Forward(255); Delay_ms(2000); Backward(255); Delay_ms(1000); Motor_Stop; } } По идее робот должен так: 2000 мс ехать вперед 800 мс поворачивать налево 2000 мс ехать вперед 800 мс поворачивать на право 2000 мс ехать вперед 1000 мс ехать на зад. Но он постоянно едет в перед.
Я не очень в Сях и темболее под Пик но попробуй всеже так Code: #include "motor.h" void main(){ while(1){ Forward(255); Delay_ms(2000); Motor_Stop(); // Тоесть перед сменой направления стопить все движки S_Left(255); Delay_ms(800); Motor_Stop(); Forward(255); Delay_ms(2000); Motor_Stop(); S_Right(255); Delay_ms(800); Motor_Stop(); Forward(255); Delay_ms(2000); Motor_Stop(); Backward(255); Delay_ms(1000); Motor_Stop; } } Также, что за функции Pwm1_Start(); Pwm2_Start(); ? Стандарт или самописные? Многие делают ошибки при инициализации Шим. А среду бери из "Центр приложений" или как он там называется (тот что в главном меню в самом конце) , ищи поиском по сочетанию "PIC". Там их штук 5 будет наверное.
POS_troi спасибо за совет, я пробовал после каждого действия останавливать двигатели, но он как будто не замечает этого. Странно что если сделать только 2 действия он выполняет нормально на пример: поехать в перед и повернуть на право. Pwm1_Start(); Pwm2_Start(); Это стандартные функции, старт двигаетелей помойму. С шим 100 процентов ничего не напутанно, функцию Шим"а брал с книги которая идет к роботу: Code: void Change_Duty(char speed) { if(speed!=motor_duty_) { motor_duty_=speed; Pwm1_Change_Duty(speed); Pwm2_Change_Duty(speed); } Буклет надо сказать они выпустили кислый
Тут дело в том что Шим тебе по умолчанию дает только положительный импульс и соответственно двигатель у тебя будет крутить только вперед , ну хотя если у тебя те функции стандартные то может както и можно указать шиму что ему отдать (положительный период или отрицательный). Вообще для данного дела лучше использовать драйверы, никаких проблем. Есть три ножки и рули как хочеш на первую подал - вперед поехал на вторую падал - назад поехал на третью ШИМ завел и с разно скоростью поехал Красота, ели пали =)
От шима зависит скорость движения, а для движения вперед и назад просто идет обращение к разным портам. Значения ШИМ от 0 до 255 Кто знает почему программа движения работает не корректно?
Нашел программатор и компилятор в 1 - Piklab, но он по ходу KDE зависим - просит подгрузить уйму библиотек KDE'ных. При компилировании вылетает, так что мои поиски продолжаются