Microchip, C18, variable folle

Fermé
titusIII Messages postés 93 Date d'inscription jeudi 16 octobre 2008 Statut Membre Dernière intervention 16 décembre 2014 - 7 févr. 2014 à 18:59
 Utilisateur anonyme - 20 févr. 2014 à 16:10
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 :


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!
Maintenant voilà quelque chose de plus utile, mais qui tourne pas :

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.

32 réponses

titusIII Messages postés 93 Date d'inscription jeudi 16 octobre 2008 Statut Membre Dernière intervention 16 décembre 2014 2
19 févr. 2014 à 13:51
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.
0
titusIII Messages postés 93 Date d'inscription jeudi 16 octobre 2008 Statut Membre Dernière intervention 16 décembre 2014 2
19 févr. 2014 à 20:54
0
Utilisateur anonyme
19 févr. 2014 à 21:01
bien reçu. je regarde
0
Utilisateur anonyme
19 févr. 2014 à 22:33
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
0
titusIII Messages postés 93 Date d'inscription jeudi 16 octobre 2008 Statut Membre Dernière intervention 16 décembre 2014 2
Modifié par titusIII le 19/02/2014 à 23:44
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
20 févr. 2014 à 00:16
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 ?
0
titusIII Messages postés 93 Date d'inscription jeudi 16 octobre 2008 Statut Membre Dernière intervention 16 décembre 2014 2
20 févr. 2014 à 13:20
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.
0
titusIII Messages postés 93 Date d'inscription jeudi 16 octobre 2008 Statut Membre Dernière intervention 16 décembre 2014 2
20 févr. 2014 à 13:22
Mes réglages : http://cjoint.com/data3/3BunwvW9v3R.htm
0
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.
0
titusIII Messages postés 93 Date d'inscription jeudi 16 octobre 2008 Statut Membre Dernière intervention 16 décembre 2014 2
20 févr. 2014 à 13:57
Alors là, je suis perdu! J'ai jamais entendu parler de ça!
Peux-tu m'en dire plus?
0
Utilisateur anonyme
20 févr. 2014 à 14:29
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 ?
0
titusIII Messages postés 93 Date d'inscription jeudi 16 octobre 2008 Statut Membre Dernière intervention 16 décembre 2014 2
20 févr. 2014 à 14:36
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 :
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!
0
Utilisateur anonyme
20 févr. 2014 à 16:10
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 :
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).
0