Computing">
More Web Proxy on the site http://driver.im/Laboratoires Prog
Laboratoires Prog
Laboratoires Prog
H 21 Lier l'architecture et la
programmation d'un
microcontrôleur
TGE
Matériel :
PC avec l’environnement de travail Keil.
Carte Dallas.
Module BARGRAPH pour Dallas (magasin).
1 Étape: Compilation
Créez un répertoire de travail et copiez-y le fichier "Bonjour.c" présent sur le réseau.
Utiliser l’environnement uVision pour le compiler. Voir Annexe 1 (page 7).
2 Étape: Simulation
Une fois le programme "Bonjour.c" compilés, vous allez le simuler. Dans l’environnement de uVision,
cliquer sur le bouton (ou dans menu Debug -> Start/Stop Debug Session ou encore Ctrl+F5).
L’environnement devrait se modifier légèrement (observez la barre d’outils du bas).
Simulation : Cliquer sur le bouton Reset CPU , pour reseter les éléments du programme, puis
cliquer sur le bouton Run pour faire rouler le programme. Observez la fenêtre UART #1.
Q2 : Pourquoi après avoir exécuté le "printf", la dernière lettre ne s’est pas afficher ?
Rép: Le simulateur réagit comme dans la vrai vie, ainsi après avoir transmis un caractère, ce caractère n'est pas
transmis instantanément mais après un certain délai qui correspond à la vitesse de transmission (baud rate)
fois le nombre de bits à transmettre (8 data + 1 start + 1 stop). C’est pour cette raison qu’il faut attendre.
Faites plusieurs Step into et vous allez finir par voir le !.
void main(void)
{
vInitPortSerie(); // Initialise le port série a 57600 bds, N, 8, 1.
while(1)
{ // Attend et ne fait plus rien.
}
} // Fin du main().
P3: représente l'état du Latch interne et Pins représente l'état des broches.
On peut changer l'état des pins en cliquant sur les crochets de Pins
ou encore dans la fenêtre Commande. Pin 3.x
On écrit : >PORT3 = 0xZZ où ZZ est une valeur hexadécimale. P3.x
Note : Pour que ça fonctionne il faut que les broches soient en
entrées (Latch à 0xFF)
Placez l'appel de la fonction "vDelai(10);", juste après "LED = !LED;" dans la boucle "while(1) ".
Testez la fonction vDelai avec la simulation (Utilisez Step, Step Over et Run).
6 Étape:
Remplacez l'instruction LED = !LED; par l'instruction: LED = SW2 & SW3;
Simulez et exécuter le programme.
Modifiez l’entrée Sw2 en cliquant sur le bit 2 du port 3.
Vérifiez l'état de la Led en simulation.
7 Étape:
Sur le réseau, vous trouverez le programme "Etape7.c". Ce programme devrait faire un chenillard de 8
bits sur le port 1 du DS89C450, mais il y a une petite erreur de logique dans le programme. Vous devez
comprendre le programme, le commenter, créer un projet, ajouter ce qui manque pour le compiler, le
simuler, le corriger, le re-simuler et finalement, l’exécuter sur la carte Dallas avec un module de LED
que vous prendrez au magasin.
9 Étape: (Bonus)
Évaluation :
Simulation de l'étape 5 (LED = !LED) : _______ / 1
Simulation et exécution de l'étape 6 (LED = SW2 & SW3) : _______ / 1
Fonctionnement de l'étape 7 (Chenillard) : _______ / 1
Fonctionnement de l'étape 8 (Simulation du Dé) _______ / 2
Listing du programme de l'étape 8 : _______ / 5
(Je corrige les entêtes, l'indentation et les commentaires).
Fonctionnement de l'étape 9 (Bonus): _______ / 1
Total: _______ /10
Lors de la remise du rapport, vous devez remettre le listing du programme de l'étape 8 avec:
- Entête de fichier,
- Entête de fonction,
- Commentaires.
Les caractères utilisés dans le listing doivent être de format Courier New, 10 points.
80 caractères maximum par ligne.
Les commentaires ne doivent pas déborder (sinon jusqu'à -2).
Ouvrir le logiciel Keil et créez un projet : menu Project New uVision Projet…
Sélectionnez votre répertoire et entrez le même nom que votre fichier source sans extension, et faites
‘Enregistrer’
Dans la fenêtre ‘Project’, faite un clic sur le signe + devant ‘Target 1’ puis un double clic sur ‘Source
Group 1’ pour inclure votre fichier source (.C) à votre projet. Sélectionner le, faites 'Add' et 'Close'.
Refaite un double clic sur ‘Source Group 1’ pour visualiser le ou les fichiers inclus dans votre projet et
faite un double clic sur votre fichier source pour pouvoir l’éditer.
Dans la fenêtre ‘Project’, sélectionner ‘Target 1’ puis clic-droite et Option for Target 'Target1',
sélectionnez l’onglet Output et cocher la case Create HEX File. Puis faite OK. Ceci vous permettra de
générer le fichier Intel-HEX qui sera transféré sur le microcontrôleur DS89C450.
Dans la fenêtre ‘Project’, sélectionner ‘Target 1’ puis clic-droite et Option for Target 'Target1',
sélectionnez l’onglet Target. Dans le champ Xtal (MHz) entrez 11.0592 , terminer avec OK.
Matériel :
Sonde Oscilloscope.
Carte Dallas
Q2: Quelles sont les valeurs maximums (pas limité à 9) que l’on peut entrer dans la variable
‘ucChiffre’ pour avoir un résultat cohérant (utilisez la calculatrice de Windows),
si Produit était de type unsigned char: _________________
unsigned int: _________________
unsigned long: _________________
float: _________________
Voir Annexe 1 pour la valeur maximum des différents types de variables.
Modifiez votre programme pour qu'il fonctionne avec des nombres de 0 à 9.
Je vérifie (Simulation, Exécution sur la carte Dallas et Réponses 4 pts )________________
Écrire ensuite le programme principal qui va faire clignoter une LED (P3_5) sans fin avec un délai
entre chaque clignotement en utilisant votre fonction vDelaiMs(100). Compilez votre programme,
simulez-le et exécutez-le sur la cible (votre kit Dallas).
En simulation, évaluer le temps de la fonction délai de l’étape 2. Pour évaluer le temps d’une partie de
code, il est important d’entrer la vitesse du cristal qui sera relié à votre microcontrôleur. Pour faire
cette configuration, dans la fenêtre ‘Project’, sélectionner ‘Target 1’ puis clic-droite et ‘Options for
Target 'Target 1' ’, sélectionnez l’onglet Target. Dans le champ Xtal entrez 11.0592 (valeur en MHz),
terminer avec Ok.
Pour réaliser facilement le calcul du temps d'exécution d'une fonction, placer un 'Breakpoint' sur la
ligne qui appelle la fonction. Après être entré en mode Debug cliquez sur Run
Ceci devrait vous placer à la ligne qui va appeler la fonction. Prenez le temps indiqué par 'sec', et
cliquer sur Step over . Vous avez maintenant le nouveau temps disponible dans 'sec'. Si vous
désirer faire une autre lecture, vous faites à nouveau Run et Step over.
Q3: Trouver la bonne valeur à mettre dans votre fonction pour que le paramètre d’entré donne
exactement un délai en ms (ex. : vDelaiMs(100), doit donner un délai de 100 ms) :
Vous pouvez ajouter votre fonction de délai dans votre fichier Frame.c.
Évaluation :
Fonctionnement de l'étape 1 (Factoriel 0 à 9) : _______ / 4
Fonctionnement de l'étape 2 (FlashLed) : _______ / 2
Fonctionnement de l'étape 3 (Temps exécution) : _______ / 3
Listing du programme de l'étape 1 : _______ / 5
(Je corrige l'entête, les indentations et les commentaires).
Total: _______ /14
Lors de la remise du rapport vous devez remettre le listing du programme de l'étape 1 (pas page titre).
Les caractères utilisés dans le listing doivent être de format Courier New, 10 points, 80 car max /ligne
et les commentaires ne doivent pas déborder (sinon jusqu'à -2).
Notes: La fonction ucLireChiffre est une fonction que vous devez créer. Elle est constituée d’un
‘getkey( )’ qui lit une touche au clavier sans en faire l'écho à l'écran.
Si le caractère lu est entre '0' et '9' on soustrait 0x30 à la valeur lue et on retourne le résultat en
sortant. Si le caractère lu n'était pas un chiffre on retourne 0.
Pour afficher la valeur numérique d'une variable à 8 bits il faut utiliser le CAST (int)
devant le nom de la variable dans le printf ou encore utiliser un des formats: %bu ou %bd.
Pour afficher la valeur d'une variable unsigned long, il faut utiliser le format %Lu.
À chaque 100ms, vous devez incrémenter les dixièmes de seconde qui seront affichés sur les bits
3 à 0 du Port 1.
Lorsque l’on passe de 9 à 10 sur les dixièmes de seconde, les dixièmes de seconde reviennent à
zéro et on incrémente les secondes (affichés sur les bits 7 à 4 du Port 1).
Si les secondes sont à 16, ont les remets à zéro.
Ainsi le chronomètre comptera de 0.0 sec à 15.9 secondes sur le Port 1 (en binaire).
Les trois boutons auront les fonctions suivantes (lorsque pesés (front descente, pas anti-rebond)):
(utilisez des constantes (#define) pour identifier les différents boutons)
SW2 (P3_2): Démarre le chronomètre (START).
SW3 (P3_3): Remise à zéro du temps (RAZ).
SW4 (P3_4): Arrêt du chronomètre (STOP).
Votre programme devra utiliser le Timer0 pour compter un intervalle de 100 ms.
Le Timer ne sera pas utilisé pour faire un délai comme dans le problème précédant.
Le programme ne doit pas bloquer.
Il vous faudra vérifier le drapeau de débordement du Timer0 pour incrémenter le temps.
Une seule lecture du Port 3 et une seule écriture sur le Port 1 sont permises.
Attention, avec le bargraph, on allume les leds sur un 0. Il faudra donc inverser les bits
(opérateur: ~ ) avant d'écrire sur le Port 1. Exemple: P1 = ~(ucCompte);
Q3: Si TH0 = 0 et TL0 = 0 (compte maximum), quel est le temps de débordement? ____________
Affichage du Chrono:
Faites le programme en commençant par l'algorithme plus détaillé de chacune des principales tâches
Pour améliorer la simulation des programmes relativement longs, il est conseillé d'utiliser les
"BREAKPOINT" ou Point d'arrêt. On place un ou plusieurs "BREAKPOINT" dans un programme en
faisant simplement un double-clic gauche sur la ligne ou l'on désire avoir un point d'arrêt (un rond
rouge va apparaitre). Par la suite, si on simule le programme en mode "RUN", ce dernier s'arrêtera
juste avant l'exécution d'une ligne marquer d'un "BREAKPOINT". Il est ainsi facile de se rendre à un
point précis d'un programme sans avoir à l'exécuter ligne à ligne. Pour retirer un "BREAKPOINT" on
refait un double-clic gauche.
Faites un chronomètre de précision, de 0,00 à 1,99 seconde avec P1_3 à P1_0 = 0 à 9 centièmes de
seconde, P1_7 à P1_4 = 0 à 9 dixièmes de seconde et le 1 seconde se fera sur la DEL de P3_5.
Évaluation :
Étape 1 (DélaiTimer Commentaires et Simulation) : _______ / 3
Étape 2 (Algo Chrono) : _______ / 4
Étape 3 (Simulation et Fonctionnement Programme) : _______ / 3
Listing du programme de l'étape 3 : _______ / 5
(Je corrige l'entête, les indentations et les commentaires).
Total: _______ /15
Étape (Bonus) (Simulation et Fonctionnement Programme) : _______ / 2
Lors de la remise du rapport vous devez remettre le listing du programme de l'étape 3 (pas page titre).
Les caractères utilisés dans le listing doivent être de format Courier New, 10 points, 80 car max /ligne
et les commentaires ne doivent pas déborder (sinon jusqu'à -2).
Matériel :
PC avec l’environnement de travail Keil.
Carte Dallas.
Ensemble Carte BARGRAPH et Carte Dipswitch (magasin).
............ ....
Chenillard manuel:
ucCompteurSw2 = 0.
ucPort1 = 10000000b. // Valeur binaire à mettre en Hexa.
TANT QUE(VRAI)
SI(SW2 est pesé)
SI(ucCompteurSw2 < 101)
ucCompteurSw2 ++.
SI(ucCompteurSw2 == 100) // Anti-rebond.
Décale ucPort1 vers la Droite de 1 bit.
SI(ucPort1 == 00000000b)
ucPort1 = 10000000b.
FIN SI.
FIN SI.
FIN SI.
SINON // SW2 pas pesé.
ucCompteurSw2 = 0.
FIN SI.
1 20
Position Position
Période
1 19 20 1
Position Position
Je vérifie (Q3, Commentaires, Simulation et Exécution sur la carte Dallas 6 pts) _____________
TANT QUE(VRAI)
Position++.
SI(Position == 21)
Position = 1.
FIN SI.
Évaluation :
Étape 1 (Chenillard Questions, Simulation et Fonctionnement) : _______ / 4
Étape 2 (Algo Chrono 2 boutons) : _______ / 3
Étape 3 (Chrono 2 boutons Fonctionnement Programme) : _______ / 2
Étape 4 (Intensité Commentaires, Simulation et Fonctionnement) _______ / 6
Total: _______ /15
Matériel :
PC avec l’environnement de travail Keil.
Carte Dallas
Carte BARGRAPH (magasin) ou votre module de Leds.
Carte DÉ électronique (magasin).
Préparations :
Écrire les commentaires (à la main) sur le programme de l'Étape 1 (page suivante).
Dessinez les quatre premières valeurs à s'afficher dans l'étape 1.
Écrire l’algorithme du programme de l'Étape 3 utilisant 1 tableau et le Timer0.
1 Étape : Chenillard spécial avec tableau (sans délai et anti-rebond logiciel avec compteur)
Dans un premier temps: Vous devez commenter le programme de chenillard de la page suivante
(vérification au début du laboratoire).
Finalement: Vous devez copier, ajouter des commentaires, compiler, comprendre, simuler et
exécuter (sur la carte Dallas avec un "Bar Graph"), le programme de chenillard
(à faire au laboratoire).
while(TRUE)
{
if(TF0 == 1 ) //
{ //
TL0 = 0x00; //
TH0 = 0x4C; //
TF0 = 0; //
ucComptDelai++; //
if(ucComptDelai >= 2) //
{ //
ucComptDelai = 0; //
P1 = ~ucTab[ucCompt]; //
//
ucCompt++; //
if(ucCompt >= 32) //
{ //
ucCompt = 0; //
}
}
} // Fin du if OverFlow.
} // Fin du while(TRUE).
} // Fin du main.
void vInitTimer0(void)
{
TMOD = TMOD & 0xF0; //
TMOD = TMOD | 0x01; //
TL0 = 0x00; //
TH0 = 0x4C; //
TR0 = 1; //
}
Fonctionnement: Sur un reset, toutes les LED s’allument (pour vérifier si des leds sont brulés).
Si on appuie sur l’interrupteur SW4 (P3_4), la valeur affichée change au 150ms.
Quand on relâche SW4, une valeur aléatoire (1 à 6) reste affichée sur les LED.
Les valeurs pour activer les LED du dé, seront dans un tableau local.
Dans le simulateur, observez les variables dans la fenêtre:
Call Stack + Locals ou avec: View Watch Windows Watch 1
TANT QUE(VRAI)
ucValDe++. // Changement de valeur.
SI(ucValDe > 6) // Fin du tableau?
ucValDe = 1.
FIN SI.
SI(l’interrupteur est pesé)
Affiche la valeur du Dé sur les LED. // Affiche au 150ms.
FIN SI.
FIN TANT QUE.
FIN.
P1_ 3 2 1 0 ucValDe P1
P1_ 3 2 1 0 0 0 0 1 1 0x01
0 0 0 1 << 1 0 0 1 0 2 0x02
0 0 1 0 +1 0 0 1 1 3 0x03
0 0 1 1 << 1 0 1 1 0 4 0x06
0 1 1 0 +1 0 1 1 1 5 0x07
0 1 1 1 << 1 1 1 1 0 6 0x0E
1 1 1 0 =0 0 0 1
Le cycle devra se répéter pour une durée de 45 secondes, après quoi il est arrêté et la valeur 0xAA est
affichée sur les LED. Vous devez faire le programme en utilisant le Timer0 ainsi qu’un tableau pour
les valeurs qui seront affiché sur les LED.
Pour les plus rapides: Utilisez un tableau de 9 éléments seulement.
Algorithme (ordinogramme ou pseudo-code)
(Explication de ce que vous allez faire et comment vous allez le faire)
Matériel :
PC avec l’environnement de travail Keil.
Carte Dallas avec vos câbles (pour les ports 1 et 3) de la première session.
Carte Bargraph ou votre module de Led.
Clavier à matrice.
"Protoboard" avec décodeur de clavier (74C922), condensateurs 1uF et 0.1uF.
Préparations :
Lire l'énoncé du laboratoire.
Remplir le tableau des broches de l'étape 2 pour le début de la semaine #1.
Compléter le schéma de l'étape 4 pour le début de la semaine #1.
Faire le montage de l'étape 4 pour le début de la semaine #2.
Note: La tâche FLIP sera effectuée une seul fois, lorsqu'on pèse sur la lettre 'A'. Cette tâche ne sera
donc pas gérée au 150ms.
C0 C1 C2 C3
L0 Pin
Colonne 0
L1 Colonne 1
Colonne 2
L2 Colonne 3
Ligne 0
L3 Ligne 1
Ligne 2
Ligne 3
PIN: 01234567
Vous devez écrire une fonction qui permet de lire le clavier à matrice: "ucLireClavier(UC ucMode)".
- La fonction doit scanner toutes les colonnes (une à la fois) et vérifier si une ligne est à 0.
- Les valeurs à sortir sur le port pour mettre une colonne à 0 doivent être dans un tableau.
- Les codes ASCII doivent être dans un tableau.
Indiquez les numéros de colonne (C0 à C3) et de lignes (L0 à L3) sur le Port 1:
Testez votre fonction avec un programme (ClavierLogiciel.c) qui affiche sur le PC le caractère pesé
(mode ASCII) ou la valeur numérique (mode NOMBRE). UC ucCheckMode(void)
{
static UC ucMode = ASCII;
Voici à quoi pourrait ressembler la boucle principale du main( ): if(ucKbHit()
{
ucTouche = getkey();
while(TRUE) switch(ucTouche)
{
{ Case 'A':
ucMode = ucCheckMode(); case 'a':
ucTouche = ucLireClavier(ucMode); ucMode = ASCII;
if(ucTouche != SPACE) break;
case 'N':
{ case 'n':
if(ucMode==ASCII) printf("%c",ucTouche); ucMode = NOMBRE;
else printf("%bd",ucTouche); break;
} default:
ucMode = ASCII;
} // Fin while(TRUE). break;
}
}
return ucMode;
}
Étant donné la vitesse du processeur, vous devriez voir plusieurs caractères apparaitre à l'écran si vous
pesez sur une touche. Pour régler ce problème, il suffit, dans la fonction ucLireClavier, de retourner le
caractère seulement s'il a changé, sinon on retourne un SPACE (voir à la fin de l'algo annexe 1).
Vous devrez utiliser une variable "static" pour garder l'état de l'ancien caractère.
Anti-rebond matériel.
Réflexion 4: Selon vous, avec la lecture du clavier par une méthode logiciel sur le port1 est-il possible de
lire plusieurs touches à la fois et Pourquoi ?
OUI: Chaque combinaison de touches aura un code diffèrent sur le port P1.
Il s'agira de bien l'interpréter pour pouvoir lire plusieurs touches à la fois.
Réflexion 5: Donnez des avantages et des inconvénients d'utiliser la lecture du clavier par la méthode
logiciel par rapport à la méthode avec décodeur 74C922 ?
Évaluation :
Étape 1 (Switch Simulation et Fonctionnement) : _______ / 4
Étape 2 (Broches du clavier préparation semaine#1)) : _______ / 2
Étape 3 (Clavier logiciel Fonctionnement) : _______ / 3
Mode NOMBRE : _______ / 2
Étape 4 (Schéma du circuit 922 début semaine #1) : _______ / 2
Étape 4 (Montage du circuit 922 début semaine #2) : _______ / 3
Étape 5 (Clavier avec 922 Fonctionnement) : _______ / 4
Total: _______ /20
Matériel :
PC avec l’environnement de travail Keil.
"Protoboard" avec deux 74HCT573, un 74LS04, un 74LS02, un 74LS00, deux Bargraph.
Carte Adaptateur 40 TSO pour Proto avec câble (ADAP 40 TSO)
Carte Simulateur Binaire V2 + Bloc alimentation.
Préparations :
Lire l'énoncé du laboratoire.
Comprendre le fonctionnement des "Latch" comme I/O et Mémoire.
Comprendre les signaux READ et WRITE et les décodeurs d'adresses.
Faites le montage de l'annexe 1 du laboratoire.
Note: Pour relier ce montage avec la carte Dallas, utilisez un câble plat 40F-40F relié
entre JP3-1 de la carte Dallas et l'adaptateur Câble plat 40.
P.C. / D.C. / F.B. Laboratoire 7 Cours 247-236 Programme de TSO
06-04-2020 32 Laboratoires236.docx
Configuration pour avoir la mémoire externe à 0x8000:
Si le programme est fonctionnel, vous devriez voir un caractère apparaitre à l'écran à chaque fois
qu'on pèse sur une touche du clavier. Comme l'adresse n'est pas décodée, peu importe l'adresse où le
compilateur placera votre variable (de 0x8000 à 0xFFFF), nous y auront toujours accès.
Pour vous assurer que c'est vraiment votre mémoire qui est utilisée, débrancher l'un des fils (RD ou
WR). Vous ne devriez plus afficher vos caractères.
DEBUT
TANT QUE(VRAI)
LIRE ucTouche. // getkey (pas d'echo).
Placez ucTouche dans la memoire externe avec le pointeur (ucpData).
ECRIRE (la valeur pointee par ucpData). // printf avec ucpData.
FIN TANT QUE.
FIN
Si le programme est fonctionnel, vous devriez voir la touche pesé apparaitre à l'écran.
Comme l'adresse n'est pas décodée, peu importe la valeur du pointeur (de 0x8000 à 0xFFFF)
il pointera toujours dans votre 74HCT573.
Pour vous assurer que c'est vraiment votre mémoire qui est utilisée, débrancher le fil WR.
Vous ne devriez plus afficher vos caractères.
5 Étape : Programme pour tester la Mémoire 2 octets avec 74HCT573 (Avec décodeur d'adresses).
Écrire un programme qui va tester les deux circuits 74HCT573. Vous devez écrire 0x55 dans une des
cases mémoires et 0x00 dans l'autre case pour modifier la donnée sur le bus. Ensuite vous devez lire la
première case mémoire et vérifier que la donnée lue est la même. Affichez un message pour dire si
OK ou Fail. Ensuite essayer avec 0xAA. Faites l'autre 573.
Algo: *U1 = 0x55; // U1 est un pointeur initialisé à l'adresse du 573 U1.
*U2 = 0x00; // Pour s'assurer que le bus de donnée soit changé.
SI(*U1 == 0x55) ECRIRE "Avec 0x55 sur U1: OK";
SINON ECRIRE "Avec 0x55 sur U1: FAIL";
Écrivez un programme qui fera un chenillard sur 16 bits sur les deux Bargraph.
Utilisez des pointeurs pour accéder aux 573.
Vous devez brancher la carte Simulateur Binaire, que vous avez réalisée la session dernière, sur la
carte Dallas par l'entremise d'un câble plat et d'un bloc d'alimentation 12 volts.
La carte binaire contient 4 "Latch" 74HCT573 qui fonctionne en sortie, comme dans l'étape 6.
P0
Les sorties sont soit deux "Bargraph" aux adresses 0x8200 et 0x8300, et 2 sept segments aux adresses
0x8400 et 0x8500.
En sortie on se sert du signal WRITE sur le "Latch Enable".
Les entrées sont deux blocs de 8 "Dip switch" aux adresses 0x8200 et 0x8300.
En entrée on se sert du signal READ sur le "Buffer".
Ex: Le programme suivant vous permettra de lire les "Dip switch" à l'adresse 0x8200 et de les
reporter sur le "Bargraph" de la même adresse.
while(1)
{
ucVal = *ucp8200; // Lit Dip-switch.
*ucp8200 = ucVal; // Affiche sur Bargraph.
}
}
Modifier le programme précédant pour faite afficher les "Dip switch" de l'adresse 0x8200 sur le
"Bargraph de l'adresse 0x8300 et inversement les "Dip switch" de l'adresse 0x8300 sur le "Bargraph
de l'adresse 0x8200
Affichez en continu, l'état des Dip switch de l'adresse 0x8300 sur les deux 7-segments (00 à FF).
Code pour les caractères en 7-Segments (Si actif a 0 il faudra inverser les codes ~):
0x3F 0x06 0x5B 0x4F 0x66 0x6D 0x7D 0x07 0x7F 0x6F 0x77 0x7C 0x39 0x5E 0x79 0x71
Faite l'algorithme (je ne vérifie pas l'algo, mais vous pouvez me le montrez) et le programme qui fera
une horloge binaire. Les seconde serons affichées (en BCD) sur les deux sept segments (00 à 59), les
minutes seront affiché sur le "bargraph" 0x8300 en BCD (0x00 à 0x59) et les heures sur le "bargraph"
0x8200 en BCD aussi (0x00 à 0x23). Pour les secondes, utilisez le Timer 0 (100 * 10ms).
Évaluation :
Étape 1 (Montage de l'annexe 1.) : _______ / 3
Étape 2 (Fonctionnement Mémoire 1 octet avec xdata.) : _______ / 3
Étape 3 (Fonctionnement Mémoire 1 octet avec pointeur.) : _______ / 3
Étape 5 (Questions+ Fonctionnement Mémoire 2 octets) : _______ / 7
Étape 7 (Fonctionnement Chenillard 16 bits) : _______ / 4
Étape 9 (Fonctionnement Dip switch Bargraph) : _______ / 2
Étape 10 (Fonctionnement Dip switch 7-Segments) : _______ / 3
Étape 11 (Fonctionnement Horloge) : _______ / 5
Total: _______ /30
Pour simplifier le montage : Placer U2 sur U1 en prenant soin de déplier les pattes 1 et 11 de U2.
Voir démo du prof.
Note: Pour relier ce montage avec la carte Dallas, utilisez un câble plat 40F-40F relié entre JP3-1 de la
carte Dallas et l'adaptateur Câble plat 40.
Matériel:
PC avec l’environnement de travail Keil.
Carte Dallas (soudée au complet).
Préparations:
Vous devez comprendre et transcrire le programme TestMem1.C de l’ANNEXE 1 (page 41).
Quel est l'étendu de mémoire RAM disponible sur votre kit Dallas ?
De___________ à ___________
Faire l'algorithme, très clair et précis, de l’Étape 2.
Vous devez faire un premier test de votre mémoire avec le programme que vous avez transcrit en
préparation. Ce programme ne teste pas toute la mémoire. S’il y a des erreurs, vous devez identifier si
le problème est logiciel ou matériel et faire les corrections nécessaires.
Rendu a 0x0000
Rendu a 0x1000
Rendu a 0x2000
Rendu a 0x3000
Rendu a 0x4000
Rendu a 0x5000
Rendu a 0x6000
Rendu a 0x7000
Rendu a 0x8000
Il y a 255 erreur(s)
Il y a 255 erreurs car l'adresse 0x8000 n'est pas dans la RAM. Pourquoi manque-t-il une erreur ?
Je vérifie (Fonctionnement sur le Dallas 6 pts) ______________
Fin du test!
Évaluation :
Étape 1 (Test Mem de base + Q1.) : _______ / 4
Étape 2 (Test Mémoire.) : _______ / 6
Listing documenté de l'étape 2 : _______ / 5
Bonus (Recherche de zone de mémoire.) : _______ / 2
Total: _______ /15
P.C. / D.C. / F.B. Laboratoire 8 Cours 247-236 Programme de TSO
06-04-2020 41 Laboratoires236.docx
ANNEXE 1
Programme TestMem1.C :
//***** P R O G R A M M E P R I N C I P A L E T A P E # 1 *****************
void main(void)
{
UC ucErreur = 0; // Pour compter les erreurs
while(1);
} // ******** F I N D U P R O G R A M M E P R I N C I P A L **************
//****** L E S F O N C T I O N S ********************************************
//*****************************************************************************
// Nom de la fct: ucVerifRAM par: Pierre Chouinard
// Date: 15 mars 2009 Revision : B
// Prototype: unsigned char ucVerifRAM (UC ucVal, UI uiAdd);
// Description: Cette fonction ecrit en RAM externe et verifie si la valeur
// a ete ecrite convenablement.
// Si oui retourne 0, sinon retourne 1.
//
// Entree: ucVal: Valeur 8 bits pour le test entre 0x00 et 0xFF
// uiAdd: Adresse de la case mémoire à tester.
// Sortie: ucVal, vaut 0 si le test est OK, ou 1 si le test a echoue.
//
// Revisions: 24/03/14: Formate, change commentaires et met un seul return. DC.
//
// Exemple d'appel: uErreur = ucVerifRAM(0x11,0x3456); // Test 0x11 a 0x3456.
//*****************************************************************************
UC ucVerifRAM(UC ucVal, UI uiAdd)
{
UC xdata *ucpExt; // Pointeur vers RAM externe.
return(ucVal);
void vInitPortSerie(void)
{
...
...
} // Fin
Matériel:
PC avec l’environnement de travail Keil, Carte Dallas.
Convertisseur Analogue/numérique ADC0804, Photo Cell, Résist. 1k et 10k, Cond. 150pF.
Câble Header 40F-40F (CABLE0053) + Adaptateur Câble plat 40 (ADAP040).
Préparations:
Vous devez mettre en forme, comprendre et commenter les programmes Historique.c et
ConvADC.c disponible sur le réseau (Voir ANNEXE II et III).
P:\243-Technologie du Genie Electrique\Daniel.Cote\Documents\Cours 247-236\Laboratoires\Lab09
Modifier un peu le montage de l’étape 1 pour relier D0 à D7, /RD, /WR, /CS et /Intr du ADC0804
aux lignes D0 à D7, /RD, /WR, /CS4 et P3_2 du connecteur 40 pins de votre carte Dallas.
IMPORTANT: Lorsque vous allez compilez votre programme n’oubliez pas de configurer
l’emplacement de la RAM externe de 0x0000 à 0x7FFF = 32k = 0x8000 octets.
Dans "Option for Target ‘Target 1’" Onglet "Target"
Vous devez corriger les partie notées « ????? » dans le programme Acquisition.c
Fichier: Fonction236.h
//*********************************************************************************
// Fonction236.h : Prototypes de trois fonctions de base du cours de 247-236
// A utiliser avec Fonction236.obj
//
// vInitVitessePortSerie: permet de configurer la vitesse du port serie en
// fonction du 'Baud Rate' desire et de la fréquence du cristal
// utilise. Pour utiliser cette fonction on doit donner la vitesse
// désire du port serie ( ex.: 300, 1200, 2400, 4800, 9600, 19200,
// 28800 ou 57600 ) et la frequence du cristal en Hz (sur la
// carte Dallas de TSO = 11059200)
//
// Exemple: vInitVitessePortSerie(57600, 11059200);
//
// ATTENTION: si vous faites une erreur le port serie ne
// fonctionnera pas
//
// vEcrire8BitsExt et
// ucLire8BitsExt: Deux fonctions qui permettent d'aller lire ou ecrire
// n'importe ou en RAM externe ou I/O.
// La fonction vEcrire8bitsExt a besoin de l'adresse ou ecrire
// et de la valeur (de type UC) a ecrire.
//
// Exemples: vEcrire8bitsExt(0x1234, 0x55);
// vEcrire8bitsExt(uiAdresse, ucVal);
//
// La fonction ucLire8bitsExt a besoin de l'adresse ou lire, pour
// parametre d'entre et elle retourne la valeur lue de type UC.
//
// Exemples: ucVal1 = ucLire8bitsExt(0x39AB);
// ucVal2 = ucLire8bitsExt(uiAdresse);
//*********************************************************************************
Fichier: ConvADC.c
//*****************************************************************************
// Fichier: ConvADC.C
// Auteur:
// Date:
// Revision :
// Compilateur:
// Description:
//*****************************************************************************
#include <stdio.h>
#include "_DeclarationGenerale.h"
#include "Fonction236.h"
#define LED P3_5; void main(void) { UC ucADC;
vInitVitessePortSerie(57600,11059200);
printf("\nProgramme ADC0804 sur chip select, lecture avec HyperTerminal. ");
printf("Par: PC\n"); printf("\nSchema de branchement du ADC0804:");
printf("\n 40 Pins ADC0804");
printf("\n ------- ----------");
printf("\n 1|D0 Vcc|2 (pin 2) Vcc--20|Vcc |");
printf("\n 3|D1 Vcc|4 (pin 1) D0---18|D0 /CS|1---/CS4 (pin 26)");
printf("\n 5|D2 | (Pin 3) D1---17|D1 /RD|2---/RD (pin 31)");
printf("\n 7|D3 | (Pin 5) D2---16|D2 /WR|3---/WR (pin 29)");
printf("\n 9|D4 | (Pin 7) D3---15|D3 /Intr|5---P3_2 (pin 33)");
printf("\n 11|D5 | (Pin 9) D4---14|D4 |");
printf("\n 13|D6 | (Pin 11) D5---13|D5 Vin+|6---Vin");
printf("\n 15|D7 | (Pin 13) D6---12|D6 Vin-|7---GND");
printf("\n | | (Pin 15) D7---11|D7 |");
printf("\n | | | ClkR|19-10k-+ ");
printf("\n | | GND----8|AGND ClkC|4------+-150pF-GND");
printf("\n | | | |");
printf("\n | /CS4|26 GND---10|GND Vref/2|9--x");
printf("\n | | ----------");
printf("\n 29|/WR |");printf("\n 31|/RD |");printf("\n 33|P3_2 |");
printf("\n 35| |");printf("\n 37| GND|39");
printf("\n 39| GND|40");printf("\n ---------");printf("\n");
vEcrire8BitsExt(0x8400,0xFF);while(1){if(P3_2 == 0){ucADC = ucLire8BitsExt(0x8400);
printf("\rADC = %bd ", ucADC); vEcrire8BitsExt(0x8400,0xFF);LED = !LED;}}}
Fichier: Historique.c
//*****************************************************************************
// Fichier: Historique.C
// Auteur:
// Date:
// Revision :
// Compilateur:
// Description: Ce programme permet de ......
//
// Avant de compiler vous devez configurer Keil pour avoir la RAM externe
// de 0x0000 a 0x7FFF:
//
// Dans: -> Option for Target 'Target 1'
// -> TARGET
// -> Off-chip Xdata Memory
// Start: Size:
// RAM 0x0000 0x8000 = (32k)
//
//*****************************************************************************
#include <stdio.h>
#include "_DeclarationGenerale.h"
#include "Fonction236.h"
#define LED P3_5 void main(void)
{ UI uiNbTouches; UI uiCompte; UC ucTouche; UC ucVal;
UC xdata ucRamExt[0x8000];vInitVitessePortSerie(57600,11059200);
printf("\nProgramme Historique avec Tableau, par: PC\n");
while(1) { LED = 0;
printf("\n\n Dans hyperterminal, commencer la capture en faisant:");
printf("\n 'Transfert'->'Capturer le texte...'->'Parcourir'");
printf("\n et entrez un NomDeFichier.XLS dans un repertoire ");
printf("\n ou vous le retrouverez facilement, puis faite");
printf("\n 'Demarrer' pour debuter le transfert.");
printf("\n\n Ensuite, dans hyperterminal, entrez des Touches au clavier.");
printf("\n Lorsque vous avez termine, faite 'ESC'");
printf("\n Maintenant, fermer le fichier d'enregistrement: ");
printf("\n 'Transfert'->'Capturer le texte...'->'Arreter'");
printf("\n Entrez dans Excel, ouvrez et visualisez votre");
printf("\n fichier de l'historique des touches.\n\n");uiNbTouches = 0;
ucTouche = getchar();while (ucTouche != 27){
ucRamExt[uiNbTouches] = ucTouche; uiNbTouches++;if(uiNbTouches >= 32700) {
printf("\n\nPreparez-vous a sauvegarder vos donnees et faites 'ESC'");
printf("\n sinon vous allez ecrire dans une zone interdite");}
ucTouche = getchar();} printf("\nIl y a %d touches.\n", uiNbTouches);
// Transfert de la memoire vers le fichier si capture demarree.
for (uiCompte = 0; uiCompte < uiNbTouches; uiCompte++){
ucVal = ucRamExt[uiCompte]; printf("\n%d\t%bd\t%c",uiCompte+1, ucVal, ucVal);
} LED = 1; printf("\n\nFin des donnees. Arretez la capture.");
printf("\nEntrez une touche pour continuer\n"); getchar(); }}