Microchip, C18, variable folle
titusIII
Messages postés
100
Statut
Membre
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour,
Je suis en train de faire un afficheur pour afficher les horaires de bus de Rennes dans mon appart, j'ai déjà réalisé avec succès ce projet sur un arduino. J'ai cependant besoin de libérer mon arduino pour un autre projet.
J'ai donc sortit un 18f2580 pour l'occasion. Je travaille avec mplabX et C18.
J'ai un problème qui me semble défier les lois de la programmation, je vous explique :
J'hésite entre passer le karcher sur le pic ou mon ordi...
Merci de votre analyse, j'attend patiemment une réponse, voir solution?
Titus.
Je suis en train de faire un afficheur pour afficher les horaires de bus de Rennes dans mon appart, j'ai déjà réalisé avec succès ce projet sur un arduino. J'ai cependant besoin de libérer mon arduino pour un autre projet.
J'ai donc sortit un 18f2580 pour l'occasion. Je travaille avec mplabX et C18.
J'ai un problème qui me semble défier les lois de la programmation, je vous explique :
Maintenant voilà quelque chose de plus utile, mais qui tourne pas :
var = 38%10;//Récupérer '8'
printCar(var+48); //+48 pour la conversion en ascii, et afficher '8'
// --> mon écran affiche '8', pas de problème!
autreVar = 38;
var = autreVar%10;//Récupérer '8'
printCar(var+48); //l'afficher '8'
// --> mon écran affiche '0' peut importe la valeur de "autreVar"
J'hésite entre passer le karcher sur le pic ou mon ordi...
Merci de votre analyse, j'attend patiemment une réponse, voir solution?
Titus.
A voir également:
- Microchip, C18, variable folle
- Vba range avec variable ✓ - Forum VB / VBA
- Variable d'environnement temp ✓ - Forum Microsoft Office
- Variable objet ou variable de bloc with non définie - Forum VB / VBA
- Impossible de créer le fichier de travail. vérifiez la variable d'environnement temp - Forum Microsoft Office
- Variable objet ou bloc "with" non définie - Forum VB / VBA
32 réponses
J'ai deux fois le caractère T, j'ai remis ma variable en char.
Je zip le tout ce soir et te l'envoie.
Je zip le tout ce soir et te l'envoie.
Je vois que le code a encore changé : tu as ajouté des remises à 0 des sorties après chaque impulsion : tu remets ton driver LCD en cause, finalement ?
Et tes variables ont changé de banque. Je ne peux malheureusement pas compiler ni désassembler, je n'ai pas MPLABX à la maison et je n'ai pas envie de l'installer.
Mais je vois que tu es supposé afficher l'heure sur la première ligne. Mis à part que tu oublies, il me semble, de faire sl++ au début et que ton test if (sl > 10) est incorrect (il faudrait >=), est-ce que cet affichage-là marche ?
Ceci étant dit, j'avoue que je ne trouve toujours pas d'explication
Et tes variables ont changé de banque. Je ne peux malheureusement pas compiler ni désassembler, je n'ai pas MPLABX à la maison et je n'ai pas envie de l'installer.
Mais je vois que tu es supposé afficher l'heure sur la première ligne. Mis à part que tu oublies, il me semble, de faire sl++ au début et que ton test if (sl > 10) est incorrect (il faudrait >=), est-ce que cet affichage-là marche ?
Ceci étant dit, j'avoue que je ne trouve toujours pas d'explication
Cet affichage marche très bien! L'heure est correcte et s'affiche bien.
J'ai en effet remi mon drivers en question, et il marche aussi comme ça.
Pas de changement sur mon résultat de modulo.
Passer sur un pic 16F ou un autre compilateur tel que HITECH (je doute de la prise en charge des 18F) résoudrait peut etre le problème.
J'essayerai demain. ca m'embete d'arreter le projet sur un problème comme celui là.
Le sl++ se fait en interruption
J'ai en effet remi mon drivers en question, et il marche aussi comme ça.
Pas de changement sur mon résultat de modulo.
Passer sur un pic 16F ou un autre compilateur tel que HITECH (je doute de la prise en charge des 18F) résoudrait peut etre le problème.
J'essayerai demain. ca m'embete d'arreter le projet sur un problème comme celui là.
Le sl++ se fait en interruption
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Le sl++ se fait en interruption
Effectivement, j'aurais dû le voir. Mais ça n'est pas logique : elle devrait être incrémentée dans time() comme les autres variables de comptage de temps. Et il faudra que tu m'expliques comment tu fais pour avoir un affichage correct du temps alors que tu n'incrémentes les dizaines que toutes les 11 secondes ! Pendant la dernière de chaque 11 secondes, tu dois afficher : (deux points) qui est le code ASCII qui suit '9'.
Personnellement, j'ai fait tourner des applications écrites avec C18 sur des 18F, j'utilise l'opérateur modulo et je n'ai jamais rien remarqué.
Aux dernières nouvelles, ça affiche un 'T' avec testT=17 : peux-tu essayer d'autres valeurs pour essayer de dégager une loi ?
Effectivement, j'aurais dû le voir. Mais ça n'est pas logique : elle devrait être incrémentée dans time() comme les autres variables de comptage de temps. Et il faudra que tu m'expliques comment tu fais pour avoir un affichage correct du temps alors que tu n'incrémentes les dizaines que toutes les 11 secondes ! Pendant la dernière de chaque 11 secondes, tu dois afficher : (deux points) qui est le code ASCII qui suit '9'.
Personnellement, j'ai fait tourner des applications écrites avec C18 sur des 18F, j'utilise l'opérateur modulo et je n'ai jamais rien remarqué.
Aux dernières nouvelles, ça affiche un 'T' avec testT=17 : peux-tu essayer d'autres valeurs pour essayer de dégager une loi ?
Pour :
testT = 17 affichage de 'T'
testT = 18 affichage de 'T'
testT = 19 affichage de 'T'
testT = 0 affichage de 'T'
Bon... Visiblement il s'en fou de ma variable.
Une autre piste? Je n'utilise pas de picKit ou ICD. Je suis dans le non-officiel avec cette chose : https://login.aliexpress.com/?from=sm&return_url=http://www.aliexpress.com/item/536517358.html
Ça marche plutôt bien, seul inconvénient, il faut régler les fuses à chaque fois dans le logiciel fourni avec. Je pense les avoirs bien réglés.
Je t'envoie un screenshot de mes réglages.
testT = 17 affichage de 'T'
testT = 18 affichage de 'T'
testT = 19 affichage de 'T'
testT = 0 affichage de 'T'
Bon... Visiblement il s'en fou de ma variable.
Une autre piste? Je n'utilise pas de picKit ou ICD. Je suis dans le non-officiel avec cette chose : https://login.aliexpress.com/?from=sm&return_url=http://www.aliexpress.com/item/536517358.html
Ça marche plutôt bien, seul inconvénient, il faut régler les fuses à chaque fois dans le logiciel fourni avec. Je pense les avoirs bien réglés.
Je t'envoie un screenshot de mes réglages.
Encore une idée : n'as-tu pas mélangé les modèles (small et large) dans ton projet ? Utilises-tu bien la bonne bibliothèque ? Il me semble (je n'ai pas de doc où je suis) qu' il y a plusieurs façons de gérer la mémoire et il faut bien utiliser à l'édition de liens la bibliothèque compatible avec le modèle choisi.
Hors sujet, après vérification, ça concerne les pointeurs sur le code.
J'ai horreur de l'avouer, mais je sèche...
Sinon, peux-tu confirmer que ton comptage de secondes a bien un problème de comptage ?
J'ai horreur de l'avouer, mais je sèche...
Sinon, peux-tu confirmer que ton comptage de secondes a bien un problème de comptage ?
Oui, effectivement il y avait bien un problème, j'avais pas remarqué.
C'est des vraies 10 secondes maintenant, merci!
J'aimerai également faire quelques chose pour mon drivers LCD :
au lieu de :
J'ai essayé quelques truc mais rien de s'affiche, il doit y avoir une solution?
J'ai pensé à faire un prototype dans ce genre :
Mais rien!
C'est des vraies 10 secondes maintenant, merci!
J'aimerai également faire quelques chose pour mon drivers LCD :
ecrire("bonjour");
au lieu de :
char var[] = "bonjour"; ecrire(var);
J'ai essayé quelques truc mais rien de s'affiche, il doit y avoir une solution?
J'ai pensé à faire un prototype dans ce genre :
void ecrire(const char p*);
Mais rien!
Pour ce dernier point, je devrais pouvoir t'aider.
Dans les PIC, les bus d'adresse programme et de données, ainsi que les mémoires correspondantes, sont totalement séparés.
Il existe des pointeurs RAM et des pointeurs ROM. Ces deux types sont totalement incompatibles : une adresse de la mémoire programme n'a absolument rien qui lui correspond dans la mémoire vive, et lycée de Versailles.
Quand tu définis :
Tu définis une variable (initialisée) en RAM et ta fonction "ecrire" attend un pointeur de type ram : ça tombe bien.
Quand tu appelles directement ecrire("bonjour"); "bonjour" n'est pas affecté à une variable, il est "logé" en mémoire non volatile, donc la mémoire programme. donc tu essayes de passer à ecrire un pointeur de type rom : je suppose que le compilateur refuse.
Ré-écris une autre version, copie quasi-conforme de "ecrire", mais avec un paramètre rom char * et ça devrait marcher.
Tu peux toujours garder tes messages prédéfinis sous la forme
comme ça ton texte "bonjour" est et reste en mémoire programme, alors que tel que tu le définis actuellement, il est défini dans la mémoire vive, ce qui oblige à en avoir une copie dans la mémoire programme (recopiée vers la RAM au lancement du programme).
Dans les PIC, les bus d'adresse programme et de données, ainsi que les mémoires correspondantes, sont totalement séparés.
Il existe des pointeurs RAM et des pointeurs ROM. Ces deux types sont totalement incompatibles : une adresse de la mémoire programme n'a absolument rien qui lui correspond dans la mémoire vive, et lycée de Versailles.
Quand tu définis :
char var[] = "bonjour";
Tu définis une variable (initialisée) en RAM et ta fonction "ecrire" attend un pointeur de type ram : ça tombe bien.
Quand tu appelles directement ecrire("bonjour"); "bonjour" n'est pas affecté à une variable, il est "logé" en mémoire non volatile, donc la mémoire programme. donc tu essayes de passer à ecrire un pointeur de type rom : je suppose que le compilateur refuse.
Ré-écris une autre version, copie quasi-conforme de "ecrire", mais avec un paramètre rom char * et ça devrait marcher.
Tu peux toujours garder tes messages prédéfinis sous la forme
const rom char var[] = "bonjour";
comme ça ton texte "bonjour" est et reste en mémoire programme, alors que tel que tu le définis actuellement, il est défini dans la mémoire vive, ce qui oblige à en avoir une copie dans la mémoire programme (recopiée vers la RAM au lancement du programme).