Détection changement d'états [Polling]
Répondre à la discussion
Affichage des résultats 1 à 12 sur 12

Détection changement d'états [Polling]



  1. #1
    Temp22

    Détection changement d'états [Polling]


    ------

    Bonsoir à tous,

    je cherche un moyen de détecter un changement d'état sur une, ou plutôt deux entrées (que ce soit un front montant, ou descendant), sans utiliser les interruptions. Est-ce possible en assembleur PIC ? j'ai fais pas mal de recherches, mais je n'ai rien trouvé de concluant. Ça serait pour faire l'acquisition de deux signaux en "plus-ou-moins" quadrature, via l'utilisation d'un codeur incrémental type EC11 de chez ALPS (http://www.alps.com/products/WebObje...EC11_list.html). Le but étant de construire un mot binaire avec deux états antérieurs, et courants, afin de déterminer le sens de rotation de l'encodeur.

    Je vous remercie d'avance!!

    -----

  2. #2
    DAUDET78

    Re : Détection changement d'états [Polling]

    La méthode par polling n'est pas la meilleure ... Tu bouffes toute la capacité de calcul de ton µC pour l'attente d'une éventuelle transition

    Le mieux, un timer qui , par interruption, vient lire l'état de tes deux entrées et, en fonction de l'état précédent, détermine si il y a incrémentation ou décrémentation. L'inconvénient, c'est la vitesse maximum de lecture. Il faut au moins une lecture par état, donc la période minimale du capteur est de 4 fois moins que la période du timer (sauf erreur de ma part)
    J'aime pas le Grec

  3. #3
    Temp22

    Re : Détection changement d'états [Polling]

    Merci de m'avoir répondu,
    Citation Envoyé par DAUDET78
    La méthode par polling n'est pas la meilleure ... Tu bouffes toute la capacité de calcul de ton µC pour l'attente d'une éventuelle transition
    Je suis d'accord, mais elle est la seule que je puisse utiliser (le PORTB étant quasiment complètement occupé, donc accessoirement toutes les interruptions "on-change" indisponibles).

    Il me reste la pin RB0/INT de libre au niveau des interruptions disponibles, mais c'est la seule. Est-elle suffisante pour l'application que je veux faire ?
    Citation Envoyé par DAUDET78
    L'inconvénient, c'est la vitesse maximum de lecture. Il faut au moins une lecture par état, donc la période minimale du capteur est de 4 fois moins que la période du timer (sauf erreur de ma part)
    Mon microcontroleur est cadencé à 4Mhz théorique. Sinon, peux-tu expliquer pourquoi la période minimale du capteur doit-être de 4 fois moins que la periode du timer ? 4 fois plus non ?

    Sinon, malgré la lourdeure de la solution par polling, je n'arrive pas à trouver de routine adéquate pour détecter les changements d'états, qu'ils soient montants ou déscendants...

  4. #4
    DAUDET78

    Re : Détection changement d'états [Polling]

    Pour voir un "step" sur les deux entrées "A" et "B" du capteur, il faut quatre échantillons 00 01 11 10 . Donc si ton timer est à 1mS, il ne ne peut "voir" qu'un step de 4mS

    L'algorithme est simple :
    Etat précédent de AB =00 Etat lu de AB=01 Compte=+1
    Etat précédent de AB =00 Etat lu de AB=00 Compte=0
    Etat précédent de AB =00 Etat lu de AB=10 Compte=-1

    Etat précédent de AB =01 Etat lu de AB=11 Compte=+1
    Etat précédent de AB =01 Etat lu de AB=01 Compte=0
    Etat précédent de AB =01 Etat lu de AB=00 Compte=-1

    Etat précédent de AB =11 Etat lu de AB=10 Compte=+1
    Etat précédent de AB =11 Etat lu de AB=11 Compte=0
    Etat précédent de AB =11 Etat lu de AB=01 Compte=-1

    Etat précédent de AB =10 Etat lu de AB=00 Compte=+1
    Etat précédent de AB =10 Etat lu de AB=10 Compte=0
    Etat précédent de AB =10 Etat lu de AB=11 Compte=-1
    J'aime pas le Grec

  5. A voir en vidéo sur Futura
  6. #5
    ftorama

    Re : Détection changement d'états [Polling]

    Encore un exemple de composant mal choisi, ou de mauvaise conception.

    Tu as des broches de libres, tu ne peux pas libérer des pins du port B en les échangeant?

    Le calcul supplémentaire pour reconstituer tes données de sortie sera largement moins gourmand que la gestion en polling de tes capteurs

    Sinon, chez les voisins, il y a l'Atmega644, 32 E/S, 32 entrées d'interruption. Elles sont simplement regroupées par port, mais le regroupement d'interruptions sur un même vecteur n'a pas de secret pour un utilisateur de PIC.

    Depuis peu, il est même possible de programmer les aVR avec du matos PIC, et réciproquement.
    Quand un homme a faim, mieux vaut lui aprendre à pecher que de lui donner un poisson.

  7. #6
    jyvoipabo

    Re : Détection changement d'états [Polling]

    Bonjour,

    J'ai aussi eu le même problème.
    Mais il se trouvait que le PIC gérait aussi un afficheur à 7 segments.

    L'astuce consiste à synchroniser le pooling de codeur avec le multiplex de l'affichage ce qui évite de faire appel à un timer supplémentaire.

    Et d'autre part, on peut utiliser la sortie multiplexage des segments pour combiner avec des diodes les 2 sorties du codeur sur une même entrée du Pic.

    JP

  8. #7
    Temp22

    Re : Détection changement d'états [Polling]

    @DAUDET78
    > Il faut seulement 2 échantillons du codeur pour écrire un mot binaire de type : ABA'B' où AB est l'état courant, et A'B' est l'état antérieur. De plus, mon codeur incrémental a un fonctionnement plutôt bizarre : Il n'a que trois états différents, je l'ai récupéré sur un micro-onde, peut-être est-ce un disfonctionnement ?
    - Pour l'incrément, les différents états qu'il peut prendre sont :
    11 (état initial), 01, 00, 11 (revient à l'état initial)
    Pour le décrément :
    11 (état initial), 00, 01, 11 (revient à l'état initial)
    Quoi qu'il en soit, il me semble qu'on peut tout de même en tirer quelques chose, en établissant une table de vérité.

    Citation Envoyé par ftorama
    Tu as des broches de libres, tu ne peux pas libérer des pins du port B en les échangeant?
    Je gère un LCD sur le PORTB, dont le bus de données 4 bits occupe les pin RB4 à RB7. Il me faudrait réécrire toute la routine et ça me prendrai pas mal de temps, j'aimerais considérer cette solution comme la dernière si je dois y avoir recours... De plus, j'ai cru comprendre que les interruptions-on-change sur le PORTB fonctionnent de pairs, càd que peut importe l'endroit où se trouvera l'évenement (sur n'importe quelle pin interrupt-on-change), le programme se branchera sur la routine d'interruption, donc ça me condamne pas mal de pin du PORTB non ?

    Je vous joins le morceau de code qui gère le codeur incrémental, il n'est pas réellement fonctionnel, il ne fait que décrémenter (ça n'est pas le fonctionnement voulu!), quand bien même PIC traiterais l'information... j'aurais besoin d'un coup de main la dessus :

    Programme principal :
    Code:
    Polling_Codeur_inc:
    	call		Gestion_Codeur			; incrémente ou décrémente via codeur incrémental
    	call		AFF_Compteur			; affiche compteur
    	
    	goto		Polling_Codeur_inc		; scrute par polling les changements d'états du codeur incrémental
    Routine de gestion du codeur incrémental
    Code:
    Gestion_Codeur:			
    
    	btfss	IO_ENCA				; attend état initial encodeur pour continuer (ENCA=ENCB=1)
    	goto		Gestion_Codeur
    	btfss	IO_ENCB
    	goto		Gestion_Codeur
    		
    	movlw	0	
    
    	btfsc	IO_ENCB				; récupère le premier état des deux signaux (antérieurs)
    	addlw	b'00000001'
    	btfsc	IO_ENCA
    	addlw	b'00000010'	
    
    
    	
    	btfsc	IO_ENCB				; récupère le deuxième état des deux signaux (courants)
    	addlw	b'00000100'
    	btfsc	IO_ENCA
    	addlw	b'00001000'	
    
    	call		Table_Codeur			; donne le code de retour
    	xorlw	0					; positionne le flag Z
    	btfsc	STATUS,Z				; si Z=1, ne fait rien
    	goto		Gestion_Codeur
    	; ici, l'encodeur a changé d'état, il faut incrémenter ou décrémenter le compteur
    	xorlw	1					; positionne le flag Z
    	btfsc	STATUS,Z				; si Z=1, incrémente, sinon, décrémente
    	call		INC
    	call		DEC
    	return	
    		
    		; 0 = ne fait rien, 1 = incrémente le compteur, 0xFF = décrémente le compteur
    		; un mot est construit comme suit : ABA'B'. AB (état après), A'B' (état avant) 
    Table_Codeur:
    	addwf	PCL,f
    	retlw	0					; 0000 ne fait rien
    	retlw	0xFF				; 0001 décrémente
    	retlw	0					; 0010 erreur
    	retlw	1					; 0011 incrémente
    	retlw	1					; 0100 incrémente
    	retlw	0					; 0101 ne fait rien
    	retlw	0					; 0110 erreur
    	retlw	0xFF				; 0111 décrémente
    	retlw	0					; 1000 erreur
    	retlw	0					; 1001 erreur
    	retlw	0					; 1010 ne fait rien
    	retlw	0					; 1011 erreur
    	retlw	0xFF				; 1100 décrémente
    	retlw	1					; 1101 incrémente
    	retlw	0					; 1110 erreur
    	retlw	0					; 1111 ne fait rien

  9. #8
    DAUDET78

    Re : Détection changement d'états [Polling]

    Citation Envoyé par Temp22 Voir le message
    Il faut seulement 2 échantillons du codeur pour écrire un mot binaire de type : ABA'B' où AB est l'état courant, et A'B' est l'état antérieur.
    et c'est quoi la conclusion ?
    De plus, mon codeur incrémental a un fonctionnement plutôt bizarre : Il n'a que trois états différents, je l'ai récupéré sur un micro-onde, peut-être est-ce un disfonctionnement ?
    Je ne vois pas ce que vient faire un codeur incrémental sur un micro-onde .....
    J'aime pas le Grec

  10. #9
    Temp22

    Re : Détection changement d'états [Polling]

    Citation Envoyé par DAUDET78
    et c'est quoi la conclusion ?
    Il n'y en a pas vraiment, juste que je m'interrogeais sur le fait que tu disais que la période minimale du capteur devait être de 4 fois moins que la période du timer.

    Sinon le codeur incrémental dans le micro-ondes sert à gérer la minuterie (le bouton de réglage du temps de chauffe), ou pour régler l'horloge, etc, comme on en trouve sur beaucoup d'appareil electronique doté d'un compteur numérique (autoradio de voiture, pour régler le volume), etc...

    Sinon, voyez-vous un moyen de corriger le programme ?

  11. #10
    DAUDET78

    Re : Détection changement d'états [Polling]

    Donc c'est un truc à balais mécaniques, ce n'est pas fait pour tourner longtemps (uniquement des entrées de réglage)
    J'aime pas le Grec

  12. #11
    jyvoipabo

    Re : Détection changement d'états [Polling]

    Bonjour,

    Si ça peut te servir, j'ai retrouvé la routine asm que j'avais programmée pour un truc qui sert à régler la durée des tours sur un métier forain.

    Elle utilise 2 bits d'un registre d'état dont les 6 autres servaient à qualifier l'état du système.

    Le pooling du codeur était calé sur celui des digits qui fonctionnait à 4x80 Hz.

    Cela marche depuis des années sans problèmes.

    A+
    Fichiers attachés Fichiers attachés

  13. #12
    Temp22

    Re : Détection changement d'états [Polling]

    Merci jyvoipabo, j'ai pu m'inspirer de ton travail, ça fonctionne à merveille maintenant !!

Discussions similaires

  1. détection de changement d'état
    Par invitef7281f10 dans le forum Électronique
    Réponses: 16
    Dernier message: 14/03/2010, 20h35
  2. POLLING avec le port parallele
    Par invite2164d6a6 dans le forum Électronique
    Réponses: 8
    Dernier message: 06/07/2009, 19h59
  3. Détection changement de phase
    Par invitee37923cb dans le forum Électronique
    Réponses: 7
    Dernier message: 13/02/2008, 09h46
  4. Superposition d'états
    Par invite31482ea3 dans le forum Physique
    Réponses: 2
    Dernier message: 04/01/2006, 08h14
  5. Detection de changement d'état
    Par invitea87c3e8f dans le forum Électronique
    Réponses: 1
    Dernier message: 09/11/2005, 21h20
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...