Assembleur et PIC 16F84A
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

Assembleur et PIC 16F84A



  1. #1
    JCT_FUTURA

    Assembleur et PIC 16F84A


    ------

    Bonjour,

    Je débute en assembleur et en PIC, donc un peu d'indulgence si je dis des bêtises.

    Projet : Réaliser une régulation interactive de chauffage entre une PAC et un chaudière Fioul.

    Mon pic doit comparer des températures mesurées entrées par 4 sondes Dallas DS18S20 et agir selon certaines règles sur les ports de sortie pour activer la mise en route de la PAC ou de la chaudière Fioul.

    J'ai pour l'instant réalisé un programme qui me lit la température relevée par UN DS18S20 sur 8 leds, la ligne d'entrée est sur le PORTA3 et mes 8 leds sont sur le PORTB. Jusque là tout va bien, çà marche.

    Je voudrais éviter d'écrire 4 fois le programme, pour l'instant j'ai une constante DQ qui représente le bit du portA connecté à mon DS et j'ai l'instruction DQ EQH H'03' qui le définit ainsi.

    Ma question : est-il possible de faire une boucle qui incrémente le bit du port pour passer au suivant ?
    J'ai déjà fait l'essai de créer une variable DQX que je charge avec le port du DS que je veux sonder et de l'incrémenter, mais cela ne doit pas être aussi simple, car çà ne marche pas !

    Voici le code que j'ai utilisé (dans l'image jointe)

    Merci d'avance de vos réponses.

    -----
    Images attachées Images attachées  

  2. #2
    Gérard

    Re : Assembleur et PIC 16F84A

    Si tu veux passer du bit 0 au bit 1 puis au bit 2 ...
    il ne faut pas incrémenter mais faire une rotation vers la gauche.
    Ex :
    Var = 1; bit 0 = 1
    Var = Var * 2 ; rotation à gauche, tu auras le bit 1 égal à 1
    Var = Var * 2 ; .... bit 2 à 1

    Tu peux faire une boucle
    For i = 0 to 3
    Var = var * 2
    traitement voulu
    next i

  3. #3
    schmo

    Re : Assembleur et PIC 16F84A

    Salut,

    Pour ton programme tu doit utiliser des masques et les instructions AND et OR pour positionner les bits spécifiques dans l'état souhaité.
    exemple pour le masque des bits d'état du porta:
    au départ masque = 00000001, si tu fait PORTA = PORTA OR masque ==> le bit RA0 sera à l'état 1. Pour le mettre à 0 il faut faire PORTA = PORTA AND (valeur du masque complémentée)

    Pour choisir le bit suivant, il suffit de faire un décalage en positionnant le bit de carry:
    carry = 0 et décalage à gauche du masque, on obtient masque = 00000010. C'est à dire le bit RA1.

    Code:
    ; initialisation des masques pour RA0
    	MOVLW	b'00000001'
    	MOVWF	MASQUE_PORTA	
    	MOVLW	b'11111110'
    	MOVWF	MASQUE_TRISA
    
    RESET4DS
    	CALL	OW_RESET
    	BCF	STATUS,RP0
    	BSF	STATUS,C		; preparation pour ligne suivante
    	RLF	MASQUE_TRISA,F	; decalage à gauche avec carry=1
    	BCF	STATUS,C		
    	RLF	MASQUE_PORTA,F	; décalage à gauche avec carry=0
    	BTFSS	MASQUE_PORTA,4	; 4 lignes faites?
    	GOTO	RESET4DS		; non, on reboucle
    	--suite					; oui: suite
    	
    OW_RESET
    	CALL	OW_HIZ
    	CLRF	PDBYTE
    	....	
    	....
    	WAIT	.70
    	MOVF	PORTA,W			; on :lit tout le port
    	ANDWF	MASQUE_PORTA,W	; on ne garde que le bit interressant
    	BTFSC	STATUS,Z		; bit Z=0 si RA(n)=1, bit Z=1 si RA(n)=0			
    	INCF	PDBYE,F			
    	WAIT	.430
    	RETLW	.0
    
    OW_HIZ
    	BSF	STATUS,RP0
    	MOVLW	b'00001111'		; on met les 4 lignes du portA en entrée
    	IORWF	TRISA,F
    	BCF	STATUS,RP0
    	RETURN
    
    OW_LO
    	BCF	STATUS,RP0
    	COMF	MASQUE_PORTA,W
    	ANDWF	PORTA,F			; RA(n)=0
    	MOVF	MASQUE_TRISA,W
    	BSF	STATUS,RP0
    	ANDWF	TRISA,F			; on met la ligne RA(n) en sortie
    	BCF	STATUS,RP0
    	...
    J'espère ne pas être trop confus. Attention Le programme n'à pas été testé. C'est pour te donner une idée.
    A+

  4. #4
    JCT_FUTURA

    Re : Assembleur et PIC 16F84A

    Merci pour vos réponses, je testerai ce soir...

    Comment faire pour mettre une fenêtre avec du code dedans comme tu l'as fait Schmo, j'ai pas trouvé ??

    A+

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

    Re : Assembleur et PIC 16F84A

    Bonjour,
    Citation Envoyé par JCT_FUTURA Voir le message
    Comment faire pour mettre une fenêtre avec du code dedans
    Il suffit d'utiliser la balise [CODE ] Insertion code assembleur [/CODE].Attention pour l'exemple, j'ai placé un espace entre le E du premier CODE et le ], il faudra supprimer cet espace pour que la balise soit opérationnelle.
    A bientôt

  7. #6
    Laboum

    Re : Assembleur et PIC 16F84A

    Et voilà !
    Code:
    ; Ceci n’est qu’un extrait de mon programme, je n’ai pas non plus
    ; inséré la macro WAIT et la variable DQX a été déclarée.
    ; Les 4 DS sont sur le PORTA0,1,2,3
    
    ; Boucle de reset des 4DS
    	MOVLW H’03’ ;3 dans W
    	MOVWF DQX   ; DQX = 3
    RESET4DS
    	CALL OW_RESET  ; Appel du Reset pour chaque DS
    	DECFSZ DQX,1   ; DQX,-1, pour passer au suivant
    	GOTO RESET4DS  ; Si > 0 on boucle
    	CALL OW_RESET  ; Reset pour le PORTA0
    
    	; ---- Et on passe à la suite -----
    
    	;----------------------------------
    
    ; Les sous programmes
    ;-------------------------------------------------------------
    ; RESET du DS18S20
    ;-------------------------------------------------------------
    OW_RESET:
    	CALL  OW_HIZ       ; DQ haute impédance Niveau 1 (res P-Up)
    	CLRF  PDBYTE       ; Raz validation du reset
    	CALL  OW_LO        ; DQ en sortie Niveau 0
    	WAIT  .500         ; Délai 500µs
    	CALL  OW_HIZ       ; DQ haute impédance Niveau 1 (res P-Up)
    	WAIT  .70          ; Attente 70µs de la mise à 0 par le DS
    	BTFSS PORTA,DQX    ; Lecture du port du DS
    	INCF  PDBYTE,F     ; PDBYTE mis à 1 si le DS à mis à 0 DQ
    	WAIT  .430         ; Délai de 430µs pour compléter le cycle
    	RETLW 0            ; Si reset non valide PDBYTE=0
    ; ------------------------------------------------------------
    
    ; PortA3 en entrée haute impédance
    ; ------------------------------------------------------------
    OW_HIZ:
    	BSF STATUS,RP0  ; Selection banque 1
    	BSF TRISA, DQX  ; DQ en entrée
    	BCF STATUS,RP0  ; Selection banque 0
    	RETURN
    ; -----------------------------------------------------------
    
    ;PortA3 en sortie à 0
    ; -----------------------------------------------------------
    OW_LO:
    	BCF STATUS,RP0   ; Selection banque 0
    	BCF PORTA, DQX   ; DQ à 0
    	BSF STATUS,RP0   ; Selection banque 1
    	BCF TRISA, DQX   ; DQ en sortie
    En espérant ne pas avoir fait de faute, par respect pour l'auteur JCT_FUTURA
    Dernière modification par Laboum ; 04/02/2010 à 17h35. Motif: Ajout auteur

  8. #7
    JCT_FUTURA

    Re : Assembleur et PIC 16F84A

    Super... çà marche

    Merci à tous et désolé pour le code à réécrire, maintenant je sais lettre du code :

    Code:
    start
    ;*********************************************************************
    ;				Power ON - 3 x Cligotements des 8 Leds
    ;*********************************************************************
    	MOVWF	TMP1			; Transfert W > TMP1
    	BTFSS	TMP1,0			; Sauter ligne suivante si TMP1>0
    	CALL	CLIFF3			; La 1ere fois cligner FF 3xfois
    	CLRW				; Met W à 0
    	CLRF	TSTW			; Met à 0 TSTW
    ;*********************************************************************
    
    ;*********************************************************************
    ;			Relève et affichage de la Température du DS18S20
    ;*********************************************************************
    BOUCLEDS				; initialisation des masques pour RA0
    	MOVLW	b'00000001'		; Bit 1 à 1 dans W
    	MOVWF	MASQUE_PORTA	; Transfert de W dans MASQUE_PORTA
    	MOVLW	b'11111110'		; Bit 1 à 0 dans W
    	MOVWF	MASQUE_TRISA	; Transfert de W dans MASQUE_TRISA
    RELEVE
    	MOVF	MASQUE_PORTA,W	;
    	MOVWF	PORTB
    	CALL 	DLY500MS
    	CLRF	PORTB
    	CALL	DLY500MS
    	CALL 	OW_RESET		; Reset du DS18S20 DQn
    	BTFSS	PDBYTE,0		; Test Reset Valide
    	GOTO	RESETPASOK		; Reset Non valide
    	CALL	GETEMP			; Reset Valide
    AFFTEMP
    ;	RRF		DSMAG,1			; Affichage sans le bit des 0,5°
    	MOVF	DSMAG,0			; Transfert température relevée dans W
    	MOVWF	PORTB			; Affichage sur les Leds
    	CALL	DLY2S
    	CLRF	PORTB
    	CALL	DLY500MS
    	BCF		STATUS,RP0		; Selection banque 0
    	BSF		STATUS,C		; Carry à 1
    	RLF		MASQUE_TRISA,F	; Décalage à gauche avec carry=1
    	BCF		STATUS,C		; Carry à 0
    	RLF		MASQUE_PORTA,F	; décalage à gauche avec carry=0
    	BTFSS	MASQUE_PORTA,4	; 4 lignes faites ?
    	GOTO	RELEVE			; On passe au ds suivant
    	GOTO	BOUCLEDS		; On reprend au 1er DS
    RESETPASOK
    	CALL	CLIPASOK		; "11000011" Cet octet clignote 3 fois
    	CLRW					; Raz W pour réaffichage de départ
    	GOTO	start			; Retour au début

  9. #8
    JCT_FUTURA

    Re : Assembleur et PIC 16F84A

    Bon à part les tabulations qui passent pas ou il faut !!!

    Je sais mettre du code... pas lettre du code

    A bientôt.

Discussions similaires

  1. pic 16f84a
    Par invite6523d53d dans le forum Électronique
    Réponses: 23
    Dernier message: 08/05/2009, 21h35
  2. PIC 16F84A et port B
    Par invite922d2110 dans le forum Électronique
    Réponses: 1
    Dernier message: 21/04/2008, 23h30
  3. programme en PIC 16f84a
    Par invitedc3cc90b dans le forum Électronique
    Réponses: 5
    Dernier message: 24/12/2007, 13h19
  4. Pic 16f84A
    Par invite29d9c8de dans le forum Électronique
    Réponses: 2
    Dernier message: 18/12/2006, 09h01
  5. pic 16f84A
    Par invite29d9c8de dans le forum Électronique
    Réponses: 3
    Dernier message: 27/11/2006, 19h15
Découvrez nos comparatifs produits sur l'informatique et les technologies.