I tried this before but there is this error. Everything is ok with 003 version... Is a cast will work ?
In function 'void init_deplacement()':
error: invalid conversion from 'int' to 'const uint16_t*' In function 'void loop()':
J'avais essayé mais non l'erreur précédente apparaît ! Alors qu'auparavant sur la 003 ca fonctionnait... Est-ce qu'un transtypage pourrait fonctionner ?
Attention au noms des fonctions qui ne sont pas ceux des libs standards pour éviter la confusion. Si vous souhaitez changer les noms, vous pouvez ou changez les dans votre code.
Le #include proposé précédement devrait fonctionner, il suffit peut être d'un cast ou qque chose de trés simple, mais voilà une solution.
bouhhhh comme c'est compliqué. :-?
je voudrais utiliser ce code pour mettre une table contenant des mots (p.ex : "bonjour")
je suis à cours de ram dans un petit projet et peut-être que les 512 bytes de l'eeprom feront la blague pour le script
genre je voudrais placer cette table dans l'eeprom :
c'est en RAM que je manque de place (la place pour les variables), le programme se charge normalement mais quand il tourne, une des table du programme contient du "n'importe quoi".
suivant la version d'arduino, je n'ai pas le même résultat dans mon serial monitor mais il semble bien qu'une des table prenne l'eau.
d'où l'idée de stocker dans l'eeprom.
ecrire mes constants dans la flash ça marche pas avec arduino.enfin j'ai pas réussit en suivant l'exemple là http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_rom_array
J'avais déjà regardé des threads où ils parlaient de la localisation d'espaces mémoire. Je n'ai pas approfondi, j'ai réussi avec l'eeprom à m'en sortir. Je vais te faire une autre proposition avant de regarder la localisation du stockage. Je prépare ça, ca arrive, si ca fonctionne, ca laissera le temps de voir la localisation des variables.
ah oui j'avais écrit << en place de < ! Il me reste une chose à régler, le pb du stockage des chaînes vides et c'est bon. Tu pourras, Eric, Stocker tes chaînes en eeprom.
Je dois partir et je n'ai pas le temps de t'expliquer maintenant mais peut-être comprendras-tu vant mon retour, tard cette nuit. dans le cas ou cela pourrait de débloquer voici le code :
L'eeprom est non volatile et, dans ton cas, pour stocker toutes tes phrases il faut je pense faire une première programmation de l'eeprom avec un prog. sans code superflu avec toutes tes phrases. Puis, ton code utile qui est chargé ensuite dans la carte et qui ne fait que la lecture de l'eeprom qui a été programmée auparavant.
En clair, il te faut programmer la carte deux fois. La première fois avec le plus petit code possible pour écrire dans l'eeprom et la seconde avec ton code enchichi de la fonction char* Jour(byte indexJour) et la déclaration de strRet et des fonctions eeprom. Ca bouffera de l'espace Flash (code), mais pas RAM.
Si t'es bloqué on voit cela plus-tard ou demain matin. Pose tes questions pendant mon absence ou mieux, dis moi que ca fonctionne pour toi.
Bon je suis rentré? Je t'explique un peu la démarche.
D'abord j'ai regardé si la capacité de l'eeprom était suffisante pour contenir le nombre de caractères que tu as a stocker pour tes 33 chaînes de caractères.
"" 0 caractères
" premier" 8 caractères
" deux" 5 caractères
" trois" 6 caractères
" quatre" 7 caractères
" cinq" 5 caractères
" six" 4 caractères
" sept" 5 caractères
" huit" 5 caractères
" neuf" 5 caractères
" dix" 4 caractères
" onze" 5 caractères
" douze" 6 caractères
" treize" 7 caractères
" quatorze" 9 caractères
" quinze" 7 caractères
" seize" 6 caractères
" dix-sept" 9 caractères
" dix-huit" 9 caractères
" dix-neuf" 9 caractères
" vingt" 6 caractères
" vingt-et-un" 12 caractères
" vingt-deux" 11 caractères
" vingt-trois" 12 caractères
" vingt-quatre" 13 caractères
" vingt-cinq" 11 caractères
" vingt-six" 10 caractères
" vingt-sept" 11 caractères
" vingt-huit" 11 caractères
" vingt-neuf" 11 caractères
" trente" 7 caractères
" trente et un" (il n'y a pas de tirets) 13 caractères
" mille" 6 caractères
En C, les chaînes de caractères sont terminées par un 0 qui sert de délimiteur. Donc, le total d'octets est au minimum de 255 (amusant) + 33 soit 288 octets.
Bon, si on écrit les chaînes à la suite en eeprom c'est bien, mais il faudrait avoir un tableau en RAM pour conserver l'index de début des chaînes de caractères, sinon comment retrouver une chaîne en particulier. Un tableau en RAM ? Zut, nous voulions libérer de la RAM ! Alors pourquoi ne pas utiliser un index en début d'eeprom ? Une SAT (String Allocation Table :D).
Mais comment savoir combien il y a d'entrées dans la SAT ? On pourrait mettre un octet en début d'eeprom et? STOP ! Il y en a 33 et c'est déclaré en constante « #define nbChaines 33 ».
L'eeprom comporte 512 cellules d'un octet. Ca laisse une marge de 224 octets. Pour la SAT, il nous faut pouvoir gérer des indices jusqu'à 512 donc des valeurs sur deux octets. La SAT occupera donc 33*2=66 octets.
Bonjour Eric,
Houla ! En faits ce n 'est pas simple ton truc ! J'en suis a compresser les données et ca ne loge toujours pas en ram ! J'arrive à 26 mais pas plus. Je regarde encore mon code ligne par ligne pour voir si je n'ai pas commit d'erreurs. Ensuite, si je ne trouve pas, je te fait un programme en C# pour charger les phrases en eeprom, avec les compléments arduino qui vont bien.
J'avais divers pbs dans mon code, c'est résolu. Du coup j'ai revu mes fonctions de lecture/écriture dans l'eeprom et j'ai trouvé pourquoi auparavant mes fonctions refusaient de fonctionner avaec une adresse en int*. J'écrirai là-dessus ensuite...
Bon, le système est scindé en deux programmes : prog_jours2 et test_jours2.
Le premier, prog_jours2, inscrit les jours dans l'EEprom.
Le second, test_jours2, affiche sur la liason série (j'utilise HyperTerminal) le contenu de l'EEprom pour vérifier.
Le format de stockage dans l'EEprom est le suivant :
premier octet, le nombre de chaînes stockées ;
les n (nombre de chaînes stockées) mots suivants, les index de début des chaînes (ce que j'appelle la SAT, String Allocation Table) ;
les octets suivants sont les caratères des chaînes de caractères avec un 0 délimiteur en fin de chacune.
Suite à différents essais, ... j'ai changé le système de description des chaînes. Il n'y a plus de tableau pour les "nombres", mais une chaîne de caratères. Plus simple à modifier vérifier, coder, ... Et cette chaîne de caractères est "compressée" pour éviter les redites. Le système est le suivant '/' pour une fin de chaîne, '1' pour 'un', 2 pour 'deux', ... 'D' pour 'dix', ... regardez le code, c'est compréhensible, je pense.
Le programme met un certain temps à programmer l'EEprom. Installez si vous le pouvez une LED sur la broche 13, elle s'allumera à la fin de la programmation de l'eeprom. Sans LED, attendre 30s.
Pas de place pour les programmes en direct dans le message donc :
gros, gros projet sur le feu... pas eu de temps libre... mais là j'en ai du coups je reviens à mes amours.
j'ai installé un atmega168 sur une de mes cartes, mais le problème de manque de ram est le même que sur l'atmega8... donc j'ai besoin d'écrire mes trucs dans la rom...
donc je suis allé rechercher ton prog et j'ai testé....avec arduino06
et j'a une erreur ;D (3 versions d'arduino plustard...)
In function 'void eeprom_wr_byte(const unsigned int*, byte)':
error: 'EEWE' was not declared in this scope
qu'est c' y veut le monsieur ? :o
y a pas d'init de la var ?
Désolé, je t'avais oublié, j'ai enchaîné deux missions et je pensais avoir le temps... Je te réponds ce soir de l'hôtel... la je suis en cours et comme je suis le formateur, "ca la fout mal".
Avec le 168 je n'ai pas encore pris le temps de réécrire des fonctions de gestion l'eeprom mais elles existent toujours dans la lib donc j'utilise celles de la lib.
En clair :
en tête de code je place : #include "avr/eeprom.h"
j'utilise la syntaxe avec cast (transtypage) pour les accès : sensibilite = eeprom_read_byte((const uint8_t*)eepromadresse++);
pour écrire idem genre : eeprom_write_byte ((uint8_t*)eepromadresse, sensibilite);
En complément de ceci je vous prépare un "post" sur la gestion des interruptions externes sur le 168 et sur la réduction de la taille du code. Pour l'instant je à l'étranger et débordé de travail. Un peu de patience pour que je rédige, mais ca fonctionne.