« Utiliser les PIC 16F et 18F/Exercices/Interruption timer0 en langage C » : différence entre les versions

m
Robot : Remplacement de texte automatisé (- n'est pas + n’est pas , - Aujourd'hui + Aujourd’hui , - d'euros + d’euros , - d'agir + d’agir , - l'apparence + l’apparence ); changements de type cosmétique
m (Robot : Remplacement de texte automatisé (-qu'il +qu’il))
m (Robot : Remplacement de texte automatisé (- n'est pas + n’est pas , - Aujourd'hui + Aujourd’hui , - d'euros + d’euros , - d'agir + d’agir , - l'apparence + l’apparence ); changements de type cosmétique)
N'oubliez pas la division par 16 qui est réalisée avec le if (!(nb % 16)) dans l'interruption.
 
<u>Calcul précis</u> : {{Unité|50|{{abréviation|Mhz|mégahertz}}}} / 4*(256*256*16) = {{Unité|11.92|{{abréviation|Hz|hertz}}}} (la division par 4 a toujours lieu).
 
3°) "if (!(nb % 16))" est une façon pas très efficace de calculer le reste de la division par 16. J'ignore la technique utilisé par le compilateur, mais ce calcul est forcément long puisqu’il n'y a pas d'instruction de division sur le 16F84.
5°) OPTION_REG = 0x84; = 1000 0100 => poids faible = 4 => division par 2 puissance 5 = 32
 
{{formatnum:4000000}} / 4*32*(256-96)*400 = {{Unité|0.48828|{{abréviation|Hz|hertz}}}} Soit pratiquement {{Unité|0.5|{{abréviation|Hz|hertz}}}}
 
Un meilleur calcul serait :
 
{{formatnum:4000000}} / 4*32*(256-94)*400 = {{Unité|0.482253086|{{abréviation|Hz|hertz}}}} (à cause des temps de latence) Cette connaissance n'estn’est pas demandée aux étudiants.
 
6°)
<source lang="c">
#include <pic1684.h>
//#include <htc.h> serait-il mieux ?
void interrupt decalage(void);
 
== Exercice 2 ==
Une partie matérielle est constituée de deux afficheurs sept segments multiplexés. Les sept segments sont commandés par le '''PORTC''', tandis que les commandes d'affichages sont réalisée par les bits b0 et b1 du '''PORTB'''. Un schéma de principe est donné ci-après.
 
[[Fichier:Afficheurs7seg.png|thumb|500px|Comment utiliser deux afficheurs multiplexés]]
 
1°) A l'aide de la documentation calculer les valeurs dans un tableau "unsigned char SEGMENT[] = {0x3F,...};" pour un affichage des chiffres de 0 à 9.
 
2°) réaliser une fonction responsable du transcodage :
 
{{Solution|contenu=
1°) 0x3F est 0011 1111 sur un affichage xgfe dcba ce qui allume les segments fedcba affiche donc un 0 et nous donne en même temps la marche à suivre.
* 1 <-> xgfe dcba = 0000 0110 = 0x06
* 2 <-> xgfe dcba = 0101 1011 = 0x5B
Les compilateurs C compilent cela certainement de manière peu optimisée. Il faut savoir qu’il existe un bit "half carry" dans le registre '''Status''' qui permet certainement d'optimiser, mais nous laissons tomber ce genre de détail.
 
Pour la période de l'interruption, on part de la fréquence quartz divisée par 4 soit : {{Unité|1|{{abréviation|Mhz|mégahertz}}}} qu’il faut diviser par {{formatnum:10000}} pour avoir une période d'overflow de 10 ms. Le timer gère une division par 256 qu'on peut ramener à 250 en l'initialisant à 6 mais il nous reste à réaliser une division par 40 qui n'estn’est pas une puissance de 2. On va prendre une division par 64 et 10000 / 64 = 156,25 donc notre timer0 sera initialisé à 256-156 = 100.
<source lang="c">
//****** Mikro C ********
}
</source>
Cette façon de faire (division par 10 et reste de la division par 10) est utile si nb n'estn’est pas en BCD, or nous avons présenté dans le main une incrémentation qui veille à laisser nb en BCD ! On peut donc renplacer cette interruption par :
<source lang="c">
void interrupt(void) {
143 371

modifications