16f877 test de contacts puce

Fermé
Takos - 16 juin 2010 à 11:13
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 - 16 juin 2010 à 11:57
Tout d'abord, bonjour à tous,

Je suis complètement noob en programmation assembler et j'ai essayer ,au bout de quelques lecture de différents Tuto, de réaliser mon programme qui permettrai de tester par un affichage de led rouge/verte si les contacts sont bons :


list      p=16F877             
	#include <p16F877.inc>         

	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _BODEN_OFF & _LVP_OFF & _CPD_OFF  & _WRT_ENABLE_ON & _DEBUG_OFF
; Pas de code protege, pas de watch hdog timer, delai de demarrage, horloge HS.



		ORG     0x000           
  		GOTO    main  
		ORG     0x004	
		RETFIE  

main 	CLRF	PORTA		; Initialise le port A
		CLRF	PORTB		; Initialise le port B	
		CLRF	PORTC		; Initialise le port C
		CLRF	PORTD		; Initialise le port D
		CLRF	PORTE		; Initialise le port E
		BSF	STATUS, RP0	; Bank 1 selectonnee
		MOVLW	B'111111'		; Port RA5-RA0 en entrée
		MOVWF	TRISA		;	
		MOVLW	B'11111111'		; Port RB7-RB0 en entrée
		MOVWF	TRISB		;
		MOVLW	B'00000000'		; Port RC7-RC0 en sortie
		MOVWF	TRISC		;
		MOVLW	B'11111000'	; Port RD7-RD3 en entrée (RD4:entrée présence carte)/ Port RD2-RD0 en sortie (bit 0: led rouge/ bit1: led verte/ bit2: sortie présence carte)
		MOVWF	TRISD		;
		MOVLW	B'111'		; Port RE2-RE0 en entrée
		MOVWF	TRISE		;	
		BCF 	STATUS,	RP0	; Bank 0 selectonnee

        bsf PORTD, 3 ; allumage des 2 leds pour montrer que le circuit est bien alimenté
        bsf PORTD, 2 ;

        bsf PORTD, 0 ; PortD RD0 a "1" => présence connecteur
ATTENTE btfss PORTD, 1 ;
        goto ATTENTE ;

 
         bcf PORTD, 3 ; leds rouge et verte eteintes
         bcf PORTD, 2 ;

        

        bsf PORTC, 0 ; PortC RC0 a "1"
        btfss PORTB, 0 ;
       goto led_rouge ;
        bsf PORTC, 1 ; PortC RC1 a "1"
        btfss PORTB, 1 ;
       goto led_rouge ;
        bsf PORTC, 2 ; PortC RC2 a "1"
        btfss PORTB, 2 ;
       goto led_rouge    ;                           
        bsf PORTC, 3 ; PortC RC3 a "1"
        btfss PORTB, 3 ;
       goto led_rouge ;
        bsf PORTC, 4 ; PortC RC4 a "1"
        btfss PORTB, 4 ;
       goto led_rouge ;
        bsf PORTC, 5 ; PortC RC5 a "1"
        btfss PORTB, 5 ;
       goto led_rouge ;
        bsf PORTC, 6 ; PortC RC6 a "1"
        btfss PORTB, 6 ;
       goto led_rouge ;
        bsf PORTC, 7 ; PortC RC7 a "1"
        btfss PORTB, 7 ;
       goto led_rouge ;

led_verte bsf PORTD, 3 ; led verte allumée
fin_verte goto fin_verte ; fin led verte


led_rouge  bsf PORTD, 2 ; led rouge allumée
fin_rouge goto fin_rouge ; fin led rouge 

        bsf PORTD, 0 ; PortD RD0 a "1" => présence connecteur
ATTENTE_1 btfsc PORTD, 1 ; 
          goto ATTENTE_1 ;

         bcf PORTD, 3 ; leds rouge et verte eteintes
         bcf PORTD, 2 ;



	END             ; directive de fin de programme   




Mon portB est utilisé en entrée, le portC en sortie.
Le bit 2 et 3 du portD sont utilisés pour faire un 9bit qui établira si la carte est bien alimentée partout en allumant les 2 leds ( rouges et vertes ).
Il y a une valeur '1' sur les ports RC0 a RC7 qui passent les differents contacts (Cn0 à Cn7) pour retourner sur les ports RB0 a RB7, si RB recoit bien le '1' la led verte s'allume pour indiquer que le contact est opérationnel, sinon une led rouge s'allumera.
Mon soucis est que lorsque pour RC0/RB0 on obtient l'allumage de led rouge/verte, comment faire pour le faire passer au contact suivent, c'est a dire RC1/RB1 ?

En espèrant avoir été assez clair, ce qui n'est pas vraiment évident ^^
Cordialement ,



A voir également:

2 réponses

Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
Modifié par Nabla's le 16/06/2010 à 11:31
Salut.

Je n'ai que très peu de bases sur la programmation assembleur. Je ne m'autoriserai donc pas à lire le code ni à le commenter.

Cependant, je sais qu'une instruction s'applelle le décalage, elle est utilisée pour diviser ou multiplier par 2 (et balancer le reste).

en gros,
tu copies ton port à lire dans une variable
tu décales ta variable du numéro de bit à lire vers la droite (donc de 0 à 7)
tu fais un masque 0b0000.0001 sur cette variable décalée
ainsi, ton bit à tester se retrouvera en position 0, ce qui permet de faire ce traitement dans une boucle.

Je débute dans le monde des PIC meme si je connais bien la programmation. Personnelement, j'ai choisi d'apprendre en passant par le C car c'est un langage que je maitrise plutot bien, et surtout qui est portable (oui, j'ai pas envie de me retaper toute la programmation le jour ou je deciderai que je préfère ATMEL à Microchip).
En C, le décallage se fait avec l'opérateur << et >>.

MPLAB est livré avec un compilateur C gratuit, et si tu veux des noms, je crois qu'il y a HT-PICC, CC5X ... et surement d'autres....
0
Ok merci, je vais me pencher sur cette fonction de décalage .

Pour l'assembler bah, ca fait partie de mon projet, il faut que je me casse la tête sur ce type de programmation alors que je n'y connaissais rien avant quelques jours, j'aurai préférer programmer en C que j'ai utilisé toute l'année ^^


Merci pour votre réponse en tout cas ;)
0
Nabla's Messages postés 18203 Date d'inscription mercredi 4 juin 2008 Statut Contributeur Dernière intervention 28 avril 2014 3 193
16 juin 2010 à 11:57
JE te dirai bien de le faire en C et de présenter le code asembleur que le compilo aura généré, mais si on te demande d'expliquer le détail, tu risques d'avoir des problèmes à le faire ;)
0