Показано с 1 по 10 из 697

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #11
    Пользователь Аватар для WhiteWings
    Регистрация
    05.02.2010
    Сообщений
    41
    Вес репутации
    344

    По умолчанию Re: Адаптер рулевых кнопок.

    Здравствуйте!
    Помогите, пожалуйста!
    решил сделать кнопки+энкодер, попытался соединить 2 кода в один... вот что получилось:
    Код:
    #define encoder0PinA  2  
    #define encoder0PinB  3 
    #define encoder0PinC  4
    #define PIN 5  //номер аналогового порта    
    #define LIMIT 10 //предел погрешности при дребезге   
    
    byte bytes[4];     
    //byte bytes[2]={0,7};
    
    unsigned long math_time,old_time,real_time, res_dt1, res_d;     
    void setup()          
    {         
      pinMode(encoder0PinA, INPUT);   
      digitalWrite(encoder0PinA, HIGH);     // подключить подтягивающий резистор  
      pinMode(encoder0PinB, INPUT);   
      digitalWrite(encoder0PinB, HIGH);    // подключить подтягивающий резистор 
      pinMode(encoder0PinC, INPUT);   
      digitalWrite(encoder0PinC, HIGH);    // подключить подтягивающий резистор  
      
      attachInterrupt(0, doEncoderA, FALLING);  // настроить прерывание interrupt 0 на pin 2  
      attachInterrupt(1, doEncoderB, FALLING);  // настроить прерывание interrupt 0 на pin 3  
      Serial.begin(115200);          
    }     
    
    void loop()         
    {       
      res_d = analogRead(PIN);  
      if( res_d < LIMIT) res_d = LIMIT; 
      delay(10);   
      res_dt1 = analogRead(PIN);   
            old_time = millis();    
            math_time = 0;     
            while(math_time < 200)    
              {    
                 real_time = millis();                 
                 math_time = real_time - old_time;   
                res_dt1 = analogRead(PIN);  
                if(res_dt1 < res_d-LIMIT || res_dt1 > res_d+LIMIT)break; 
              }    
    
     if(digitalRead(encoder0PinC)==LOW) 
       {
         res_d=res_d+2000;
    //      Serial.write( bytes,2);  
          while(digitalRead(encoder0PinC)==LOW){delay(50);}
    //       bytes[1]=7; 
       }
           
        if( math_time > 70)  
          {   
          bytes[0] = res_d  & 0xFF;          // преобразовать в 4-байта     
          bytes[1] = (res_d  & 0xFF00) >> 8;     
          bytes[2] = (res_d  & 0xFF0000) >> 16;    
          bytes[3] = (res_d  & 0xFF000000) >> 24;    
          Serial.write( bytes,4); // отправить прочитаное значение компьютеру          
          bytes[0] = 0;
          bytes[1] = 0;
          bytes[2] = 0;
          bytes[3] = 0;
          }       
    }  
    
    
    
    
    
    // обработка прерывания  
    void doEncoderA()  
    {  
      if(digitalRead(encoder0PinB)==HIGH){res_d=2048;
          bytes[0] = res_d  & 0xFF;          // преобразовать в 4-байта     
          bytes[1] = (res_d  & 0xFF00) >> 8;     
          bytes[2] = (res_d  & 0xFF0000) >> 16;    
          bytes[3] = (res_d  & 0xFF000000) >> 24;    
          Serial.write( bytes,4); // отправить прочитаное значение компьютеру          
          bytes[0] = 0;
          bytes[1] = 0;
          bytes[2] = 0;
          bytes[3] = 0;}
    
    //  Serial.write( bytes,2); 
    //  bytes[0]=0;}
    }    
    
    // обработка прерывания  
    void doEncoderB()  
    {  
        if(digitalRead(encoder0PinA)==HIGH){res_d=2084;
          bytes[0] = res_d  & 0xFF;          // преобразовать в 4-байта     
          bytes[1] = (res_d  & 0xFF00) >> 8;     
          bytes[2] = (res_d  & 0xFF0000) >> 16;    
          bytes[3] = (res_d  & 0xFF000000) >> 24;    
          Serial.write( bytes,4); // отправить прочитаное значение компьютеру          
          bytes[0] = 0;
          bytes[1] = 0;
          bytes[2] = 0;
          bytes[3] = 0;}
    
    //    Serial.write( bytes,2); 
    //    bytes[0]=0;}
    }
    Если начинаю резко крутить энкодер - программа начинает читать неверные значения, а именно вместо 2048 - 1372830241 (число написал примерно, на самом деле их слишком много, выскакивают разные, иногда повторяются), кнопки при этом глюке тоже показывают неверные значения, тоже увеличенные до больших размеров, но все пропорционально... например вместо 20 показывает 248912, а вместо 250 показывает 5448912
    и т.д... Через пару сек может все встать на свои места или через 10-20 сек... Где ошибка?

    UPDATE:
    Сейчас вместо 1000 четко показывал 256000, еще покрутил - показал 65536000
    вместо 990 - 253440
    вместо 1023 - 261888
    ну то есть просто умножает на 256 программа или скетч... потом все нормально становится
    Последний раз редактировалось WhiteWings; 02.03.2012 в 01:22.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •