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 ---
- 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 ---
Modérateur : mazertoc
utiliser le timer
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 )
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
Svp, un indice
Merci
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 )
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
Svp, un indice
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
utiliser le timer
utiliser le timer
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
je ne sais pas faire le calcul du timer non plus. bigonoff en parle dans sa doc, je vais regarder
utiliser le timer
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.
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
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é
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.
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
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é
utiliser le timer
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 suivant ce test, si c'est timer1 tu traites INCF Temp,F .Si c'est timer0 tu traites l'affichage.
A+
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
A+
utiliser le timer
utiliser le timer
utiliser le timer
Pour la partie réglage, j'arrête le timer ainsi, est-ce correct ?
et je le remet en route a la fin avec bsf
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
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+
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 78 invités