Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Debounce software interrupt esterno

Progetti, interfacciamento, discussioni varie su questa piattaforma.

Moderatori: Foto UtenteMassimoB, Foto Utentexyz, Foto UtenteWALTERmwp

2
voti

[11] Re: Debounce software interrupt esterno.

Messaggioda Foto Utentedjnz » 27 ago 2022, 17:54

Attendere il fronte del clock e leggere semplicemente il livello dell'altro ingresso non è il metodo corretto.

Per funzionare all'incirca funziona, ma non si può essere certi che sia stato effettivamente fatto uno scatto (basta un quarto di scatto e tornare indietro per rilevare uno scatto completo fasullo), inoltre si devono gestire i rimbalzi, il che rema contro la necessità di letture veloci.

In un encoder come quello postato uno scatto è composto da quattro fronti (o se vogliamo da una sequenza binaria a due bit in codice gray) da riconoscere nell'esatta sequenza, ad esempio con una macchinetta a stati (e i rimbalzi verrebbero automaticamente soppressi).
Avatar utente
Foto Utentedjnz
595 2 5
Expert
Expert
 
Messaggi: 283
Iscritto il: 26 lug 2020, 14:52

0
voti

[12] Re: Debounce software interrupt esterno.

Messaggioda Foto UtenteEtemenanki » 27 ago 2022, 17:57

Vero, ma considera che quegli encoder hanno dei blocchi meccanici (click) apposta, per cui bisogna essere abbastanza perfidi intenzionalmente, per cercare di fregare il circuito con un quarto di click :mrgreen:
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.
Avatar utente
Foto UtenteEtemenanki
2.977 2 4 8
Master
Master
 
Messaggi: 1933
Iscritto il: 2 apr 2021, 23:42
Località: Dalle parti di un grande lago ... :)

1
voti

[13] Re: Debounce software interrupt esterno.

Messaggioda Foto Utentedjnz » 27 ago 2022, 18:00

Quando si fa click velocemente su una manopola è facilissimo ruotare leggermente il perno in modo involontario, quanto basta per creare lo scatto fasullo.
Avatar utente
Foto Utentedjnz
595 2 5
Expert
Expert
 
Messaggi: 283
Iscritto il: 26 lug 2020, 14:52

0
voti

[14] Re: Debounce software interrupt esterno.

Messaggioda Foto UtenteGioArca67 » 27 ago 2022, 18:54

Ma lui rende sordo l'INT per 300ms (troppi , ok, ma gli rallenta solo la velocità massima).

Sta usando un metodo abbastanza comune nella lettura con interrupt di questi encoder.

Foto Utentelucaking ma se ruoti più velocemente che succede?
Il problema lo riscontri solo quando ruoti molto lentamente o sempre?
Togli comunque le Serial.print da dentro alle routine di interrupt, fanno solo casino.

Non hai un oscilloscopio per vedere cosa succede?
Potresti altrimenti (per capire che succede) attaccare entrambi i canali dell'encoder ai pin con interrupt e salvare in due array i tempi in cui avviene l'interrupt di ciascuno. Poi quando premi un pulsante li fai stampare sulla seriale. Potresti usare micros().
millis() all'interno di una ISR non si aggiorna, quindi ti riporta l'istante in cui è stata chiamata (cioè se la chiami all'inizio ed alla fine hai sempre lo stesso valore anche se l'ISR è durata più di 1 ms).
Avatar utente
Foto UtenteGioArca67
2.123 2 4 9
Master
Master
 
Messaggi: 1894
Iscritto il: 12 mar 2021, 9:36

0
voti

[15] Re: Debounce software interrupt esterno.

Messaggioda Foto UtenteEtemenanki » 27 ago 2022, 19:33

djnz ha scritto:Quando si fa click velocemente su una manopola è facilissimo ruotare leggermente il perno in modo involontario, quanto basta per creare lo scatto fasullo.

A me finora non e' mai successo (pero' gli unici che ho usato finora avevano gli scatti abbastanza duretti)
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.
Avatar utente
Foto UtenteEtemenanki
2.977 2 4 8
Master
Master
 
Messaggi: 1933
Iscritto il: 2 apr 2021, 23:42
Località: Dalle parti di un grande lago ... :)

1
voti

[16] Re: Debounce software interrupt esterno

Messaggioda Foto Utentestefanopc » 27 ago 2022, 21:34

https://forum.arduino.cc/t/comportament ... ivo/647188

Volendo qui ci sono informazioni interessanti.
Ciao
600 Elettra
Avatar utente
Foto Utentestefanopc
7.666 4 8 12
Master EY
Master EY
 
Messaggi: 2533
Iscritto il: 4 ago 2020, 9:11

0
voti

[17] Re: Debounce software interrupt esterno

Messaggioda Foto Utentelucaking » 28 ago 2022, 11:45

Come promesso, ho dato un occhiata alle forme d' onda all' uscita del modulino dell' encoder.
Alla luce di cio che vedo, non sembrano cosi disastrose, quindi piu che rimbalzi forse erano problemi del mio codice. :-k
In giallo il CLK_PIN e in blu DRCT_PIN, le prime ruotando lentamente l' encoder, le seconde due ruotandolo piu velocemete.
SDS00001.jpg
SDS00001.jpg (43.75 KiB) Osservato 486 volte

SDS00002.jpg
SDS00002.jpg (41.09 KiB) Osservato 486 volte

SDS00003.jpg
SDS00003.jpg (44.81 KiB) Osservato 486 volte
Avatar utente
Foto Utentelucaking
1.438 3 5 8
Expert
Expert
 
Messaggi: 1270
Iscritto il: 29 mag 2015, 14:28

0
voti

[18] Re: Debounce software interrupt esterno

Messaggioda Foto Utentelucaking » 28 ago 2022, 11:47

SDS00004.jpg
SDS00004.jpg (41.64 KiB) Osservato 485 volte


Nel frattempo ho modificato anche il codice come segue, e il comportamento è decisamente migliorato e sembrano sparite le false letture, ma sempre a patto di no ruotare troppo velocemente.
Qui sotto l' output di quattro giri, man mano a velocità crescente e al temine di ognuno la pressione del bottone.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
28 29 30 31 32 33
Confermato 33

34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
58 59 60 61 62 63 64 65
Confermato 65

66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 97 98 99 100 101 102 103
Confermato 103

104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
122 123 124 125 126 127 128 129 130 131 132 133 134 135
Confermato 135

136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
154 155 156 157 158 159
Confermato 159

Cosi la cosa mi soddisfa abbastanza, anche se all' aumentare della velocità qualche scatto si perde.

Poi ho letto anche il link alla discussione consigliatami e infine ho dato un occhio al codice di questa libreria per la gestione degli encoder e ho capito che la cosa è parecchio piu complicata di come pensavo, come al solito del resto... :cry: .
Credo proprio che i problemi maggiori siano quelli descritti da Foto Utentedjnz in [11] e [13].
Va beh, per ora sono impantanato li, ma non mi arrendo. :D
Avatar utente
Foto Utentelucaking
1.438 3 5 8
Expert
Expert
 
Messaggi: 1270
Iscritto il: 29 mag 2015, 14:28

0
voti

[19] Re: Debounce software interrupt esterno

Messaggioda Foto Utenteluxinterior » 28 ago 2022, 12:32

Mi puoi spiegare una cosa
le orme d'onda non sono quelle di un segnale encoder Se fosse ecoder incrementale sarebbero due onde quadre sfasate di 90°
Anche sulllo stampato le label dei pin sono CLK_PIN e DRCT_PIN a me fa pensare più a una seriale con segnale di clock e dato.
AVresti mica un datashhet o della documentaizone della tua schedina che descrive l'interfaccia
Avatar utente
Foto Utenteluxinterior
3.311 2 4 8
Master
Master
 
Messaggi: 1987
Iscritto il: 6 gen 2016, 17:48

2
voti

[20] Re: Debounce software interrupt esterno

Messaggioda Foto Utentedjnz » 28 ago 2022, 15:29

lucaking ha scritto:ho modificato anche il codice come segue

:?: :?: :?:

Personalmente leggo gli encoder con una macchina a stati e senza interrupt, con sei sette smanopolate da un secondo ciascuna arrivo al valore 100, tra l'altro riportato su display LCD parallelo che fa perdere ulteriore tempo macchina/passi:

Codice: Seleziona tutto
const uint8_t tabT[7][4] = {
    { 0, 4, 1, 0 },
    { 2, 1, 1, 0 },
    { 2, 3, 1, 2 },
    { 2, 3, 3, 0 },
    { 5, 4, 4, 0 },
    { 5, 4, 6, 5 },
    { 5, 6, 6, 0 }
};


void readEncoder()
{
    static uint8_t  fase = 0;
    uint8_t enc = (digitalRead(ENCODER_B) << 1) | digitalRead(ENCODER_A);
    onUp = (3 == fase  &&  3 == enc);
    onDn = (6 == fase  &&  3 == enc);
    fase = tabT[fase][enc];
}


void loop()
{
    readEncoder();
    if (onUp) ....
    if (onDn) ....
}
Avatar utente
Foto Utentedjnz
595 2 5
Expert
Expert
 
Messaggi: 283
Iscritto il: 26 lug 2020, 14:52

PrecedenteProssimo

Torna a Arduino

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite