Új hozzászólás Aktív témák

  • ecaddsell

    aktív tag

    válasz weiss #9427 üzenetére

    Bár lehet jó eséllyel meg tudnám csinálni (legalábbis az esetek egy részére), de ez nem annyira triviális mert a kondi a jelalakot is torzítja.
    Szóval méretezni kell zavaró és kívánatos jeltől függően stb. A zavaró jel meg gombtól, öregedéstől stb. is függhet (meg encodernél forgatás sebessége miegymás).
    A SW-ben 1 változót sokkal gyorsabban változtatok mint a kondit újraforrasztom.

    Példának okáért gyorsan összedobtam a gomb kódját a lenti logikának (mivel most per pill. még fordítani sem tudom, szóval lehet nemcsak hibás is, hanem esélyes, hogy már a fordító sem eszi meg), nekem ez sokkal gyorsabb mint forrasztgatni, tárolós szkópon nézegetni a lehetséges hibákat stb.

    (Alsó rész init-be megy, meg GPIO-t változókat stb. be kell állítani).

    #include <pthread.h>
    #define ROTE_SW GPIO_NUM_xx
    #define RENC1_STPLIM 6

    typedef struct {
    gpio_num_t swpin;
    uint16_t step;
    } roteswT;

    roteswT rote1par;
    pthread_t rotethrdsw1;

    void* roteswbgrd(void* pars){
    roteswT* swpar = (roteswT*) pars; // switch parameters
    gpio_num_t swbut = swpar->swpin;
    uint32_t bcount;

    while (1){
    if(digitalRead(swbut) == LOW)
    {
    bcount = 0;
    for(int i=0; i<20; i++){
    delayMicroseconds(100);
    if(digitalRead(swbut) == LOW) bcount++;
    }
    if(bcount>=6){
    swpar->step = (swpar->step +1) % RENC1_STPLIM;
    delay (300);
    }
    }
    delay (5); // could pthread_cond_wait() for interrupt from pin
    }
    } // roteswbgrd

    pinMode(ROTE_SW, INPUT);
    rote1par.swpin = ROTE_SW;
    rote1par.step = 0;
    pthread_create(&rotethrdsw1, NULL, roteswbgrd, (void*) &rote1par);

    Az encoder számláló része persze kicsit húzósabb és ami dühítő, hogy a HW akár tudhatná is (nagyon közel van hozzá)...

Új hozzászólás Aktív témák