Se connecter
Se connecter

ou
Créer un compte

ou
Agrandir
Les Mains dans le Cambouis
Bidouille & Développement Informatique

Sujet Le pub des programmeurs

  • 1 925 réponses
  • 117 participants
  • 123 031 vues
  • 130 followers
Sujet de la discussion Le pub des programmeurs
Salut :coucou: y a des programeurs sur AF si oui vous bossez sous quoi ?
Afficher le sujet de la discussion
1861
une methode qui marche super bien je trouve c'est le debounce qu'on trouve sur les modules mutable instruments. une loop a 1Khz et un ring buffer traité dans la while loop.

rumorofsmoke.github.io/

1862
Pouet > Non dans l'appliction finale, le cpu fera autre chose durant ce laps de temps (la je cherche juste à valider l'idée)

redpill > Merci pour l'idée du debounce ! Je n'y avais pas pensé en effet ca va m'être utile. J'avais essayé de basculer le tout dans la fonction d'interruption, mais ca ne fonctionnais pas mieux.
1863
essayes peut etre plutot un truc comme ca.
toto = 0; 

main()
{
pin_setup(bouton); 
interuption_setup(#pin)

while(
    new_toto = toto;     //fais le code uniquement si toto a changé
    if(new_toto != old_toto)
    {
         send_to_UART(toto);
        old_toto = new_toto;     //pour éviter l'envoi continuel
    }
    
}

interuption_pin{
    clean_inter; //important !!
    if(PIN == 0) toto = 0;  //lis l'état de la pin
    else toto = 1; 
}

rumorofsmoke.github.io/

[ Dernière édition du message le 13/01/2020 à 23:03:24 ]

1864
Citation de Patrick :

J'ai paramétré le type de detection sur front montant et descendant

Le code tel quel fonctionne à peu près. C'est à dire que quand je presse le bouton, j'ai sur mon terminal "B=1" mais quand je le relache... aussi. Je ne comprends pas pourquoi... Quelqu'un a une idée ?

Si tu n'as besoin de l'interruption que sur un seul front (montant ou descendant), pourquoi diable configurer l'EXTI pour faire péter une interruption sur les deux fronts?
Sinon, +1 pour le debounce aussi, quoiqu'il faudrait avoir le schéma de la connexion du bouton à la GPIO pour savoir si c'est vraiment nécessaire.

Resistance is not futile... it's voltage divided by current

1865
Citation de aaB :
Citation de Patrick :

J'ai paramétré le type de detection sur front montant et descendant

Le code tel quel fonctionne à peu près. C'est à dire que quand je presse le bouton, j'ai sur mon terminal "B=1" mais quand je le relache... aussi. Je ne comprends pas pourquoi... Quelqu'un a une idée ?

Si tu n'as besoin de l'interruption que sur un seul front (montant ou descendant), pourquoi diable configurer l'EXTI pour faire péter une interruption sur les deux fronts?
Sinon, +1 pour le debounce aussi, quoiqu'il faudrait avoir le schéma de la connexion du bouton à la GPIO pour savoir si c'est vraiment nécessaire.

C'est clair, je comprends pas pourquoi tu es etonne d'avoir les 2 quand tu demandes a avoir les deux ?
1866
aaB > non je voudrais avoir une interruption lorsque le bouton est appuyé puis quand il est relâché, pour faire des traitements diffèrents dans les deux cas. Pour ça j'ai essayé de checker l'interruption ET la valeur du bouton mais ça ne fonctionne pas (ça me renvoie toujours le même résultat c'est ce que je décris dans mon premier message)

Miles > ce qui m'étonne c'est d'avoir la même valeur alors que je m'attends dans le premier cas (bouton appuyé) je m'attends a recevoir B=1 et dans le second (bouton relâché) B=0 mais c'est peut être un problème de debouncing
1867
Dans ton code, tu initialises toto à 1, mais je ne vois nulle part de code qui modifie cette valeur.
La manière habituelle pour ce genre de truc, c'est d'aller lire l'état de la pin dans le registre de la GPIO pour déterminer si ton interruption a pété sur un front montant ou descendant.
Il devrait y avoir quelque part une ligne de code qui assigne à toto la valeur du bit adéquat dans le registre d'état de la GPIO.

Resistance is not futile... it's voltage divided by current

1868
un truc qui n'engage que moi, tu devrais peut etre coder sans les librairies tiers genre HAL, cubeX et compagnie. Tu comprendrais bien mieux ce que tu fais et ce qui se passe. C'est pas plus compliqué, c'est bien plus formateur et la methode est ensuite transposable a tout les micros que tu vas utilisé.

rumorofsmoke.github.io/

1869
Citation de aaB :
Dans ton code, tu initialises toto à 1, mais je ne vois nulle part de code qui modifie cette valeur.
La manière habituelle pour ce genre de truc, c'est d'aller lire l'état de la pin dans le registre de la GPIO pour déterminer si ton interruption a pété sur un front montant ou descendant.

C'est ce qui a l'air d'etre fait, le toto n'est utilise que pour transmettre la valeur une fois et la pin est lue pour verifier.

if (toto && !HAL_GPIO_ReadPin(B1_Pin, B1_GPIO_Port))
{
  HAL_UART_Transmit(&huart2, "B=0\r\n", 6, 10);
}
toto = 0;

[ Dernière édition du message le 14/01/2020 à 17:37:54 ]

1870
Vu que HAL_GPIO_ReadPin retourne un enum, je comparerai directement a l'enum pour etre sur de ce que je fais. On ne sait jamais.