Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

XC8 et bootloader USB, hex ne s'execute pas
elekaj34
Membre
Membre
Messages : 4
Enregistré en : octobre 2016

#1 Message par elekaj34 » mer. 26 oct. 2016 19:44

Bonjour,

Ma chaîne de développement est sous Linux (Ubuntu 16.04 LTS), sur laquelle j'ai pk2cmd qui fonctionne ainsi que l'environnement MPLAB X IDE et le compilateur XC8. Tous çà à jour car téléchargé et installé aujourd'hui même :-)

Le PIC est un PIC18F4550 avec à son bord un bootloader USB (donc celui compilé avec C18). J'ai sur ma machine l'utilitaire hid_bootloader qui semble fonctionner correctement (si je reprogramme un hex compilé jadis, le programme fonctionne)

J'ai donc créer un petit programme de test pour vérifier le bon fonctionnement de ma chaine de programmation.
J'ai le fichier C suivant (qui se compile sans problème) :

Code : Tout sélectionner

#pragma config PLLDIV = 5 // (20 MHz crystal)
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 2 // Clock source from 96MHz PLL/2
#pragma config FOSC = HSPLL_HS
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config PWRT = ON
#pragma config BOR = OFF
#pragma config BORV = 2
#pragma config VREGEN = ON //USB Voltage Regulator
#pragma config WDT = OFF
#pragma config WDTPS = 2048
#pragma config MCLRE = ON
#pragma config LPT1OSC = OFF
#pragma config PBADEN = OFF //NOTE: modifying this value here won't have an effect
//on the application. See the top of the main() function.
//By default the RB4 I/O pin is used to detect if the
//firmware should enter the bootloader or the main application
//firmware after a reset. In order to do this, it needs to
//configure RB4 as a digital input, thereby changing it from
//the reset value according to this configuration bit.
#pragma config CCP2MX = ON
#pragma config STVREN = ON
#pragma config LVP = OFF
#pragma config ICPRT = OFF // Dedicated In-Circuit Debug/Programming
#pragma config XINST = OFF // Extended Instruction Set

// Write Protection config bits
#pragma config CP0 = OFF    // Code Protect disabled
#pragma config CP1 = OFF
#pragma config CP2 = OFF
#pragma config CP3 = OFF
#pragma config CPB = OFF    // Boot block is not code protected
#pragma config CPD = OFF    // Data EEPROM is not code protected
#pragma config WRT0 = OFF    // Write Protect disabled
#pragma config WRT1 = OFF
#pragma config WRT2 = OFF
#pragma config WRT3 = OFF
#pragma config WRTB = OFF    // Boot Block not protected
#pragma config WRTC = OFF    // Config registers not protected
#pragma config WRTD = OFF    // Data EEPROM is not write protected
#pragma config EBTR0 = OFF
#pragma config EBTR1 = OFF
#pragma config EBTR2 = OFF
#pragma config EBTR3 = OFF
#pragma config EBTRB = OFF

#define _XTAL_FREQ 20000000

#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <p18f4550.h>

void delay100ms(unsigned int x)
{
    while(x--)
    {
        __delay_ms(25);
        __delay_ms(25);
        __delay_ms(25);
        __delay_ms(25);
    }
}

int main(int argc, char** argv) {
    TRISB=1;                // PortB en entrée
    
    TRISC6
=0;                // RC6 (LED1) en sortie
    TRISC7=0;                // RC7 (LED2) en sortie
    TRISD=0;                // Port D en sortie

    ADCON1|=0x0F;            // Mets toutes les pins en digital
    
    while
(1)
    {
        delay100ms(10);
        RC6=1;
        delay100ms(10);
        RC6=0;
    }
    
    return 
(EXIT_SUCCESS);
}
 

Dans les options du linker, j'ai spécifié un codeoffset de 0x1000 !

Quand je le charge dans le PIC (via le bootloader USB), après reset, la LED ne clignote pas ! Mais le bootloader n'est pas effacé.
J'ai essayé de charger le hex dans le PIC avec pk2cmd (et cette fois-ci sans code offset) et là pareil, pas de signe de vie.

Je court-circuite une étape mais je vois pas laquelle :sad:

Merci pour votre aide

PS : Avant je codais avec le compilateur C18, mais çà c'était avant.
Alain
Ubuntu 16.04 LTS - MPLAB X IDE 3.40 - XC8 1.38

XC8 et bootloader USB, hex ne s'execute pas
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#2 Message par Guest » jeu. 27 oct. 2016 08:02

Bonjour

Nous sommes sur la même configuration :wink: sauf cote programmateur, j'ai pk2 et pk3.

Pour ce qui est de ton programme, il fonctionne sans soucis (passé sous debug) ,avec quelles remarques. Tu dois avoir des avertissements, notamment sur RC0

IL faut écrire:

Code : Tout sélectionner

        __delay_ms(1000);
        PORTCbits.RC6=1;
        __delay_ms(1000);
        PORTCbits.RC6=0;


J'ai un peu modifié le code :sifflotte:
Tu ne dois pas mettre sous XC8, l'include du pic, mais uniquement l'include

Code : Tout sélectionner

 #include <xc.h>
qui fait ref au pic de ton projet.

Donc le problème est coté hard, a voir...

A+

PS:1/ Pas passe en hard :wink:
2/Je viens de voir, qu'il y a aussi du coté du résultat de compilation des avertissements (1311). Si c'est le cas, passer par :
XC8 linker -> memory model de word passer en byte, offset 0x1000 se passe aussi bien .

XC8 et bootloader USB, hex ne s'execute pas
elekaj34
Membre
Membre
Messages : 4
Enregistré en : octobre 2016

#3 Message par elekaj34 » jeu. 27 oct. 2016 08:44

Bonjour,

J'ai le hex du même programme compilé en C18 (jadis) et quand je charge ce hex dans le PIC via l'USB, çà fonctionne nickel.
Quand je charge le hex compilé avec XC8 (le nouveau donc), çà refuse de fonctionner :sad: Donc le hard fonctionne bien à priori. J'ai l'impression que c'est le hex qui ne se "lance" pas !
Après sous C18, j'utilisais un fichier linker, mais pas avec xc8. Est-ce que c'est là la raison de mon souci ?

Sinon, avec une commande style __delay_ms(1000), j'ai l'erreur suivante :
main.c:57: error: (1355) in-line delay argument too large
Alain
Ubuntu 16.04 LTS - MPLAB X IDE 3.40 - XC8 1.38

XC8 et bootloader USB, hex ne s'execute pas
patou149
Débutant
Débutant
Messages : 35
Enregistré en : octobre 2015

#4 Message par patou149 » jeu. 27 oct. 2016 10:54

bonjour,

La fonction "__delay_ms(x) que l'on peut trouver dans le fichier "pic.h" est la suivante :

Code : Tout sélectionner

#define __delay_ms(x) _delay((unsigned long)((x)*(_XTAL_FREQ/4000.0)))   


La limite maximum est semble t'il de 197200 cycles (x), ce qui avec une fréquence de 16MHz donne 49 de maximum.
La valeur de "x" maxi est donc fonction de la fréquence de l'oscillateur.
perso j'utilise une boucle pour générer des délais importants :

Code : Tout sélectionner


void my_delais
(unsigned int nbms) {
    for (int count = 0; count < nbms; count++) __delay_ms(1);
}


A+

XC8 et bootloader USB, hex ne s'execute pas
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#5 Message par Guest » jeu. 27 oct. 2016 11:12

Oui c'est exact a 20Mhz c'est trop GROS, comme le problème ne viens pas de la,donc ne pas s’attarder sur celui ci.
Aucune remarque sur les WARNING de ton compli ???? TU N'AS PAS de WARNING moi a la compli j'ai des avertissements et pas qu'un
au niveau fichier je ne sais pas.
Autre question la Fosc avec le PLL est de combien ??? niveau delay tu l'as fixé a 20MHz

XC8 et bootloader USB, hex ne s'execute pas
elekaj34
Membre
Membre
Messages : 4
Enregistré en : octobre 2016

#6 Message par elekaj34 » jeu. 27 oct. 2016 12:55

Re,

En repartant de 0 (donc en recréant un nouveau projet), maintenant çà marche :-D
Donc j'avais bien zappé un truc, mais quoi je sais pas :sifflotte:

Sinon, oui j'ai bien un quartz de 20MHz pour l'oscillateur :wink:
Alain
Ubuntu 16.04 LTS - MPLAB X IDE 3.40 - XC8 1.38

XC8 et bootloader USB, hex ne s'execute pas
elekaj34
Membre
Membre
Messages : 4
Enregistré en : octobre 2016

#7 Message par elekaj34 » jeu. 27 oct. 2016 13:12

Sinon, pas de warnings, du moins pas dans la partie "Output", dont voici la sortie :


CLEAN SUCCESSFUL (total time: 54ms)
make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1] : on entre dans le répertoire « /home/alain/MPLABXProjects/PICLED.X »
make -f nbproject/Makefile-default.mk dist/default/production/PICLED.X.production.hex
make[2] : on entre dans le répertoire « /home/alain/MPLABXProjects/PICLED.X »
"/opt/microchip/xc8/v1.38/bin/xc8" --pass1 --chip=18F4550 -Q -G --double=24 --float=24 --emi=wordwrite --opt=default,+asm,+asmfile,-speed,+space,-debug --addrqual=ignore --mode=free -P -N255 --warn=-3 --asmlist -DXPRJ_default=default --summary=default,-psect,-class,+mem,-hex,-file --codeoffset=0x1000 --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,-download,+config,+clib,-plib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s" -obuild/default/production/main.p1 main.c
"/opt/microchip/xc8/v1.38/bin/xc8" --chip=18F4550 -G -mdist/default/production/PICLED.X.production.map --double=24 --float=24 --emi=wordwrite --opt=default,+asm,+asmfile,-speed,+space,-debug --addrqual=ignore --mode=free -P -N255 --warn=-3 --asmlist -DXPRJ_default=default --summary=default,-psect,-class,+mem,-hex,-file --codeoffset=0x1000 --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,-download,+config,+clib,-plib --output=-mcof,+elf:multilocs --stack=compiled:auto:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s" --memorysummary dist/default/production/memoryfile.xml -odist/default/production/PICLED.X.production.elf build/default/production/main.p1
Microchip MPLAB XC8 C Compiler (Free Mode) V1.38
Build date: Jun 30 2016
Part Support Version: 1.38
Copyright (C) 2016 Microchip Technology Inc.
License type: Node Configuration

:: advisory: (1233) Employing 18F4550 errata work-arounds:
:: advisory: (1234) * Corrupted fast interrupt shadow registers
:: warning: (1273) Omniscient Code Generation not available in Free mode

Memory Summary:
Program space used 8Ch ( 140) of 7000h bytes ( 0.5%)
Data space used 8h ( 8) of 800h bytes ( 0.4%)
Configuration bits used 7h ( 7) of 7h words (100.0%)
EEPROM space used 0h ( 0) of 100h bytes ( 0.0%)
ID Location space used 8h ( 8) of 8h bytes (100.0%)
Data stack space used 0h ( 0) of 7A0h bytes ( 0.0%)


You have compiled in FREE mode.
Using Omnicient Code Generation that is available in PRO mode,
you could have produced up to 60% smaller and 400% faster code.
See http://www.microchip.com/MPLABXCcompilers for more information.

make[2] : on quitte le répertoire « /home/alain/MPLABXProjects/PICLED.X »
make[1] : on quitte le répertoire « /home/alain/MPLABXProjects/PICLED.X »

BUILD SUCCESSFUL (total time: 355ms)
Loading code from /home/alain/MPLABXProjects/PICLED.X/dist/default/production/PICLED.X.production.hex...
Loading completed
Alain
Ubuntu 16.04 LTS - MPLAB X IDE 3.40 - XC8 1.38

XC8 et bootloader USB, hex ne s'execute pas
Guest
Confirmé
Confirmé
Messages : 800
Enregistré en : mars 2017

#8 Message par Guest » jeu. 27 oct. 2016 13:25

Bien content pour toi que cela fonctionne :wink:
ici
Capture.png

Mes (entre autre) warnings, qui ont été corrigés par

Code : Tout sélectionner

PORTCbits.RC6=1

Sur ce, bonne continuation et bien sur plaisir de te lire sur fantaspic

A+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 32 invités