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

PIC 16F84A et Tmr0



  1. #1
    boy30

    PIC 16F84A et Tmr0


    ------

    Bonsoir, je voudrais être sûr de pouvoir faire ce programme pour un PIC16F84A (je sais, il date mais je n'avais pas besoin de plus pour çà).
    C'est pour une télécommande RF; le tout alimenté par une petite pile 12 V mais qui doit consommer le moins possible.
    Donc, le portB est en entrée avec interruption qui réveille le mode SLEEP qui lui-même à été activé avec le timer0 en prescaler le plus haut possible X 256 passages dans son interruption pour le mettre en service.
    Le débordement du timer0 fois 256 (inactivité de l'utilisateur sur le PIC) entraîne le PIC en mode SLEEP et, je le réveille avec interruption sur changement d'état sur les PORTB[4;7] pour pouvoir envoyer au module RF une trame correspondant à la touche appuyée.
    J'utilise le format NRZ à 9600 bauds (2400 ici) avec bit de parité pour m'assurer de la réception de Mr Bigonoff (ISO7816).
    La question est: puisque j'utilise le timer0 en interruption pour activer le mode veille, est-ce que je peux utiliser ce même timer0 (utilisé par Bigonoff et unique sut le 16F84A) pour gérer les temporisations inhérentes à la transmission série asynchrone dans une autre interruption relative à l'appuie d'une touche sur RBx (pull-up interne activé); GIE sera à zéro pendant la routine d'interruption RBx d’émission du caractère.
    Le débordement alors de timer0 ne pourra rien occasionner, n'est-il?
    En gros, le timer0 tourne toujours, mais dans un cas, il "interrupte" à intervalles régulier et dans l'autre, il me sert à temporiser:
    code de la source

    Code:
    temp_1bd 
      movlw  -38      ; en tenant compte des 2 cycles d’arrêt de Tmr0 
     movwf TMR0   ; initialiser tmr0 
      call  temp_suite    ; et attendre 1/2 bit 
     
    temp_1b 
      movlw  -91      ; écart entre 2 bits + 2 cycles d’arrêt 
      addwf  TMR0 , f    ; ajouter à la valeur actuelle 
     
    temp_suite 
     bcf    INTCON , T0IF  ; effacer flag   
     
    temp_wait 
      btfss  INTCON , T0IF  ; attendre débordement timer 
      goto  temp_wait    ; pas fini, attendre 
     return    ; et sortir
    Puis-je coder de la sorte?

    -----
    Dernière modification par boy30 ; 05/04/2015 à 21h07.
    ....j'ai glissé chef!

  2. #2
    antek

    Re : PIC 16F84A et Tmr0

    Avec un algorithme graphique ce serait plus facilement compréhensible que des phrases.
    En tout cas ça fait plaisir quelqu'un qui fait de l'assembleur . . .

    Je ne vois pas d'instruction "sleep" donc on peut pas savoir comment ça se goupille (à quel endroit le PIC se réveille ?)
    Une écriture dans tmr0 met à 0 le contenu du prédiviseur
    call temp_suite ; et attendre 1/2 bit - ?
    movlw -91 ; écart entre 2 bits + 2 cycles d’arrêt - ?

    Expliquer avec un logigramme permettrait de comprendre facilement les chargements de tmr0 avec des valeurs négatives.

    "GIE sera à zéro pendant la routine d'interruption RBx d’émission du caractère" - GIE est toujours à 0 pendant l'execution d'une routine d'interruption

  3. #3
    boy30

    Re : PIC 16F84A et Tmr0

    C'est un peu brouillon mais voilà l'algo que j'avais fait:

    Nom : algoflash.JPG
Affichages : 368
Taille : 202,5 Ko

    Et code toujours en construction et c'est au niveau des tempos dans les routines d'interruption RBx que je pense que je vais les changer pour prendre celles citées plus haut:

    Code:
    ;**********************************************************************
    ;                                                                     *
    ; Contrôle d'une commande RF									      *
    ;                                                                     *
    ;**********************************************************************
    ;                                                                     *
    ;    NOM: RF_16F84A                                 				  *
    ;    Date: 23/03/2015                                                 *
    ;    Version: 1                                    		              *
    ;    Circuit: Platine d'essai                                         *
    ;    Auteur: tnasel/(Bigonoff pour le template)                       *
    ;                                                                     *
    ;**********************************************************************
    ; Historique : Version 1.1 : modification de l'interruption RB4/RB7   *
    ;**********************************************************************
    ;                                                                     *
    ;    Fichier requis: P16F84.inc                                       *
    ;                                                                     *
    ;                                                                     *
    ;                                                                     *
    ;**********************************************************************
    ;                                                                     *
    ;    Notes: gestion de systèmes/d'appareils électriques/électroniques *
    ;			à distance											      *
    ;                                                                     *
    ;**********************************************************************
    
    
    	LIST      p=16F84A            ; Définition de processeur
    	#include <p16F84A.inc>        ; Définitions des constantes
    
    	ERRORLEVEL	-302			; désactive les warnings 302
    
    	__CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
    
    
    ;*********************************************************************
    ;                              ASSIGNATIONS                          *
    ;*********************************************************************
    
    OPTIONVAL	EQU	B'00000111'		; Valeur registre option
                                    ; Résistance pull-up ON
                                    ; Préscaler timer à 256
    
    DIRPORTA	EQU	B'00000000'	; Direction PORTA (1=entrée)
    DIRPORTB	EQU	B'11110000'	; Direction PORTB
    
    INTERMASK	EQU	B'00101000'		; Interruptions sur RBx avec x E [4;7]
    								; et sur Timer0 overflow
    TIMEBASE	EQU	D'244'			; base de temps
    
    CODERB7		EQU	B'01010101'		; code envoyé lors de l'appuie sur RB7
    
    
    ;*********************************************************************
    ;                             DEFINE                                 *
    ;*********************************************************************
    
    #DEFINE LED	PORTA,3				; LED sur RA3		(pin n°2)
    #DEFINE SLEEPLED	PORTA,2		; SLEEPLED sur RA2	(pin n°1)
    #DEFINE SLP		0				; masque pour passage en mode SLEEP
    
    #DEFINE RF	PORTA, 1			; RF sur PORTA1
    
    
    ;#DEFINE AUTO	B'00000001'	; Masque pour inversion de Mode
    
    ;*********************************************************************
    ;                             MACRO                                  *
    ;*********************************************************************
    
    BANK0	macro
    		bcf	STATUS , RP0		; passer banque0
    		endm
    
    BANK1	macro
    		bsf	STATUS , RP0		; passer banque1
    		endm
    
    ;*********************************************************************
    ;                   DECLARATIONS DE VARIABLES                        *
    ;*********************************************************************
    
    ;exemples
    ;---------
    	CBLOCK 0x00C   				; début de la zone variables
    	w_temp :1					; Sauvegarde du registre W
    	status_temp : 1				; Sauvegarde du registre STATUS
    	cmpt : 1					; compteur de passage
    	mode : 1					; registre virtuel du mode de fonctionnement
    	tramecode : 1				; mémoire tampon pour envoyer dans la trame
    	adrcarte : 1				; valeur de l'adresse de la carte concernée
    	numpin : 1					; numéro de la pin concernée
    	tempo : 1					; variable temporaire pour les temporisations
    								; des communications à 2400 bauds
    	nbrdonnee : 1				; variable contenant le nombre de bits de la donnée 
    								; à envoyer
    	donnee : 1					; variable contenant la donnée à envoyer (8 bits)
    	parite : 1					; contient la parité (0 ici car paire)
    
    	cli_on	:	1				; clignotement 1 = oui; 0 = non
    	ENDC						; Fin de la zone                        
    
    ;**********************************************************************
    ;                      DEMARRAGE SUR RESET                            *
    ;**********************************************************************
    
    	org 	0x000 				; Adresse de départ après reset
      	goto    init				; Adresse 0: initialiser
    
    ;**********************************************************************
    ;                     ROUTINE INTERRUPTION                            *
    ;**********************************************************************
    
    					;sauvegarder registres	
    					;---------------------
    	org 	0x004				; adresse d'interruption
    	movwf   w_temp  			; sauver registre W
    	swapf	STATUS,w			; swap status avec résultat dans w
    	movwf	status_temp			; sauver status swappé
    
    			; switch vers différentes interrupts
    			; inverser ordre pour modifier priorités
    			;----------------------------------------
    	
    	btfsc	INTCON,T0IE			; tester si interrupt timer autorisée
    	btfss	INTCON,T0IF			; oui, tester si interrupt timer en cours
    	goto 	intsw1				; non test suivant
    	call	inttimer			; oui, traiter interrupt timer
    	bcf		INTCON,T0IF			; effacer flag interrupt timer
    	goto	restorereg			; et fin d'interruption
    								; SUPPRIMER CETTE LIGNE POUR
    								; TRAITER PLUSIEURS INTERRUPT
    								; EN 1 SEULE FOIS
    
    intsw1
    	btfsc	INTCON,INTE			; tester si interrupt RB0 autorisée
    	btfss	INTCON,INTF			; oui, tester si interrupt RB0 en cours
    	goto 	intsw2				; non sauter au test suivant
    	call	intrb0				; oui, traiter interrupt RB0
    	bcf		INTCON,INTF			; effacer flag interupt RB0
    	goto	restorereg			; et fin d'interruption
    								; SUPPRIMER CETTE LIGNE POUR
    								; TRAITER PLUSIEURS INTERRUPT
    								; EN 1 SEULE FOIS
    
    intsw2
    	btfsc	INTCON,RBIE			; tester si interrupt RB4/7 autorisée
    	btfss	INTCON,RBIF			; oui, tester si interrupt RB4/7 en cours
    	goto 	intsw3				; non sauter
    	call	intrb4				; oui, traiter interrupt RB4/7
    	bcf		INTCON,RBIF			; effacer flag interupt RB4/7
    	goto	restorereg			; et fin d'interrupt
    								; SUPPRIMER CETTE LIGNE POUR
    								; TRAITER PLUSIEURS INTERRUPT
    								; EN 1 SEULE FOIS
    
    intsw3
    	BANK1						; passer banque1
    	btfsc	INTCON,EEIE			; tester si interrupt EEPROM autorisée
    	btfss	EECON1,EEIF			; oui,tester si interrupt EEPROM
    	goto 	restorereg			; non sauter
    	call	inteep				; traiter interruption eeprom
    	bcf		INTCON,EEIF			; effacer flag interrupt eeprom
    	goto	restorereg
    
    	
    					;restaurer registres
    					;-------------------
    restorereg
    	swapf	status_temp,w		; swap ancien status, résultat dans w
    	movwf   STATUS				; restaurer status
    	swapf   w_temp,f			; Inversion L et H de l'ancien W
                           			; sans modifier Z
    	swapf   w_temp,w  			; Réinversion de L et H dans W
    								; W restauré sans modifier status
    	retfie  					; return from interrupt
    
    ;**********************************************************************
    ;                     INTERRUPTION TIMER 0                            *
    ;**********************************************************************
    inttimer
    	decfsz	cmpt,f				; décrémenter compteur de passages
    	return						; pas 0, on ne fait rien
    	BANK0						; par précaution
    
    
    
    
    ; préparation à la mise en veille
    	clrf	PORTA				; Sorties portA à 0
    	clrf	PORTB				; sorties portB à 0
    								; pour éviter des consommations
    								; inutiles relatives au circuit
    	bsf	mode, SLP				; activation du mode SLEEP
    
    
    	return						; fin d'interruption timer
    
    ;**********************************************************************
    ;                     INTERRUPTION RB0/INT                            *
    ;**********************************************************************
    
    ;**********************************************************************
    ;                     INTERRUPTION RB4/RB7                            *
    ;**********************************************************************
    intrb4
    	movf PORTB,w				; indispensable pour pouvoir resetter RBIF
    
    ;***** mise à 1 de la ligne de transmission
    	bsf	PORTA, 1		; pour le TEST et pour le début de la transmission
    
    ;********************* pour les tests ************************
    ;	bsf LED						; allume la led sur RA3
    	BANK0						; par précaution
    	movlw	b'00001000'			; sélectionner bit à inverser
    	xorwf	PORTA , f			; inverser LED
    ;*************************************************************
    
    
    
    ;***** détection du quel bit activé sur le portB
    	btfss	PORTB, 7	; saute si RB7 = 1 <=> pas appuyé
    	goto	makerb7		; va faire ce qui corresponds à RB7
    
    
    	return
    
    
    
    
    ;***** Routines correspondantes à chaque interrupteurs différents
    ;***** 				pour l'appuie sur RB7
    makerb7
    	bsf	PORTB, 3		; allumer LED sur PORTB 3
    	movlw	CODERB7		; charger valeur du code correspondant à RB7
    	movwf	tramecode	; dans valeur à envoyer dans la trame
    	goto	trame		; va envoyer la trame
    
    
    
    
    ;***** Routine d'envoi de la trame de quatre octetsau format NRZ comme suit:
    ;*****	1 bit de start, 8 bits de données, (1bit de parité),1 bit de stop à 2400 bauds
    ;*****	1ier octet	: Entête	= 255
    ;*****	2nd octet	: Adresse de la carte concernée (RA2, RA3, RA4)
    ;*****	3ième octet	: Numéro de la pin du 16F84A concernée
    ;*****	4ième octet	: code proprement dir relatif à la touche appuyée
    trame
    	movlw	0xFF			; charge l'entête dans w
    	call	envoie			; et l'envoi au format NRZ
    	movf	adrcarte, w		; charge valeur de l'adresse de la carte concernée
    	call	envoie			; et l'envoi au format NRZ
    	movf	numpin, w		; charge valeur du numéro de la pin concernée
    	call	envoie			; et l'envoi au format NRZ
    	movf	tramecode, w	; charge code correspondant à envoyer
    	call	envoie			; et l'envoi au format NRZ
    
    
    ;*****	Routine d'envoie d'une trame au format NRZ sur la pin RA1 (pin 18)
    envoie
    	movwf	donnee		; sauvegarde de la donnée à envoyer dans (donnee)
    	call	temps_1bd	; attente de 1 bit et demi
    
    envoi_start_bit
    	bcf	RF				; envoi du start bit sur la pin RF (=0)
    	clrf	parite		; éffacer variable (parite) pour parité paire <=> (=0)
    	movlw	D'8'		; 8 bits à envoyer
    	movwf	nbrdonnee	; chargé dans (nbrdonnee)
    
    
    
    ;	call tempo1_2bit	; mise à 1 de la ligne de transmission pendant ~200 µs
    ;	call tempo1_2bit	; mise à 1 de la ligne de transmission pendant ~200 µs
    	
    ;envoi_bit0				; envoi  du bit0 à envoyer sur RF
    
    ;	rlf	donnee, f		; bitX de (donnee) dans la Carry
    ;	btfss	STATUS, C	; teste si Carry (bit0) = 1
    
    ;	bsf	RF				; non => envoi d'un 1 sur RF
    
    
    
    
    	return						; fin d'interruption RB4/RB7
    								; peut être remplacé par 
    								; retlw pour retour code d'erreur
    
    ;**********************************************************************
    ;		Temporisation nécessaires pour la transmission série		  *
    ;					asynchrone à 2400 bauds							  *
    ;**********************************************************************
    tempo1_2bit
    	movlw	D'64'				; 198 µs = 64 x 3µs + 6 µs
    	movwf	tempo				; dans variable (tempo)
    tempo1_2bit_loop
    	decfsz	tempo, f			; décrémente et saute si égal 0
    	goto	tempo1_2bit_loop	; boucler sinon
    	
    	return						; fin de temporisation de  198 µs
    
    
    
    
    ;**********************************************************************
    ;                     INTERRUPTION EEPROM                             *
    ;**********************************************************************
    
    ;*********************************************************************
    ;                       INITIALISATIONS                              *
    ;*********************************************************************
    
    init
    	clrf	PORTA				; Sorties portA à 0
    	clrf	PORTB				; sorties portB à 0
    	clrf	EEADR				; permet de diminuer la consommation
    
    	clrf	mode				; (mode) à 0
    
    	BANK1						; passer banque1
    	movlw	OPTIONVAL			; charger masque
    	movwf	OPTION_REG			; initialiser registre option
    	movlw	DIRPORTA			; charge masque de direction du PORTA
    	movwf	TRISA				; dans registre de direction
    	movlw	DIRPORTB			; charge masque de direction du PORTB
    	movwf	TRISB				; dans registre de direction
    
    					; Effacer RAM
    					; ------------
    	movlw	0x0c				; initialisation pointeur
    	movwf	FSR					; pointeur d'adressage indirect
    init1
    	clrf	INDF				; effacer ram
    	incf	FSR,f				; pointer sur suivant
    	btfss	FSR,6				; tester si fin zone atteinte (>=40)
    	goto	init1				; non, boucler
    	btfss	FSR,4				; tester si fin zone atteinte (>=50)
    	goto	init1				; non, boucler
    
    				; initialiser ports
    				; -----------------
    	bcf		LED					; passer LED en sortie
    	BANK0						; passer banque0
    
    	movlw	INTERMASK			; masque interruption
    	movwf	INTCON				; charger interrupt control
    
    				; initialisations variables
    				; -------------------------
    	movlw	TIMEBASE			; charger base de temps
    	movwf	cmpt				; initialiser compteur de passages
    
    	bsf		INTCON, GIE			; active les interruptions
    
    ;***** pour les tests
    ;	bsf	SLEEPLED
    
    ;*****
    
    ;	goto	start				; sauter programme principal
    	call	testsleep			; test si retour d'un sleep
    
    
    ;*********************************************************************
    ;                      PROGRAMME PRINCIPAL                           *
    ;*********************************************************************
    
    start
    	btfss	mode, SLP			; mise en veille activée?
    	goto start					; non, boucler
    
    	bcf	SLEEPLED				; éteindre LED témoin d'un retour de SLEEP
    	sleep						; mise en veille
    	bcf	mode, SLP				; RAZ du mode (plus en mode SLEEP)
    								; et va à l'interruption qui l'a réveillé
    
    	call	testsleep			; tester si retour d'un sleep
    
    	goto	start				; retour de l'interruption qui l'a réveillé
    								; pour retour au programme principal
    
    
    
    testsleep
    	btfss	STATUS, NOT_PD	; test si retour d'un sleep
    	bsf	SLEEPLED			; allumer LED témoin d'un retour de SLEEP
    	return
    
    
    
    
    
    
    
    
    	END				 			; directive fin de programme
    ....j'ai glissé chef!

  4. #4
    antek

    Re : PIC 16F84A et Tmr0

    Si j'ai compris tu attends qu'il ai été inactif pendant un certain temps pour le mettre en veille.
    Pourquoi attendre ?
    Vérifie combien de temps il met pour se réveiller (il faudra un temps d'appui minimum pour que le test RB4/7 soit correct)
    Pourquoi tu parles de NRZ ? Une I/O reviendra forcément à 0 et c'est pas une tension symétrique par rapport à 0.

  5. A voir en vidéo sur Futura

Discussions similaires

  1. cette serrure est elle realisé avec un 16f84A-04 ou 16f84A-10?
    Par invite93ed6d5d dans le forum Électronique
    Réponses: 24
    Dernier message: 23/07/2011, 17h34
  2. Tmr0 de pic 16f877
    Par invite062eba2b dans le forum Électronique
    Réponses: 3
    Dernier message: 25/05/2011, 16h13
  3. Tmr0
    Par invite062eba2b dans le forum Électronique
    Réponses: 0
    Dernier message: 23/05/2011, 02h57
  4. Précision TMR0
    Par invite02a9928f dans le forum Électronique
    Réponses: 10
    Dernier message: 25/10/2010, 02h24
  5. PIC 16F688 et TMR0
    Par inviteac602306 dans le forum Électronique
    Réponses: 26
    Dernier message: 05/07/2010, 14h26
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...