Prog asm PIC+registre décalage 74HC595

Bonjour,

J'ai un problème quant à la programmation du PIC pour la communication avec 5 registres à décalage en cascade reliés avec la pin DATA (déjà pour 1 je ne sais pas comment faire). 1 registre est relié à 8 leds. Admettons que je veux allumer la led numéro 4, voilà ma routine:

Movlw 4 ; transfert 4 bits
movwf countLED
rcall LEDS

...

LEDS

bcf PORTB,5 ;Reset Leds

movlw 0xAA ; valeur 10101010
movwf Var ; chargée dans la variable "Var"

Loop
rlcf Var,f ;rotation à gauche de la variable "var"
btfss STATUS,C ;Retenue = 1? si oui sauter l'instruction suivante
bcf PORTE,3 ;sinon on met la ligne DATAS à 0
btfsc STATUS,C ;Retenue à 0? si oui sauter l'instruction suivante
bsf PORTE,3 ;sinon on met la ligne DATAS à 1

bsf PORTC,2 ;\
bsf PORTE,2
nop ; |Générer un front d'horloge sur SH_CP et ST_CP
bcf PORTE,2
bcf PORTC,2 ;/

decfsz countLED,f ;tout les bits sont ils envoyés? Si oui sauter instruction suivante
goto Loop ;sinon on boucle

Le schéma du montage: [url=https://www.casimages.com/i/100525033452942902.jpg.html][img]http://nsa14.casimages.com/img/2010/05/25/mini_100525033452942902.jpg[/img][/url]

4 pins du PIC sont utilisés pour la SH_CP, ST_CP, DS(data), Reset (/MR). Une led à la fois s'allume avec une condition précise: elles ne s'allument qu'en fonction de l'appui sur le bouton poussoir qui lui correspond (condition des BP passe dans le Pic aussi)

Je n'ai pas bien compris le fonctionnement avec les 2 horloges SH_CP et ST_CP, je sais que je dois latcher les autres leds quand je veux en allumer 1 seule à la fois mais je ne sais pas vraiment comment faire. POur l'instant ce que j'ai fait me fait un peu n'importe quoi.

Merci d'avance

3 réponses

  1. salut tchotch se que tu veux faire est simple donnes moi juste le temps de télécharger le datasheet du 74hc595
    0
    1. salut tchotch
      ton programme est faux est ce que tu as déja travailler avec les Pics?

      je vais te donner une astuce:
      1 - il faut créer un sous programme d'affichage sur les leds, tu feras appel à ce sous programme à chaque fois que tu en à besoin pour le rafraichissement, ce sous programme aura comme entrée un octet de sorte à ce que chaque bit correspond à la led que tu veux allumer tu pourra ainsi allumer tes leds suivant 256 combinaison.

      le sous programme sera comme suit :

      tu déclareras les registres tout seul biensur:

      Affich ; nom du sous programme
      movlw d'8'
      movwf ContBit ; compteur de bits = 8

      Loop
      btfss DataVar,0x07 ; verifie la valeur du 7ème bit
      bcf PORTE,3
      btfsc DataVar,0x07 ; verifie la valeur du 7ème bit
      bsf PORTE,3

      rlf DataVar

      bsf PORTE,2
      nop ; |Générer un front d'horloge sur SH_CP et ST_CP
      bcf PORTE,2

      decfsz ContBit
      goto Loop

      bsf PORTC,2 ;/
      nop
      bcf PORTC,2 ;/

      return

      dans le programme principal tu fais appel comme suit

      boucle
      movlw 'xxxxxxxx'b à la place des x tu mes des 0 ou des 1 suivant la donnée
      movwf DataVar
      call Affich
      goto boucle

      fais attention au déclaration des entrées sorties
      si ça marche pas dis le moi je te guiderais
      0
      1. Merci beaucoup, je m'y met!
        0
      2. J'ai essayé de faire ce que tu m'a dit mais cela ne fonctionne pas bien. Je contrôle bien les 8 premières Leds vu que j'envois 8 octets, ma)is elles s'allument aléatoirement et pas forcément une à la fois. Par exemple pour la première led j'envois '10000000'.

        Je ne comprend pas trop comment fonctionne ton bout de programme au niveau des horloges. Pourquoi ici tu fais correspondre 8 cycles sur SH_CP (RE2) et 1 cycle sur ST_CP (RC2?
        0
    2. désolé pour le retard j'étais absent hier

      je vais t'expliquer

      le circuit comprend 2 étages de 8 (bascules) bits.chaque bascule correspond à 1 bit.

      pour simplifier on appel A le première étage B le 2ème Qn la nième bascule

      AQ5 correspond à la 5ème bascule du 1ère étage.

      dans le première étage les 8 bascules sont reliées entre elles en série (cascade) sortie AQ1 --> entrée AQ2 ainsi de suite

      dans le deuxième étage la sortie AQ1 --> entrée BQ1

      tu auras le schéma suivant

      AQ1-->AQ2-->AQ3-->AQ4-->AQ5-->AQ6-->AQ7-->AQ8
      | | | | | | | |
      BQ1-->BQ2-->BQ3-->BQ4-->BQ5-->BQ6-->BQ7-->BQ8

      en réalité les leds sont reliées au 2ème étage c'est à dire B

      le signal SH_CP sert à décaler les sorties de l'étage A on a donc besoin de 8 front pour que l'octet soit présent sur les huit bascules mais jusqu'à présent rien ne sort sur les leds.

      quand on applique le signal ST_CP les huit sorties de l'étage A seront présente sur l'étage B en parallèle c'est pour cette raison qu'on a besoin du signal ST_CP que lorsqu'on veut obtenir l'affichage

      s'il te plait tu peux m'envoyer ton programme complet pour que j'essaie de voir le bug voici mon email selim_sefraoui@hotmail.com c'est mon msn aussi.
      0
      1. Le problème vient de ma broche RE3 (pour la donnée DATA) de mon PIC, je croyais l'avoir configuré en output mais je viens de voir qu'en fait elle peut seulement être en entrée. Il faut que je trouve une alternative.
        0
      2. J'ai changé, cela devrait mieux marcher avec la broche data alors que c'est encore pire! Les leds ne s'allument plus du tout. Il y a un problème avec data je pense. Quel doit être son comportement?
        0
      3. Je viens de m'apercevoir en mode debug qu'une action sur SH_CP (RE2) ramène data (RE1 et non plus RE3 car j'ai changé)) à 0 sans raison (j'ai checké le montage aussi)! J'abandonne pour aujourd'hui, je comprend plus rien là.
        0
      4. tchotch j'ai une question à te poser quel PIC tu utilises ?
        0
      5. 18F4520
        0