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

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

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #3
    Продвинутый
    Регистрация
    28.11.2010
    Возраст
    61
    Сообщений
    241
    Вес репутации
    232

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

    Спасибо, я реально сам не разберусь.

    С мегой не заработала, пока разбирался с портами, то нашел еще вариант. Как-то больше доверия

    Пожалуйста, если сразу видно проблемность кода, тормозните.
    Я так понял из библиотеки, что можно использовать на выбор любой из 3-х таймеров? С мегой работать будет?

    PHP код:
    #include <PinChangeInt.h>    // http://www.arduino.cc/playground/Main/PinChangeInt
    #include <PinChangeIntConfig.h>
    #include <TimerOne.h>        // http://www.arduino.cc/playground/Code/Timer1

    #define NO_PORTB_PINCHANGES //PinChangeInt setup
    #define NO_PORTC_PINCHANGES    //only port D pinchanges (see: http://www.arduino.cc/playground/Learning/Pins)
    #define PIN_COUNT 3    //number of channels attached to the reciver
    #define MAX_PIN_CHANGE_PINS PIN_COUNT

    #define RC_TURN 3    //arduino pins attached to the reciver
    #define RC_FWD 2
    #define RC_FIRE 4
    byte pin[] = {RC_FWDRC_TURNRC_FIRE};    //for maximum efficency thise pins should be attached
    unsigned int time[] = {0,0,0};                // to the reciver's channels in the order listed here

    byte state=0;
    byte burp=0;    // a counter to see how many times the int has executed
    byte cmd=0;     // a place to put our serial data
    byte i=0;       // global counter for tracking what pin we are on

    void setup() {
        
    Serial.begin(115200);
        
    Serial.print("PinChangeInt ReciverReading test");
        
    Serial.println();            //warm up the serial port

        
    Timer1.initialize(2200);    //longest pulse in PPM is usally 2.1 milliseconds,
                                    //pick a period that gives you a little headroom.
        
    Timer1.stop();                //stop the counter
        
    Timer1.restart();            //set the clock to zero

        
    for (byte i=0i<3i++)
        {
            
    pinMode(pin[i], INPUT);     //set the pin to input
            
    digitalWrite(pin[i], HIGH); //use the internal pullup resistor
        
    }
        
    PCintPort::attachInterrupt(pin[i], rise,RISING); // attach a PinChange Interrupt to our first pin
    }

    void loop() {
        
    cmd=Serial.read();        //while you got some time gimme a systems report
        
    if (cmd=='p')
        {
            
    Serial.print("time:\t");
            for (
    byte i=0i<PIN_COUNT;i++)
            {
                
    Serial.print(i,DEC);
                
    Serial.print(":");
                
    Serial.print(time[i],DEC);
                
    Serial.print("\t");
            }
            
    Serial.print(burpDEC);
            
    Serial.println();
    /*      Serial.print("\t");
            Serial.print(clockCyclesToMicroseconds(Timer1.pwmPeriod), DEC);
            Serial.print("\t");
            Serial.print(Timer1.clockSelectBits, BIN);
            Serial.print("\t");
            Serial.println(ICR1, DEC);*/
        
    }
        
    cmd=0;
        switch (
    state)
        {
            case 
    RISING//we have just seen a rising edge
                
    PCintPort::detachInterrupt(pin[i]);
                
    PCintPort::attachInterrupt(pin[i], fallFALLING); //attach the falling end
                
    state=255;
                break;
            case 
    FALLING//we just saw a falling edge
                
    PCintPort::detachInterrupt(pin[i]);
                
    i++;                //move to the next pin
                
    PIN_COUNT;  //i ranges from 0 to PIN_COUNT
                
    PCintPort::attachInterrupt(pin[i], rise,RISING);
                
    state=255;
                break;
            
    /*default:
                //do nothing
                break;*/
        
    }
    }

    void rise()        //on the rising edge of the currently intresting pin
    {
        
    Timer1.restart();        //set our stopwatch to 0
        
    Timer1.start();            //and start it up
        
    state=RISING;
    //  Serial.print('r');
        
    burp++;
    }

    void fall()        //on the falling edge of the signal
    {
        
    state=FALLING;
        
    time[i]=readTimer1();    // read the time since timer1 was restarted
    //  time[i]=Timer1.read();    // The function below has been ported into the
                                // the latest TimerOne class, if you have the
                                // new Timer1 lib you can use this line instead
        
    Timer1.stop();
    //  Serial.print('f');
    }

    unsigned long readTimer1()        //returns the value of the timer in microseconds
    {                                    //rember! phase and freq correct mode counts 
                                        //up to ICR1 then down again
        
    unsigned int tmp=TCNT1;
        
    char scale=0;
        switch (
    Timer1.clockSelectBits)
        {
        case 
    1:// no prescalse
            
    scale=0;
            break;
        case 
    2:// x8 prescale
            
    scale=3;
            break;
        case 
    3:// x64
            
    scale=6;
            break;
        case 
    4:// x256
            
    scale=8;
            break;
        case 
    5:// x1024
            
    scale=10;
            break;
        }
        while (
    TCNT1==tmp//if the timer has not ticked yet
        
    {
            
    //do nothing -- max delay here is ~1023 cycles
        
    }
        
    tmp = (  (TCNT1>tmp) ? (tmp) : (ICR1-TCNT1)+ICR1  );//if we are counting down add the top value
                                                            //to how far we have counted down
        
    return ((tmp*1000L)/(F_CPU /1000L))<<scale;

    Вложения Вложения
    Последний раз редактировалось Mastar; 22.11.2011 в 18:09.
    Мои проекты - Катер для рыбалки

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

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

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

Ваши права

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