Pb compilation ATTiny et MCP23017

Bonjour à tous,
je souhaiterai réaliser un capteur de niveau d'eau pour une cuve d'eau basé sur ce type de capteur Zp4510

Comme je voit les chose en grand je souhaite 10 capteurs (10% ->100%) et comme en plus je souhaite un "petit" dispositif je suis parti sur un Attiny (85) comme microcontrôleur.
Compte tenu du nombre d'entrée je me suis tourné vers un MCp23017 et la lib Adafruit( pour étendre le nombre de ports.
Mon proto est ok sur un arduino Nano, mais lorsque je compile pour Attiny j'obtiens les erreurs suivantes (extrait):

Arduino: 1.8.10 (Windows 10), Board: "ATtiny25/45/85, ATtiny45, Internal 1 MHz" 
C:\Users\seb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.2\libraries\Wire\src\utility\twi.c: In function 'twi_init': 
C:\Users\seb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.2\libraries\Wire\src\utility\twi.c:76:16: error: 'SDA' undeclared (first use in this function) digitalWrite(SDA, 1);
^~~
C:\Users\seb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.2\libraries\Wire\src\utility\twi.c:76:16: note: each undeclared identifier is reported only once for each function it appears in 
C:\Users\seb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.2\libraries\Wire\src\utility\twi.c:77:16: error: 'SCL' undeclared (first use in this function); did you mean 'SPL'?
digitalWrite(SCL, 1);
^~~
SPL In file included from c:\users\seb\appdata\local\arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino5\avr\include\avr\io.h:99:0, from 
C:\Users\seb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.2\libraries\Wire\src\utility\twi.c:25:C:\Users\seb\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.2\libraries\Wire\src\utility\twi.c:80:7: error: 'TWSR' undeclared (first use in this function); did you mean 'ACSR'?
cbi(TWSR, TWPS0);

Ceci semble lié à l'utilisation de Wire sur Attiny , mais un chgt vers TinyWire ne donne pas de + grd résulat (ref ici)

Bref, cette option est elle envisageable, l'un de vous à t'il déjà eu / solutionné ce pb ou dois je m'orienter vers un peu plus grd (un nano avec 22 ports digitaux) étant suffisant. (je doit avouer que le "challenge" du Attiny /MCP23017 me plaisait assez :slight_smile: ....)

PS: question posée également sur le github Adafruit mais au vu de la fréquentation + de chance d'obtenir une réponse ici :wink:

Merci d'avance

oui la bibliothèque Wire standard ne fonctionne pas sur attiny85.

TinyWireM c'est pour Trinket et Gemma d'Adafruit qui sont basés sur des attiny85, mais il faut mettre vos pull ups sur SDA & SCL et bien sûr récrire les communications pour votre MCP23017 avec les nouvelles API.

il existe des cartes Attiny85 toute montées avec un MCP23016 il me semble

Merci pour la réponse.
En résumé : pour cette 'configuration' pas possible d'utiliser la lib MCP23017, il faut assurer la communication entre ATtiny et MCP en utilisant les fonctions I2C plus bas niveau (via lib TinyWire).
Le challenge est interessant :wink: Le temps ce n'est pas topr ce qui manque en ce moment!

As tu des ref pour des cartes Attiny toutes montées ? Une recherche (rapide) ne m'a pas permis de trouver quoi que ce soit.

Bonjour,

Pourquoi ne pas utiliser un attiny84 ou un attiny2313 qui comportent beaucoup plus d' E/S, ce qui simplifierait à la fois l'implantation et le programme.

Pour le moment pas d'autres raisons que :

  • la connaissance des ces autres micro
  • la dispo d'un attiny85 dans l'atelier
  • les délais pour avoir les autres,

Mais effectivement cela mérite réflexion

caps1g3f:
Merci pour la réponse.
En résumé : pour cette ‘configuration’ pas possible d’utiliser la lib MCP23017, il faut assurer la communication entre ATtiny et MCP en utilisant les fonctions I2C plus bas niveau (via lib TinyWire).
Le challenge est interessant :wink: Le temps ce n’est pas topr ce qui manque en ce moment!

As tu des ref pour des cartes Attiny toutes montées ? Une recherche (rapide) ne m’a pas permis de trouver quoi que ce soit.

oui faut bosser un peu, mais ce n’est pas le composant le plus compliqué du monde, ça doit être jouable.
(j’ai vu ce truc en ligne qui peut aider)

j’ai pas retrouvé de ref, c’était il y a longtemps ou ma mémoire me joue des tours…

caps1g3f:
Comme je voit les chose en grand je souhaite 10 capteurs (10% ->100%) et comme en plus je souhaite un "petit" dispositif je suis parti sur un Attiny (85) comme microcontrôleur.
Compte tenu du nombre d'entrée je me suis tourné vers un MCp23017

Bonjour,
il y a peut être la possibilité de mettre les 10 capteurs sur une seule entrée analogique avec un réseau de résistances R/2R donc plus besoin du MCP...

En essayant d'avancer sur devpt 'bas niveau' j'ai fouillé la lib MCP23017
En lisant puis en modifiant le fichier MCP23017.h j'ai réussi à compiler pour Attiny (bon j'avoue je suis loin de maitriser, c'était plus de la tentative.) Bref j'ai commenté qques lignes (cf ci dessous préfixé par ICI) et donc ça compile. Si j'ai bien compris si pas sur ARDUINO_AVR_GEMMA, on utilise TinyWire et redéfini Wire

// Don't forget the Wire library
//ICI #ifndef ARDUINO_AVR_GEMMA
//TinyWireM is now part of
//   Adafruit version of Wire Library, so this
// will work with Adafruit ATtiny85's
//But Arduino Gemma doesn't use that library
// We do NOT want to include Wire if it's an arduino Gemma
//ICI #include <Wire.h>
//ICI #else
  #include <TinyWireM.h>
  #define Wire TinyWireM
//ICI #endif

je me suis lancé dans le montage suivant :


avec le code suivant:

#include <Adafruit_MCP23017.h>
int dix = 0;
Adafruit_MCP23017 mcp;

void setup() {
  mcp.begin();      // use default address 0
  mcp.pinMode(dix, INPUT);
  mcp.pullUp(dix, HIGH);  // turn on a 100K pullup internally
  pinMode(4, OUTPUT); // debug led
}



void loop() {
  if (mcp.digitalRead(0) == 1) {
    digitalWrite(4, HIGH );
  } else {
    digitalWrite(4, LOW );
  }
  delay (1000);
}

Résultat = ça ne fonctionne pas >:(
Des idées de mon (mes) erreur(s) ?

Autre solution en ces temps de confinement :
Prendre la datasheet du MCP23017 et faire sa propre gestion.
Il n'est obligatoire que ce soit sous la forme d'une bibliothèque. La bibliothèque c'est seulement mieux si on veut réutiliser facilement son travail dans d'autres projets.
Après tout ce n'est qu'une suite d'écriture et de lecture dans les registres du MCP23017 en utilisant la version de "Wire" qui va bien pour le micro.

Bon au début ce sera un peu laborieux mais, sauf exception, nous avons un peu de temps libre à occuper en ce moment.

Hello caps1g3f,

Je viens d’essayer ton programme et chez moi ça fonctionne sans problème.
Par contre j’ai laissé A0,A1,A2 en l’air.

Pour garder la compatibilité j’ai modifié le fichier Adafruit_MCP23017.h comme suit:

// Don't forget the Wire library
#if not defined ARDUINO_AVR_GEMMA && not defined __AVR_ATtiny85__
                                   //TinyWireM is now part of
                                   //   Adafruit version of Wire Library, so this
                                   // will work with Adafruit ATtiny85's
                                   //But Arduino Gemma doesn't use that library
                                   // We do NOT want to include Wire if it's an arduino Gemma
 #include <Wire.h>
#else
 #pragma message "Compilation pour attiny85"
 #include <TinyWireM.h>
 #define Wire TinyWireM
#endif

@68jts, effectivement confiné et un peu plus de temps mais a peine plus, matin consacré à l'école et après midi au (télé travail). J'aimerais descendre dans les entrailles mais vu le temps disponible et les compétences si la lib fait le taff je suis preneur.
@kamill merci pour modif plus propre de la lib et les tests... Je vais vérifier si mon montage est conforme au schéma, mais ton message est encourageant

Sur ton schéma tu mets A0-A2 au gnd. Moi j'ai testé avec A0-A2 en l'air.
J'ai aussi enlevé le delay() pour avoir une réaction immédiate.

bon je me remettrai à l'ouvrage demain. Je suis rassuré d'être sur la bonne voie néanmoins:
@kamill lorsque j'applique tes modifs dans Adafruit_MCP23017.h , je passe tt de même dans le if => utilisation de Wire.h, si je garde mes modif et ajoute le pragma => erreur de compil... il doit me manquer qqchose. :confused:
Les broche A0-> A2 sont sur GND pour positionner l'adresse à 0

Quoiqu'il en soit apres double vérif du montage pas mieux. Je ne lâche rien et remettrai le couvert demain.
Merci pour l'aide. Je pense en avoir encore besoin.

Peut être que AVR_ATtiny85 n'est pas défini dans toutes les extensions de cartes attiny. Moi j'utilise les cartes définies ici: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json

#pragma message ne génère pas d'erreur. Il est vrai que l'ide l'affiche de la même façon que les erreurs, mais si on lit bien le message affiché, on voit bien qu'il s'agit d'un pragma et non d'une erreur.

@Kamill, en fait peut être que j'ai mal recopié ta modif du header et que ceci explique cela :confused:
J'ai essaye en compilant avec PlatformIO sans la modif et pas de prb coté compil.
Je retourne à l'étude du montage sur breadboard / verif des composants car manifestement le prb vient de la maintenant !

Bon je craque !!!
Plusieurs recablage du montage, test sur Attiny45 (pour éliminer compo defectueux) et toujours KO.
A tout hasard je poste une photo du montage ;-).
Je tenterai bien sans la lib, mais pas sur que cela soit + efficace.
Bref je pense que les arduino micro vont faire l'affaire, et qu'il va falloir revoir la gestion de l'alim :confused:

Sur ton attiny85, je te conseille de mettre le reset au 5V
Fais une impulsion sur la led au démarrage pour t’assurer que l’attiny démarre bien.

@Kamill clignotement de led mis en place dans le setup => ça clignote (bon signe)
Par contre pas de changement lors de la mise à la masse sur le mcp23017, changement de port => KO
Je me suis rendu compte que la fréquence de l'attiny n'étais pas OK (je compilais à 8Mhz alors que le micro étais à 1Mhz) burn du bootloader pour passer à 8Mhz => KO.

La seule chose 'notable' est que en utilisant la lib 'Wire' a la fin de mon setup je termine avec la led allumé, avec la lib TinyWire je termine led éteinte. Pour le moment, incapable d'interpréter et d'y apporter une quelconque déduction.

Je lache l'affaire pour le MCP23017, je vais voir du coté de PCF8574 si j'ai plus de succés ::slight_smile:

C’est un peu du pinaillage mais ce n’est pas le bootloader qui met l’horloge à 8 MHz.
Par contre il faut choisir un bootloader adapté à une horloge de 8MHz.

Un micro avr est livré dans sa configuration “usine” : oscillateur interne à 8 MHz et diviseur d’horloge par 8 activé.
C’est la configuration “brute de fonderie” qui permet de faire des tests sous pointes avant la découpe des puces.

Il y a donc deux opérations distinctes à faire :

  1. Régler les fuses pour retirer le diviseur par 8 et faire fonctionner le micro avec un quartz externe
  2. Optionnellement introduire un bootloader si on veut éviter la programmation par mode ISP.

La confusion provient du fait qu’Arduino fait ses deux opérations sous le vocable : “Graver la séquence d’initialisation” sans détailler les deux opérations.

Pour les cas où on cherche une consommation minimale il peut être utile de repasser en mode oscillateur interne et/ou rétablir le diviseur d’horloge par 8.
Note : le fait de repasser en oscillateur interne peut permettre de récupérer les deux pins du quartz qui redeviennent des E/S numériques exploitables.
Bien évidement l’horloge obtenue avec l’oscillateur interne est moins stable que celle obtenue avec un résonateur ou un quartz.

Je n'avais pas fait attention, mais sur ton schéma il n'y a pas de pullup sur sda et scl. Il faut absolument des pullups.