sadr0b0t / arduino-timer-api

Cross-platform Arduino timer API
GNU Lesser General Public License v3.0
35 stars 18 forks source link

Реализация вызовов timer_init_ISR_xxHz для PIC32MZ 200МГц #3

Open sadr0b0t opened 6 years ago

sadr0b0t commented 6 years ago

Дополнить реализацию вызовов timer_init_ISR_xxHz для чипов PIC32MZ 200МГц.

Сейчас она прячется за пустыми дефайнами в общем для PIC32 файле: https://github.com/sadr0b0t/arduino-timer-api/blob/master/timer-api/timer_setup_pic32.c

например:

/**
 * freq: 50Hz = 50 ops/sec
 * period: 1sec/50 = 20ms
 */
void timer_init_ISR_50Hz(int timer) {
#if defined(__PIC32MX1XX__) || defined(__PIC32MX2XX__)
    // 40MHz
    // TODO

    // 40000000 / 32 / 25000 = 50 => 20ms
    //uint8_t     tckps   = 0b101;    // set prescalar 1:32
    //uint16_t    prx     = 0x61A8;   // 25000
#elif defined(__PIC32MZXX__)
    // 200MHz
    // TODO

    // 200000000 / PB3(usually == 2) / 64 / 31250 = 50 => 20ms
    //uint8_t     tckps   = 0b110;    // set prescalar 1:64
    //uint16_t    prx     = F_CPU / (PB3DIV + 1) / 64 / 50;
#else
    // 80MHz
    // to set timer clock period to 20ms (50 operations per second == 50Hz) on 80MHz CPU
    // use prescaler 1:64 (TIMER_PRESCALER_1_64) and adjustment=25000:
    // 80000000/64/50 = 1250000/50 = 25000
    timer_init_ISR(timer, TIMER_PRESCALER_1_64, 25000-1);
#endif
}

Вроде ничего сложного, но там, судя по коду Servo.cpp, в игру вступает еще один делитель PB3, нужно разобраться, как он работает и всегда ли там лежит обещанная двойка.