Dans la plupart de mes montages je rajoute un FTDI FT232R pour avoir une liaison USB-série. Cela engendre un léger surcoût (environ 5€) et une difficulté supplémentaire lors de la soudure car le circuit n’est disponible qu’en SSOP. Mais par contre cela me facilite grandement la communication avec un PC et la programmation du PIC par l’intermédiaire du bootloader TinyBootLoader. J’ai fait une présentation de TinyBootLoader sur le site de l’académie de Limoges (à lire avant cet article). Cependant, je n’abordais pas la problématique de l’utilisation de l’oscillateur interne avec le bootloader. Je présente donc dans cet article la mise en place de TinyBootLoader dans un PIC18F2520 en utilisant l’oscillateur interne avec ou sans la PLL.
Je commence donc par télécharger la dernière version de TinyBootLoader sur le site de Claudiu Chiculita (version 198). Extraire l’archive ZIP puis allez dans le répertoire « picsource/18f ». Vous trouvez tout un ensemble de programmes sources en assembleur et des fichiers pré-compilés pour certains cas courants. Nous allons nous intéresser au fichier « TinyB18F32.asm ». Copiez ce fichier et les fichiers « bankswitch.inc », « icdpictypes.inc » et « spbrgselect.inc » dans un nouveau dossier. Du coté logiciel, il faut que MPASMWIN (l’assembleur de Microchip) soit installé, celui-ci est disponible avec MPLab ou en installant le compilateur C C18.
Éditez alors le fichier « TinyB18F32.asm », les modifications que l’on va apporter se situe au début du code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
radix DEC LIST P=18F4550 ; change also: Configure->Select Device from MPLAB ; For 2455, 2550, 4455, and 4550: 4 MHz quartz / 1 * 24 / 4 = 24 MHz xtal EQU 24000000 ; you may want to change: _XT_OSC_1H _HS_OSC_1H _HSPLL_OSC_1H baud EQU 38400 ; standard TinyBld baud rates: 115200 or 19200 ; The above 3 lines can be changed and built a bootloader for the desired frequency (and PIC type) ;******************************************************************** ; Tiny Bootloader 18F series Size=100words ; claudiu.chiculita@ugal.ro ; http://www.etc.ugal.ro/cchiculita/software/picbootloader.htm ; Modified by Nam Nguyen-Quang for testing different PIC18Fs with tinybldWin.exe v1.9 ; namqn@yahoo.com ;******************************************************************** ; This source file is for PIC18F2420, 2520, 4420, 4520, 2455, 2550, 4455, and 4550 ; Copy these include files to your project directory (i.e. they are in the same ; directory with your .asm source file), if necessary #include "icdpictypes.inc" ; Takes care of: #include "p18fxxx.inc", max_flash, IdTypePIC #include "spbrgselect.inc" ; RoundResult and baud_rate #define first_address max_flash-200 ;100 words ; For different PICs, uncomment the appropriate lines of CONFIG directives ; as indicated, and comment out all the other lines, if necessary ; For example, the following configuration is for PIC18F4550, with 4 MHz crystal ; You could find the symbol names for the chip in its include file ; (in the Microchip\MPASM Suite directory) ;----- CONFIG1L Options ----- ; For 18F2455, 2550, 4455, and 4550 CONFIG PLLDIV = 1, CPUDIV = OSC3_PLL4, USBDIV = 2 ;----- CONFIG1H Options ----- ; For 18F2455, 2550, 4455, and 4550 CONFIG FOSC = HSPLL_HS, FCMEM = OFF, IESO = OFF ; For 18F2420, 2520, 4420, and 4520 ; CONFIG OSC = HS, FCMEN = OFF, IESO = OFF ; CONFIG OSC = INTIO67, FCMEN = OFF, IESO = OFF ; Use internal oscilator, xtal = 8000000 ;----- CONFIG2L Options ----- ; For 18F2455, 2550, 4455, and 4550 CONFIG PWRT = ON, BOR = OFF, BORV = 21, VREGEN = OFF ; For 18F2420, and 4420 ; CONFIG PWRT = ON, BOREN = ON, BORV = 27 ; For 18F2520, and 4520 ; CONFIG PWRT = ON, BOREN = ON, BORV = 28 ;----- CONFIG2H Options ----- ; For all of the chips associated with this source file CONFIG WDT = OFF, WDTPS = 128 ;----- CONFIG3H Options ----- ; For 18F2455, 2550, 4455, and 4550 CONFIG MCLRE = ON, LPT1OSC = OFF, PBADEN = OFF, CCP2MX = OFF ; For 18F2420, and 4420 ; CONFIG MCLRE = ON, PBADEN = OFF, CCP2MX = PORTC ; For 18F2520, and 4520 ; CONFIG MCLRE = ON, LPT1OSC = OFF, PBADEN = OFF, CCP2MX = PORTC ;----- CONFIG4L Options ----- ; For 18F2455, 2550, 4455, and 4550 CONFIG STVREN = ON, LVP = OFF, ICPRT = OFF, DEBUG = OFF, XINST = OFF ; For 18F2420, and 4420 ; CONFIG STVREN = ON, LVP = OFF, ENHCPU = OFF, DEBUG = OFF ; For 18F2520, and 4520 ; CONFIG STVREN = ON, LVP = OFF, DEBUG = OFF, XINST = OFF ... IntrareBootloader ;init IntOSC, added by Nam Nguyen-Quang movlw 0x70 movwf OSCCON ; the above 2 lines should be commented out for designs not using the internal oscilator ; or for the chips without the internal oscilator |
Vous avez donc ci-dessus les lignes qui nous intéresse. Nous allons modifier ce source pour l’adapter à un PIC18F2520 avec l’oscillateur interne à 8MHz sans PLL avec une vitesse de la voie série à 57600 bauds/s. Les fusibles de configuration sont visibles dans le fichier « P18F2520.INC » dans le répertoire de MPASM (faire une recherche de fichier !). J’obtiens donc le fichier suivant :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
radix DEC LIST P=18F2520 ; MODIF xtal EQU 8000000 ; MODIF baud EQU 57600 ; MODIF => Pas de 115200 car erreur trop grande avec une frequence de 8MHz ; The above 3 lines can be changed and built a bootloader for the desired frequency (and PIC type) ... ;----- CONFIG1L Options ----- CONFIG OSC = INTIO67 ; Utilisation de l'oscillateur interne, les broches RA6 et RA7 sont des E/S ;----- CONFIG2H Options ----- ; For all of the chips associated with this source file CONFIG WDT = OFF, WDTPS = 128 ;----- CONFIG3H Options ----- CONFIG MCLRE = ON, LPT1OSC = OFF, PBADEN = OFF ; La broche MCLR est active ; For 18F2520, and 4520 CONFIG STVREN = ON, LVP = OFF, DEBUG = OFF, XINST = OFF ... IntrareBootloader ;init IntOSC, added by Nam Nguyen-Quang movlw 0x70 movwf OSCCON ; Passe l'oscillateur interne à 8MHz ; the above 2 lines should be commented out for designs not using the internal oscilator ; or for the chips without the internal oscilator |
Je compile le tout avec MPASMWIN et j’obtiens un fichier hex que je programme dans le PIC 18F2520. Je lance le programme « tinybldwin.exe », je choisis le port série auquel est relié le PIC ainsi que sa vitesse (dans notre cas 57600) et appuie sur le bouton « Check PIC ». J’alimente le PIC. TinyBootLoader doit alors vous renvoyer le type de PIC trouvé dans sa fenêtre « messages ».
J’ai ensuite testé avec un oscillateur interne à 4MHz et une vitesse de 19200 bauds/s. La encore le test est concluant. Par contre ca se gate lorsque je tente d’utiliser la PLL. J’effectue les modifications suivantes dans le code source du bootloader, je prends comme base de départ: oscillateur interne à 8MHz, PLL x4 activée donc Fosc=32Mhz et une vitesse du port série à 115200 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
radix DEC LIST P=18F2520 ; PIC du type 18F2520 xtal EQU 32000000 ; Frequence d'horloge interne = 8MHz x 4 (INTOSC à 8MHz x PLL (x4)) baud EQU 115200 ; 115200 bauds/s ; The above 3 lines can be changed and built a bootloader for the desired frequency (and PIC type) ... #define first_address max_flash-204 ; MODIF : Rajout de deux instructions => 102 words ... ;init IntOSC, added by Nam Nguyen-Quang movlw 0x70 ; Oscillateur interne à 8MHz movwf OSCCON movlw 0x40 ; Activation de la PLL movwf OSCTUNE ; the above 2 lines should be commented out for designs not using the internal oscilator ; or for the chips without the internal oscilator |
La compilation avec MPASMWIN se passe correctement. Je programme le fichier HEX dans le PIC. Quand je fait le test « Check PIC » depuis le logiciel « TinyBldWin » à 115200 bauds/s, le pic est reconnu. Je fais donc une modif du code source CCS pour avoir l’oscillateur interne activé à 8MHz ainsi que la PLL. Cela se traduit par la modification des lignes suivantes dans un code de test : #use delay(clock=32M,internal=8M) et #use rs232(baud=115200, parity=N, xmit=PIN_C6, rcv=PIN_C7, STOP=1, BITS=8). Je compile et je lance la programmation avec TinyBldWin. La programmation se passe comme il faut et le pic redémarre avec le nouveau programme. Problème, lorsque je fais un « Check PIC », les pre-codes sont bien reçus par le PIC qui fait un reset pour passer la main au bootloader mais celui-ci ne répond plus !!! Je fais une modif du code asm du bootloader pour repasser à une longueur de 100mots en supprimant 2 nop en début de prog. La encore tout fonctionne jusqu’à la programmation par TinyBldWin mais ensuite le bootloader ne répond plus !! Pour l’instant je suis bloqué ici…je remarque que malgré la ligne device ICD = True, le compilateur n’insère pas un NOP à l’adresse 0 mais un goto vers la fonction main() donc à priori il écrase le goto du bootloader ! Pour l’instant pas de solution…
En reprenant à zéro et en regardant à chaque fois le code HEX dans le pic, je me suis apercu que les deux dernières instructions (désactivation de l’USART et saut à la zone réservé de 4 mots pour sauvegarder l’adresse du main) n’existait pas dans le cas ou j’activais le PLL. En décalant le début du bootloader en lui donnant une taille de 102 mots cela fonctionnait mais une fois que l’on avait programmé un programme avec tinybootloader celui-ci m’écrasais les quatre mots à l’adresse maxflash-100 et pas maxflash-102 ! donc la première programmation était correct mais ensuite les deux premières instructions du bootloader était écrasé ! Il fallait donc que je gagne deux instructions dans le code source original…j’ai supprimé un NOP et la désactivation de l’USART (avant dernière ligne). Et depuis cela fonctionne !!!
Je pense qu’il faut dans les programmes désactiver la voie série car le bootloader la laisse activé ! Donc je termine avec un bootloader qui tourne à 115200 bauds/s avec l’oscillateur interne à 8MHz et la PLL activé donc Fosc = 32MHz.
Je mets ci-dessous les lignes que j’ai modifié (cette solution fonctionne !) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
radix DEC LIST P=18F2520 ; type de pic utilisé xtal EQU 32000000 ; frequence d'horloge = 8MHz * 4 = 32MHz baud EQU 115200 ; vitesse de dialogue entre le PC et le PIC ... #define first_address max_flash-200 ; on garde bien une taille de 100 mots CONFIG OSC = INTIO67 ; oscilateur interne CONFIG WDT = OFF, WDTPS = 128 ; watchdog désactivé CONFIG MCLRE = ON, LPT1OSC = OFF, PBADEN = OFF ; broche MCLR active CONFIG STVREN = ON, LVP = OFF, DEBUG = OFF, XINST = OFF ; pas de programmation basse tension ... ORG first_address ;space to deposit first 4 instr. of user prog. nop ; recopie du goto de votre programme principal dans cette zone nop nop nop org first_address+8 IntrareBootloader ; debut du bootloader ; init IntOSC, added by Nam Nguyen-Quang movlw 0x70 ; Oscillateur interne à 8MHz movwf OSCCON movlw 0x40 ; Activation de la PLL movwf OSCTUNE ... Write movwf EECON1 movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1,WR ;WRITE ;nop ; pour gagner les deux instructions de l'activation de la PLL ;nop return ... way_to_exit ;bcf RCSTA, SPEN ; deactivate UART ; pour gagner les deux instructions de l'activation de la PLL bra first_address |
Je mets en téléchargement les fichiers sources et les fichiers HEX que j’ai testé et qui fonctionne…
Ping : Electronique Innovante » Robot hexapode - Robot “Fourmi”