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

m
Un [[w:PIC_16F84_de_Microchip|PIC16F84]] est enfoui dans un [[w:FPGA|FPGA]]. Sa seule particularité est de fonctionner à 50MHz contre 10 (resp. 20 MHz) de fréquence maximale d'horloge pour les PIC 16F84 (resp. 16F84A). Il exécute le programme suivant (écrit avec le compilateur Hitech C) :
<source lang="c">
#include <pic1684.h>
//#include <htc.h> serait-il mieux ?
void interrupt decalage(void);
unsigned char nb;
</source>
Remarquez comment est écrit une interruption avec ce compilateur.
 
1°) Repérer et modifier les lignes de ce programmes pour qu'il fonctionne avec le compilateur MikroC.
 
6°) Modifier l'interruption pour qu'elle réalise un chenillard d'une LED se déplaçant vers les poids faibles.
 
{{Solution|contenu=
2°) Je l'ai réalisé dans un FPGA et à vue de nez la fréquence est entre 5 et 10 Hz.
 
N'oubliez pas la division par 16 qui est réalisée avec le if (!(nb % 16)) dans l'interruption.
 
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.
 
Comme la division se fait par 16 qui est une puissance de deux, on peut utiliser un masque pour faire ce calcul bien plus rapidement :
<source lang="c">
// langage C
if (!(nb & 0x0F)) // idem à if (!(nb % 16)) mais plus rapide
</source>
4°) Décalage tout simple d'une LED vers les poids forts.
}}
 
==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.
 
[[File:Afficheurs7seg.png|thumb|500px|
 
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 :
<source lang="c">
unsigned char Display(unsigned char no) {
unsigned char Pattern;
unsigned char SEGMENT[] = {0x3F,....
</source>
3°) Réaliser le programme main() responsable de l'initialisation de l'interruption qui doit avoir lieu toutes les 10ms (avec un quartz de 4MHz) et qui compte de 00 à 99 toutes les secondes environ (avec un "Delay_ms(1000);")
 
4°) Réaliser enfin l'interruption qui affichera tantôt les dizaines, tantôt les unités.
 
{{Solution|contenu=
2°)
<source lang="c">
unsigned char Display(unsigned char no) {
//unsigned char Pattern;
unsigned char SEGMENT[] = {0x3F,....
return SEGMENT[no];
</source>
}}
 
 
10 144

modifications