Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur l'Assembleur !

Modérateur : mazertoc

Aide pour générer une temporisation
Jul09
Membre
Membre
Messages : 3
Enregistré en : décembre 2018

#1 Message par Jul09 » mar. 4 déc. 2018 11:57

Bonjour , alors je suis un débutant en ce qui concerne la programmation des pic et j'ai rencontré le probléme ci dessous :
Programme permettant de générer une temporisation de 100ųs en utilisant le timer0 du 16f84A , sachant que fosc=8MHz.
Et merci pour votre aides

Aide pour générer une temporisation
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#2 Message par JMarc » mar. 4 déc. 2018 17:55

Bonjour Jul09, bien venu a toi

Je ne comprend pas ta question car tu n'as pas mis le programme en question pour vérifier ton timer0 :cry:

Aide pour générer une temporisation
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » mar. 4 déc. 2018 19:06

Bonjour Jul09 ,

Tu programme donc en ASM si ton post est ici ?

Tu as des tutoriels concernant les timers par exemple ici :http://www.fantaspic.fr/viewtopic.php?f=15&t=47
As toi de nous montrer ou tu coince exactement et le travaille que tu as fait ! car tu question ressemble à un exercice scolaire !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Aide pour générer une temporisation
Temps-x
Avatar de l’utilisateur
Expert
Expert
Messages : 2595
Enregistré en : juillet 2016
Localisation : Terre

#4 Message par Temps-x » mer. 5 déc. 2018 01:48

Bonsoir Jul09, et tout le forum,

Soit le bienvenue sur le forum, et j'espère que tu y passeras des bons moment comme nous,

Jul09 a écrit :Source du message j'ai rencontré le probléme ci dessous :


As tu fais un début de programme :?:

Pour un Quartz de 8Mhz et sans prédiviseur, le timer0 génère une interruption tous les 128 µs, mais il traite 256 cycle.

Si tu veux un temps de 100 µs Il faudra incrémenter ton timer0 pour chaque débordement de 56

Ce qui donne :

Code : Tout sélectionner

;**************************** déclaration du processeur utilisé *******************************

    Errorlevel-302               ; Supprime le message "Ensure that bank bits are correct" 

    LIST      p
=16F84A            
    
#include <p16F84a.inc>        

;***************** selection, code protection, timer reset, watch-dog, oscillateur ************  

    __CONFIG   _CP_OFF 
& _WDT_OFF & _PWRTE_ON & _HS_OSC
    

 CBLOCK 0x0C
    status_temp   
:1
    w_temp        
:1
    pclath_temp   
:1
  ENDC


    org H
'00'
         goto debut      

;*************************** control si interruption à eu lieu ********************************
   org  H'04'  

      movwf w_temp              
      swapf STATUS
,W            
      movwf status_temp                                                            

      BANKSEL INTCON                      
; on passe en bank 0

      btfss INTCON
,T0IE                   ; tester si interruption autorisée sur le débordement du timer0 
      goto restorereg                     
; non  
      btfsc INTCON
,T0IF                   ; tester si interrupt timer0 est en cours
      goto debordement                    
; oui, traiter interruption sur timer0

      goto restorereg                     
; non  

;********************************** débordement du timer0 ************************************* 
debordement
      bcf INTCON
,T0IE                     ; arrêt du timer0       

      movf D
'56',W                        ; réglage à affiner pour avoir 100 µs précis
      movwf TMR0                              
      
      bsf INTCON
,T0IE                     ; mise en route du débordement
      goto restorereg                     
;  

;********************************************************************************************** 
restorereg         

      btfsc INTCON
,T0IF                   ; si le bit T0IF est à 1 on va à la ligne 1
      bcf INTCON
,T0IF                     ; effacer flag interupttion du timer0 causé par le débordement
                
      swapf status_temp
,w        
      movwf STATUS                
      swapf w_temp
,f            
      swapf w_temp
,w              
      retfie                          

debut

;************************ configuration du registre OPTION_REG en bank 1 **********************                                     

      BANKSEL OPTION_REG                  
; on passe en bank 1
      
      movlw B
'00000000'                   ; 
      movwf OPTION_REG                    
; timer0 réglé sur 256 cycles                                         

                                          
; b7 = Résitance en service                              
                                          
; b6 = Si modification sur RB0 dans le front descendant   
                                          
; b5 = Timer incrémente à chaque instruction désactivé
                                          
; b4 = Timer module sur les fronts montants de RA4/T0CKI désactivé
                                          
; b3 = Le prescaler fonctionne sur le Timer                
                                          
; b2 = Taux de division à 0 sur PS2
                                          
; b1 = Taux de division à 0 sur PS1
                                          
; b0 = Taux de division à 0 sur PS0
    
;********************** configuration du registre INTCON en bank 0,**************************

      movlw B'01000000'                   ; 
      movwf INTCON                        
; on initialise INTCON
                                          
;
                                          ; b7 = Arrêt des interruption désactivé                                           
                                          
; b6 = Autorisation générale périphériques                         
                                          
; b5 = Débordement sur timer0 désactiver
                                          
; b4 = Autorise interruption si modification de l'entrée RB0/INT  
                                          ; b3 = Autorise interruption si modification de l'
entrée RB4/RB7 désactivé 
                                          
; b2 = Flag d'interruption tmr0
                                          ; b1 = Flag  d'
interruption RB0/Int
                                          
; b0 = Flag interruption RB4/RB7
                                                      
;************************ configuration du registre TRISA en bank 1  **************************
                                                     
      BANKSEL TRISA                       
; on passe en bank 1

      movlw B
'00000000'                   ; configure les pattes pour des sorties dans TRISA
      movwf TRISA                         
; 17(RA0),18(RA1),1(RA2),2(RA3),3(RA4)
                                                                   

      movlw B
'11111111'                   ; configure les pattes pour des entrées dans TRISB
      movwf TRISB                         
; 6(RB0),7(RB1),8(RB2),9(RB3),10(RB4),11(RB5),12(RB6),13(RB7)                                                                                                            


;**********************************************************************************************
                                          ; alimmentation sous 5 volts patte 5 mettre au moins 
                                          
; patte 14 mettre au plus

;**********************************************************************************************

      BANKSEL PORTA                       ; on passe en bank 0

      clrf    PORTA                       
; PORTA à 0          
      clrf    PORTB                       
; PORTB à 0
 
      bsf INTCON
,GIE                      ; autorisation de toutes les interuption 

;********************************************************************************************** 

do_loop
      nop                                 
; voilà toutes les 100 µs devait se produire une interruption
  
      goto do_loop  


    End  



J'espère ne pas avoir fait d'erreur, normalement ça doit fonctionner, pour avoir plus de précision tu peux changer la
valeur du Timer0 :wink:


==> A+
:roll: Les requins, c'est comme le langage ASM, c'est le sommet de la chaîne alimentaire. :wink:

Aide pour générer une temporisation
Jul09
Membre
Membre
Messages : 3
Enregistré en : décembre 2018

#5 Message par Jul09 » ven. 7 déc. 2018 10:17

merci beaucoup


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Roger et 40 invités