Temporisation 250ms avec un PIC18F4520
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

Temporisation 250ms avec un PIC18F4520



  1. #1
    mohamine1989

    Post Temporisation 250ms avec un PIC18F4520


    ------

    Slt, je suis nouveau sur ce forum
    Je veut obtenir une temporisation de 250 ms avec un PIC18F4520 cadencé a 20MHZ, j'ai tenté :
    Code:
    tempo250ms	movlw h'07'               
    			movwf t1
    comp1		dcfsnz t1
    			return
    			movlw h'10'
    			movwf t2
    comp2		dcfsnz t2
    			goto comp1
    			goto comp2
    avec ça, j'ai réussi a obtenir 499 cycles
    Code:
    2 * (n - 1) + (n - 1) * (2 + 3 * (m - 1) + 2 * m + 1) + 5 (nb cycles)
    , soit 249.5 ms avec la paire (n ,m) = (7, 16) en prenant en compte call tempo250ms (2cycles)
    Je voudrai savoir quel est la formule avec le code correspondant en assembleur qui permet d'obtenir une temporisation d'exactement 250 ms ou autre
    Avec mes remerciements d'avance, et mon respect le plus profond
    Amicalement, Mohamed Amine

    -----

  2. #2
    DAUDET78

    Re : Temporisation 250ms avec un PIC18F4520

    Bonjour mohamine1989 et bienvenue sur FUTURA
    Citation Envoyé par mohamine1989 Voir le message
    Je voudrai savoir quel est la formule avec le code correspondant en assembleur qui permet d'obtenir une temporisation d'exactement 250 ms ou autre
    Je n'y connais rien en PIC .....
    Mais ce que tu fais est une temporisation soft et ce n'est pas génial :
    - Ton µC ne fait rien d'autre pendant qu'il temporise (gestion de bouton ou de LED par exemple)
    - Si une interruption hardware se présente (arrivé d'un octet sur l'UART de réception par exemple), le temps de traitement de cette interruption se rajoute à la durée de la temporisation

    Donc la bonne solution, traiter la temporisation en interruption en utilisant un Timer que tu as certainement dans ton µC . Evidemment, c'est un peu plus compliqué à gérer et surtout à écrire le programme !
    J'aime pas le Grec

  3. #3
    Gérard

    Re : Temporisation 250ms avec un PIC18F4520

    Regarde les cours de Bigonoff.

  4. #4
    Biname

    Re : Temporisation 250ms avec un PIC18F4520

    Des sites crées le code pour toi

    Exemple : http://www.piclist.com/techref/picli...egen/delay.htm


    Code:
    ; Delay = 0.25 seconds
    ; Clock frequency = 20 MHz
    
    ; Actual delay = 0.25 seconds = 1250000 cycles
    ; Error = 0 %
    
    	cblock
    	d1
    	d2
    	d3
    	endc
    
    Wait250ms
    			;1249995 cycles
    	movlw	0x8A
    	movwf	d1
    	movlw	0xBA
    	movwf	d2
    	movlw	0x03
    	movwf	d3
    Wait250ms_0
    	decfsz	d1, f
    	goto	$+2
    	decfsz	d2, f
    	goto	$+2
    	decfsz	d3, f
    	goto	Wait250ms_0
    
    			;1 cycle
    	nop
    
    			;4 cycles (including call)
    	return

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

    Re : Temporisation 250ms avec un PIC18F4520

    Bonjour,

    Tu peux même télécharger picdel.exe http://www.4shared.com/file/W414bg_C/PICDEL.htmlqui te créera tous les délais que tu veux.
    Cependant comme dit Daudet78, 1/4s c'est très long, avec un timer, il suffit de le faire "tourner" autant de fois que nécessaire.

  7. #6
    mohamine1989

    Re : Temporisation 250ms avec un PIC18F4520

    Merci infiniment a tous ceux qui m'ont aidé, je vais voir du coté de Bigonoff, il y a pas mal de choses sur les PIC dans ses cours, rares sont les cours qui traite ce genre sujet
    Encore une fois, mille et un merci
    Amicalement, Mohamed Amine

  8. #7
    mohamine1989

    Re : Temporisation 250ms avec un PIC18F4520

    Problème résolu, il y a ce lien qui m'a mis a cote http://asm.developpez.com/faq/?page=fg#fg_howlong
    Sur d'autres forum, il y a le bouton résolu, mais ici, j'arrive pas a le retrouver
    En tous cas, merci beaucoup pour votre aide, vous êtes vraiment très gentils.
    Amicalement Mohamed Amine

  9. #8
    Nicocloud

    Re : Temporisation 250ms avec un PIC18F4520

    Tiens, je pense qu'il y a tout et en plus c'est pour un PIC18F4520, faut juste refaire les calculs pour le préchargement pour avoir 250ms.
    Bon courage xD

    Code:
    // en utilisant le timer1 avec l'oscillateur 32.768kHz
    // La led RB2 clignote chaque seconde pour montrer le passage dans l'IT
    // La led RB1 s'allumme 5 secondes après l'appui sur le bouton RB0
    // de la carte picdem2+
    // Sans rechargement Toverflow = 2^16 . Tosc = 2^16 . (1/32768) = 2s
    // En préchargeant le compteur à 32768 Toverflow = (2^16 - 32768)/32768 = 1s 
    // Le même principe peut être utilisé avec les autres timers
    // avec d'autres base de temps (osc du pic ,  osc externe, prescaler ,...) 
    // ici les it sont utilisées dans le mode pic18 
    // avec priorité (RCONbits.IPEN = 1 )
    // L'autorisation se fait par les bits GIE et PEIE de INTCON.
    
    #include <p18cxxx.h> 
    #include <timers.h>   // pour fonctions timers
    
    // configuration PICDEM2+ quartz
    #pragma config OSC = HS
    #pragma config WDT = OFF
    #pragma config LVP = OFF
    #pragma config PBADEN = OFF
    
    #define Button0 PORTBbits.RB0
    #define Led1 PORTBbits.RB1
    #define Led2   PORTBbits.RB2
    
    
    
    //prototypes des gestionnaires d'interruption
    void InterruptHandlerHigh (void);
    
    unsigned int cpt ;
    
    void main(void){
    unsigned char state=0 ;
    Led1= 0 ;
    Led2 = 0 ;
    TRISBbits.TRISB1=0;
    TRISBbits.TRISB2=0;
    OpenTimer1(TIMER_INT_ON   &
               T1_16BIT_RW    &
               T1_SOURCE_EXT  &
               T1_PS_1_1      &
               T1_OSC1EN_ON   &  
               T1_SYNC_EXT_ON    );
    WriteTimer1(32768); // Préchargement
    IPR1bits.TMR1IP=1;           // T1 haute priorité
    
    RCONbits.IPEN = 1;
    INTCONbits.GIEH = 1 ; // autorisation high
    
    for( ;; )
    {
       switch (state) {
        case 0 : Led1 = 0 ;
                 if ( Button0 == 0 ) {
                 state = 1 ; }
                 break ;
        case 1 : cpt = 5 ;
                 state=2;
                 break ; 
        case 2 : if ( cpt == 0 ) {  
                 state = 3 ; }
                 break ;
        case 3 :
                Led1 = 1 ;
                if(Button0 == 0 ) {
                state = 0 ;   
                }
                break ;                    
       }
     // la boucle n'est jamais bloquée !!
    }
    }
    
    //Placement d'un saut vers le gestionnaire d'interruption
    //----------------------------------------------------------------------------
    // High priority interrupt vector
    #pragma code InterruptVectorHigh = 0x08
    void InterruptVectorHigh (void)
    {
      _asm
        goto InterruptHandlerHigh //jump to interrupt routine
      _endasm
    }
    
    // Routine gestionnaire d'interruption
    //----------------------------------------------------------------------------
    // High priority interrupt routine
    #pragma code
    #pragma interrupt InterruptHandlerHigh
    void InterruptHandlerHigh (void){
     
       if(PIR1bits.TMR1IF ){   // On passe ici chaque seconde
              PIR1bits.TMR1IF = 0 ;
              Led2 = !Led2 ;
              WriteTimer1(32768); // Préchargement
              if(cpt>=0) { cpt--; }
        }
     // Placer ici les autres parties
     // if(Autre bit F)
      // {
      //   Raz du bit F ;
      //   Traitement ;
      // }
    }

Discussions similaires

  1. Problème de compilation avec MCC18 pour un pic18F4520
    Par Mickl1722 dans le forum Électronique
    Réponses: 1
    Dernier message: 05/06/2010, 09h20
  2. temporisation avec NE555
    Par phil3434 dans le forum Électronique
    Réponses: 5
    Dernier message: 10/11/2009, 18h50
  3. Temporisation avec un CD4536
    Par invite5da7755c dans le forum Électronique
    Réponses: 0
    Dernier message: 01/07/2008, 19h35
  4. Réponses: 18
    Dernier message: 03/06/2008, 13h10
  5. Temporisation avec un NE 555
    Par invitec21bfff3 dans le forum Électronique
    Réponses: 6
    Dernier message: 27/09/2007, 22h58
Découvrez nos comparatifs produits sur l'informatique et les technologies.