Lecture écriture 24LC16B

zebulon

Member
Bonsoir,

Cela fait 2 jours que je galère, alors je pose ma petite question.

Afin de poursuivre mes expérimentations, je souhaite faire un simple datalogger de température.
But : faire les acquisitions de température, les stocker dans une 24LC16B et relire la 24LC16B plus tard.

Le montage est simple et la programmation aussi; dire qu'il y a quelques années, j'avais décortiquer tous les chronogrammes du DS1820 afin d'écrire les routines de lecture/écriture (qui fonctionnaient très bien d'ailleurs).

Mon problème : Je n'arrive pas à ecrire/relire dans l'EEPROM.

Je lis la température. Si je la transmet directement sur le port série avec sertxd, pas de problème, j'affiche bien la température lu sur le capteur DS18B20.
Je fais clignoter une LED pour controler que le PIC n'est pas planté -> OK
J'ajoute les instructions de config/ecriture/lecture de l'EEPROM et là, plus rien ne fonctionne.
Lors de l'envoi des données sur le port série par sertxd, la température est constamment à 255.

Je ne pense pas qu'il y ait d'erreur de câblage mais je vous le décrit sommairement :
- pattes 1,2,3 de la 24LC16B à la masse
- patte 4 à la masse
- patte 5 de la 24LC16B reliée à la patte 7 du PICAXE-18M2
- patte 6 de la 24LC16B reliée à la patte 10 du PICAXE
- patte 7 de la 24LC16B reliée à la masse
- patte 8 de la 24LC16B reliée au +4,5V

Et voici le tout petit programme que j'ai écris :

Code:
main:
  high B.0 ' Allume LED
  readtemp C.0, b0
  low B.0 ' Eteind LED

  i2cslave $A0, i2cfast, i2cbyte

  let W1 = $0000

  writei2c w1,(b0)
  pause 20

  pause 1000

  readi2c w1,(b1)

  sertxd("Temp=", #b1, 13, 10)

  goto main
J'avais également essayé avec une 24LC256 (en mettant i2cword au lieu de i2cbyte), mais sans plus de succès
J'avais aussi au départ mis 0 au lieu de W1 pour l'adresse, pensant que peut-être il fallait passer par un registre intermédiaire, mais pas mieux.

Est-ce que certain registre sont interdits quand on utilise les commandes i2c ?

Voilà, si vous voyez d'où vient le problème, je suis preneur de tous commentaires.

Merci,
Guillaume
 
Last edited:

westaust55

Moderator
Votre description de câblage est correcte pour l'opération.

Vous avez correctement placé la taille d'adresse pour le 124LC16B à i2cbyte

Au lieu de l'utilisation le word variable (W1) pour passer l'endroit d'adresse à l'EEPROM emploient svp une variable de byte

Code:
main:
  high B.0 ' Allume LED
  readtemp C.0, b0
  low B.0 ' Eteind LED

  i2cslave $A0, i2cfast, i2cbyte

  let [COLOR="Red"]b2[/COLOR] = $[COLOR="red"]00[/COLOR]
  writei2c [COLOR="red"]b2[/COLOR],(b0)
  pause 20
 

zebulon

Member
Votre description de câblage est correcte pour l'opération.

Vous avez correctement placé la taille d'adresse pour le 124LC16B à i2cbyte

Au lieu de l'utilisation le word variable (W1) pour passer l'endroit d'adresse à l'EEPROM emploient svp une variable de byte

Code:
main:
  high B.0 ' Allume LED
  readtemp C.0, b0
  low B.0 ' Eteind LED

  i2cslave $A0, i2cfast, i2cbyte

  let [COLOR="Red"]b2[/COLOR] = $[COLOR="red"]00[/COLOR]
  writei2c [COLOR="red"]b2[/COLOR],(b0)
  pause 20
Bonjour,

Merci westaust55.
J'ai fait cela depuis mon dernier message, mais ça ne fonctionne pas mieux.

Je posterais ce soir une photo du montage sur plaque d'essai au cas où il y aurait quelque chose que je ne vois pas.
J'ai déjà tout décâblé puis recâbler car au bout d'un moment, je ne voyais plus rien, mais ça ne fonctionne toujours pas. Ce doit être un truc tout bête.

D'autres idées ?

Merci,
Guillaume
 
Last edited:

westaust55

Moderator
For the the I2c bus, do you have a "pull up" resistor on each line (Sda and Scl) connecting the lines to Vcc (4.5V or 5V)?
Typical value for each resistor is 4k7 ohms.


EDIT: added diagram for reference
 

Attachments

Last edited:

westaust55

Moderator
Dans le simulateur ceci fonctionne.

J'ai déplacé l'i2cslave au début et fait le changement d'endroit d'EEPROM autrement vous " ; portez l'out" ; le premier endroit d'EEPROM tout à fait rapidement. Également maintenant utilisant bloc le de 256 deuxième bytes de l'EEPROM pour la même raison a par conséquent changé $A0 en $A2

Si aucun succès ne signalent toujours svp votre schéma de circuit et peut-être quelques photographies.

Code:
Init:
  i2cslave $A2, i2cfast, i2cbyte
  let b2 = $00
  inc b2

main:
  high B.0 ' Allume LED
  readtemp C.0, b0
  low B.0 ' Eteind LED


  writei2c b2,(b0)
  pause 1000

  readi2c b2,(b1)

  sertxd("Temp=", #b1, 13, 10)
  
pause 1000
  goto main
 

zebulon

Member
Je viens de faire de nouvelles expérimentations.
J'ai utiliser plusieurs 24LC16B différentes. Elles sont neuves, mais en stock depuis quelques années (3-4 ans). Ca ne se dégrade pas dans le temps quand même (Elles étaient stockées dans un tiroir dans les petites boites plastiques qu'utilise MAXIM pour envoyer les composants, sur la mousse).

J'ai changé la commande sertxd par ceci :

sertxd("B0=", #B0, " - B1=", #B1, " - B2=", #B2, 13, 10)

Pour être plus précis, voici exactement ce que je fais.
- Une fois mon PICAXE programmé, je débranche le circuit d'alim (3 piles 1,5V)
- Je lance mon logiciel d'émulation de terminal, je configure la vitesse à 4800 bauds
- Je remets le circuit sous tension.

Je reçois les données suivantes :

B0=25 - B1=163 - B2=1
B0=25 - B1=163 - B2=1
B0=25 - B1=163 - B2=1
B0=25 - B1=163 - B2=1
B0=25 - B1=163 - B2=1
B0=25 - B1=255 - B2=1
B0=25 - B1=255 - B2=1
B0=25 - B1=255 - B2=1
B0=25 - B1=255 - B2=1
B0=25 - B1=255 - B2=1
...

En fait à la mise sous tension, les premières valeurs de B1 sont à 163 (10100011B) variable de 1 à 10 fois et ensuite, il y a toujours 255.

Si je coupe l'alim et que je rebranche, ça refait la même chose.

J'ai essayé en utilisant différents bloc de l'EEPROM et en changeant l'adresse, c'est toujours pareil.

Finalement, J'ai débranché les lignes SCL et SDA ... C'EST PAREIL !!!

Donc le PICAXE "ne voit pas" l'EEPROM.

Je suis désespéré ... :(

Guillaume
 

zebulon

Member
Nouvel essai.
Je branche l'oscillo (base de temps sur 5µs (400KHz = 2,5µs) et amplitude 2V/DIV).
Il n'y a rien qui passe, ni sur SDA, ni sur SCL.

On dirait que le PICAXE 18M2 n'utilise pas les broches 7 et 10 pour l'I2C.

J'ai testé les autres broches pour voir si je trouvais un signal à 400Khz, mais nada !
 
Last edited:

zebulon

Member
Je potasse la doc et je vois qu'il faut préciser le i2cfast en indiquant i2cfast_4, i2cfast_8 ou i2cfast_16, etc ...
Par défaut, le PICAXE 18M2 fonctionne à 4 Mhz. J'ai donc mis i2cfast_4, mais pas d'amélioration.

Comme vous pouvez voir, je cherche ... mais je ne trouve pas :(
 

zebulon

Member
Bonjour Zebulon,
Voici un tuto sur l'utilisation des mémoires i2c, le test de lecture et d'écriture devrait valider le fonctionnement de la mémoire.
View attachment 8424
Cordialement
Merci fuse pour cette doc concise.

Bon, c'est ce que je fais donc je suis pas beaucoup plus avancé.
Mais en lisant un post ICI, je retourne voir ma photo et je m'aperçois que les 2 résistances de pull-up n'y sont plus (probablement quand j'ai décâblé/recâblé).
Je refais un test ce soir. J'espère que ça vient de là.

Encore merci pour cette doc.
Guillaume
 

PieM

Senior Member
Bonjour,

Les liaisons I2C sont connectées au bon endroit , mais je ne vois qu'une résistance de 4.7k et connectée sur C.7 (ou C.0 ?)

Quant au 163 reçu ça ressemble bizarrement à la partie fixe de l'adresse mémoire ...
 

zebulon

Member
Bonjour,

Les liaisons I2C sont connectées au bon endroit , mais je ne vois qu'une résistance de 4.7k et connectée sur C.7 (ou C.0 ?)

Quant au 163 reçu ça ressemble bizarrement à la partie fixe de l'adresse mémoire ...
Oui, c'est la résistance de pull-up du DATA du DS18B20.

Bon, j'ai lu une grande partie de la discussion que j'ai cité précédemment et apparemment, en sept. 2110, il y avait un problème sur les 18M2 lors de la lecture d'EEPROM avec un adressage I2CWORD.

Le problème est peut-être résolu, mais mon revendeur m'a peut-être vendu un 18M2 de ses vieux stocks qui possèdent encore ce problème.

La solution pour remédier à ce problème d'adressage est ICI .

Mais apparemment, cela doit fonctionner avec les EEPROM inférieur ou égale à 16Kbits.

Donc ce soir, je vais voir en ajoutant les résistances de pull-up.
 
Last edited:

westaust55

Moderator
Le problème que 18M2 tôt a eu avec l'adressage d' i2cword ne pose pas un problème en employant le 24LC16B

Le "pull-up" résistances 4k7 que j'avais précédemment mentionnées au poteau 4 sont essentielles et car mentionné ne sont pas incluses en votre photographie.
 

zebulon

Member
Le problème que 18M2 tôt a eu avec l'adressage d' i2cword ne pose pas un problème en employant le 24LC16B

Le "pull-up" résistances 4k7 que j'avais précédemment mentionnées au poteau 4 sont essentielles et car mentionné ne sont pas incluses en votre photographie.
Oui, tout à fait vrai westaust55. D'ailleurs je t'avais répondu oui. Donc quuand j'ai décablé/recablé, j'ai du oublié les 2 résistances.

En tout cas, depuis que j'ai recâblé, et maintenant que j'ai ajouté les résistances de pull-up, c'est tout bon. Ca fonctionne correctement avec les 24LC16B.

Par contre, ça ne fonctionne pas avec les 24LC256.
Mais là, je crois me souvenir qu'il y a quelques années, je les avais fait chauffer un peu. Donc suis pas sûr que ça viennent du pic.

Merci à tout ceux qui ont répondus et désolé de vous avoir fait perdre un peu de temps avec ce qui devait probablement être une erreur de cablage.

Au programme : Emetteur/Recepteur, lcd, horloge i2c ... pour commencer ...

Donc je reviendrais très bientôt avec d'autres questions.

Guillaume
 

jl-bot

New Member
Bonjour,


et avec Hi2cup, Hi2cout, Hi2cin reconnus par le 18M2
à la place de i2Cslave....?

ayant un projet similaire dans l'avenir, la solution m'intéresse....

Je vais débuter en i2C, d'abord avec le capteur magnétique HMC6352.

Bon courage
 

westaust55

Moderator
@zebulon,

Pour le 24LC256 EEPROM il est nécessaire de changer le paramètre de longueur d'adresse i2cbyte en i2cword dans la commande i2cslave ou hi2csetup
 

PieM

Senior Member
Bonjour jl-bot

et avec Hi2cup, Hi2cout, Hi2cin reconnus par le 18M2
à la place de i2Cslave....?
i2cslave est une commande obsolète.
Elle est remplacée par hi2csetup slave (et hi2csetup master)
hi2cout sert à écrire sur le bus i2c
hi2cin sert à lire sur le bus.
Et cela pas seulement pour le 18M2 !

Et débuter en i2c avec le HMC6352 n'est pas le plus simple !
 

jl-bot

New Member
@westaus55

Merci pour ces infos

sur le fil que tu m'indiques (pour le HMC6352) , personne ne fait état que le module Sparkfun contient les 2 résistances pull-up et un condensateur. Donc il ne faut pas ajouter de résistances sur les lignes SDA et SCL.

Je suis hors sujet pour l'EEPROM.

Disposant de Cubloc CB220 si j'échoue pour le HMC6352 avec le picaxe, je vérifierai avec le cubloc.........pour tenter de cerner les problèmes s'il y en a.
En effet ça ne paraît pas simple. D'où l'intérêt de la manip!
 

Attachments

Top