Pages: 1 2 [3]   Go Down
Author Topic: Comment incrémenter ceci 0x0100  (Read 2204 times)
0 Members and 1 Guest are viewing this topic.
Bretagne
Online Online
Edison Member
*
Karma: 10
Posts: 1296
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si tu avais su, tu te serais mis à boire plus tôt. smiley-lol

Alors oui, pourquoi pour qui et comment? peut-être que #define (qui n'a comme fonction que de remplacer l'identifiant par la valeur dans tout ton programme avant compilation) fait se mélanger des byte et des words, et je sais que par moments si on n'y pense pas assez, un word multiplié par un byte sera retenu comme byte, et qu'à la lecture du word, l'otcet de poids faible sera le byte calculé, et l'otcet de poids fort la case mémoire suivante qui sera peut-être occupée par autre chose, mais là, le µP s'en contre-fout, il lit quand même. ou l'inverse, enfin je me comprends...

Ce qui compte, c'est que tu as trouvé une parade, alors restons dessus et félicitations!

Sinon, pourquoi word au lieu de unsigned int? parce que que l'on écrive "word", "unsigned int", "uint16_t" ou "uint16", c'est exactement la même chose. Le core arduino comprend des milliers de #define qui se redéfinissent entre eux... Puis il y a 20 ans, à l'école on ne m'a parlé que de byte (octet) et word (un mot de deux octets) quand on jouait à programmer des 68HC11. Du coup, j'ai gardé ces définitions qui sont bien plus claires pour moi-même...
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 368
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

oK alors je vais rester sur
Quote
const unsigned int eprom_cou = 0x0000;
meme s'il y aun peu plus d'écriture, si c'est la même chose?

Par contre derniere question, on est d'acord que de faire
Code:
const unsigned int EPROM_COU = 0x0000;
ou
Code:
const unsigned int EPROM_COU = 0;

c'est exactement la même chose pour le microtrolleur? (juste pour avoir une confirmation.

En tout cas, milles mercis (et a fdufnews aussi) pour toutes ces explications et le temps passé.

Je passerai bien en bretagne te payer une biere, mais c'est fait un peu loin, suis de l'autre côté  smiley
Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

Bretagne
Online Online
Edison Member
*
Karma: 10
Posts: 1296
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Par contre derniere question, on est d'acord que de faire
Code:
const unsigned int EPROM_COU = 0x0000;
ou
Code:
const unsigned int EPROM_COU = 0;

c'est exactement la même chose pour le microtrolleur? (juste pour avoir une confirmation.

dans ce cas, oui, car le format de la variable est défini, c'est un entier non signé sur 2 octets (16 bits). donc lui affecter 0 ou 0x0000, c'est tout pareil, le compilateur va transformer ta valeur numérique en un nombre binaire de 16 bits, soit 0000000000000000.

Pour la bière, t'inquiète, je n'oublie pas, méfiance si un jour tu viens en vacances dans le coin!
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 368
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Super. Milles mercis pour tout ces explications. C'est super cool.

Quote
Pour la bière, t'inquiète, je n'oublie pas, méfiance si un jour tu viens en vacances dans le coin!
J'y étais, y a ....deux ans. Et comme ca été vraiment bien, ca sera en grand plaisir de revenir.

 smiley-cool
Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

Offline Offline
Sr. Member
****
Karma: 0
Posts: 368
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello,

Je constate qu'il y a un probleme au niveau de l'incrémentation (index)

Ceci est mon index
Code:
unsigned long int index_EPROM = 0L;

Je l'incrlmente simplement comme ceci

Code:
index_EPROM++;

Le truc c'es qu'il ne depasse pas 10. Ensuite il recommence à 0.
C'est pas bisard alors qu'on est en long int?
Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

Bretagne
Online Online
Edison Member
*
Karma: 10
Posts: 1296
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

heu... tu parles de 10 ou de 0x10? c'est étonnant que tu ne puisses pas incrémenter un long. tu as essayé :
Code:
index_EPROM = index_EPROM + 1;
?

c'est tout con, mais si on n'essaie pas, on ne sait pas...
Logged

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3010
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ce serait bien de mettre le code incriminé. Par ce que bon un ++ ça incrémente mais tu peux faire autre chose à coté qui modifie la valeur.
Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 368
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello!

Oui j'avais essayéc eci sans succès
Code:
index_EPROM+=1L;

J'ai reproduit cette exrcice afin d'exclure une partie de mon code.
Ceci me permets de tester aJSON (qui ne marche pas, ca n'affiche le format JSON, mais doit encore chercher  smiley https://github.com/interactive-matter/aJson/blob/master/README.md ),

Mais avant, je souhaiterai comprendre et résoudre l'incrémentation qui ne dépasse pas 10L. J'ai mis les commentaire, dans le code.
Ha, ne le lisez pas le tout. Le probleme se situe dans setup() et dans loop(). Mais si c'est reglé dans setup(), ben ca regler dans loop()  smiley

Par contre je dois mettre le code me dehor du post, a cause de la limitation du nombre de caratctere:
http://www.hello-web.net/temp/forum2.html
Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

Bretagne
Online Online
Edison Member
*
Karma: 10
Posts: 1296
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut.

Code:
unsigned long int intMax = 9L; // L Parce qu'il interfera avec index_EPROM

 (...)

for(index_EPROM=0L; index_EPROM <=intMax; index_EPROM++ ){
}
si ça peut t'aider...

et pourquoi utiliser un long??? tu vas perdre énormément de temps à le traiter, alors que c'est une valeur qui ne devrait pas dépasser les 3000. utilises un unsigned int, et :

Code:
#define SIZE_IND 2 // Debug, pour suivre l incrementation
(...)
word ind;  // au lieu d'un char[]

//writeEEPROM(rom,(eprom_inc*index_EPROM)+eprom_ind,char_index_EPROM); // ICI JE VOIS L EVOLUTION DE L INCREMENTATION
writeEEPROM(rom,(eprom_inc*index_EPROM)+eprom_ind,index_EPROM); // normalement, ça passe comme ça, mais le but du jeu est d'enregistrer une valeur numérique sur deux octets.
te prends pas la tête à convertir en chaîne de caractère, tu perds du temps et c'est un risque de foirer les données. en même temps, tu n'as plus besoin de l'enregistrer, ça ne sert absolument à rien car j'ai trouvé ton erreur...
« Last Edit: September 30, 2013, 11:42:46 am by Super_Cinci » Logged

Offline Offline
Sr. Member
****
Karma: 0
Posts: 368
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Alors, oui j'ai essayé d'utiliser de int au lieu des long int.
et avec des int ca fonctionne.

Le truc c'est que je suis limitl à 32763  aors que le long int va au moins jusqu'a la valeur max de l'EEPROM soit de 262144.
Je suis conscient qu'il sera extrement rare d'aller jusquà ce grand nombre


Mais bon c'est vrai que j exagere puisque 32763min fait 546 heure.  smiley
Logged

Il ne suffit pas de tout savoir, la persévérance, c'est déjà presque tout!

Bretagne
Online Online
Edison Member
*
Karma: 10
Posts: 1296
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

surtout que l'index, c'est le numéro d'un bloc de 90 octets, donc l'index max = 262144/90 = 3000 environ... donc soit un int soit un word. le jour où tu mettras une eprom de 2,5Mo, oui, l'int ne suivra plus. pour saturer un word, il faudra dépasser les 5Mo... pour un long, la limite sera dans les... 175Go, je crois pas qu'on ait encore inventé une telle eprom sur un DIP8 smiley-lol.
« Last Edit: September 30, 2013, 01:29:52 pm by Super_Cinci » Logged

France
Offline Offline
Faraday Member
**
Karma: 23
Posts: 3010
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Alors, oui j'ai essayé d'utiliser de int au lieu des long int.
et avec des int ca fonctionne.

Le truc c'est que je suis limitl à 32763  aors que le long int va au moins jusqu'a la valeur max de l'EEPROM soit de 262144.
Je suis conscient qu'il sera extrement rare d'aller jusquà ce grand nombre


Mais bon c'est vrai que j exagere puisque 32763min fait 546 heure.  smiley
Je crois que tu t'es un peu mélangé entre taille mémoire et adressage de la mémoire (et nous on a suivi sans réfléchir). Je viens seulement de faire le rapprochement entre les deux fils de discussion que tu as ouvert, l'un sur l'incrémentation et l'autre sur le calcul avec des long int.
La mémoire à une capacité de 256k bits mais en fait l'accès à son contenu se fait par octet et donc on a une mémoire de 32k octets.
Dans la fonction write l'adresse est un entier entre 0 et 32767.
Logged

Pages: 1 2 [3]   Go Up
Jump to: