Je n'arrive pas a utiliser la librairie OneWire sur un atmega328p

J'espère que quelqu'un pourra me donner une piste pour me sortir de là:

J'expérimente un montage comme suit:

  • atmega328p standalone sans quartz horloge interne 8 MHz

  • capteur de température Dallas DS18B20

  • câblage comme suit:
    ds18B20_montage

Le DS18B20 ne répond pas:
Error: Could not read temperature data
Requesting temperatures...DONE
Error: Could not read temperature data
Requesting temperatures...

J'ai aussi testé isolément le bus OneWire. Il ne répond pas non plus ce qui explique la non réponse du 18B20.

J'ai relevé à l'oscillocope le signal sur la broche 2 du DS18B20:
E1

Détail:
E2

Le signal me paraît bizarre on dirait qu'il y a un conflit quelque-part.

Voici le source:
jojo

Qulqu'un a-t-il séjà eu ce genre de soucis?

Bonjour et excusez moi de ne pas pouvoir répondre à votre souci, mais je vois deux petits problèmes

  • la ligne série n'est pas initialisée (mettre dans setup Serial.begin(115200); simplifierait la vie à terme;
  • votre code n'est pas dans les balises code (au milieu en haut de la fenêtre de saisie de ce forum) ce qui simplifie souvent la lecture
    ex
Serial.begin(115200);
// servira plus tard

Le bon type "d'Arduino" a été sélectionné dans l'IDE?
OneWire repose sur le respect de timings précis si tu n'as pas choisi le bon type de carte ces temps ne peuvent pas être respectés.

Le bus est en haute impédance une partie du temps lors de la lecture.
Pour écrire un 1

  • la ligne est à 0 pendant 10µs
  • la ligne est à 1 pendant 55µs

Pour écrire un 0

  • la ligne est à 0 pendant 65µs
  • la ligne est à 1 pendant 5µs

Pour lire

  • la ligne passe en sortie
  • la ligne est à 0 pendant 3µs
  • la ligne passe en entrée
  • on attend 10µs
  • on lit l'état de la ligne
  • on attend 53µs

Donc pendant une soixantaine de µs la ligne est en haute impédance ou forcée à 1 ou à 0 par l'organe qu'on lit.
Le fait que tu vois la ligne "flotter" donne à penser que ton 18B20 ne répond pas.

1 Like

Bonsoir fdufnews,

Oui, j'ai choisi atmega328p dans l'IDE Arduino.

J'ai testé le composant DS18B20 sur une carte Arduino. Il fonctionne. La différence avec l'atmega328 standalone est la fréquence d'horloge qui est 16 MHz sur la carte Arduino au lieu de 8 et il n'y a pas de quartz pour la cadencer.

J'ai un truc pas normal, c'est que je suis obligé de régler le terminal en 1200 ou 2400 bauds (je ne sais plus) au lieu des 9600 initialisés dans le setup. La fréquence d'horloge passant de 16 MHz à 8 MHz n'explique pas un tel écart.

J'ai vu dans les sources de la librairie OneWire plein de delais en microsecondes programmés. Si ces délais sont indexés sur la vitesse du processeur, cela pourrait peut-être expliquer ces problèmes..

C'était le sens de ma question.
Il faut soit:

  • choisir une carte existante dans la liste des carte qui fonctionne avec l'horloge interne à 8MHz. Il y a la LilyPad Arduino w/ ATmega328P et l'Arduino Fio, peut-être feraient-elles l'affaire, je ne saurais trop m'avancer là-dessus. Il faudrait vérifier si elles sont matériellement équivalentes.
  • ajouter un type de carte dans board.txt qui utilise un ATmega328 et fonctionne à 8MHz

On verra ça demain. Pour l'heur je suis devant ma télé et je regarde Armaguedon. Merci de ton aide je posterai la suite de mes essais..

Des choses à voir ici

Bonjour,

C'est normal si tu n'as pas reprogrammé les fuses. Il me semble que sur un atmega328 neuf la fréquence programmée dans les fuses est 1MHz.

Pour que ton processeur fonctionne correctement à 8 MHz il faut deux choses:

  • programmer les fuses pour une horloge interne à 8MHz
  • compiler avec une définition de fréquence d'horloge à 8MHz

J'avais fait ça il y a quelque temps déjà en suivant ce tuto chapitre ' Minimal Circuit'.
Il faut utiliser le fichier breadboard-1-6-x.zip. Je vois que le lien sur cette page est mort, mais il est disponible aussi sur cette page.
Ensuite tu as une carte "atmega328 on a breadboard (8MHz internal clock)" dans Outils/Cartes. Tu la sélectionnes et tu graves la séquence d'inittialisation. Ensuite tout roule.

Bonjour Kamill,

Merci du coup de main; j'apprécie..

Que dois-je faire du fichier "megaBOOT_168_atmega328_pro_8MHz.hex"? Je le téléverse tel-quel dans l'atmega328?

Je n'ai pas de carte "atmega328 on a breadboard (8MHz internal clock)" dans Outils/Cartes mais j'ai ATMega328 (8MHz internal clock). est-ce que ça peut convenir pour graver le chargeur de démarrage?

Oui, peut être que le nom varie légèrement suivant les fonctions.

Il sera utilisé quand tu vas faire 'graver la séquence d'initialisation'. Tu peux aussi le téléverser avec avrdude/avrdudess

Un grand merci à toi.

Après bien des difficultés j'ai réussi à faire fonctionner le OneBus en faisant ce que tu 'as conseillé. Mais que de misères. Je haie ces breadboards. En faisant un montage avec l'ATMega328 sur la breadboard l'arduino UNO à côté, le câblage vérifiés x fois, pas moyen de téléverser.

J'ai cablé une carte prototype soudée avec un support pour l'ATMEGA328p qui s'enfiche directement dans les connecteurs de la UNO et là, enfin, ça a marché. J'ai maintenent un sabot de programmation qui fonctionne pour programmer mes ATMega328P.

Je vois au scope des signaux conformes et de fréquence bien plus élevée. Et sur ma liaison série,: la température apparaît enfin!

En plus de cela, la vitesse de la liaison série est devenue normale. 9600 bauds sont bien 9600 bauds de mon source.

Donc, ton diagnostique était le bon. C'est la vitesse de l'horloge interne qui était n'importe quoi.

Je vais donc clore ce topic.

Bravo. Bonne continuation.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.