PIC16F887 + Linux

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by M.W.N.N., 1 May 2010.

  1. M.W.N.N.

    M.W.N.N. Member

    Joined:
    5 Jan 2009
    Messages:
    173
    Likes Received:
    78
    Reputations:
    6
    Здравствуйте. Подскажите пож-та срезу для разработки ПО под PIC микроконтроллер PIC16F887 и программатор.
    ОС Linux (Ubuntu 9.10)

    Под Windows в комплекте идет компилятор microC + ПО для программатора - PICkit 2 v2.4

    Комплект RoboPica
     
    #1 M.W.N.N., 1 May 2010
    Last edited: 1 May 2010
  2. M.W.N.N.

    M.W.N.N. Member

    Joined:
    5 Jan 2009
    Messages:
    173
    Likes Received:
    78
    Reputations:
    6
    Сразу еще 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 мс ехать на зад.

    Но он постоянно едет в перед.
     
    #2 M.W.N.N., 2 May 2010
    Last edited: 2 May 2010
  3. POS_troi

    POS_troi Elder - Старейшина

    Joined:
    1 Dec 2006
    Messages:
    1,569
    Likes Received:
    466
    Reputations:
    108
    Я не очень в Сях и темболее под Пик но попробуй всеже так

    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 будет наверное.
     
    #3 POS_troi, 2 May 2010
    Last edited: 2 May 2010
    1 person likes this.
  4. M.W.N.N.

    M.W.N.N. Member

    Joined:
    5 Jan 2009
    Messages:
    173
    Likes Received:
    78
    Reputations:
    6
    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);
    							          }
    
    
    Буклет надо сказать они выпустили кислый :(
     
  5. POS_troi

    POS_troi Elder - Старейшина

    Joined:
    1 Dec 2006
    Messages:
    1,569
    Likes Received:
    466
    Reputations:
    108
    Тут дело в том что Шим тебе по умолчанию дает только положительный импульс и соответственно двигатель у тебя будет крутить только вперед , ну хотя если у тебя те функции стандартные то может както и можно указать шиму что ему отдать (положительный период или отрицательный).

    Вообще для данного дела лучше использовать драйверы, никаких проблем.

    Есть три ножки и рули как хочеш

    на первую подал - вперед поехал
    на вторую падал - назад поехал
    на третью ШИМ завел и с разно скоростью поехал

    Красота, ели пали =)
     
  6. M.W.N.N.

    M.W.N.N. Member

    Joined:
    5 Jan 2009
    Messages:
    173
    Likes Received:
    78
    Reputations:
    6
    Вот мое чудо :)
    http://imglink.ru/pictures/02-05-10/fffd6d6d91247248e425f6326fe20bd8.jpg
     
    #6 M.W.N.N., 2 May 2010
    Last edited: 2 May 2010
    1 person likes this.
  7. M.W.N.N.

    M.W.N.N. Member

    Joined:
    5 Jan 2009
    Messages:
    173
    Likes Received:
    78
    Reputations:
    6
    От шима зависит скорость движения, а для движения вперед и назад просто идет обращение к разным портам.
    Значения ШИМ от 0 до 255

    Кто знает почему программа движения работает не корректно?
     
  8. POS_troi

    POS_troi Elder - Старейшина

    Joined:
    1 Dec 2006
    Messages:
    1,569
    Likes Received:
    466
    Reputations:
    108
    Кусочек схемы, драйвера двигателя можеш выложить?

    З.Ы. Пореж фоту, ато Ачат уехал =/
     
  9. M.W.N.N.

    M.W.N.N. Member

    Joined:
    5 Jan 2009
    Messages:
    173
    Likes Received:
    78
    Reputations:
    6
    Вот схема http://imglink.ru/show-image.php?id=386e79fde73bbb846c3cafa66f99303b
     
  10. M.W.N.N.

    M.W.N.N. Member

    Joined:
    5 Jan 2009
    Messages:
    173
    Likes Received:
    78
    Reputations:
    6
    Нашел программатор и компилятор в 1 - Piklab, но он по ходу KDE зависим - просит подгрузить уйму библиотек KDE'ных. При компилировании вылетает, так что мои поиски продолжаются :)