timer1 pic 16f876 qui bloque
Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

timer1 pic 16f876 qui bloque



  1. #1
    invitec34be199

    timer1 pic 16f876 qui bloque


    ------

    bonjour,
    je suis en train de développer une carte pour commander l’éclairage à diode de mon aquarium.
    rapidement, je commande le tous par un pic 16f876 cadencé par un quart de 20Mhz.
    Le montage comprend un écran lcd 4*16 caractères, de 4 boutons poussoirs et des 2 sorties PWM.

    J'utilise le timer1 pour calculer ma seconde, les 4 boutons me servent à régler mon heure et ma minute (1 incrément heure, 1 décrément heure, 1 incrément minute, 1 décrément minute)
    Les sorties PWM vont me servir à piloter mes drivers à led qui comportent une entrée PWM.
    L'ecran va me servir à afficher l'heure courante, et plutard d'autre information (tel que la température de l'eau).

    Il y a un événement que je ne comprend pas, quand le pic compte tous va bien ma minute défile. Par contre du moment que je touche au BP de réglage 1 coup sur 3 le timer1 s’arrête et il ne compte plus.
    Le seul moyen que j'ai pour le redémarrer c'est de faire un reset.
    Par contre les sorties PWM elle continue à fonctionner, la gestion de l'ecran fonctionne toujours car quand je touche au BP je voie l'heure se mettre à jour.

    Je programme via MIKRObasic V6.0.0.
    Y as t'il une raison particulière a ce blocage du timer1?
    merci pour votre aides


    voila mon code (il est simple):

    program Test

    dim counter as word
    dim seconde1,minute1,heure1,calmin t as string[3]
    dim seconde,minute,heure, calmin,calmin1 as byte


    ' Lcd module connections
    dim LCD_RS as sbit at RB4_bit
    LCD_EN as sbit at RB5_bit
    LCD_D4 as sbit at RB0_bit
    LCD_D5 as sbit at RB1_bit
    LCD_D6 as sbit at RB2_bit
    LCD_D7 as sbit at RB3_bit

    LCD_RS_Direction as sbit at TRISB4_bit
    LCD_EN_Direction as sbit at TRISB5_bit
    LCD_D4_Direction as sbit at TRISB0_bit
    LCD_D5_Direction as sbit at TRISB1_bit
    LCD_D6_Direction as sbit at TRISB2_bit
    LCD_D7_Direction as sbit at TRISB3_bit



    sub procedure Interrupt()
    Inc(counter) ' Increment value of counter on every interrupt
    PIR1.TMR1IF = 0 ' clear TMR1IF
    TMR1H = 0x0B
    TMR1L = 0xDB
    end sub

    main:
    PORTB = 0x00 ' Initialize PORTB
    TRISB = 0xC0 ' PORTB is output
    PORTC = 0x00 ' Initialize PORTA
    TRISC = 0xFF ' PORTA is input
    T1CON = 0x31 ' Timer1 settings
    PIR1.TMR1IF = 0 ' clear TMR1IF
    TMR1H = 0x0B
    TMR1L = 0xDB
    PIE1.TMR1IE = 1 ' enable Timer1 interrupt

    counter = 0 ' initialize counter
    INTCON = 0xC0 ' Set GIE, PEIE

    LCD_Init()
    LCD_Cmd(_LCD_CLEAR)
    LCD_Cmd(_LCD_CURSOR_OFF)
    seconde=0
    minute=0
    heure=0

    PWM1_Init(5000)
    PWM1_Set_Duty(0)
    PWM1_Start()

    PWM2_Init(5000)
    PWM2_Set_Duty(0)
    PWM2_Start()

    while TRUE
    if (counter = 1) then ' if counter is 10 pour 1s
    inc(seconde)
    counter = 0 ' reset counter
    end if

    if (seconde=60) then
    inc(minute)
    seconde=0
    end if

    if (minute=60) then
    inc(heure)
    minute=0
    end if

    if (minute>60) then
    minute=59
    end if

    if (heure=24) then
    heure=0
    end if

    if (heure>24) then
    heure=23
    end if

    if Button(PORTC, 6, 10, 1) then
    inc(minute)
    end if

    if Button(PORTC, 7, 10, 1) then
    dec(minute)
    end if

    if Button(PORTB, 6, 10, 1) then
    inc(heure)
    end if

    if Button(PORTB, 7, 10, 1) then
    dec(heure)
    end if



    ByteToStr(seconde,seconde1)
    ByteToStr(minute,minute1)
    ByteToStr(heure,heure1)
    LCD_Out(2,9,seconde1)
    LCD_Out(2,8,":")
    LCD_Out(2,5,minute1)
    LCD_Out(2,4,":")
    LCD_Out(2,1,heure1)

    if (heure=8) then
    if (minute<31) then
    PWM1_Set_Duty(minute*8)
    end if
    if (minute>30) then
    PWM1_Set_Duty(255)
    end if
    end if

    if (heure=19) then
    if (minute<31) then
    calmin = minute*8
    calmin1 = 255-calmin
    PWM1_Set_Duty(calmin1)
    end if
    if (minute>30) then
    PWM1_Set_Duty(0)
    end if
    end if

    wend
    end.

    -----

  2. #2
    invitee05a3fcc

    Re : timer1 pic 16f876 qui bloque

    J'y connais rien en PIC .....
    Mais je ne vois pas d'anti-rebond sur la gestion des boutons ni de test de relachement
    C'est quoi ton schéma hard ?
    PS : utilise les balises de code !
    Code:
    if Button(PORTC, 6, 10, 1) then
        inc(minute)
    end if
    
    if Button(PORTC, 7, 10, 1) then
        dec(minute)
    end if

  3. #3
    invitec34be199

    Re : timer1 pic 16f876 qui bloque

    sorry j'ai oublié pour le code.

    oui l'anti rebond y est.
    il est inclu dans le bout de code suivant:
    Button(PORTC, 6, 10, 1):
    en traduit il contrôle le PORTC6 qu'il passe au niveau logique 1 avec une tempo de 10ms à la détection.

    bizarrement au début j'ai mis la tempo a 100ms et dés que je touche les boutons le timer plante.
    je viens de modifier la tempo, je l'ai passé à 40ms et plus de problème de blocage.
    je ne comprend pas pourquoi......

  4. #4
    invitef86a6203

    Re : timer1 pic 16f876 qui bloque

    C'est plus mieux (much better) comme ça ;

    Code:
    if (counter <> 0 ) then ' if counter is 10 pour 1s
       inc(seconde)
       counter = 0 ' reset counter
    end if

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

    Re : timer1 pic 16f876 qui bloque

    Salut,

    Y'a ces bouts de code qui me chiffonnent aussi :

    Code:
    if (minute>60) then
    minute=59
    end if
    
    ...
    
    if (heure>24) then
    heure=23
    end if

  7. #6
    invitec34be199

    Re : timer1 pic 16f876 qui bloque

    Citation Envoyé par freepicbasic Voir le message
    C'est plus mieux (much better) comme ça ;

    Code:
    if (counter <> 0 ) then ' if counter is 10 pour 1s
       inc(seconde)
       counter = 0 ' reset counter
    end if

    salut
    je ne comprend pas ta remarque, pour que j'arrive à 1 seconde il faut que conter soit egale à 10, pourquoi alors tu me fait incrémenter ma seconde quand je suis différents de 0?


    Citation Envoyé par gabuzo Voir le message
    Salut,

    Y'a ces bouts de code qui me chiffonnent aussi :

    Code:
    if (minute>60) then
    minute=59
    end if
    
    ...
    
    if (heure>24) then
    heure=23
    end if
    alors ce bout de code me sert quand je fait le reglage manuel de l'heure et de la minute, et plus particulierement quand je décrémente mes valeurs afin de passer, par exemple, de 0 à 23 pour l'heure quand je décrémente ou de 0 à 59 pour la minute.

  8. #7
    Montd'est

    Re : timer1 pic 16f876 qui bloque

    Perso j'ai eu des problèmes avec de genre de truc " Button(PORTC, 6, 10, 1): " sur Mikropascal.

    Ca génère une sorte de pose si j'ai bien compris, comme la fonction delay et ça fait chi...

    Bref quand j'utilise des BP je fais toujours l'anti rebond moi même:

    compt:byte;

    If port ((C.6 = 1) and (compt < 20)) then begin inc (compt); end;
    if port C.6 = 0 then begin compt:=0; end;
    if compt = 20 then begin actions..... end;


    désolé je ne sais pas écrire ça en basic ou autre...

  9. #8
    invite5637435c

    Re : timer1 pic 16f876 qui bloque

    Bonjour, la fonction qui gère l'anti rebond fait appel au timer1, une fois celle-ci utilisée ton timer1 est stoppé automatiquement par la fonction, donc plus d'interruption possible. Il faut donc soit te passer de la fonction toute faite du compilo qui gère tes boutons, soit relancer ton timer1 "à la main" juste après l'usage de la fonction, avec une perte de précision minime qui n'est sans doute pas préjudiciable dans ton appli.

  10. #9
    invitefa96bd8f

    Re : timer1 pic 16f876 qui bloque

    et voila pourquoi je déteste utiliser toutes ces bibliothèques...
    On ne sait jamais ce qui se passe exactement dedans, à moins de s'amuser à les décortiquer.

  11. #10
    invitec34be199

    Re : timer1 pic 16f876 qui bloque

    salut,
    ha ok ok ca utilise carement la timer 1 fait chier, je comprend mieux maintenant . bon alors ma solution de facilité est de faire l’anti-rebond avec un condensateur en parallèle de ma résistance comme ca plus de problème de timer. a mins que je m'amuse à gerer ca en logiciel comme l'exemple de Montd'est (t'inquit meme si c'est du pascal j'ai comprit ton code, mon choix du basic est partie dessus car c'est celui que je préfère)


    Citation Envoyé par HULK28 Voir le message
    Bonjour, la fonction qui gère l'anti rebond fait appel au timer1, une fois celle-ci utilisée ton timer1 est stoppé automatiquement par la fonction, donc plus d'interruption possible. Il faut donc soit te passer de la fonction toute faite du compilo qui gère tes boutons, soit relancer ton timer1 "à la main" juste après l'usage de la fonction, avec une perte de précision minime qui n'est sans doute pas préjudiciable dans ton appli.
    merci pour vos conseil.

  12. #11
    invitec34be199

    Re : timer1 pic 16f876 qui bloque

    j'ai tésté ton code vraiment sympa et puis c'est expéditif au moins pas de fioriture.

    Citation Envoyé par Montd'est Voir le message
    Perso j'ai eu des problèmes avec de genre de truc " Button(PORTC, 6, 10, 1): " sur Mikropascal.

    Ca génère une sorte de pose si j'ai bien compris, comme la fonction delay et ça fait chi...

    Bref quand j'utilise des BP je fais toujours l'anti rebond moi même:

    compt:byte;

    If port ((C.6 = 1) and (compt < 20)) then begin inc (compt); end;
    if port C.6 = 0 then begin compt:=0; end;
    if compt = 20 then begin actions..... end;


    désolé je ne sais pas écrire ça en basic ou autre...

  13. #12
    Montd'est

    Re : timer1 pic 16f876 qui bloque

    Cool par contre attention, plus il y a d'instructions plus le temps d'appui nécessaire augmente évidemment...

    Et il peut en plus varier selon qu'on appelle des sous programmes ou non à partir de la boucle principale.

  14. #13
    invitefa96bd8f

    Re : timer1 pic 16f876 qui bloque

    Le mieux est d'utiliser un timer qui va générer un interrupt régulièrement.
    Dans l'interrupt tu peux ainsi surveiller TOUS les boutons, et faire un peu comme Montd'est propose en #7

  15. #14
    invitec34be199

    Re : timer1 pic 16f876 qui bloque

    Citation Envoyé par terriblement Voir le message
    Le mieux est d'utiliser un timer qui va générer un interrupt régulièrement.
    Dans l'interrupt tu peux ainsi surveiller TOUS les boutons, et faire un peu comme Montd'est propose en #7
    J'ai suivis le conseille de Montd'est et j'ai utilisé son code (transposé en basic bien evidement).

    Pour la durée de l'appui bein je suis allé à petit pas et j'ai paramétré avec tous mon code au cul et j'ai trouvé mon bon compromis.

    Code:
        if (portb.6=1) and (comptpb6<20) then
           inc(comptpb6)
        end if
        if (portb.6=0)then
            comptpb6=0
        end if
        if (comptpb6=3) then
           manu_on = not manu_on
        end if
    bon il va faloir que je teste maintenant avec ma carte afin de voir si les condo mis en parallele de la resistance ne vas pas me foutre le bordele.

Discussions similaires

  1. timer1
    Par invite6737e865 dans le forum Électronique
    Réponses: 0
    Dernier message: 31/05/2012, 14h49
  2. Timer1 programmation en c18
    Par inviteb2b48352 dans le forum Électronique
    Réponses: 3
    Dernier message: 30/04/2010, 11h31
  3. Timer1
    Par invite91183f95 dans le forum Électronique
    Réponses: 2
    Dernier message: 26/04/2007, 16h10
  4. Probleme avec Timer1 sur 16F876
    Par invited72fbbcc dans le forum Électronique
    Réponses: 4
    Dernier message: 27/12/2006, 16h02
  5. PB de timer1 sur pic
    Par invitebf62768c dans le forum Électronique
    Réponses: 3
    Dernier message: 01/03/2004, 14h11
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...