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

utiliser le timer
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#1 Message par JMarc » jeu. 10 nov. 2016 10:22

Bonjour a tous et a toutes


Le problème, pour que mon programme attende un évènement, j'utilise une boucle pour lui faire perdre du temps du style call tem20ms. mais du coup mon pic ne fait plus rien a part attendre la fin de la tempo (comme moi il ne fait qu'une chose a la fois :lol: )
Pour le rafraichissement des afficheurs, j'ai compris le processus avec le timer et les interruptions car j'ai une interruption régulière toute les x milli secondes

dans mon cas, je voudrais remplacer un call tem20ms par l'utilisation du timer0 ou timer1
J'ai regardé les posts sur le timer mais je ne comprend rien :cry:

Svp, un indice :sifflotte:

Merci

Code : Tout sélectionner

Tem20ms       
   clrf i
   movlw .20
   movwf    j
   
goto Tem0
   
Tem2ms   
   CLRF   i
   MOVLW   TEMPO
   MOVWF   j         
;charge variable boucle principale
   
Tem0   DECFSZ   i         
;test si boucle secondaire =0
   
GOTO   Tem0         ;NON retoure dans boucle secondaire
   DECFSZ   j         
;test si boucle principale =0
   
GOTO   Tem0         ;NON recharge boucle secondaire
   
RETURN            ;oui fin de la tempo

utiliser le timer
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#2 Message par Guest » jeu. 10 nov. 2016 10:41

alors l'indice il suffit de placer la macro de l'affichage dans int

comme cela tu ne gères plus l'affichage l'int sera periodique et donc ton affichage aussi

AMHA la 2mS est très bien :sifflotte:

PS il va y avoir un problème de timer mais je te laisse chercher

utiliser le timer
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#3 Message par Guest » jeu. 10 nov. 2016 10:56

mais bon si tu veux remplacer la tempo 2ms par un timer pour quoi pas

je me pose la question. Tu sais faire les calculs pour les timers c'est peut-être cela la question ?? :sifflotte:

utiliser le timer
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#4 Message par JMarc » jeu. 10 nov. 2016 22:21

JMarc a écrit :Pour le rafraichissement des afficheurs, j'ai compris le processus avec le timer et les interruptions car j'ai une interruption régulière toute les x milli secondes


Je rectifie, j'avais rien compris. je m'aperçois que le timer n'y était pour rien dans le rafraichissement des afficheurs, c'est la boucle tem2ms qui fait perdre du temps. le timer sert uniquement a alimenter un compteur pour les secondes.

Donc si je met la macro de l'affichage a l'intérieur du timer, tous les afficheurs seront allumés et éteint simultanément en non individuellement :cry:

je ne sais pas faire le calcul du timer non plus. bigonoff en parle dans sa doc, je vais regarder

utiliser le timer
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#5 Message par Guest » ven. 11 nov. 2016 11:05

Un petit topo sur timer(rien sur les INT)

Les Timers (ICI 16F) sont des COMPTEURS qui sont INCRÉMENTES au même rythme que le pointeur instruction(cycle machine) une instruction NOP = le pointeur instruction suivant "+1" en 1 cycles ,le timer une incrémentation, un GOTO 3 cycles ,3 incrémentations du timer , et comme la fréquence du pointeur instruction (Fcy) et de : Fosc/4 (fréquence de votre quartz par exemple 4Mhz/4 ) la Fcy est donc de 1Mhz ou 1000000 Fcy ou 1µs

Tres bien nous avons donc notre compteur qui augmente, tout seul au rythme de 1µs, voir +. Un compteur part de la valeur zéro pour aller à ... et bien suivant le type du timer, vous avez :
le timer0 -> 8bits de 0 -> 255 -> 0 etc...
le timer1 -> 16bits de 0 -> 65535 -> 0 etc..
le timer2 -> 8bits de 0 -> 255 > 0 etc...

On part sur le Timer0, le 2 est spécial,et le 1 un peu trop gros. Bien oui au plus simple. :wink:
Alors donc notre compteur(0), tourne au rythme de nos instructions quand il arrive au passage de 255(0XFF) à 0 une int est déclenché, après on gère cette int suivant les besoins.

Notre timer0 déclenche tout les 256 Fcy une INT ou 256 µs à 4Mhz .OUI mais la c'est pas beaucoup 256 µs, exact alors comme faire , on sait faire des compteurs, mais aussi des diviseurs, les plus simples, sont des multiples du plus simple, le diviseur par 2 (deux fronts(Montant ou descendant) pour changer la sortie). Ces diviseurs, on peut les mettre, avant compteur (pre diviseur ) après compteur (post diviseur) donc on à pour le trimer0:
Un pré de 2,4,8,16,32,64,256 ,voir registre OPTION_REG pour sa sélection.

On peut charger et recharger le timer0, son registre est en lecture/écriture, un exemple simple,(sans diviseur):
si on charge et recharge le compteur d'une valeur 56, il reste 200 Fcy avant int donc une int toute les 200 µs. Il faut seulement, suivant nos besoins ,charger régulièrement le timer0, d'une valeur donc la formule est :

TMR0=((256)-(((Fosc/4000000 )*temps désire)/diviseur)
exemple je veux 1mS soit 1000µs
avec diviseur 4

TMR0=(256-(((4000000/400000)*10000)/4)
TMR0=.256-((.......(.1.)...........…...*.10000)/4)
TMR0=256 -250
TMR0 =6.
6 est la valeur à charger et recharger dans le registre TRM0.

une int toute les: de 6 à 256=250 * 4 du diviseur =1000µs.
ATTENTION a ne passer les 256 dans le calcul de (((Fosc/4000000 )*temps désire)/diviseur) et 256-257=-1 marche pas donc jouer avec le diviseur et la aussi il y à une limite .

A+

PS comme dab un peu trop long oops

si question comme dab pas de problème et bien sur je revendique le droit a l'erreur, cela aussi comme dab

heu 3 dab j'ai gagné :lol:

utiliser le timer
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#6 Message par Guest » ven. 11 nov. 2016 19:34

Suite question ici viewtopic.php?f=11&p=4505#p4505
Alors pourquoi le timer1 plutôt que le timer0

Le timer1 nous donne une int toutes les 100 mS .c'est le seul sous 16F a allez aussi loin voir plus ,car c'est un 16bits. le tmer0 va au max à 256*256( 256 pour le 8bits et 256 pour le diviseur)655356 soit 6,5ms, il faudrait faire 15 int pour arriver au même résultat que le timer1. (info sur les 18F touts les timer sont de 16bits avec possibilité de passer sous 8 bits pour faire tourner programme 16F).
Toutes c'est info sont pour du 4Mhz

Alors oui le trimer0 sert a l"affichage.
Pour la gestion des int, c'est simple un test sur les flags ,tu as déjà celui du timer1, pour le trimer0 c'est

Code : Tout sélectionner

BTFSS INTCON,T0IF
suivant ce test, si c'est timer1 tu traites INCF Temp,F .Si c'est timer0 tu traites l'affichage.

A+

utiliser le timer
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#7 Message par JMarc » sam. 12 nov. 2016 21:38

+1 Merci !

Voilà, afficheur fonctionnant avec tmr0, ps2=0, ps1 et ps0 =1 soit division par 16 si j'ai tout compris. 256 cycles x 16 soit 4,096 milli seconde avec mon Quartz de 4mhz.
Ça toune bien sur la platine

Merci !

utiliser le timer
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#8 Message par Guest » dim. 13 nov. 2016 19:09

OUIiiiiiiiiiiiiiiiiiiiii c'est bien, attention quand même de rafraîchir assez souvent ici c'est du 1mS largement le temps de faire la gestion clavier

utiliser le timer
JMarc
Confirmé
Confirmé
Messages : 605
Enregistré en : août 2016
Localisation : Dans le Sud...

#9 Message par JMarc » lun. 14 nov. 2016 20:24

Pour la partie réglage, j'arrête le timer ainsi, est-ce correct ?

Code : Tout sélectionner

Traitementboutonvalid
    call        Tem2ms
   btfsc    BOUTONVALID        
test si RB2 +5 volt si non sauté l'instruction suivante
   goto        Traitementboutonvalid    ; boucle pour attendre le relachement du bouton
   
   bcf     INTCON,T0IE        ; arret du TMR0 affichage géré manuellement
   bcf        PORTA,1        ; autres afficheurs eteints
   BCF        PORTA,2
   BCF        PORTA,3
   BSF        PORTA,0        ;allumage digit0
   MOVFW    ComptSu        ;charge la donnée
   CALL        LedTable        ;recherche donnée
   MOVWF    PORTC        ;envoi donnée


et je le remet en route a la fin avec bsf

utiliser le timer
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#10 Message par Guest » mar. 15 nov. 2016 09:28

Bonjour

Le TIMER0 sur 16F est incrémenté en permanence, soit par l'horloge interne, soit par l'horloge externe.Donc pas de TIMER ON/OFF, comme sur le TIMER1.Donc c'est une des possibilités, pour interrompre l'int sur le Timer. Mais attention, le TIMER continue de tourner,lors de la remise en service, de bien penser à réinitialiser le TIMER0, dans ton CAS une RAZ pour avoir la bonne Tempo.

Il y a aussi, si pas d'utilisation de RA4, donc pas l'horloge externe, de basculer sur cette horloge ( bit TOSC du registre OPTION_REG) pas de front bas, ni de front haut, donc pas incrémentation du timer et pas INT

A+


Retourner vers « Langage ASM »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 39 invités