Cours 1- 2 : Architecture interne du PIC 16FXXX
Transcription
Cours 1- 2 : Architecture interne du PIC 16FXXX
Cours 1- 2 : Architecture interne du PIC 16FXXX Mémoire programme 4k 1k 16F84 8k 16F873 16F887 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 Que valent m et n ? Mémoire données SFR Special Function Registers 68 octets 16F84 2x96=192 octets 16F873 sur 4 banques dont deux identiques. Banc de registres File en anglais Banc Reg/RAM RAM b7 b6 b5 b4 b3 b2 b1 b0 Banque 0 SFR Special Function Registers Banc de registres Banque 1 Banc de registres File RAM 68 octets 16F84 Identique RAM b7 b6 b 5 b4 b3 b 2 b1 b0 b7 b6 b5 b4 b3 b2 b1 b0 Modèle de programmation du PIC 16F84 Registre de travail W Banc de registres SFR Special Function Register b7 b6 b 5 b4 b3 b2 b1 b0 PCL status Compteur programme b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 File PCLATH Pointeur de pile b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 RAM 8 niveaux b7 b6 b 5 b4 b3 b 2 b1 b0 Status IRP RP1 RP0 /TO /PD Z DC C Les registres jaunes ne font pas partie du banc de registres L'instruction MOVLW Mnémonique Opérande MOVLW K Opcode sur 14 bits 11 00xx kkkk kkkk Mémoire programme Registre de travail 1 1 0 0 0 0 1 0 0 1 1 1 1 0 16F84 W b7 b6 b 5 b4 b3 b 2 b1 b0 b13 b12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 La valeur est transférée à partir de la mémoire programme vers le registre de travail. Assembler et désassembler Assembler Mnémonique Opérande MOVLW K Opcode sur 14 bits 11 00xx kkkk kkkk Désassembler Les deux autres instructions MOV MOVF f,d N'importe où dans File 00 1000 dfff ffff Banc de registres PCL status d=1 Registre de travail PCLATH W RAM b7 b6 b 5 b4 b3 b 2 b1 b0 d=0 N'importe où dans File Positionne Z de STATUS MOVWF f 00 0000 1fff ffff Banc de registres PCL Registre de travail status PCLATH RAM W b7 b6 b 5 b4 b3 b 2 b1 b0 Les instructions MOV sur architecture complète 10 8 Program Counter FLASH Program Memory 1K x 14 8 Level stack (10 bits) 14 RAM File Registers 68 x 8 7 Instruction register Adr MUX direct Addr OSC2/CLKOUT OSC1/CLKIN TMR0 FSR reg RA4/T0CKI PORTA Power-up Timer Oscillator startup Timer Power-on Reset Watchdog Timer MCLR 7 Indirect Addr STATUS MOVLW K Timing génération MOVF f,d avec d=0 RAM Addr 5 Instruction Decode & Control Data bus OSC2/CLKOUT OSC1/CLKIN MUX ALU I/0 Ports RA3 ..RA0 RB7 ..RB1 MOVWF f PORTB RB0/INT ACC W Architecture du 16F84A Exécuter un programme avec un compteur programme Des PORTs pour les entrées et sorties (notées E/S) PORT b7 b6 PIC16F b5 b4 b3 b2 b1 b0 Ampli de puissance E/S E/S E/S E/S E/S E/S E/S TRISA Bus interne E/S physique RB2 b7 b6 b5 b4 E/S b3 b2 b1 b0 Détermine la direction : (1) entrée ou (0) sortie PORTA Les PORTs du PIC 16F84 (1) RA2 RA3 RA4/T0CKI MCLR masse/VSS RB0/INT RB1 RB2 (9) RB3 RA1 (18) RA0 OSC1/CLKIN OSC2/CLKOUT VDD/Vcc RB7 RB6 RB5 RB4 (10) Deux ports : - PORTA 5 bits RA0 -> RA4 -PORTB 8 bits RB0 -> RB7 Les PORTs du PIC 16F887 Cinq ports : - PORTA 8 bits RA0 -> RA7 - PORTB 8 bits RB0 -> RB7 - PORTC 8 bits RC0 -> RC7 - PORTD 8 bits RD0 -> RD7 - PORTE 2 bits RE0 -> RE2 MCLR RB7 RA0 RB6 RA1 RB5 RA2 RB4 RA3 RB3 RA4 RB2 RA5 RB1 RE0 RB0 RE1 Vcc RE2 GND VCCPIC16FRD7 GND RD6 RA7 RD5 RA6 RD4 RC0 RC7 RC1 RC6 RC2 RC5 RC3 RC4 RD0 RD3 RD1 RD2 Les modèles électriques des PORTs V (V) 5 OH max 4 typ 3 min 2 1 0 5 10 15 IOH (mA) 20 25 Les ports du 16F84 sont supposés délivrer ou recevoir jusqu'à 25mA 1.0 VOL (V) max 0.8 typ 0.6 min 0.4 0.2 0 5 10 15 IOL (mA) 20 25 IOH Sortie haute Rth IOL R'th 16<R'th<36 56<Rth<180 UHth = 5V Sortie basse ULth=0V On prendra toujours Rth =100 Ω Après avoir déterminé les modèles de Thévenin des PORTs on s'intéresse maintenant aux résistances de tirage. Les résistances de tirage des PORTs A quoi cela sert ? On les utilise en général pour les entrées et cela peut éviter d'utiliser ces mêmes résistances en externe. Vcc (en) pull-up resistor (fr) Résistance de tirage interne PIC 16FXXX PORT b7 b6 b5 b4 b3 b2 b1 b0 Sur PIC pull-up avec bit RPBU du registre OPTION Cours 3 - 4 Interfaces externes des micro-contrôleurs I) Horloge Le 16F84 peut être configuré pour 4 modes d'horloge : - XT- crystal : mode standard pour 1 – 4 MHz - HS – High Speed aux alentours de 4 MHz : grande consommation de courant - LP - Low Power fréquences basses (32,768 kHz jusqu'à 200 kHz) - RC Resistor Capacitor difficile de prévoir la fréquence d'oscillation avec certitude. Vcc C1=22pF RExt (16) OSC1 (16) OSC1 RF sleep RS CExt C2=22pF (17) OSC2 PIC 16F PIC 16F II) Interfacer des LEDs Rappel : Diode bloquée Diode passante RD UD ou U0 : tension de seuil Si UD inconnue prendre 1,8V. RD : résistance dynamique Si RD inconnue prendre 0Ω. UD PA1 R1 Vcc R1 IS Micro-contrôleur IE Micro-contrôleur Micro-contrôleur comme source de courant PA1 Micro-contrôleur comme puits de courant ATTENTION les ports ne sont pas forcément symétriques : IS peut être différent de IE. Pour information VOH=4V pour ID=10mA et V0L = 0,4V pour ID=10mA pour le PIC 16F84. Calculer les modèles de Thévenin correspondants. Si on ne connait rien on prend VD = 1,8V et V0L = 0V et VOH=Vcc. Calcul de R1 Source de courant : R1= (VOH-VD) /ID avec VD tension directe de la diode et VOH tension haute du port. Puits de courant : R1= (Vcc-VD-V0L) /ID avec V0L tension basse du port Exemple : Kingbright led rouge 10mA l=627nm 15mcd à 10mA VD = 1,95V Kingbright led vert 10mA l=565nm 12mcd à 10mA VD = 2,09V Pour information les résistances utilisées sur EasyPIC5 sont de 1kΩ. Pour généraliser l'utilisation des LEDs, on peut s'intéresser aux afficheurs sept segments a g b a g b Cathode commune Anode commune Comment allume-t-on un afficheur anode commune, un afficheur cathode commune ? Multiplexage de plusieurs afficheurs : PIC 16F877A RC0 RC1 RC2 RC3 RC4 RC5 RC6 290 RB0 RB1 DC5611EWA Common Cathode a a b c d e f g f b g e c d 1k 1k EasyPIC5 MCLR RB7 RA0 RB6 RA1 RB5 RA2 RB4 RA3 RB3 RA4 RB2 RA5 RB1 RE0 RB0 RE1 Vcc RE2 GND VCC PIC16FRD7 GND RD6 RA7 RD5 RA6 RD4 RC0 RC7 RC1 RC6 RC2 RC5 RC3 RC4 RD0 RD3 RD1 RD2 DIS3 a b c d e f g DP DIS0 f e c d 10k sw6 DIS3 DIS0 b g III) Interfacer des sorties puissantes Pour commander des sorties puissantes il faut ajouter des transistors (BJT Bipolar Junction Transistor). Les sorties puissantes peuvent être : - des relais Résistance pull-up = résistance de tirage - des bobines Vcc = 5V - des LEDs Vcc=12V - des moteurs Certains micro-contrôleurs ont une résistance interne pull-up par défaut à la mise sous tension. Le transistor 100R RC est alors passant. Pour éviter cela on 680R peut ajouter la résistance R2. 2K2 R1 PA2 R2 1K 2N2222 permet de sortir jusqu'à 60mA Micro-contrôleur Problème des Pull-Up internes pour les entrées Sur PIC pull-up avec bit RPBU du registre OPTION initialisé à 1 à la mise sous tension mais ????. IV) Interfacer des sorties puissantes avec des FET On peut utiliser des transistors à effet de champ à la place des BJT. Nous examinons le cas des MOSFET. Vcc = 5V Vcc=12V RC BSS138 permet de sortir jusqu'à 220mA avec VDS=0,13V PA2 R2 Il existe des familles spécialement faites pour être commandées directement par des PORTs. Voir ZVN4206A et ZVN4306A de chez Zetex. 2K2 Micro-contrôleur V) Encore plus de puissance Il faut utiliser des opto-coupleurs. Il permettent aussi une isolation galvanique ce qui est important si la tension d'alimentation est très différente de celle du micro-contrôleur. 24V Vcc=5V R1 RC Charge TLP181 Micro-contrôleur PAi TLP181 : 16mA < IDmax < 20mA avec VD <1,3V à 10mA 1mA < IC <10mA Dimensionner R1. VI) Commander des bobines moteurs et relais avec BJT Il existe des transistors de puissance adaptés. Par exemple le transistor BD139 propose un gain β compris entre 25 et 250. On peut l'utiliser avec un courant IC=1,5 A (3A en pointe). Son faible gain nécessite un courant IB assez important, allant au-delà des possibilités des ports traditionnels (typiquement 10mA). Par exemple pour commuter 1A, il faut un IB=40mA dans le pire des cas. Il faut donc un transistor supplémentaire. Vcc = 15V R2 PA2 3K3 R1 Micro-contrôleur Vcc = 15V Le transistor 2N2222 est bloqué, il circule 40mA dans IB M D1 1°) Si R2 est choisi à 330 Ω, quelle puissance passe dans R2 ? IB BD139 2°) Si le transistor 2N2222 est saturé (VCEsat=0,2V) quelle 2N2222 permet de sortir puissance passe dans R2 ? jusqu'à 60mA 3°) Lorsque le BD139 est saturé, il sous 60V circule Il circule IC=1A et l'on a VCEsat=0,70V. Quelle puissance est dissipée dans le BD139 ? VII) Quelques circuits spécialisés On peut trouver des circuits spécialisés destinés à commander directement des moteurs. Le circuit L293D de chez Texas Voici le schéma interne : On suppose que - Pin 4 est reliée à RA3 - Pin 5 est reliée à RA2 - Pin 7 est reliée à RA1 - Pin 6 est reliée à RA0 Comment fait-on avancer un robot motorisé par deux moteurs ? Comment le fait-on reculer ? VIII) Interfacer des entrées - Les boutons Vcc=5V Cela fonctionnet-il sans pull-up ? RA4 4,7kΩ R1 Sans pull-up interne RA4 Vcc=5V Vcc=5V RA1 Micro-contrôleur RA1 R1 Micro-contrôleur R3 470Ω R2 4,7kΩ Montage simple qui nécessite cependant un bit par interrupteur. On ne peut pas toujours se le permettre. Application au clavier Vcc Résistances de tirage PORTB b7 b6 b5 b4 1 2 3 4 5 6 7 8 9 * 0 # b3 b2 b1 b0 clavier Ajouter interface afficheur LCD Vcc RA3 J15 P1 MCLR RB7 RA0 RB6 RA1 RB5 RA2 RB4 RA3 RB3 RA4 RB2 RA5 RB1 RE0 RB0 RE1 Vcc RE2 GND VCC PIC16FRD7 GND RD6 RA7 RD5 RA6 RD4 RC0 RC7 RC1 RC6 RC2 RC5 RC3 RC4 RD0 RD3 RD1 RD2 DIS3 a b c d e f g DP DIS0 f e c d 10k sw6 DIS2 DIS0 b g Cours 45 : les périphériques internes de la famille 16F I) Les registres et noms des bits en Mikro C Documentation technique OPTION b7 RBPU b6 INTEDG b5 T0CS b4 T0SE b3 PSA b2 PS2 b1 PS1 Ficher entête Mikro C //**MikroC fichier P18F84A.c *** //********** bits de OPTION NOT_RBPU = 0x0007, INTEDG = 0x0006, T0CS = 0x0005, T0SE = 0x0004, PSA = 0x0003, PS2 = 0x0002, PS1 = 0x0001, PS0 = 0x0000, ... b0 PS0 Remarque : les noms de la documentation et les noms du fichier d'entête ne correspondent pas toujours ! Les trois façons de programmer en Mikro C Ficher programme Mikro C Void main( void) { .... //*** Toujours ***** OPTION_REG.B3 =1; //**** Si on connaît le nom OPTION_REG.PSA =1; // **** ou encore PSA_bit = 1; ... } II) Timer0 dans 16FXXX 4 MUX 0 1 Timer0 b7 .................................. b0 Timer0 OPTION MCU Clock b7 =1 b6 b7 b5 T0CS b4 T0SE b5 b2 PS2 b3 b0 PS0 Overflow (8 bits) b6 b3 PSA b4 b1 PS1 b2 T0SE : Source Edge select PORTA b7 2, 4, ...,256 =2(n+1) b3RA4/T0CKI MUX 0 1 b0 b2 b1 INTCON b0 III) Interruption timer0 INTCON 0x0B Banque 0 et 1 b7 & & GIE b6 EEIE b5 T0IE b4 b3 & & INTE RBIE b2 T0IF b1 INTF b0 RBIF b5 b4 TMR0IF b1 b6 Overflow Timer0 b7 ..................................... b0 IV) Timer1 dans 18F4550 et 16F877A 4 Timer1 0xFB3h TMR1H 0xFB2h TMR1L b15 .................................. b0 MUX 0 Timer1 b7 & b6 overflow b5 b4 MCU Clock RD16 b6 PIR1 b7 1 T1CON 0xFCD T1Run b5 T1CKPS1 b4 T1CKPS0 b3 1, 2, 4,8 =2(n) PORTC T1OSCEN b2 NOT_T1SYNC b0 TMR1ON b7 b1TMR1CS b3 b2 CCP1IF b1 b0 TMR1IF b6 b5 Détection synchronisée b4 b3 MUX 1 0 T1OSI T1OSO/T1CLI TMR1ON T1OSO/T1CLI 0 1 T1OSI Prescaler 1,2,4,8 Sync with internal clock b2 b1 b0 & 1 0 Timer1 High Byte Timer1L FOsc/4 TMR1CS T1OSCEN NOT_T1SYNC Write TMR1L 8 Read TMR1L T1CKPS<1:0> Timer1 dans 16FXXX Timer1H 8 Internal Data Bus 8 V) CAPTURE POUR 16F877 PIR1 CCPR1H CCPR1L b7 PORTC b7 TMR1H b6 TMR1L b3 b4 b0 b2 CCP1IF CCP1CON b3 b1 b5 b4 b5 b2 b6 RC2/CCP1 b7 b1 b6 b0 b5 b4 b3 CCP1M3 b2 CCP1M2 b1 CCP1M1 b0 CCP1M0 1,4,16 } 0000 : Module CCP1 désactivé 0100 : Capture tous les fronts descendants 0101 : Capture tous les fronts montants 0110 : Capture tous les 4 fronts montants 0111 : Capture tous les 16 fronts montants VI) COMPARAISON PIC 16F877 POR TC b7 Special Event Trigger déclenchera: un Reset du Timer1 (mais pas un positionnement du drapeau d'interruption de Timer1) positionnement du bit GO/DONE qui démarre une conversion A/D (ECCP1 seulement) b6 b5 TMR1H b4 TMR1L Special Event Trigger b3 RC2/CCP1 b2 b1 Q S R Logique de sortie Comparaison b0 b7 TRIS C CCP1CO b7 N b6 b6 b4 b4 b5 b5 b3 b3 CCP1M3 b2 b1 b0 0 b2 CCP1M2 b1 CCP1M1 b0CCP1M0 CCPR1H CCPR1L PIR1 b7 } b6 b5 b4 b3 b2 CCP1IF 0010 : Compare bascule sortie quand comparaison (CCPxIF) b1 1000 : Compare force CCP à un (CCPIF est géré) b0 TMR1IF 1001 : Compare force CCP à zéro (CCPIF est géré) 1010 : Compare sort rien sur CCP mais sur CCPIF 1011 : Compare force Special Event Trigger reset sur timer1 (CCP1IF est géré) VII) Timer2 dans 18F4550 et 16F877A b7 .................................. b0 PR2 Comparateur Reset Timer2 b7 .................................. b0 & T2CON b7 b6 b5 b4 b3 b2 b1 b0 0000 = 1: 1 0001 = 1: 2 0010 = 1: 3 .... 1111 = 1:16 TOUTPS1 1, 2, .., 16 b4 b3 b1 TMR2IF TMR2ON T2CKPS0 b6 b2 CCP1IF TOUTPS0 T2CKPS1 b7 b5 TOUTPS3 TOUTPS2 PIR1 1, 4, 16 00 = 1: 1 01 = 1: 4 1x = 1: 16 b0 TMR1IF 4 MCU Clock VIII) PWM dans 18F4550 et 16F877A b7 .................................. b0 PR2 T2CON 8 b7 b6 Comparateur b5 Reset 8 b7 .................................. b0 b4 b3 Timer2 & CCPR1 L b7 .................................. b0 b7 b6 b5 TOUTPS2 b4 1, 2, .., 16 b3 TOUTPS1 b2 CCP1IF TOUTPS0 b2 TMR2ON b0 T2CKPS0 b1 TMR2IF b0 TMR1IF 1, 4, 16 CCP1CON b7 00 = 1: 1 01 = 1: 4 1x = 1: 16 Comparat eur 1 0 CCPR1 H b9 .................................. b2 PIR1 TOUTPS3 T2CKPS1 b9 .................................. b2 b1 b0 b1 10 0000 = 1: 1 0001 = 1: 2 0010 = 1: 3 .... 1111 = 1:16 b6 b5 DC1B1 MCU Clock 4 b4 DC1B0 b3 CCP1M3 b2 CCP1M2 PORTC b7 b CCP1M1 1 b6 b CCP1M0 b1 b0 b5 b4 b3 R Q S RC2/CCP1 b2 b1 b0 Entrée n'importe quand prise en compte en fin de période. TRISC b7 b6 b5 b4 b3 0 b2 b1 b0 0 CCP1CON (CCP1M3210 1100 : Enable PWM