Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parJulien Boisvert Modifié depuis plus de 8 années
1
1 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 ● Cours micro pic18 ● IUT GEII
2
2 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Licence P aternité - Pas d'utilisation Commerciale - Partage des Conditions Initiales à l'identique 2.0 France Vous êtes libres : * de reproduire, distribuer et communiquer cette création au public * de modifier cette création, selon les conditions suivantes : Paternité. Vous devez citer le nom de l'auteur original. Pas d'utilisation Commerciale. Vous n'avez pas le droit d'utiliser cette création à des fins commerciales. Partage des Conditions Initiales à l'identique Si vous modifiez, transformez ou adaptez cette création, vous n'avez le droit de distribuer la création qui en résulte que sous un contrat identique à celui-ci. * A chaque réutilisation ou distribution, vous devez faire apparaître clairement aux autres les conditions contractuelles de mise à disposition de cette création. * Chacune de ces conditions peut être levée si vous obtenez l'autorisation du titulaire des droits. Ce qui précède n'affecte en rien vos droits en tant qu'utilisateur (exceptions au droit d'auteur : copies réservées à l'usage privé du copiste, courtes citations, parodie...) voir le contrat complet sous : http://fr.creativecommons.org/contrats.htm
3
3 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Plan du cours (1) Matériels et logiciels nécessaires Hello world pic18 Utiliser un écran lcd à base de contrôleur HD44780 Structure logicielle d'une application / Machine d'états Les entrées/sorties logiques Le module convertisseur analogique/numérique (adc) Les interruptions Gestion du temps Générer un signal PWM avec un module CCP Liaison série asynchrone module UART
4
4 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Plan du cours (2) Le Bus I2C Fonctionnement Interne Chaîne de développement Les Interruptions
5
5 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 ● Matériel et logiciels nécessaires
6
6 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Matériels nécessaires ICD2 : debugger / programmateur Il permet de charger un programme dans le micro (programmeur) et de contrôler son exécution, de voir et de modifier des variables, de placer des points d'arrêt (debugger). (vérifier que le pic utilisé est compatible icd2) On peut également utiliser un simple programmateur (picstart plus) mais la mise au point sera fastidieuse !
7
7 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Connections ICD2/PC/Cible Liaison ICD2<>PC par le bus USB l'ICD est alimenté par l'USB, la cible doit posséder sa propre alimentation. Laison ICD2<>PC par le port série RS232 L'ICD doit être alimenté par l'alimentation fournie. L'ICD peut alimenter la cible en validant une option dans le menu :Debugger->setting->Power (pour une faible consommation seulement)
8
8 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Matériels nécessaires Une carte cible munie d'un connecteur icd2 (rj12).
9
9 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Schéma minimum de démarrage
10
10 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Schéma minimum de démarrage Si la tension Vdd s'établit assez rapidement,on peut se passer du circuit RC de Reset et relier directement ● la broche /Reset à Vdd (si on utilise pas l'icd). Pour une application où la précision sur les durées n'est pas ● critique, on peut utiliser un circuit RC pour générer l'horloge. L'utilisation du programateur/débugger ICD2 ● fait perdre l'usage de : ● 2 broches E/S (RB6 et RB7) ● 2 niveaux de pile (sur 31 possibles) ● 512 octets de mémoire programme ● 10 octets de mémoire data.
11
11 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Documentations PIC 18F2520/4520 Data Sheet DS39631A.pdf MPLAB-C18-Getting-Started_51295f.pdf MPLAB-C18-Users-Guide_51288j.pdf MPLAB-C18-Libraries_51297f.pdf
12
12 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Logiciels nécessaires L'environnement MPLAB IDE (www.microchip.com) Le compilateur C18 (www.microchip.com) Pour le lcd de la carte picdem2+ la librairie xcldvvv.lib et son fichier entête xcldvvv.h correspondant. (arlotto.univ-tln.fr) N'hésitez pas à télécharger la version la plus récente : Les mises en jours sont fréquentes et corrigent de nombreux bugs. Pour ce cours on utilise : mplab v7.31c18 v3.02 (linker 4.02) xlcd100.lib
13
13 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Installation MPLAB : pré-installer les drivers usb C18 : cocher toutes les options et respecter le répertoire par défaut
14
14 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 ● Hello world pic18
15
15 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Hello world pic18 Créer un projet avec Project->Project Wizard... Choisir le bon pic (18f4520) Choisir le langage : Microchip C18 Toolsuite Créer un répertoire pour chaque projet 18f4520i 18f4520 Ajouter en copiant un linker script au projet. le script sample du pic correspondant convient la plupart du temps si vous n'utilisez pas de librairie supplémentaire 18f4520i.lkr si vous utilisez un icd 18f4520.lkr si vous utilisez pas d'icd Terminez
16
16 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Hello World pic18 Créez le fichier HelloWorld.c et ajoutez-le au projet #include // bits de configuration #pragma config OSC = HS // dépend de l'oscillateur utilisé #pragma config WDT = OFF // pas de wd pour debug #pragma config LVP = OFF // pas de lvp pour l'icd #pragma config PBADEN = OFF // RB4:RB0 digitales au reset void main(void) { PORTBbits.RB3 = 0 ; TRISBbits.TRISB3 = 0 ; // RB3 en sortie
17
17 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Hello World pic18 for(;;) { if(PORTAbits.RA4==0) { PORTBbits.RB3 = 1 ; } else { PORTBbits.RB3 = 0 ; } } // fin for } // fin main Compilez et linkez : Projet->Build All Corrigez vos erreurs éventuelles (puis Build All à nouveau)
18
18 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Hello World pic18 Debugger->Select Tool->MPLAB ICD2 connecter l'icd (Reset and connect icd) Chargez le programme sur la cible : Debugger->Program Lancez le programme : Debugger->Run Essayez le !! A ce stade le programme est chargé dans la cible mais elle n'est pas autonome : le pic attend l'ordre de l'icd pour démarrer. Pour rendre la cible autonome : Choisir l'icd en tant que "programmer" (Programmer- >Select Programmer) Recompiler et recharger le programme.
19
19 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Debugger avec l'icd Point d'arrêt : double-clic à gauche d'une ligne de programme Attention certaines les lignes du source ne se retrouvent pas dans le programme ! L'arrêt ou non du programme est une indication du passage par la ligne où est placé le point d'arrêt
20
20 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Debugger avec l'icd Visualisation de la valeur d'une variable : A l'arrêt passer la souris sur une variable montre sa valeur. Attention, une variable n'a qu'une valeur à un moment donné. La valeur montrée est donc indépendante de la position pointée dans le programme.
21
21 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Debugger avec l'icd Voir et modifier les variables et les registres avec une "watch window" la valeur en rouge indique : soit un changement depuis le dernier affichage soit une valeur que l'on a modifiée et qui sera chargée au prochain démarrage.
22
22 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 linker script Le fichier linker script contient la liste des fichiers qui seront liés au votre pour créer le fichier exécutable. Par exemple : FILES c018i.o // code de démarrage FILES clib.lib // librairie C "standard" FILES p18f4520.lib // fonctions spécifiques au 4250 Le code de démarrage c018i.o assure l'initialisation du pointeur de pile et des variables statiques initialisées mais pas la remise à zéro de la zone statique non initialisée. Si vous désirez un comportement conforme à la norme ANSI vous pouvez utiliser le fichier c018iz.o à la place. Le code de démarrage appelle ensuite la fonction main() dans une boucle infinie (généralement on ne sortira plus de main)
23
23 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 ● Utiliser un écran lcd ● à base d'un contrôleur HD44780
24
24 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Ecran lcd HD44780 C18 est fournit avec une bibliothèque de fonctions de pilotage d'un écran lcd HD44780 appelée xlcd par microchip. Les sources sont dans : C:\mcc18\src\traditional\pmc\XLCD Il suffit de modifier le fichier xlcd.h pour adapter les définitions aux lignes de commande utilisées dans votre câblage. Puis de recompiler la librairie de c18. Ce travail est fait pour le câblage de la carte picdem2+ (voir http://arlotto.univ-tln.fr/pic/pic18/sources_xlcdlib200/ )http://arlotto.univ-tln.fr/pic/pic18/sources_xlcdlib200/ Attention le câblage particulier des cartes picdem2+ (version 2006).
25
25 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Librairie LCD xlcd200 Il existe deux versions de la librairie xlcd200 : ➢ Une version avec tous les fichiers suffixés R pour les cartes picdem2+ antérieure à 2006 qui ont le module lcd câblé sur le PORTD (RD0-RD3) et le PORTA (RA1-RA3). ➢ Une version avec tous les fichiers suffixés V pour les cartes picdem2+ postérieures à 2006 qui ont le module lcd câblé sur le PORTD (RD0-RD7) (cablâge à utiliser de préférence si vous créez votre propre carte).
26
26 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Utiliser la librairie xlcd200 Recopier les fichiers xlcd200R.lib, xlcd200R.h et 18F4520ixlcd200R.lkr dans le répertoire de votre projet et ajoutez les au projet. Vérifier que : Dans Project->Build Option->Project : 1/ Library Path contient seulement : c\mcc18\lib Les autres champ sont vides 2/ Dans l'onglet MPLAB C18 Categories Memory Model Les modèles mémoires Code et RAM utilisés sont "Large" Inclure l'entête de la librairie par #include "xlcd200R.h" Pour printf inclure stdio.h par #include et changer la sortie standard par stdout =_H_USER ;
27
27 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Utiliser la librairie xlcd200 Initialiser le lcd par : OpenXLCD(OPEN_PICDEM_LCD); Ensuite les fonctions de stdio ainsi que les fonctions décrites dans la documentation microchip sont utilisables Pour positionner le curseur, une fonction supplémentaire est disponible : gotoXLCD gotoXLCD(LCD_LINE_ONE);// ligne 1 pos 0 unsigned char i =4 ; gotoXLCD(LCD_LINE_TWO+i); // ligne 2 pos i (4)
28
28 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Utiliser la librairie xlcd200 Voir un exemple sur : http://arlotto.univ-tln.fr/pic/pic18/xlcd200_demo.zip http://arlotto.univ-tln.fr/pic/pic18/xlcd200_demo.zip Les fichiers à récupérer sont à : http://arlotto.univ-tln.fr/pic/pic18/xlcd200/ http://arlotto.univ-tln.fr/pic/pic18/xlcd200/ Pour correction et adaptation on peut partir du projet : http://arlotto.univ-tln.fr/pic/pic18/sources_xlcdlib200.zip http://arlotto.univ-tln.fr/pic/pic18/sources_xlcdlib200.zip
29
29 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 ● Modèle de programmation
30
30 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Structure d'un programme Le programme embarqué dans le micro a la particularité de démarrer à la mise sous tension du système et de ne s'arrêter qu'à la coupure de l'alimentation. C'est donc un programme qui après une séquence d'initialisation tourne en une boucle infinie. Cette boucle peut être interrompue par des interruptions Les tâches de l'application sont exécutées en séquence les unes après les autres dans un ordre prédéfinit. Les tâches sont ici des séquences d'instructions qui répondent aux différentes fonctionnalités de l'application. Ce ne sont pas des boucles infinies.
31
31 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Interruption Une interruption est un évènement matériel* qui déclenche très rapidement l'exécution d'une partie de programme (appelée programme d'interruption). Après l'exécution du programme d'interruption, le µP reprend l'exécution normale du programme interrompu. * : sur certains µP, il existe aussi des évènements logiciels (division par 0, erreur d'adresse,instruction spéciale,...) qui peuvent déclencher une interruption : on parle alors d'interruption logicielle (ou synchrone).
32
32 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Modèle boucle infinie/ interruptions (superloop background/foreground) void main(void) { séquence d'initialisation ;....; autorisation éventuelle des interruptions ; for( ;;) { Tâche n°1 ; Tâche n°2 ;....; Tâche n° N ; }
33
33 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Modèle boucle infinie/ interruptions #pragma interrupt InterruptHandlerHigh void InterruptHandlerHigh () {....; } #pragma interrupt InterruptHandlerLow void InterruptHandlerLow () {....; } Sur un pic18, il ne peut y avoir que deux fonctions d'interruptions
34
34 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Timing boucle infinie / interruptions T1T2T3InitT1T2T3 temps Interruption low T2T1T2 Interruption high T1 T3T3 évènements basse priorité évènements haute priorité Background (Voir cours temps reél) Tboucle
35
35 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 ● Timing boucle infinie/interruptions Une tâche doit être effectuée le plus rapidement possible car son exécution retarde l'exécution des autres tâches. Temps de réponse d'une tâche <= Temps de parcours de la boucle générale. (Tboucle) Tboucle n'est pas constant. Dans la boucle infinie, on peut manquer des évènements dont la durée est inférieure au temps de boucle !
36
36 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Programmation boucle infinie/interruptions Les actions "urgentes" sont traitées par interruption. Les routines d'interruptions sont les plus courtes possibles. Les traitements dans la boucle infinie (tâches) sont les plus courts possibles car une tâche "longue" retarde toutes les autres. Lorsqu'une tâche se bloque, elle bloque toutes les autres tâches : Il faut un mécanisme logiciel pour attendre des événements sans boucle while (ni for) : machine d'états. Si une tâche boucle accidentellement, le système se fige. Un watch dog matériel permet de resetter le système. L'initialisation doit également être très courte en cas de reset par un watch dog.
37
37 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Éviter de "refaire" ce qui à été fait Pour ne pas ralentir inutilement une tâche, on a intérêt à ne pas refaire des calculs ou des affichages lorsque on est certain que le résultat sera le même ou que la variation sera négligeable. Exemple : Pour afficher une valeur, il n'est pas nécessaire de recommencer l'affichage si la valeur n'a pas changée depuis le dernier affichage. Pour ce faire on stocke la valeur affichée dans une variable que l'on compare à la valeur courante. Si la valeur affichée n'est pas à jour, on fait l'affichage et on remet à jour la variable. Si l'affichage est à jour on ne fait rien (et on gagne du temps).
38
38 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Éviter de "refaire" ce qui à été fait i nt Temp_courante int Temp_aff = -500 ; // valeur impossible pour avoir // un affichage au premier passage...... ; printf("Temp = °C"); // affichage partie fixe for( ; ; ) {.... ; Temp_courante = lire_temp(); // acquisition température if ( Temp_courante != Temp_aff ) { gotoXLCD(LCD_LINE_ONE + 5 ); // déplacement aprés = printf("%4d",Temp_courante); Temp_aff = Temp_courante ; }....; }
39
39 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Éviter de "refaire" ce qui à été fait Ne refaire un calcul que lorsque la grandeur a variée de plus qu'une certaine quantité : #define EPSILON 2 int Temp_old = xxx ; // valeur impossible.... ; for( ; ; ) {....; if ( abs (Temp_courante – Temp_old ) > EPSILON ) { calcul( ) ; Temp_old = Temp_courante ; }....; }
40
40 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 ● Attendre sans boucler
41
41 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Attendre sans boucler Dans beaucoup de systèmes on doit attendre un événement avant de passer à la suite des opérations. Souvent les spécifications s'énoncent ainsi : Mettre le four en marche jusqu'à ce que la température atteigne 180°C Attendre l'arrêt complet (vitesse nulle) avant d'ouvrir la porte Mettre le moteur en marche Attendre deux minutes Arrêter le moteur
42
42 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Attendre sans boucler Attendre l'arrêt complet (vitesse nulle) avant d'ouvrir la porte while(vitesse()!=0); PORTBbits.RB3=1; // ouvrir porte Mettre le four en marche tant que la température n'a pas atteint 180°C PORTBbits.RB2=1; // four en marche while(temperature()<180); PORTBbits.RB3=0; // arrêt four Avec ces lignes de programme les autres tâches seraient bloquées !
43
43 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Attendre sans boucler Une solution est de créer une machine d'état que ne passe à l'état suivant que lorsque la condition est réalisée Etat 0 Fermer porte Etat 1 Ouvrir porte Vitesse == 0 km/h Départ == 1
44
44 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Grafcet
45
45 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Attendre sans boucler En france, on a coutume d'utiliser la représentation GRAFCET. 0 1 Fermer porte Vitesse == 0 km/h Ouvrir porte Départ == 1 Un Etat est appelé ici étape Une transition est une équation logique placée entre deux étapes
46
46 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Règles d'évolution d'un grafcet Lorsqu'une étape possède plusieurs étapes suivantes, on s'imposera la condition : Produit des transitions = 0 Ainsi : on est forcé à examiner tous les cas lors de la conception du grafcet. Lors de la programmation l'ordre d'évaluation des transitions n'aura pas d'importance.
47
47 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Règles d'évolution d'un grafcet M Action N T_N_M Action M N Lorsque l'étape N est active et que la transition T_N_M est vraie : L'étape N est désactivée et l'étape M devient active
48
48 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Divergence en OU M Action N T_N_M Action M N P T_N_P Action P T_N_M. T_N_P = 0 Après l'étape N une seule des deux étapes M ou P peut être active.
49
49 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Divergence en ET M Action N T_N_M Action M N P T_N_P Action P La condition T_N_M. T_N_P = 0 n'est plus respectée. Après l'étape N les deux étapes M ou P peuvent être actives. Ce cas n'est pas traitée par la méthode suivante. On préférera faire deux grafcets.
50
50 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Divergence en ET simulée M Action N T_N_M Action M N P T_N_P et N active Action P 0 Attention il peut être nécessaire de désactiver l'action N
51
51 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Codage d'un grafcet en C Une variable (entière) contient le numéro de l'étape courante (en général initialisée à 0) Le grafcet est codé dans une structure switch...case Un cas par étape + un clause default en cas de problème logiciel. Le traitement d'une étape est effectué par un cas de la structure switch..case. Le grafcet "avance" éventuellement d'une étape à chaque exécution du switch...case (une fois par tour de boucle générale).
52
52 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Codage d'un grafcet en C int etape = 0 ; //initialisation....; for( ; ; ) {....; switch (etape) { case 0 : // traiter étape 0 ; break ; case 1 : // traiter étape 1 ; break ; case N :.......; break ; default : // erreur !!.......; }....; }
53
53 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Codage d'un grafcet en C Traitement d'une étape : case N : action N ; if ( T_N_M ) { etape = M ; } else { if ( T_N_P ) { etape = P ; } } break ; On exécute l'action de l'étape courante et ensuite on évalue les transitions vers les étapes suivantes. Si une transition est vraie on change simplement la valeur de la variable qui contient le numéro de l'étape courante. L'étape suivante sera alors active au prochain tour de boucle générale.
54
54 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 clause default Normalement on ne peut pas arriver dans la clause default. Si on y arrive c'est que la variable etape est corrompue ! Il s'agit d'une défaillance critique du logiciel. Il faut : mettre le système en sécurité, prévenir, redémarrer si nécessaire. Ce cas doit être prévu dès la conception.
55
55 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 ● Les Périphériques du 18F4520
56
56 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Périphériques du 18F4520 5 ports d'entrées sorties logiques (jusqu'à 34 broches E/S) 4 timers (2 de 8bits, 2 de 16bits) 2 modules CCP : Capture, Compare, Pwm (génération et mesures de signaux) 1 port série synchrone (I2C ou SPI) 1 port série asynchrone (UART) (utilisable en USB, RS232, RS485 avec un adaptateur externe) 1 convertisseur analogique numérique 10 bits (jusqu'à 13 canaux d'entrées) watch dog, détection tension alimentation basse fréquence horloge modifiable par programme 256 octets de mémoire EEPROM
57
57 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Entrées/sorties logiques Toutes les broches peuvent être configurées indépendamment en entrées ou sorties logiques. Au Reset les broches sont toujours configurées en entrées Attention les ports A et B sont partagés avec le module adc. Toutes les combinaisons Analogique/Digitale ne sont pas possibles. Le port A est configuré en analogique au Reset. Sauf RA4 qui est toujours digitale. RA4 : drain ouvert en sortie / trigger de smith en entrée La configuration au reset des broches RB4:RB0 du port B dépend du bit de config PBADEN : OFF : RB4:RB0 digitales au reset, ON : analogique On peut activer des résistances de pullup internes sur le PORTB. RB6 et RB7 sont dédiées à l'ICD
58
58 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Entrées / sorties logiques PORTA, PORTB et PORTE : Partagé avec le module convertisseur analogique/numérique PORTA : Analogique au reset. PORTB : Analogique ou digital au reset selon l'état du bit de configuration PBADEN Les configurations de chaque broches ne sont pas indépendantes. Voir le registre ADCON1 (DS39631A page 224) PORTC et PORTD : partagés avec d'autres fonctions mais toujours digitaux.
59
59 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Entrées/sorties logiques Trois registres importants : PORTx : bits représentants l'état réel de lignes d'E/S LATx : bits représentants l'état forcé des sorties TRISx : bits de configurations : 1 : entrée (valeur au reset) 0 : sortie Normalement pour une sortie LATx = PORTx sauf dans quelques cas particulier : court-circuit entre broches drain ouvert surconsommation
60
60 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Entrées/sorties logiques Entrée Configuration : TRISBbits.TRISB0 = 1 ; // inutile au reset Lecture : if(PORTBbits.RB0 == 0 ) {...... ; // action si 1 } else {..... ; // action si 0 Ecriture : sans effet (PORTBbits.RB0 = 1 ;)
61
61 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Entrées/sorties logiques Sorties Configuration : PORTBbits.RB3 = 0 ; TRISBbits.TRISB3 = 0 ; // il vaut mieux fixer l'état avant // que la broche soit une sortie Ecriture : PORTBbits.RB3 = 0 ; ou LATBbits.LATB3 = 0 ; Relecture : if ( PORTBbits.RB3==1) {.... ou if (LATBbits.LATB3==1) {....
62
62 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Convertisseur analogique/numérique Fonction : convertir une tension analogique, comprise entre deux tension de référence Vref- et Vref+, en une valeur numérique N sur n bits. Vref+ Vref- Ve N N = E[2 n x (Ve - Vref-) / (Vref+ - Vref-)] ( E[x]:partie entière de x ) ( Nmax = 2 n -1 car Ve<Vref+ )
63
63 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Convertisseur analogique/numérique LSB (ou quantum) : résolution du convertisseur. Incrément de tension d'entrée produisant une variation d'une unité du résultat de la conversion lsb = (Vref+ - Vref-)/2 n Fonction de transfert pour n=10bits
64
64 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Convertisseur analogique/numérique Résolution d'une mesure : plus petite variation de la grandeur qui produit une variation du résultat de la conversion. Ve = f(g) N = E [2 n. ( Ve – Vref- ) / (Vref+ - Vref-)] g1 => N1, g2 => N2 (N2-N1)mini = 1 => résolution g2 - g1 ADC N sur n bits g capteur Ve
65
65 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Convertisseur analogique/numérique Exemple de calcul de résolution : capteur linéaire Ve = A.g + B Vref- = 0 V g1 => Ve1 = A. g1 + B => N1 = 2 n. (A.g1 + B) / Vref+ g2 => Ve2 = A. g2 + B => N2 = 2 n. (A.g2 + B) / Vref+ N2-N1 = 2 n. A. (g2 – g1) / Vref+ N2 – N1 mini = 1 => résolution g2 – g1 = Vref+ / 2 n. A
66
66 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Convertisseur analogique/numérique Convertisseur 10 bits à approximations successives Jusqu'à 13 canaux d'entrées Références : haute : Vdd ou externe par l'entrée Vref+ (AN3) (1.8V mini) basse : Vss ou externe par l'entrée Vref- (AN2) Valeur obtenue : N = E[1024 x (Ve - Vref-) / (Vref+ - Vref-)] Avec références 0/5V : N = E[1024.Ve/5] Durée d 'une conversion : 12.Tad + Tacq (Tad = k. Tosc) Attention à respecter le temps de charge de CHOLD après un changement de canal
67
67 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Convertisseur analogique/numérique
68
68 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Convertisseur analogique/numérique Initialisation Choisir la configuration des broches : Analogique ou Digitale voir ADCON1 En déduire la constante à passer à la fonction OpenADC : Par exemple : RA0 analog les autres digitales => 14 Calculer la fréquence de l'horloge du convertisseur : il faut avoir TAD >= 0.8µs avec TAD = k.Tosc Choisir le plus faible k parmi 1,2,4,8,16,32 ou 64 En déduire la constante à passer à la fonction OpenADC Par exemple : ADC_FOSC_8
69
69 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Convertisseur analogique/numérique Initialisation Calculer le temps d'acquisition en fonction de l'impédance de la source (si plusieurs canaux prendre le max) : Tacqmin Choisir parmi les valeurs possibles la valeur de k qui vérifie : kTad > Tacqmin (cf DS39631A page 225-228) En déduire la constante à passer à la fonction OpenADC Exemple : ADC_4_TAD Choisir les références : Vdd ou AN3, Vss ou AN2 Exemple: ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS
70
70 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Convertisseur analogique/numérique Choisir le canal qui sera sélectionné après l'initialisation (On pourra en sélectionner un autre par la suite) Appeler la fonction OpenADC : OpenADC( ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_4_TAD, ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS, // non définit dans la doc rev. E !! 14 );
71
71 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Convertisseur analogique numérique Sélectionner le canal Soit à l'initialisation par OpenADC() Par la suite par la fonction SetChanADC() Lancer la conversion : ConvertADC(); Attendre la fin : while(BusyADC()); (ou 12TAD) Lire le résultat : int Result ; Result = ReadAC(); Une nouvelle conversion peut être relancée immédiatement même si on a changé de canal car le temps d'acquisition à été programmé lors de l'initialisation (sauf si on a choisit 0Tad) Pour économiser l'énergie on peut l'arrêter par CloseADC(); (attention il faudra refaire OpenADC() pour l'utiliser à nouveau)
72
72 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Convertisseur Analogique/Numérique Voir un exemple pour la carte picdem2+ à : http://arlotto.univ-tln.fr/pic/pic18/adc/
73
73 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Timers Un timer est un compteur 8 ou 16 bits préchargeable dont l'horloge Th peut être : Soit dérivée de l'horloge principale du PIC (4Tosc ou Kp.4.Tosc si on utilise un prédiviseur) Soit fournie par un signal externe (broche RA4/T0CKI pour le timer0) Soit fournie par un oscillateur interne supplémentaire (oscillateur du Timer1 (ou Timer3) avec quartz externe)
74
74 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Timer Timer x div. Kp Th N (sur 8 ou 16bits) Bit d'overflow TMRxIF Horloge Th = 4.Tosc si horloge interne sur Fosc ou Th = Text si horloge externe (pas de facteur 4)
75
75 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Timers Le passage de la valeur maximum (0xFF ou 0xFFFF) à 0 est appelé overflow. L'overflow provoque le passage à 1 du bit TMRxIF. Une interruption est disponible sur l'overflow. On peut lire/écrire une valeur dans le compteur. (Précautions nécessaires pour les compteurs 16bits)
76
76 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Timers La durée entre deux overflow est : Toverflow = (2 n – valeur initiale). Kp.Th (n = 8 ou 16) On peut donc : produire des interruptions à intervalle régulier pour réaliser des temporisations (cf chapitre Gestion du Temps) produire une interruption un certain temps après un événement. mesurer le temps entre deux événements 1 et 2. A t1 on lit C1 dans le compteur, à t2 on lit C2 Après la lecture à t1 on compte les overflow et on a : t2 -t1 = (C2 -C1).Th + (nombre d'overflow).Toverflow
77
77 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Exemple LeLe Le timer 1 est un timer 16 bits. Avec une horloge externe à 32.768 kHz et sans prédiviseur on a : Toverflow = 2 16. 1/32768 = 2s En rechargeant la valeur 32768 après chaque overflow on a : Toverlfow = (2 16 – 32768). 1/32768 = 1s En rechargeant la valeur 49152 après chaque overflow on a : Toverlfow = (2 16 – 49152). 1/32768 = 0.5s Voir la mise en oeuvre à : http://arlotto.univ-tln.fr/pic/pic18/timers/tempo_timer1.c http://arlotto.univ-tln.fr/pic/pic18/timers/tempo_timer1.c
78
78 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Signal PWM t T Vmoy = Vmax. t / T Utilisations : Génération d'une tension analogique après filtrage Commande en vitesse de moteur DC Commande d'actionneur en position..... Vmax
79
79 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Générer un signal PWM Deux modules CCP (capture, Compare, Pwm) peuvent être utilisés pour générer deux signaux PWM de même période et de rapport cyclique indépendant. Module CCP1 : sortie pwm sur RC2. Module CCP2 : sortie pwm sur RC1 ( ou RB3 en fonction de l'état d'un bit de configuration). La période est fixée par les overflow du timer2. Le temps à l'état haut est modifiable par la fonction SetDCPWMx
80
80 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Générer un signal PWM On souhaite générer un signal pwm de période T = 1ms et de rapport cyclique 35,8% sur RC2. Le pic à un quartz de 4Mhz. RC2 => Module CCP1 => fonctions indicées 1 Calcul de la valeur à passer à la fonction OpenPWM1 : T = (PR2+1).4.Tosc.K2 (K2=prédivision du timer2 1,4 ou 16) Avec K2 = 1 => PR2+1 = 1ms/1µs = 1000 > 256 impossible Avec K2 = 4 => PR2 + 1 = 1ms/4us = 250 < 256 possible Avec K2 =16 ce sera donc possible mais résolution plus faible on choisit donc K2=4, PR2 = 249 donc on fait OpenPWM1(249);
81
81 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Générer un signal PWM Rapport cyclique : 35,8 % => Temps à l'état haut = 0.358ms 0.358 ms = dutycyle. Tosc. K2 = dutycyle. 0.25us. 4 Soit dutycyle = 358 ( <= 1023 donc possible) Pour 100% on aurait 1000us = dutycyle. 0.25us. 4 soit dutycycle = 1000 Programmation : OpenPWM1(249); OpenTimer2(TIMER_INT_OFF & T2_PS_1_4 ); SetDCPWM1(358); (Attention bien que la broche RC2 soit une sortie, il ne faut pas mettre TRISC2 à 0 c'est maintenant le module pwm qui gère cette broche et plus le port C.)
82
82 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Générer un signal PWM Voir un exemple plus simple (sans prédiviseur) à : http://arlotto.univ-tln.fr/pic/pic18/pwm/pwm.c Par la suite on peut modifier le rapport cyclique par un nouvel appel à SetDCPWM1()
83
83 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Liaison série asynchrone S1S2 Tx Rx M Tx Rx M But : Transmettre des octets entre deux systèmes Il y a au moins 3 fils : Rx réception Tx émission Masse Si les systèmes S1 et S2 sont identiques, le câble est forcément croisé.
84
84 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 ● Liaison série asynchrone Format de transmission : Ligne inactive (idle) : niveau haut Bit de start : marque le début de la transmission d'un octet. D0,D1...D7 : l'octet est transmis avec D0 en premier (lsb fisrt) Bit de parité : optionnel Bit de stop : marque la fin de la transmission (un nouveau caractère peut être transmis dès la fin du bit de stop. Dans ce cas il n'y a état idle)
85
85 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 ● Liaison série asynchrone Parité : Mécanisme rudimentaire de détection d'erreur. A l'émission le bit de parité est positionné pour que le nombre total de bit à 1 soit pair (parité paire) (ou impair si on travaille en parité impaire). A la réception, on vérifie que dans l'octet reçu le nombre de bit à 1 est bien pair (ou impair si on travaille en parité impaire). Si ce n'est pas le cas on considère qu'il y eu erreur de transmission. Ce mécanisme est mis en défaut si il y a plus d'un bit en erreur. (Pour détecter (voire corriger) plusieurs erreurs, il faut rajouter plusieurs bits : codes correcteurs d'erreurs.)
86
86 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 ● Liaison série asynchrone Norme RS232 : 5 V (idle) : - 10 V environ 0V (actif) : + 10 V environ Norme RS485 : c'est la différence de tension entre deux fils U+ et U- qui contient la donnée 1:U+>U- 0:U=<U- Vitesse normalisée (bits/s): 300, 600,1200, 2400, 4800, 9600, 19200,38400 57600,115200 progression x2 jusqu'à 38400puis 38400 x 1.5 = 57600 puis 57600 x 2 = 115200
87
87 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Liaison série asynchrone Brochage DB9
88
88 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Conversion TTL/RS232
89
89 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Logiciels émulateurs de terminal Très pratique pour la mise au point un émulateur de terminal est un logiciel qui permet d'envoyer et de recevoir des caractères sur un port série : Pour Linux : gtkterm ou minicom Pour Windows : Hyperterminal Nom des ports séries : Linux : classiques : /dev/ttyS0 /dev/ttyS1,.... virtuels usb : /dev/ttyUSB0, /dev/ttyUSB1,.... Windows : classiques : COM1, COM2 virtuels usb : souvent COMx x>=3
90
90 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Module USART Associé à un circuit MAX232 ou FDTI FT232R par exemple, le module USART du Pic permet la communication RS232 ou USB. En USB, on obtient un port série virtuel. Driver disponible sur le site de ftdi pour Windows (Natif sous Linux). Utilisé seul il permet la communication série asynchrone ou synchrone avec d'autres circuits alimentés en 5V. Il permet d'envoyer et de recevoir des octets. Nous n'utiliserons ici que le mode asynchrone (RS232)
91
91 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Module USART Initialisation : Vitesse : deux possibilités : High Speed Vitesse en bit/s = Fosc / (16. (spbrg + 1)) Low Speed Vitesse en bit/s = Fosc / (64.( spbrg + 1)) Faire les deux calculs de spbrg. Si deux valeurs sont possibles (0-255) choisir celle qui donne le moins d'erreur.
92
92 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Module USART Exemple : 9600 bit/s à Fosc = 4MHz High Speed : USART_BRGH_HIGH spbrg = 25 erreur = +0.16% Low Speed : USART_BRGH_LOW spbrg = 6 erreur = -6.99% On choisit donc High Speed
93
93 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Module USART Choisir USART_CONT_RX pour recevoir des caractères en continu. Les autres possibilités sont évidentes : OpenUSART( USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH, 25 );
94
94 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Module USART émettre un caractère (octet quelconque): char c ; c = 'A' ; WriteUSART(c);
95
95 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Module USART Pour utiliser printf, il suffit que la sortie standard soit dirigée sur le module USART. stdout = _H_USART ; printf("Coucou !\r"); C'est le cas au reset. Si on a redirigé la sortie sur le lcd par exemple (stdout = _H_USER;) il suffit de la rediriger vers l'USART pour que printf sorte à nouveau sur le module USART.
96
96 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Module USART Réception ( souvent réalisée sous interruption ) : char c ; if(DataRdyUSART() ) { c = ReadUSART() ; }
97
97 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 ASCII ou Binaire ? On peut choisir de transmettre les données en ASCII ou directement en binaire : Pour transmettre la valeur d'une variable : int a = 1000 ; En Ascii : printf("%d",a); Ou Directement en binaire : WriteUSART( a&0xFF) ; // poids faible WriteUSART( (a&0xFF00)>>8); // poids fort
98
98 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 ACSII ou binaire ? En ASCII pour la valeur 1000, 4 caractères seront Transmis : '1' '0' '0' '0' En binaire toujours pour 1000 (0x03E8) seulement deux octets : 0x03 puis 0xE8 (ou l'inverse) ASCII : - plus long car plus de valeur à transmettre :-( - lisible directement avec un terminal :-) - compatible avec tous les systèmes :-) Binaire : - plus rapide car moins d'octet à transmettre :-) - mise au point plus difficile (pas lisible directement) :-( - on doit tenir compte de l'ordre des octets lors de la réception : problème Big Endian / Little Endian. :-(
99
99 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Module USART Voir deux exemples sur : http://arlotto.univ-tln.fr/pic/pic18/liaison_serie
100
100 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Les chaînes de caractères En C une chaîne de caractères est une suite de char dont la fin est marquée par le caractère de valeur 0x00 (noté'\0') char Ch[12]="Bonjour !" ; Il existent de nombreuses fonctions C ANSI permettant de manipuler les chaînes de caractères : affichage, recopie, comparaison, concaténation, recherche de motif, etc... MPLAB C18 fournit la plupart des fonctions standards mais du fait de la structure mémoire du pic il y a plusieurs fonctions C18 pour une même fonction C ANSI.
101
101 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Fonctions C18 sur les chaînes de caractères Il faut utiliser la bonne version d'une fonction selon la mémoire dans la laquelle sont stockés les arguments : strcpy : de mémoire data à data strcpypgm : de mémoire programme à programme strcpypgm2ram : de mémoire programme à data strcpyram2pgm : de mémoire data à programme
102
102 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Fonctions C18 sur les chaînes de caractères // Chaîne stockée en mémoire programme : const rom char Ch[]="bonjour !" ; void main(void) { // Chaîne en mémoire data char RamCh[15] ;....; // Copie de Ch dans RamCh strcpypgm2ram(RamCh,Ch); }
103
103 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus I2C
104
104 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Le Bus I2C Il permet l'échange bidirectionnel d'informations (octets) entre différents circuits intégrés (I2C = IIC = Inter Integrated Circuit) connectés sur un bus à deux fils SCL (horloge) et SDA (données). µC Master Circuit 1 Vdd SDA SCL Circuit 2Circuit 3 slave1slave2slave3 Configuration classique : un µC maître et plusieurs esclaves. Chaque esclave possède une adresse unique. (7bits=112 adresses possibles ou 10bits=plus de 1000 adresses possibles) document de référence : The I2C-bus specification Philips Semiconductors VERSION 2.1 JANUARY 2000 www.nxp.com Vitesses : 100 kb/s à 3.4Mb/s
105
105 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus I2C : Terminologie Transmitter : le circuit qui émet des données sur le bus Receiver : le circuit qui reçoit des données sur le bus. Master : le circuit qui est à l'initiative de l'échange sur le bus; Il génère l'horloge et termine le transfert. Slave : le circuit adressé par un Master. Lors d'un échange on peut avoir : Master/Transmitter Slave/Receiver puis Master/Receiver Slave/Transmitter Par exemple lecture d'une mesure sur un capteur I2C.
106
106 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus I2C : Transfert d'un bit L'état du bit (sur SDA) est lu lorsque l'horloge (SCL) est à l'état haut. Le changement d'état n'a lieu que lorsque SCL est au niveau bas. Les échanges se font toujours par octets complets. (8bits = 8 fronts de SCL)
107
107 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus I2C : Conditions START et STOP Lorsque SDA change d'état alors que SCL est au niveau haut, il s'agit de conditions spéciales appelées : START (S) et STOP (P) Start et stoP sont toujours générées par un MASTER. Le bus est occupé après Start et libre après stoP. Le bus reste occupé si un S remplace un P à la fin d'un échange. On appelle cette configuration REAPETED START notée Sr.
108
108 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus I2C : Acknowledge Lors du transfert d'un octet une neuvième période d'horloge est générée pour le bit Acknowledge. Acknowledge = état bas de SDA Not Acknowledge = état haut de SDA
109
109 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus I2C : Acknowledge Acknowledge = état bas de SDA Not Acknowledge = état haut de SDA
110
110 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus I2C : Acknowledge L'acknowledge est toujours généré par un receiver. Il peut (doit) être testé par le transmitter pour décider de la suite des opérations sur le bus. Slave receiver : Un slave receiver génère toujours un Acknowledge à la fin de chaque octet reçu. Si l'acknowledge n'est pas généré, c'est que la donnée n'a pas été reçue correctement (esclave occupé, adresse inconnue, désynchronisation, etc...). Aucune autre donnée ne peut être alors reçue. Le maître doit alors interrompre l'échange par un P (ou un Sr). Master receiver : Le master receiver génère un Acknowledge à la fin de chaque octet reçu sauf pour le dernier. Il génère alors un Not Acknowledge pour signaler au slave transmitter la fin d'un échange. Ensuite il génère un P (ou un Sr) afin de clore la transaction sur le bus.
111
111 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus I2C : Adressage 7 bits Chaque esclave possède une adresse unique sur 7 bits. L'adresse est transmisse par le maître en ajoutant un 8 ème bit R/W: 0 pour écrire (/W), 1 pour lire (R). Exemple : adresse 7bits esclave 1001 010. écriture : 1001 0100 = 0x94 (toujours paire) lecture : 1001 0101 = 0x95 (toujours impaire) Par abus de langage on dit que l'esclave possède deux "adresses", l'une en écriture (0x94) l'autre en lecture (0x95)
112
112 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus I2C : Exemple de transfert (1) Un maître envoie des données (master transmitter) à un esclave (slave receiver).
113
113 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus I2C : Exemple de transfert (2) Un maître lit des octets d'un esclave. Master receiver / Slave transmitter. Remarquez le "not ackonwledge" après la lecture du dernier octet (/A).
114
114 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus I2C : PIC18 en master C18 fournit des fonctions pour gérer simplement le module MSSP en mode I2C master (et aussi en mode slave). Attention sur les 18F4520/2520 il n'y a qu'un seul module MSSP. Donc il faut choisir entre I2C ou SPI. #include Initialisation : unsigned char x ; OpenI2C( MASTER, SLEW_OFF ) ; SSPADD = 9 ; // 100Khz pour Fosc=4Mhz ( voir DS39631 §17.4.7) x=SSPBUF ; // Lecture factice pour assurer un buffer vide.
115
115 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus I2C : PIC18 master : Générer des conditions Générer un START (et attendre qu'il soit fini) : StartI2C(); IdleI2C(); Générer un STOP (et attendre qu'il soit fini) : StopI2C(); IdleI2C(); Générer un REPEATED START (et attendre qu'il soit fini) : RestartI2C(); IdleI2C(); Générer un Acknowledge positif : AckI2C(); IdleI2C(); Générer un Not Acknowledge : NotAckI2C(); IdleI2C();
116
116 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus I2C : PIC18 master : lire / écrire unsigned char c ; Ecrire un octet sur le bus (vers un slave receiver) : WriteI2C( c ) ; IdleI2C(); Lire un octet sur le bus (depuis un slave transmitter) : if ( DataRdyI2C() ) { c = ReadI2C(); } * si on veut bien accepter d'être bloqué en attente de la disponibilité d'une donnée on peut se passer du test avec DataRdyI2C().
117
117 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus I2C : Exemple Le circuit TC74 est un thermomètre numérique accessible par le bus I2C. Il est présent sur la carte PICDEM2+. (Voir doc Microchip TC74 21462c). Son adresse est fixée à la fabrication du circuit par défaut c'est 1001 101. Ce qui donne 1001 1010 = 0x9A pour écrire et 1001 1011 = 0x9B pour lire. La température est donnée par le circuit sous la forme d'un octet contenant la valeur signée en nombre entier de degrés Celsius.
118
118 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus I2C : Exemple 0x9A 0x00 0x9BTemp Register
119
119 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus I2C : Exemple D'où le programme (ack du tc74 non testés): signed char temp ; unsigned char x ; OpenI2C( MASTER, SLEW_OFF ) ; SSPADD = 9 ; x=SSPBUF ; StartI2C(); IdleI2C(); WriteI2C(0x9A); IdleI2C(); WriteI2C(0x00); IdleI2C(); RestartI2C(); IdleI2C(); WriteI2C(0x9B); IdleI2C(); temp = ReadI2C(); IdleI2C(); NotAckI2C(); IdleI2C(); StopI2C();
120
120 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus SPI
121
121 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Principes Le Bus SPI permet l'échange bidirectionnel de données sur le Mode Maître/Esclave par une transmission série synchrone full duplex. Données Maître -> esclave Horloge Maître -> esclave Registre à décalage Données Esclave -> maître Registre EMISSION / RECEPTION Slave Select (optionnel)
122
122 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Les signaux SCLK ( clock ) : horloge MOSI ( Master Output, Slave Input ) sortie donnée maître, entrée donnée esclave MISO ( Master Input, Slave Output ) entrée donnée maître, sortie donnée esclave SS ( Slave Select ) sélection esclave Les paramètres CPOL et CPHA déterminent quatre "modes" spi possibles. Il faut bien sûr que le mode soit indentiques sur le maître et l'esclave. CPOL : polarité de l'horloge. CPHA : front sur lequel le bit est échantillonné.
123
123 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus SPI : PIC18
124
124 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Chronogrammes des signaux
125
125 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Chronogrammes des signaux
126
126 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Connexion de plusieurs esclaves Esclaves en parallèle Sélection par /SS (la plus courante) Daisy Chain : la sortie d'un esclave alimente l'entrée du suivant.
127
127 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus SPI : PIC18 en master C18 fournit des fonctions pour gérer simplement le module MSSP en mode SPI master (et aussi en mode slave). Attention sur les 18F4520/2520 il n'y a qu'un seul module MSSP. Donc il faut choisir entre I2C ou SPI. #include Initialisation : unsigned char x ; OpenSPI(SPI_FOSC_16, MODE_00, SMPEND); SPI_FOSC_16 -> Fclock = Fosc/16 MODE_00 -> CPOL et CPHA à 0 SMPEND → les bits entrants sont lus à la fin d'un cycle d'écriture d'un bit
128
128 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus SPI : PIC18 en master Fonctions d'écritures : Un octet : unsigned char x ; WriteSPI(x); Plusieurs octets : suite terminée par un octet à zéro (non émis sur le bus) : unsigned char data[10]; putsSPI(data); Attention sur le bus SPI, il est courant de travailler directement en binaire.
129
129 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Bus SPI : Pic 18 en master DataRdySPI() retourne vrai si des données un octet est prêt à être lu. Lire un octet : unsigned char r ; r = ReadSPI(); Lire plusieurs octets : unsigned char data[10]; getsSPI(data,10); Attention on n'obtient pas nécessairement une chaîne de Caractères au sens du C (terminée par 0) car on travaille souvent directement en "binaire".
130
130 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 ● Fonctionnement Interne
131
131 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 La mémoire programme (Flash) 21 bits d'adresses = 2 Mo d'espace adressable Sur 18F452 seulement 32ko implémentés (de 0x0000 à 0x7FFF) Au Reset PC = 0x000000 Les instructions sont codées sur 16 bits (2 cases). Les instructions commencent donc toujours à une adresse paire. 32ko => 16k instructions
132
132 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 La mémoire de données (Ram data memory) 12 bits d'adresses 0x000 à 0xFFF 8 bits de données soit 4ko possibles Seulement 1536o existent sur le 18F452
133
133 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 La mémoire de données (Ram data memory) Elle est organisée en 16 banques de 256o: bank0 à bank15. On change de banque lorsque le chiffre héxa de poids fort change : bank0 0x000 – 0x0FF (256o) bank1 0x100 – 0x1FF bank2 0x200 – 0x2FF.... bank15 0xF00 – 0xFFF La zone 0xF80 – 0xFFF est allouée aux SFR : registre dédiés à une fonction (port E/S, configuration périphériques,...) SFR : special fonction register GP : General Purpose (case mémoire à usage général) Seules les banques 0 à 5 existent sur le 18F452 6x256o=1536o=1.5ko
134
134 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 La mémoire de données (Ram data memory) Le BSR Bank Select Register est un SFR qui contient le poids fort de l'adresse RAM utilisée (la banque). Un zone particulière de 256o constituée des 128 premiers octets de la banque 0 et des 128 SFR est appelée ACCESS BANK. Cette zone permet d'accéder à des registres GP et SFR sans devoir changer de banque (pas de modification du BSR) Pour optimiser la durée et la taille des programmes, les compilateurs C essayent de placer les variables le plus souvent utilisées et les résultats de calculs intermédiaires dans la zone ACCESS BANK.
135
135 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Exécution d'une instruction ● Une instruction est d'abord lue en mémoire puis exécutée. ● Ce processus prend deux cycles : un cycle pour la lecture en mémoire programme (fetch) un cycle pour l'exécution et la sauvegarde du résultat. ● L'architecture de harvard permettant l'accès simultané ● aux deux mémoires, le pic exécute un cycle fetch sur la ● prochaine instruction pendant le cycle d'exécution ● de l'instruction en cours. ● Ainsi la plupart des instructions sont exécutées en un cycle.
136
136 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Relation Cycle / Horloge Un cycle dure 4 périodes de l'horloge dénommées : Q1,Q2,Q3,Q4. Tcy = 4. Tosc Tosc = 1/Fosc Fosc : fréquence de l'horloge Exemple : avec un quartz à 4 Mhz, un cycle dure 1µs Fosc=4Mhz d'où Tosc=0.125µs et Tcy = 4 x 0.125µs = 1µs
137
137 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Cycles machines Un cycle "Fetch" : le PC est incrémenté sur Q1 puis l'instruction est lue (Q2,Q3) et placée dans le registre d'intructions (Q4). A la fin d'un cycle fetch le PC est incrémenté de 2 unités (instruction sur 16bits) et pointe l'adresse de la prochaine instruction.
138
138 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Cycles machines Un cycle d'exécution : Q1 configuration par le registre d'instruction (décodage) Q2 lecture de l'opérande (data memory read) Q3 calcul Q4 écriture du résultat (destination write)
139
139 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 pipeline Grace à l'architecture de harvard, pendant l'exécution d'une instruction, on lit l'instruction suivante. Ainsi la plupart des instructions s'exécute en un seul cycle. Rupture de séquence : Les instructions de branchement (goto, call) et les instructions de branchement conditionnel provoquent des modifications du PC qui fait que l'instruction suivante qui avait été lue n'est plus valable. Un cycle (fetch) est nécessaire pour aller lire l'instruction à la nouvelle adresse avant de l'exécuter. Une instruction vide (nop) est exécutée à la place de l'instruction lue en avance dans le pipeline. Les instructions qui modifient le PC nécessitent donc 2 cycles.
140
140 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 ● Chaîne de développement
141
141 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Chaîne de développement Source C Compilateur C Code Objet int x,y ;.... if(x!=0){ y=x++; } Le code objet est le code source traduit en instructions de processeur. Ce code n'est pas exécutable car il manque les adresses des différentes zone mémoires (sections). C'est un code dit relogeable. (Les adresses réellement utilisées seront fixées lors de l'édition de liens)
142
142 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Chaîne de développement Source en langage d'assembla ge Assembleur Code Objet Deb : movlw 5 goto Loop.... addwf X subf Y,w Loop: Le langage d'assemblage est un langage composé d'instructions du processeur écrites en mnémonique. Chaque type de processeurs possède son propre langage d'assemblage.
143
143 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Compilateur C Le compilateur transforme le code source C en code source assembleur avant de produire le code objet. Source C Source Assembleur Code Objet On peut généralement examiner le code source assembleur généré par un compilateur par l'option -S (stop). Ex : gcc -S test.c On estime qu'un compilateur C produit un programme 5 à 10% plus gros et moins rapide qu'un programme écrit en langage d'assemblage par un bon programmeur.
144
144 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Editeur de liens L'éditeur de liens (linker) rassemble les fichiers objets issus des fichiers sources (C, assembleur ou autre) ainsi que des fichiers de librairies (standard ou spécifiques) pour former le fichier exécutable. Il utilise pour cela les valeurs des adresses des différentes sections (code,data,....) qui sont spécifiques à la carte ou au microcontrôleur utilisé. Ces adresses lui sont fournies par un fichier de configuration (linker script)
145
145 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Chaîne de développement Code Objet main.o Code Objet fonc.o Code Objet adc.o Librairie math.lib Librairie std.lib Editeur de liens (linker) Fichier Exécutab le Fichier de configuration du linker linker script
146
146 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Chaîne de développement
147
147 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Configuration linker pour 18f4520 LIBPATH. FILES c018i.o //code de démarrage (à remplacer par c018iz.o pour raz zone statique) FILES clib.lib //librairie standard FILES p18f4520.lib //lib librairie spécifique f4520 CODEPAGE NAME=vectors START=0x0 END=0x29 PROTECTED CODEPAGE NAME=page START=0x2A END=0x7FFF CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED CODEPAGE NAME=eedata START=0xF00000 END=0xF000FF PROTECTED ACCESSBANK NAME=accessram START=0x0 END=0x7F DATABANK NAME=gpr0 START=0x80 END=0xFF DATABANK NAME=gpr1 START=0x100 END=0x1FF DATABANK NAME=gpr2 START=0x200 END=0x2FF DATABANK NAME=gpr3 START=0x300 END=0x3FF DATABANK NAME=gpr4 START=0x400 END=0x4FF DATABANK NAME=gpr5 START=0x500 END=0x5FF ACCESSBANK NAME=accesssfr START=0xF80 END=0xFFF PROTECTED SECTION NAME=CONFIG ROM=config STACK SIZE=0x100 RAM=gpr5 section programme section Ram data memory
148
148 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Du C à l'assembleur puis dans le µP Instructions µP movlw 3 movwf 0x000 movf 0x000, w addlw 2 movwf 0x001 Portions de programme C : char x, y ;....; x=3; y=x + 2 ;....; Compilate ur Comme les véritables adresses sont inconnues à ce stade, on prend 0 comme base. par exemple : 0x000 pour x, 0x001 pour y
149
149 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Du C à l'assembleur puis dans le µP x = 3 ; movlw 3 déplace (move) la constante (literal) 3 dans w movwf 0x000 déplace w dans la mémoire (file) d'@ 0x000 y = x + 2 ; movf 0x000, w move file 0x000 (x) dans w (w=x) addlw 2 add literal 2 to w result in w (w=w+2) movwf 0x001 move w to file 0x001 (y) (y=w) NB : si ces deux instructions C se suivent, l'instruction movf 0x000,w est inutile. C'est le rôle de l'optimiseur de s'en apercevoir et de la supprimer pour rendre le programme plus court et plus rapide.
150
150 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Du C à l'assembleur puis dans le µP if( x == y ){ y=122; x++; } 0x000000 movf 0x000,w (w=x) 0x000002 subwf 0x001,w (w=y-w) 0x000004 bnz 0x003 0x000006 movlw 122 0x000008 mowf 0x001 0x00000A incf 0x000,1 0x00000C...... On va soustraire x de y. si le bit n°2 (Z) du registre d'état (0xFD8) ne vaut pas 1 on saute les instructions du if (bnz : branch if not Zero)
151
151 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Et dans le µP Address Opcode Disassembly 00E6 0000NOP 00E8 5100MOVF x, W, BANKED 00EA 5D01SUBWF y, W, BANKED 00EC E103BNZ 0xf4 00EE 0E7AMOVLW 0x7a 00F0 6F01MOVWF y, BANKED 00F2 2B00INCF x, F, BANKED 00F4 0000NOP 00F6 0000NOP Contenu de la mémoire programme
152
152 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 ● Les interruptions
153
153 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Programmation boucle infinie/interruptions Les actions "urgentes" sont traitées par interruption. Les routines d'interruptions sont les plus courtes possibles. Les traitements dans la boucle infinie (tâches) sont les plus courts possibles car une tâche "longue" retarde toutes les autres. Lorsqu'une tâche se bloque, elle bloque toutes les autres tâches : Il faut un mécanisme logiciel pour attendre des événements sans boucle while (ni for) : machine d'états. Si un tâche boucle accidentellement, le système se fige. Un watch dog matériel permet de resetter le système. L'initialisation doit également être très courte en cas de reset par un watch dog.
154
154 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Les interruptions Traitement immédiat Le traitement associé à l'interruption est effectué directement dans la routine d'interruption. Utilisé pour des événements urgents dont le traitement est court. Ex : arrêt d'urgence, mesure de temps, temporisations.... Traitement différé La routine d'interruption positionne simplement une variable (globale) qui sera utilisée par une tâche pour effectuer le traitement associé. Le temps de réponse est alors le temps de réponse de la tâche mais l'évènement ne peut être manqué. Utilisé pour des évènements à ne pas manquer mais dont le traitement est plus long. Traitement mixte (une partie immédiate, une partie différée)
155
155 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Interruptions : Traitement différé unsigned char it; void main(void) {......; for( ;;) {...... ; if ( it ) { traitement ; it=0; }...... ; } #pragma code #pragma interrupt isr void isr(void) { if(bit F){ it = 1 ; RAZ bit F ; } } Rq : Si it vaut 1 lorsque, on arrive dans la routine c'est qu'on a manqué le traitement d'une interruption (overflow) On peut tester it et signaler une erreur.
156
156 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Interruptions sur PIC18 Les différentes sources d'interruptions peuvent être soit : Désactivées Activées et assignées au vecteur de priorité haute (0x000008) Activées et assignées au vecteur de priorité basse (0x000018)
157
157 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Interruptions sur pic18 Un bit F (Flag) qui indique que l'événement s'est produit. Un bit E (Enable) qui autorise le programme à se dérouter vers le vecteur d'interruption (qui est fonction du bit P) lorsque F passe à 1. Un bit P (Priority) qui sélectionne le vecteur utilisé par la source correspondante (1 : High vector / 0 Low vector) *sauf INT0 qui n'a pas de bit P (priorité toujours High) Chaque source d'interruption* possède trois bits qui contrôlent son fonctionnement :
158
158 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Interruptions sur pic18 Attention, le bit F ne repasse pas à 0 lorsque l'événement disparaît ou lorsque on rentre dans la routine d'interruption. C'est au programmeur de penser à le remettre à 0 dans la routine d'interruption. Si ce n'est pas fait la condition d'interruption est toujours considérée active et il n'y a pas de retour dans la boucle générale.
159
159 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Interruptions sur pic18 Le pic possède deux modes de fonctionnement : RCONbits.IPEN=0 ; Mode par défaut compatible Mid-Range (PIC16) : Les priorités ne sont pas utilisées (bits P sans effet). Seul le vecteur High (0x000008) est utilisé. Les interruptions sont autorisées par INTCONbits.GIE et INTCONbits.PEIE (cf DS39564B ch 8.0 fig 8-1) RCONbits.IPEN=1 ; Les bits P fixent le vecteur utilisé par chaque source. INTCONbits.GIEH autorise les sources assignées au vecteur haute priorité. INTCONbits.GIEL autorise les sources assignées au vecteur basse priorité.
160
160 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Mise en oeuvre avec C18 1/ Dans la séquence d'initialisation, autoriser la source a produire une interruption : Soit en mettant le bit E à 1, soit en passant des paramètres d'activation à la fonction Open du périphérique. Fixer la priorité par le bit P. 2/ En fin de séquence d'initialisation, autoriser globalement les interruptions selon le mode par GIE/PEIE ou par GIEH/GIEL. 3/ Ecrire une ou deux fonctions d'interruption. void isr_high_vector(void); void isr_low_vector(void); 4/ Placer un branchement (goto) vers les fonctions d'interruption aux adresses des vecteurs 8 et 18.
161
161 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Mise en oeuvre avec C18 La fonction gestionnaire d'interruption doit : tester chaque bit F pouvant déclencher l'interruption Effectuer le traitement correspondant (rapidement!) Remettre à zéro le bit F. #pragma code #pragma interrupt InterruptHandlerHigh void InterruptHandlerHigh (){ if (bit F source x ){ Traitement correspondant à la source x ; bit F source x = 0 ; } if (bit F source y ){ Traitement correspondant à la source y ; bit F source y = 0 ; }....; }
162
162 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Placement des branchements #pragma code InterruptVectorHigh = 0x08 void InterruptVectorHigh (void) { _asm goto InterruptHandlerHigh //jump to interrupt routine _endasm } Idem pour le vecteur 0x18
163
163 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Exemples http://arlotto.univ-tln.fr/pic/pic18/interruptions/ http://arlotto.univ-tln.fr/pic/pic18/liaison_serie/
164
164 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 ● Gestion du temps
165
165 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Temporisations Temporisations basées sur la durée des instructions Temporisations basées sur la durée de la boucle générale Temporisations basées sur une interruption périodique
166
166 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Temporisations basées sur la durée des instructions Ces temporisations consistent à répéter des instructions jusqu'à obtenir la durée voulue. On peut les réaliser à partir d'une boucle for (ou plusieurs imbriqués pour des durées plus longues) : for (i=0; i <3000; i++) ; Les durées obtenues sont précises et stables (basées sur l'horloge du µP : quartz ). L'inconvénient majeur est de bloquer la suite du programme pendant la durée de la temporisation. A réserver à des durées très faibles devant le temps de réponse souhaité.
167
167 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Temporisation basée sur la durée de la boucle générale Il suffit de déclencher un traitement une fois tous les N tours de la boucle générale. La durée obtenue est N.Tboucle. C'est simple à mettre en oeuvre mais c'est peu précis car Tboucle varie. unsigned int n ; n=0;.....; for(; ;) {....; n++; if(n>=N) { Action périodique ; n = 0 ; }....; }
168
168 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Temporisations basées sur une interruption périodique Principe: Un timer génère un interruption périodique tous les dT. Dans la routine d'interruption, on incrémente une variable. Quand cette variable a variée de N, c'est qu'il s'est écoulé la durée N.dT. Ce principe peut être implémenté de différentes manières selon que l'on souhaite effectuer : des actions périodiques, des actions à des dates déterminées, des actions de durées déterminés,... C'est simple, précis et non bloquant.
169
169 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Sur la carte picdem2, un quartz 32.768Khz peut être utilisé avec l'oscillateur du timer 1 pour produire une interruption chaque seconde. En décrémentant un compteur dans la routine d'interruption associée, il est facile de produire des temporisations de durée variable. Voir un exemple à : http://arlotto.univ-tln.fr/pic/pic18/timers/ Temporisations basées sur une interruption périodique
170
170 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Une bibliothèque de temporisation Un temporisation est vue comme l'association d'un compteur et d'un état (on peut utiliser une structure en C). l'état peut prendre les valeurs suivantes : STOP : la temporisation est arrêtée START : la temporisation démarre RUNNING : la temporisation est en cours DONE : la temporisation est échue Le compteur est une variable entière qui : est chargée à sa valeur maximale (durée de la temporisation) lorsque la temporisation est dans l'état START. est décrementée à intervalle régulier dans l'état RUNNING fait passer l'état à DONE lorsqu'elle vaut zéro
171
171 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Une bibliothèque de temporisation La temporisation est régie par le grafcet suivant qui est exécuté à intervalle régulier : 0 1 Start Cpt = Max 1 3 Cpt==0 Cpt = Cpt - 1 0 1 Start Cpt = Max 1 2 0 STOP 1 START 2 RUNNING 3 DONE
172
172 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Une bibliothèque de temporisation Le grafcet est écrit dans une fonction timer_tick() qui est appelée régulièrement dans une fonction d'IT, La condition start est simplement réalisée par l'appel d'une fonction qui place le grafcet dans l'état START et charge la valeur maximale dans le compteur.
173
173 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Une bibliothèque de temporisation L'interface est réalisée par les fonctions suivantes : void timer_start(int time); // lance la tempo pour time sec int timer_done(void) ; // retourne vrai si la tempo est échue on peut rajouter les fonctions suivantes : void timer_stop(void) ; // interrompt le décompte de la temporisation. void timer_restart(void) ; // relance la temporisation void timer_more(unsigned long time); // ajoute time secondes à une temporisation en cours. En utilisant un tableau de structures et en ajoutant un numéro de temporisation en paramètre de chaque fonction, on peut aisément créer de nombreux temporisateurs indépendants à partir d'une base de temps fournie par un seul timer matériel.
174
174 © Copyright 2005, Philippe Arlotto http://arlotto.univ- tln.fr Creative Commons Attribution-ShareAlike 2.0 license 18/09/2016 Une bibliothèque de temporisation Ces fonctions se révèlent très pratiques : void main(void){ unsigned long time; int x=0 ; OpenTimer1(.......); TRISBbits.TRISB2=0;PORTBbits.RB2=0; timer_start(5); for( ;; ) {....; if (timer_done()) { x=1-x ; PORTBbits.RB2=x; timer_start(5-2*x); }....; // rien n'est bloquant !! } La led 2 clignote 5 sec éteinte / 3 sec allumée void isr(void){ Timer_tick(); }
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.