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
Utilisateur anonyme - 20 févr. 2014 à 16:10
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
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.
Je zip le tout ce soir et te l'envoie.
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
19 févr. 2014 à 20:54
Voila mon code :
https://www.cjoint.com/?3BtuY6zxFoC
https://www.cjoint.com/?3BtuY6zxFoC
Utilisateur anonyme
19 févr. 2014 à 22:33
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
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
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
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
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
Utilisateur anonyme
20 févr. 2014 à 00:16
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 ?
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 ?
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
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.
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.
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
20 févr. 2014 à 13:22
Mes réglages : http://cjoint.com/data3/3BunwvW9v3R.htm
Utilisateur anonyme
Modifié par le père. le 20/02/2014 à 13:55
Modifié par le père. le 20/02/2014 à 13:55
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.
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
20 févr. 2014 à 13:57
Alors là, je suis perdu! J'ai jamais entendu parler de ça!
Peux-tu m'en dire plus?
Peux-tu m'en dire plus?
Utilisateur anonyme
20 févr. 2014 à 14:29
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 ?
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 ?
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
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 :
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!
Utilisateur anonyme
20 févr. 2014 à 16:10
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 :
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).