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

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

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #11
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    55
    Сообщений
    13,381
    Вес репутации
    10

    По умолчанию Re: PPM энкодер на ...дуино

    Вот набросал болванку , для захвата длительностей импульсов в два массива , один с длительностями положительных импульсов другой соответственно с отрицательными . В главном цикле можно делать обработку этих импульсов, разрешение таймера очень высокое, равно 8 тактам процессора 0.0000005 , это значит максимальная длительность импульса на входе D2 не должна быть больше чем 32 мс
    PHP код:
    volatile uint8_t i=0;
    volatile uint8_t Counter=0;
    volatile uint16_t Time=0;
    volatile uint16_t Bit_High[255];
    volatile uint16_t Bit_Low[255];
    //*************************************************************************
    ISR(INT0_vect)  // обработчик внешнего прерывания
    {
     
    Time=TCNT1
     if (
    PIND & (1<<2))  // Если бит 2 порта D установлен в лог. 1 
      
    {
        
    Bit_High[i]=Time;
      } else 
          {
            
    Bit_Low[i]=Time;
          }
     
    i++;  
     
    TCNT1 0;          //обнулить счетчик таймера
    }  
    //*************************************************************************
    void setup()    
    {   
       
    pinMode(2INPUT);
       
    pinMode(13OUTPUT);
       
    digitalWrite(2HIGH); // включить подтяжку входа
       
    Serial.begin(115200);
       
    Init_Timer1(); 
       
    Init_Ext_Int0();
    }
    //*************************************************************************
    void loop()    
    {   
    //.......

    //*************************************************************************
    void Init_Ext_Int0()// инициализация прерывания int0
    {
        
    EICRA &= ~((1<<ISC00)|(1<<ISC01)); //прерывание вызавается при сигнале LOW  
        
    EICRA |= (1<<ISC00); // прерывание вызывается при спадающем или нарастающем фронте сигнала на входе;  
        
    EIMSK |= (1<<INT0);  // разрешить прерывание INT0; 
        
    sei();              //разрешить все прерывания 
    }   
    //*************************************************************************
    void Init_Timer1()// инициализация таймера
    {
        
    TCCR1A 0;         //Normal mode
        
    TCCR1B = (1<< CS11); //предделителm x8
        
    TCNT1 0;          //обнулить счетчик таймера
        
    TIMSK1 _BV(TOIE1);   // Включить прерывание по переполнению таймера
        
    sei();              //разрешить все прерывания
    }   
    //*************************************************************************
    ISR(TIMER1_OVF_vect)//вектор прерывания по переполнению счетчика

       
    //Counter++; 
          
    TCNT1=0;

    Последний раз редактировалось Chip; 25.11.2011 в 02:29.

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

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

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

Ваши права

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