pointeur asm pic 16f84
Répondre à la discussion
Affichage des résultats 1 à 20 sur 20

pointeur asm pic 16f84



  1. #1
    jeff123

    pointeur asm pic 16f84


    ------

    Bonjour,
    je programme en ASM avec le logiciel MPLAB et il ya une fonction que je n'arrive pas a ecrire en assembleur.

    Je cherche a associer l'index d'une entrée a une variable.
    Je m'explique :

    entrée 1 : RA0 alors var = 0
    entrée 2 : RA1 alors var = 1

    Je souhaite m'en servir pour rediriger une sortie.

    si var = 0 alors RB0 = 1
    si var = 1 alors RB1 = 1.

    cette variable est utilisée plusieurs fois dans mon programme donc je veux faire une seule fois le test et apres utilisé cette variable.
    Vous comprendrez mieux dans mon exemple.

    test1-----------btfsc porta,0
    ----------------goto test2
    ----------------bcf var
    ----------------goto fintest

    test2------------btfsc porta,1
    -----------------goto fintest
    -----------------bsf var

    fintest------...
    ------------...


    start-----btfsc porta,var --- ;je sais que ça marche pas
    -----------------------------;mais j'ai besoin dans mon programme
    -----------------------------;de retester la variable qui était a On
    -----------------------------;pour savoir s'il elle l'est toujours.



    ---------bcf portb,var---------------;voila apres les fonctions dont j'ai
    ---------bsf portb,var---------------;besoin
    ---------btfss portb,var

    alors j'ai essayé avec le pointeur FSR, indf mais je n'y arrive pas.

    Ce doit etre une fonction simple, mais je n'arrive pas a l'appliquer, si quelqu'un a une idée.

    Merci de m'aider.

    -----

  2. #2
    jamnt

    Re : pointeur asm pic 16f84

    Bonsoir,

    Si j'ai bien compris, var doit refléter l'état des entrées RA0 & 1?
    Si c'est bien ça, chaque fois que tu veux tester ces entrées, il suffit d'appeler le test (call test1) et terminé fintest par return.

    Cordialement

  3. #3
    jeff123

    Re : pointeur asm pic 16f84

    oui mais comme je disais jeveux faire qu'une seule fois le test, je suis limité en temps d'instruction car j'ai des boucles derrieres qui tournent.
    Et puis les instructions (btfsc porta,var ) ; (bcf portb,var ) ne fonctionnent pas comme ça. Var doit etre configure avec la fonction equ 2 pour l'adresse 2 du portb par exemple.
    enfin je pense que l'idée est dans le pointeur FSR mais il faut bien l'ecrire.
    Sinon je ferai 2 programmes sir var = 0 j'irai dans un programme qui traite le rb0 et si var = 1 j'irai dans le programme rb1.
    Mais bon c'est copier 2 fois le meme programme pour rien.

  4. #4
    invite092cb13c

    Re : pointeur asm pic 16f84

    Bonjour
    Ton probleme n'est pas trop bien posé, je veux dire que le fonctionnement ne me semble pas tres clair dans ton esprit, et c'est souvent un probleme en assembleur.
    1° var n'est pas une variable à la façon dont tu l'utilises, c'est un bit que tu dois definir de cette façon :
    Code:
    #DEFINE var	temp,0			; on utilise le premier bit d'une variable que l'on declare sous le nom temp
    2° il y a un cas dont tu ne parles pas, c'est si RA0 et RA1 sont toutes les deux à 1
    3° un test peut être de cette forme si RA0 et RA1 n'ont jamais la même valeur, on ne teste que RA0
    Code:
    	bcf	var 	  	; on met var à 0
    	btfsc	PORTA,0	; on test si RA0 est à 0
    	bsf	var		; non donc var =1
    4° ensuite pour piloter RB0 ou RB1 en fonction de var
    Code:
    	btfss	var
    	bcf	PORTB,0
    	btfsc 	var
    	bsf	PORTB,1
    Mais je ne suis pas certain d'avoir exactement compris ce que tu veux faire.
    Si tu veux absoluement utiliser INDF, il faut un tableau de deux valeurs et transferer var dans une variable, mais cela me semble plus compliqué.

    Gilles

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

    Re : pointeur asm pic 16f84

    C'est vrai que tout ça n'est pas tres claire mais en fait je vais vous donner l'exemple mais programmé en langage que tout le monde peut comprendre.

    Code:
        
    ;porta en entrée, portb en sortie
    ;exemple : porta.0 représente l'entrée RA0
     
    
    ;test a faire qu'une seule fois
    
    test
    
    
    --if porta.0 = 1 then var = 0 
    --if porta.1 = 1 then var = 1
    
    ;programme principal
    
    start
    
    --if porta.var = 1 then	 
    
    ------if portb.var = 1 then
    	
    ------------------portb.var = 0		
    ------elseif
    ------------------portb.var = 1
    ------endif
    
    --elseif goto test-------;si la variable a changé d'état 
    -----------------------------;on retourne faire le test.
    endif
    
    goto start
    .
    Dernière modification par gienas ; 02/02/2010 à 11h17. Motif: Remplacé balises quote par code

  7. #6
    jeff123

    Re : pointeur asm pic 16f84

    voila désolé je n'arrive pas a inserer des décalages.

  8. #7
    jamnt

    Re : pointeur asm pic 16f84

    Re,

    C'est toujours pas clair.
    var=0 si porta,0=1 et que fait-on si porta,0=0
    var=1 si porta,1=1 et.....si porta,1=0

    if porta.var = 1, euh....je ne comprends pas ce que tu veux dire, c'est un peu redondant.
    porta,x est un bit représentant le n° du porta, à moins que tu veuilles traiter tout le porta?
    var =valeur de ce bit à l'instant du test (if porta.0 = 1 then var = 0)

    Décrit en "bon français" ce que tu veux réaliser.

  9. #8
    freepicbasic

    Re : pointeur asm pic 16f84

    Code:
    param EQU 0x20
    
    
    PullPort
      movlw 1
      movwf param
      call SetBit
      rlf param,f
      call SetBit
      rlf param,f
      call SetBit
      rlf param,f
      call SetBit
      rlf param,f
      call SetBit
    
    goto PullPort
    
    
    
    
    SetBit
      movf PORTA,w
      ANDwf param,W
      btfss	STATUS,Z
      	bcf	PORTB,0
      btfsc	STATUS,Z
      	bsf	PORTB,1
      bcf STATUS,C
      return
    Dernière modification par freepicbasic ; 02/02/2010 à 10h52.
    A+, pat

  10. #9
    freepicbasic

    Re : pointeur asm pic 16f84

    Transforme un numéro de pin en mask.
    entrée dans w
    sortie dans _PIN
    Code:
    PINZ
    ; Table to convert numbers 0-7 into bytes with a 1 in the corresponding
    ; bit position. For example, 3 converts to 00001000b.
    	movwf	FSR
    	incf	FSR,f
    	clrf	_PIN
    	bsf	STATUS,CY
    _Pinz2
    	rlf	_PIN,f
    	decfsz	FSR,f
    	goto	_Pinz2
    	movf	_PIN,w
    	RETURN
    A+, pat

  11. #10
    freepicbasic

    Re : pointeur asm pic 16f84

    Code:
    param EQU 0x20
    _PIN EQU 0x21
    
    PullPort
      movlw 1
      movwf param
      call PINZ
      call SetBit
      incf param,f
      call PINZ
      call SetBit
      incf param,f
      call PINZ
      call SetBit
      incf param,f
      call PINZ
      call SetBit
      incf param,f
      call PINZ
      call SetBit
      incf param,f
    
    goto PullPort
    
    
    
    
    SetBit
      movf PORTA,w
      ANDwf _PIN,W
      btfss	STATUS,Z
      	bcf	PORTB,0
      btfsc	STATUS,Z
      	bsf	PORTB,1
      bcf STATUS,C
      return
    
    PINZ
    ; Table to convert numbers 0-7 into bytes with a 1 in the corresponding
    ; bit position. For example, 3 converts to 00001000b.
    	movwf	FSR
    	incf	FSR,f
    	clrf	_PIN
    	bsf	STATUS,CY
    _Pinz2
    	rlf	_PIN,f
    	decfsz	FSR,f
    	goto	_Pinz2
    	movf	_PIN,w
    	RETURN
    A+, pat

  12. #11
    jeff123

    Re : pointeur asm pic 16f84

    merci freepicbasic. Mais ton programme ne repond qu' a la moitié de mon problème. Et puis je pense qu'une solution plus simple doit exister, d'ailleurs j'y suis presque mais un phénomène bizarre me bloque.

    jamnt si porta,0=0 alors dans la boucle test on fait rien et on sort de la boucle start.
    if porta.var = 1 c'est justement pour tester exactement l'entrée qui etait valide dans la boucle précédente.
    en fait tant qu'on reste appuyé sur le bouton relié on fait l'action sur la sortie associée.
    porta,x est un bit représentant le n° du porta :t'as compris.
    var =valeur de ce bit à l'instant du test , non var représente l'entrée qui etait a 1 pendant la boucle test.

    Voici un morceau de mon programme :

    Code:
    org 0
    goto start
    
    org 4
    goto ServiceInterrupts
    
    var SET 0x00
    
    test		
              btfss PORTA,0
              goto test2
              var SET  0x00
              goto fintest
    			
    test2		
              btfss PORTA,1
              goto test
              var SET 0x01
              goto fintest
    			
    fintest
    
    ServiceInterrupts
    
               btfsc PORTB,var	
               goto SortieOff
               bsf PORTB,var
               retfie
    
    SortieOff	
               bcf PORTB,var
               retfie
    En fait en fonction qu'on appuie sur le bouton branché sur l'entrée 0 ou 1, tout mon programme va agir sur la sortie 0 ou 1.
    Donc je n'ai qu'un programme qui va agir sur une sortie sélectionnée par l'entrée validée.

    Mon programme fonctionne jusqu'a une certaine ligne ou la valeur de var se modifie mais je ne sais pas pourquoi :
    voila les lignes de simulation :

    Code:
    -3 0004  1406             BSF 0x6, 0      0006 00  0006 01 000000000039
    -2 0005  2830             GOTO 0x30       ---- --  ---- -- 00000000003A
    -1 0006  0000start        NOP             ---- --  ---- -- 00000000003B
    0 0030  1486ServiceInterruptsBSF 0x6, 0x1    0006 01  0006 03 00000000003C
    0x6 est ma sortie. on voit qu'il y a zero apres.
    en derniere ligne on voit que var s'est transformée en 0x1 mais il n y a rien qui l'a modifié.
    Je comprends pas.
    merci pour l'aide

  13. #12
    jamnt

    Re : pointeur asm pic 16f84

    Bonjour,

    D'abord, si sur les entrées 0 et 1 il y a des boutons poussoirs, il est presque obligatoire de mettre une boucle antirebonds de quelques dizaines de ms. Sinon, effectivement ton programme risque d'avoir des comportements erratiques.
    Attends....y a un truc que je ne comprends pas. Si tu appuies sur 0, sortie 0 active ou inactive, et si tu appuies sur 1 sortie 1 ....etc
    A mon avis, t'as pas besoin d'un pic pour ça. 2 relais, ou des portes Et, OU, NAND, ou NOR devraient largement suffirent.

  14. #13
    jeff123

    Re : pointeur asm pic 16f84

    ohlala jamnt merci de m'aider mais la tu m'aides pas trop.
    La boucle anti rebond t'inquiete pas je m'en charge si on appuie sur les 2 boutons en meme temps je m'en charge aussi.
    Mon programme ne fait pas que ça, il gere une PWM sur les sorties utilisées, j'active une pwm sur les sorties en fonction de l'entrée. Mais il ne fait pas que ça il gere aussi des fins de course, des electro aimants qui ont tout a fait d'autres fonctions, tu vois mainetenant pourquoi ça serait difficile avec des relais.

    Et c'est pour ça que je veux faire un acces direct en sortie en fonction de l'entrée je ne veux pas activer une boucle de test a chaque fois que je change d'etat sur une sortie en fonction d'une entrée ou en fonctionde la fréquence.
    Et ma PWM est intelligente elle ralentit, accelere etc ...
    Tout ça avec un 16f84 ou il faut develloper soi meme sa PWM.
    J'essaie de ramener le fonctionnement au plus simple pour obtenir de l'aide.

    Merci quand meme.

  15. #14
    jamnt

    Re : pointeur asm pic 16f84

    Re,

    J'ai oublié, normal que ton programme ne fonctionne pas. Quand il entre dans l'interruption (provoqué par quoi?) tu ne sauvegardes pas l'environnement, et évidemment tu ne le restaures pas avant retfie, donc, ton programme redémarre, et reste dans l'interruption puisque tu ne gères pas les flags. Revoies le cours de Bigonnoff .....

    A+

  16. #15
    jeff123

    Re : pointeur asm pic 16f84

    l'interruption est provoqué par le tmr0. Je gere bien les flags mais je n'ai pas mis tout le programme, par contre qu'est ce que tu entends par sauvegarder l'environnment : ça m'interresse qu'est ce que tu entends par environnement. par contre je restaure l'intcon avant le retfie sinon mon interruption ne fonctionnerait qu'une fois.

    Mon programme fonctionne mais je veux l'adapter a deux sorties(en fait l'action sur l'un ou l'autre bouton active le sens de mon moteur en PWM)
    Pour le moment il ne tourne que dans un sens. Sur une sortie il fonctionne tres bien.
    Bigonnof c'est mon livre de chevet en ce moment et c'est de la que j'ai utilisé les SET.

  17. #16
    jamnt

    Re : pointeur asm pic 16f84

    Re,

    Justement, revoies le § interruptions du cours de Bigonoff. Le mécanisme des interruptions y est très bien expliqué.

    A+

  18. #17
    freepicbasic

    Re : pointeur asm pic 16f84

    1)le progr n'a pas de fin, il fini planté dans la routine d'int.
    2)La routine d'int ne gère les flags qui sont à l'origine de l'int.
    3)Les registres a sauver, comme déjà dit , apparemment pour le moment seul le status est touché.
    Mais si on sauve W devra être sauvé aussi.
    4) "Var set 0x00" , bizarre ce truc , jamais vu !
    5)
    0x6 est ma sortie. on voit qu'il y a zero apres.
    en derniere ligne on voit que var s'est transformée en 0x1 mais il n y a rien qui l'a modifié.
    d'où sort ce var ??
    Il n'est même pas déclaré !
    VAR EQU 0x20 ; par exemple

    il donne l'état du registre 006 avant et après l'instruction bsf
    bit 0 et 1 ça fait 03 déci ou Binaire,"00000011"
    A+, pat

  19. #18
    jeff123

    Re : pointeur asm pic 16f84

    Bonjour freepic,
    1 le programme n'y est pas en entier, je pense pas que ce soit interressant de le joindre ici. en tout cas la simulation jointe est extraite de mon programme réel et on voit que var est réaffecté alors qu'il y a juste un goto entre.

    Var set 0x00 : en fait SET est equivalent a EQU mais l'interet du SET c'est qu'on peut le réaffecter en cours de programme alors que l'equ , on ne peut plus le bouger.
    Dans mon programme j'utilise la variable var et elle ne bouge pas mais juste a cette instruction elle est modifiée, je comprends pas.
    Si quelqu'un a deja utilisé le SET ??
    Et ce qui est étrange c'est qu'il me le donne en decimal et apres en hexadecimal, et c'est la que c'est modifié. Incomprehensible. C'est peut etre le soft de simulation qui a un bug.

  20. #19
    freepicbasic

    Re : pointeur asm pic 16f84

    Var set 0x00 : en fait SET est equivalent a EQU mais l'interet du SET c'est qu'on peut le réaffecter en cours de programme alors que l'equ , on ne peut plus le bouger.
    c'est une instruction pour le compilateur !
    Ce n'est pas du dynamique , ne pas confondre !
    A+, pat

  21. #20
    jeff123

    Re : pointeur asm pic 16f84

    oui c'est vrai qu'en y reflechissant un peu plus, ça ne peut pas marcher en dynamique.
    bon pour le moment je n'ai pas de solutions simples, donc je vais creer deux morceaux identiques dans mon programme un qui traite la sortie 0 et un qui traite la sortie 1 en fonction de l'entree valide.
    Merci pour votre temps accordé.

Discussions similaires

  1. PIC 16F877 en ASM
    Par invite814175e4 dans le forum Électronique
    Réponses: 0
    Dernier message: 07/12/2009, 16h04
  2. fonction strtok et pointeur en µC (PIC)
    Par invite3bf0caa8 dans le forum Électronique
    Réponses: 6
    Dernier message: 23/05/2008, 17h12
  3. [ Programmation PIC 16F84 (asm) ]
    Par invite49af6c4e dans le forum Électronique
    Réponses: 1
    Dernier message: 23/10/2003, 19h55
  4. Programmation ASM d'un PIC
    Par invite67d96d45 dans le forum Électronique
    Réponses: 4
    Dernier message: 04/06/2003, 11h09
  5. PIC 16f877, source ASM !
    Par NYghost dans le forum Électronique
    Réponses: 5
    Dernier message: 02/04/2003, 07h05
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...