Sommaire: Cours et techniques de programmation des PICs
1. INTRODUCTION
2. LES SYSTEMES DE NUMEROTATION
2.1 LE SYSTEME DECIMAL
2.2 LE SYSTEME BINAIRE
2.3 LE SYSTEME HEXADECIMAL
2.4 LES OPERATIONS
2.5 LES NOMBRES SIGNES
2.6 LES OPERATIONS BOOLEENNES
2.6.1 Le complément
2.6.2 La fonction « ET » ou « AND »
2.6.3 La fonction « OU » ou « OR »
2.6.4 La fonction « OU EXCLUSIF » ou « Exclusif OR » ou « XOR »
3. COMPOSITION ET FONCTIONNEMENT DES PICS
3.1 QU’EST-CE QU’UNE PIC ?
3.2 LES DIFFERENTES FAMILLES DES PICS
3.3 IDENTIFICATION D’UNE PIC
3.4 ORGANISATION DE LA 16F84
3.4.1 La mémoire programme
3.4.2 La mémoire eeprom
3.4.3 La mémoire Ram
4. ORGANISATION DES INSTRUCTIONS
4.1 GENERALITES
4.2 LES TYPES D’INSTRUCTIONS
4.2.1 Les instructions « orientées octet »
4.2.2 Les instructions « orientées bits »
4.2.3 Les instructions générales
4.2.4 Les sauts et appels de sous-routines
4.3 PANORAMIQUE DES INSTRUCTIONS
4.4 LES INDICATEURS D’ETAT
4.4.1 L’indicateur d’état « Z
4.4.2 L’indicateur d’état « C »
5. LES DEBUTS AVEC MPLAB
5.1 PREPARATION A L’UTILISATION
5.2 CREATION DE NOTRE PREMIER PROJET
6. ORGANISATION D’UN FICHIER «ASM »
6.1 LES COMMENTAIRES
6.2 LES DIRECTIVES
6.3 LES FICHIERS « INCLUDE »
6.4 LA DIRECTIVE _CONFIG
6.5 LES ASSIGNATIONS
6.6 LES DEFINITIONS
6.7 LES MACROS
6.8 LA ZONE DES VARIABLES
6.9 LES ETIQUETTES
6.10 LA DIRECTIVE « ORG »
6.11 LA DIRECTIVE « END »
7. REALISATION D’UN PROGRAMME
7.1 CREATION DE NOTRE PREMIER PROGRAMME
7.2 L’ASSEMBLAGE D’UN PROGRAMME
8. LA SIMULATION D’UN PROGRAMME
8.1 LANCEMENT ET PARAMETRAGE DU SIMULATEUR
8.2 EXPLICATION DES REGISTRES FONDAMENTAUX
8.2.1 Les registres « PCL » et « PCLATH »
8.2.2 Le registre « W »
8.2.3 Le registre « STATUS »
8.3 LANCEMENT DE LA SIMULATION
9. LE JEU D’INSTRUCTIONS
9.1 L’INSTRUCTION « GOTO » (ALLER A)
9.2 L’INSTRUCTION « INCF » (INCREMENT FILE)
9.3 L’INSTRUCTION « DECF » (DECREMENT FILE)
9.4 L’INSTRUCTION « MOVLW » (MOVE LITERAL TO W)
9.5 L’INSTRUCTION « MOVF » (MOVE FILE)
9.6 L’INSTRUCTION « MOVWF » (MOVE W TO FILE)
9.7 L’INSTRUCTION « ADDLW » (ADD LITERAL AND W)
9.8 L’INSTRUCTION « ADDWF » (ADD W AND F)
9.9 L’INSTRUCTION « SUBLW » (SUBTRACT W FROM LITERAL)
9.10 L’INSTRUCTION « SUBWF » (SUBTRACT W FROM F)
9.11 L’INSTRUCTION « ANDLW » (AND LITERAL WITH W)
9.12 L’INSTRUCTION « ANDWF » (AND W WITH F)
9.13 L’INSTRUCTION « IORLW » (INCLUSIVE OR LITERAL WITH W)
9.14 L’INSTRUCTION « IORWF » (INCLUSIVE OR W WITH FILE)
9.15 L’INSTRUCTION « XORLW » (EXCLUSIVE OR LITERAL WITH W)
9.16 L’INSTRUCTION « XORWF » (EXCLUSIVE OR W WITH F)
9.17 L’INSTRUCTION « BSF » (BIT SET F)
9.18 L’INSTRUCTION « BCF » (BIT CLEAR F)
9.19 L’INSTRUCTION « RLF » ( ROTATE LEFT THROUGH CARRY)
9.20 L’INSTRUCTION « RRF » ( ROTATE RIGHT THROUGH CARRY)
9.21 L’INSTRUCTION « BTFSC » (BIT TEST F, SKIP IF CLEAR)
9.22 L’INSTRUCTION « BTFSS » (BIT TEST F, SKIP IF SET)
9.23 L’INSTRUCTION « DECFSZ » (DECREMENT F, SKIP IF Z)
9.24 L’INSTRUCTION « INCFSZ » (INCREMENT F, SKIP IF ZERO)
9.25 L’INSTRUCTION « SWAPF » (SWAP NIBBLES IN F)
9.26 L’INSTRUCTION « CALL » (CALL SUBROUTINE)
9.27 L’INSTRUCTION « RETURN » (RETURN FROM SUBROUTINE)
9.28 L’INSTRUCTION « RETLW » (RETURN WITH LITERAL IN W)
9.29 L’INSTRUCTION « RETFIE » (RETURN FROM INTERRUPT)
9.30 L’INSTRUCTION « CLRF » (CLEAR F)
9.31 L’INSTRUCTION « CLRW » (CLEAR W)
9.32 L’INSTRUCTION « CLRWDT » (CLEAR WATCHDOG)
9.33 L’INSTRUCTION « COMF » (COMPLEMENT F)
9.34 L’INSTRUCTION « SLEEP » (MISE EN SOMMEIL)
9. 35 L’INSTRUCTION « NOP » (NO OPERATION)
9.36 LES INSTRUCTIONS OBSOLETES
10. LES MODES D’ADRESSAGE
10.1 L’ADRESSAGE LITTERAL OU IMMEDIAT
10.2 L’ADRESSAGE DIRECT
10.3 L’ADRESSAGE INDIRECT
10.3.1 Les registres FSR et INDF
10.4 QUELQUES EXEMPLES
11. REALISATION D’UN PROGRAMME EMBARQUE
11.1 LE MATERIEL NECESSAIRE
11.2 MONTAGE DE LA PLATINE D’ESSAIS
11.3 CREATION DU PROJET
11.4 EDITION DU FICHIER SOURCE
11.5 CHOIX DE LA CONFIGURATION
11.6 LE REGISTRE OPTION
11.7 EDITION DU PROGRAMME
11.8 LE REGISTRE PORTA
11.8.1 Fonctionnement particulier des PORTS
11.9 LE REGISTRE TRISA
11.10 LES REGISTRES PORTB ET TRISB
11.11 EXEMPLE D’APPLICATION
11.12 LA ROUTINE D’INITIALISATION
11.13 LES RESULTATS DE LA COMPILATION
11.14 LE PROGRAMME PRINCIPAL
11.15 LA SOUS-ROUTINE DE TEMPORISATION
12. LES INTERRUPTIONS
12.1 QU’EST-CE QU’UNE INTERRUPTION ?
12.2 MECANISME GENERAL D’UNE INTERRUPTION
12.3 MECANISME D’INTERRUPTION SUR LES PICS
12.4 LES SOURCES D’INTERRUPTIONS DE LA 16F84
12.5 LES DISPOSITIFS MIS EN ŒUVRE
12.6 LE REGISTRE INTCON (INTERRUPT CONTROL)
12.7 SAUVEGARDE ET RESTAURATION DE L’ENVIRONNEMENT
12.7.1 Les registres à sauvegarder
12.7.2 La méthode de sauvegarde
12.7.3 Particulatité de l’instruction « RETFIE »
12.8 UTILISATION D’UNE ROUTINE D’INTERRUPTION
12.9 ANALYSE DE LA ROUTINE D’INTERRUPTION
12.10 ADAPTATION DE LA ROUTINE D’INTERRUPTION
12.11 L’INITIALISATION
12.12 CONSTRUCTION DU PROGRAMME PRINCIPAL
12.13 CONSTRUCTION DE LA ROUTINE D’INTERRUPTION
12.14 PASSAGE AU SIMULATEUR D’UNE ROUTINE D’INTERRUPTION
12.15 PREMIERE CORRECTION : RESET DU FLAG
12.16 SE METTRE A L’ECHELLE DE TEMPS DE LA PIC
12.17 LE PROBLEME DE L’ANTI-REBOND
12.18 FINALISATION DU PROGRAMME
12.19 REMARQUES IMPORTANTES
12.20 CONCLUSIONS
13. LE TIMER 0
13.1 LES DIFFERENTS MODES DE FONCTIONNEMENT
13.2 LE REGISTRE TMR0
13.3 LES METHODES D’UTILISATION DU TIMER0
13.3.1 Le mode de lecture simple
13.3.2 Le mode de scrutation du flag
13.3.3 Le mode d’interruption
13.3.4 Les méthodes combinées
13.4 LE PREDIVISEUR
13.5 APPLICATION PRATIQUE DU TIMER0
13.5.1 Préparations
13.5.2 L’initialisation
13.5.3 La routine d’interruption
13.6 MODIFICATION DES REGISTRES DANS LE SIMULATEUR
13.7 MISE EN PLACE SUR LA PLATINE D’ESSAIS
13.8 PREMIERE AMELIORATION DE LA PRECISION
13.9 SECONDE AMELIORATION DE LA PRECISION
13.10 LA BONNE METHODE – ADAPTATION DE L’HORLOGE
13.11 LA METHODE DE LUXE : LA DOUBLE HORLOGE
13.12 EXEMPLE D’UTILISATION DE 2 INTERRUPTIONS
13.13 CONCLUSION
14. LES ACCES EN MEMOIRE « EEPROM »
14.1 TAILLE ET LOCALISATION DE LA MEMOIRE « EEPROM »
14.2 PREPARATION DU PROGRAMME
14.3 INITIALISATION DE LA ZONE EEPROM
14.4 LE REGISTRE EEDATA
14.5 LE REGISTRE EEADR
14.6 LE REGISTRE EECON1
14.7 LE REGISTRE EECON2
14.8 ACCES EN LECTURE DANS LA MEMOIRE « EEPROM »
14.9 L’ACCES EN ECRITURE A LA ZONE EEPROM
14.10 UTILISATION PRATIQUE DE LA MEMOIRE « EEPROM »
14.11 SECURISATION DES ACCES EN MEMOIRE « EEPROM »
14.12 CONCLUSION
15. LE WATCHDOG
15.1 LE PRINCIPE DE FONCTIONNEMENT
15.2 LE PREDIVISEUR ET LE WATCHDOG
15.3 LES ROLES DU WATCHDOG
15.4 UTILISATION CORRECTE DU WATCHDOG
15.5 CE QU’IL NE FAUT PAS FAIRE
15.6 MESURE DU TEMPS REEL DU WATCHDOG
15.7 SIMULATION DU PLANTAGE D’UN PROGRAMME
15.7.1 Correction avec utilisation du watchdog
15.8 CHOIX DE LA VALEUR DU PREDIVISEUR
15.9 TEMPS TYPIQUE, MINIMAL, ET MAXIMUM
15.10 CONCLUSION
16. LE MODE SLEEP
16.1 PRINCIPE DE FONCTIONNEMENT
16.2 LA SORTIE DU MODE « SLEEP »
16.3 REVEIL AVEC GIE HORS SERVICE.
16.4 REVEIL AVEC GIE EN SERVICE
16.5 MISE EN SOMMEIL IMPOSSIBLE
16.6 UTILISATION DU MODE « SLEEP »
16.7 CAS TYPIQUES D’UTILISATION
16.8 CONCLUSION
17. LE RESTE DU DATASHEET
17.1 LA STRUCTURE INTERNE
17.2 LA SEQUENCE DE DECODAGE
17.3 ORGANISATION DE LA MEMOIRE
17.4 LES REGISTRES SPECIAUX
17.5 L’ELECTRONIQUE DES PORTS
17.6 LE REGISTRE DE CONFIGURATION
17.7 LES DIFFERENTS TYPES D’OSCILLATEURS
17.8 LE RESET
17.9 LA MISE SOUS TENSION
17.10 CARACTERISTIQUES ELECTRIQUES
17.11 PORTABILITE DES PROGRAMMES
17.12 LES MISES A JOUR DES COMPOSANTS
17.13 CONCLUSION
18. ASTUCES DE PROGRAMMATION
18.1 LES COMPARAISONS
18.2 SOUSTRAIRE UNE VALEUR DE W
18.3 LES MULTIPLICATIONS
18.4 MULTIPLICATION PAR UNE CONSTANTE
18.5 ADRESSAGE INDIRECT POINTANT SUR 2 ZONES DIFFERENTES
18.6 LES TABLEAUX EN MEMOIRE PROGRAMME
18.7 LES VARIABLES LOCALES
18.7.1 Détermination des variables locales
18.7.2 Construction sans variables locales
18.7.3 Construction avec variables locales
18.8 CONCLUSION
19. LA NORME ISO 7816
19.1 SPECIFICITES UTILES DE LA NORME ISO 7816
19.1.1 Les commandes ISO 7816
19.1.2 Le protocole d’échange d’informations
19.2 LES LIAISONS SERIE ASYNCHRONES
19.2.1 Le start-bit
19.2.2 Les bits de donnée
19.2.3 Le bit de parité
19.2.4 Le stop-bit
19.2.5 Vitesse et débit
19.3 ACQUISITION DES BITS
19.4 CARACTERISTIQUE DES CARTES « STANDARD »
19.5 CREATION ET INITIALISATION DU PROJET
19.6 LA BASE DE TEMPS
19.7 RECEPTION D’UN OCTET
19.8 L’EMISSION D’UN CARACTERE
19.9 INITIALISATION
19.10 ENVOI DE L’ATR
19.11 L’ENVOI DU STATUS
19.12 RECEPTION DE LA CLASSE
19.13 RECEPTION DE INS, P1, P2, ET LEN
19.14 CONTROLE DE L’INSTRUCTION REÇUE
19.15 TRAITEMENT D’UNE INSTRUCTION
19.16 LES VARIABLES
19.17 CONCLUSION
ANNEXE1 : QUESTIONS FREQUEMMENT POSEES (F.A.Q.)
A1.1 JE N’ARRIVE PAS A EDITER MON FICHIER SOURCE
A1.2 JE TROUVE QUE 8 SOUS-PROGRAMMES, C’EST PEU
A1.3 JE N’UTILISE QUE 8 IMBRICATIONS, ET POURTANT MON PROGRAMME PLANTE.
A1.4 MON PROGRAMME SEMBLE NE JAMAIS SORTIR DES INTERRUPTIONS
A1.5 JE N’ARRIVE PAS A AJOUTER UN NŒUD A MON PROJET
A1.6 JE N’ARRIVE PAS A UTILISER LE SIMULATEUR, LES OPTIONS SONT EN GRISE
A1.7 JE REÇOIS UN MESSAGE D’ERREUR EOF AVANT INSTRUCTION END
A1.8 COMMENT DESASSEMBLER UN FICHIER «HEX » ?
A1.9 UTILISATION DES MINUSCULES ET DES MAJUSCULES
A1.10 LE CHOIX D’UN PROGRAMMATEUR
UTILISATION DU PRESENT DOCUMENT
Extrait du cours et techniques de programmation des PICs
1. Introduction
Et voilà, nous voilà partis ensemble pour cette grande aventure qu’est la programmation des pics. Je vais tenter de rester le plus concret possible, mais, cependant, une certaine part de théorie est indispensable pour arriver au but recherché.Je vais donc commencer ce petit cours par un rappel sur les systèmes de numérotation. Ca y est, j’en vois qui râlent déjà. Mais je suis sûr que vous comprendrez qu’il est impossible de programmer sérieusement un microcontroleur sans savoir ce qu’est un bit, ou comment convertir les notations décimales en hexadécimales.
Rassurez-vous, je vais faire bref, et nous pourrons très rapidement aborder le sujet qui nous intéresse tant. Si vous êtes déjà un « pro », vous pouvez sauter le premier chapitre et passer directement au suivant.N’hésitez jamais à me faire part de vos remarques, ni à me signaler les erreurs qui m’auraient échappées. Faites du copier/coller, répercutez les infos que vous trouverez ici, traduisez le document dans une autre langue ou un autre format. Simplement, dans ce cas, veuillez respecter les désirs de l’auteur en fin d’ouvrage et faites moi parvenir un exemplaire de votre travail. Ceci pour permettre de faire profiter le plus grand nombre de votre travail.
2. Les systèmes de numérotation
2.1 Le système décimal
Nous sommes habitués, depuis notre enfance à utiliser le système numérique décimal, à tel point que nous ne voyons même plus la manière donc ce système fonctionne, tant c’est devenu un automatisme.
Décimal, pourquoi ? Parce qu’il utilise une numérotation à 10 chiffres. Nous dirons que c’est un système en BASE 10. Pour la petite histoire, on a utilisé un système base 10 car nos ancêtres ont commencé à compter sur leurs 10 doigts, pas besoin d’aller chercher plus loin. Mais la position des chiffres a également une grande importance. Les chiffres les moins significatifs se situent à droite du nombre, et leur importance augmente au fur et à mesure du déplacement vers la gauche. En effet, dans le nombre 502, le 5 à une plus grande importance que le 2. En réalité, chaque chiffre, que l’on peut appeler DIGIT, à une valeur qui dépend de son RANG . Quel est ce rapport ? Il s’agit tout simplement de l’élévation de la BASE utilisée élevé à la puissance de son RANG .
2.2 Le système binaire
Vous avez compris ce qui précède ? Alors la suite va vous paraître simple.Cela ne pose aucun problème pour vous de compter sur vos 10 doigts, mais pour les ordinateurs, cela n’est pas si simple. Ils ne savent faire la distinction qu’entre 2 niveaux (présence ou absence de tension). Le système de numérotation décimal est donc inadapté.On comprendra immédiatement que le seul système adapté est donc un système en base 2, appelé système binaire. Ce système ne comporte donc que 2 chiffres, à savoir 0 et 1. Comme, de plus, les premiers ordinateurs (et les pics) travaillent avec des nombres de 8 chiffres binaires, on a donc appelé ces nombres des octets (ou bytes en anglais). Le chiffre 0 ou 1 est appelé un BIT(unité binaire, ou BInary uniT) .Pour nous y retrouver dans la suite de ce petit ouvrage, on adoptera les conventions suivantes : tout nombre décimal est écrit tel quel, ou en utilisant la notation D’xxx’ ; tout nombre binaire est écrit suivant la forme B’xxxxxxxx’ dans lesquels les ‘x’ valent… 0 ou 1, vous avez suivi.
2.3 Le système hexadécimal
La représentation de nombres binaires n’est pas évidente à gérer, et écrire une succession de 1 et de 0 représente une grande source d’erreurs. Il fallait donc trouver une solution plus pratique pour représenter les nombres binaires. On a donc décider de couper chaque octet en 2 (QUARTET) et de représenter chaque partie par un chiffre.Comme un quartet peut varier de b’0000’ à b’1111’, on constate que l’on obtient une valeur comprise entre 0 et 15. Cela fait 16 combinaisons. Les 10 chiffres du système décimal ne suffisaient donc pas pour coder ces valeurs.
2.4 Les opérations
Après avoir converti les nombres dans différents formats, vous allez voir qu’il est également très simple de réaliser des opérations sur ces nombres dans n’importe quel format.Il suffit pour cela d’effectuer les mêmes procédures qu’en décimal.Petit exemple : Que vaut B’1011’ + B ‘0110’ ?
2.5 Les nombres signés
Dans certaines applications, il est nécessaire de pouvoir utiliser des nombres négatifs.Comme les processeurs ne comprennent pas le signe « – » , et comme il fallait limiter la taille des mots à 8 bits, la seule méthode trouvée a été d’introduire le signe dans le nombre.On a donc choisi (pas au hasard) le bit 7 pour représenter le signe. Dans les nombres signés, un bit 7 à ‘1’ signifie nombre négatif. Si on s’était contenté de cela, on aurait perdu une valeur possible. En effet, B’10000000’ (-0) était alors égal à B’00000000’ (0). De plus, pour des raisons de facilité de calcul, il a été décidé d’utiliser une notation légèrement différente.Pour rendre un nombre négatif, il faut procéder en 2 étapes.
1) On inverse la totalité du nombre.
2) On ajoute 1
On obtient alors ce qu’on appelle le COMPLEMENT A DEUX du nombre.
Exemple : soit le nombre 5 : B’00000101’ Comment écrire Ŕ5 ?
1) on inverse tous les bits (complément à 1) B’11111010’
2) on ajoute 1 (complément à 2) Ŕ5 = B’11111011’
Pour faire la conversion inverse, on procède de manière identique.
1) on inverse tous les bits B’00000100’
2) On ajoute 1 B‘00000101’
2.6 Les opérations booléennes.
Qu’est-ce que c’est que ça, me direz-vous ? Et bien, pour faire simple, disons que ce sont des opérations qui s’effectuent bit par bit sur un octet donné. Plutôt qu’une grosse théorie sur l’algèbre de boole (j‘en vois qui respirent), je vais donner dans le concret en présentant les opérations indispensables à connaître dans la programmation des pics et autres microcontrôleurs.
2.6.1 Le complément
Que vous trouverez également sous les formes « inversion » ou « NOT » ou encore complément à 1. Elle est souvent notée « ! »
C’est tout simple, cela consiste à inverser tous les bits de l’octet.Exemple : NOT B’10001111’ donne ‘B01110000 ‘. Vous voyez ici que pour les opérations booléennes, il est plus facile de travailler en binaire. Traduisez l’exemple ci-dessus en hexadécimal (on dira maintenant « hexa ») ou en décimal et essayez de complémenter directement. Bonjour les neurones.A quoi sert-elle ? Par exemple à lire une valeur dont les niveaux actifs ont été inversés, à réaliser des nombres négatifs, ou autres.
…….
Cours et techniques de programmation des PICs (9116 KO) (Cours DOC)