SoftwareSerial e I2C insieme su ATtiny85 [RISOLTO]

Salve,
Mi rivolgo a voi con tanta speranza :smiley: .
Nel corso del mio progetto di domotica, ho incontrato l’esigenza di far convivere insieme un ATMega328P e un ATtiny84 tramite seriale. Il tutto ha funzionato pefettamente tramite la SoftwareSerial per l’ATtiny e l’HardwareSerial per l’ATMega. Ho creato un protocollo multimaster che permette ai due chip di scambiarsi informazioni.
Successivamente ho scollegato l’ATMega e collegato due integrati all’ATtiny tramite protocollo I2C: un PCF8574 e un MCP23017. Il protocollo funziona egregiamente tramite la libreria TinyWire.
Il problema viene a crearsi quando ho fuso i due sketch per tentare di far funzionare le due librerie insieme sull’ATtiny: la SoftwareSerial e la TinyWire, in quanto mi esce un messaggio di errore.
Per maggiore chiarezza posto il codice incriminato ]:smiley:

#include <TinyWireM.h>
#include "Tiny_MCP23017.h"
#include "Tiny_PCF8574.h"
#include "SoftwareSerial.h"
#define expander 0x38 //pcf8574 with all address pins grounded
byte DataRead;
byte DataWrite = (B11111111);
byte i,Disp;
boolean SPul[8], SPulConf[8], SPulV[8], SDis[8];
boolean Lettura;
byte PulDis[8] = {0,1,2,3,4,5,6,7};
unsigned long Inizio[8], Fine[8], InizioAsp;
Tiny_MCP23017 mcp;
Tiny_PCF8574 pcf;
SoftwareSerial mySerial (3, 4);

void setup() {  
  mcp.begin();      // use default address 0
  for (int porta=0; porta < 16; porta++) {
    mcp.pinMode(porta, OUTPUT);
    mcp.digitalWrite(porta, LOW);
  }
  for( i=0; i<8; i++) {
    SPul[i]=0;
    SPulConf[i]=0;
    SDis[i]=0;
  }
  pcf.ExpanderWrite (DataWrite);
  pinMode (2, OUTPUT);
  digitalWrite (2, HIGH);
  for(int porta=0; porta<8; porta++) {
   int spegni=porta*2;
   mcp.digitalWrite(spegni, HIGH);
  }
  delay (50);
  for(int porta=0; porta<8; porta++) {
    int spegni=porta*2;
    mcp.digitalWrite(spegni, LOW);
  } 
}

void loop(){
  if (Lettura == true) {
    pcf.ExpanderRead (DataRead);
    for (i=0; i<8; i++)
    SPul[i] = bitRead (DataRead, i);
    InizioAsp = 0;
  }
  Lettura = Tempo (&InizioAsp, 10);
  if (Lettura == true) {
    pcf.ExpanderRead (DataRead);
    for (i=0; i<8; i++) {
      SPulConf[i] = bitRead (DataRead, i);
      if (SPul[i] == SPulConf[i])
      AzionaBlocca (PulDis[i], SPul[i], &SPulV[i], &SDis[i], &Inizio[i], &Fine[i]);     
    }
  }
}

void AzionaBlocca (byte Dispositivo, boolean StPulN, boolean *StPulV, boolean *StDis, unsigned long *InizioSAB, unsigned long *FineAB)
{
  byte DispOff = Dispositivo*2;
  byte DispOn  = Dispositivo*2+1;
  if (StPulN == LOW && StPulN != *StPulV)
  {
    if (*StDis == 0)
    mcp.digitalWrite (DispOff, HIGH);
    else
    mcp.digitalWrite (DispOn, HIGH);
    *InizioSAB = 0;
  }
  *StPulV = StPulN;
  boolean Scaduto_AB = Tempo (&*InizioSAB, 50);
  if (Scaduto_AB && *InizioSAB != 1)
  {
    if (*StDis == 0)
    {
      *StDis = 1;
      mcp.digitalWrite (DispOff, LOW);
    }
    else
    {
      *StDis = 0;
      mcp.digitalWrite (DispOn, LOW);
    }
    *InizioSAB = 1;
  }
}

boolean Tempo (unsigned long *InizioT, unsigned int Attesa) {
  unsigned long FineT;
  unsigned int Diff;
  if (*InizioT == 0)
  *InizioT = millis ();
  FineT = millis ();
  Diff = FineT - *InizioT;
  if (*InizioT != 1) {
    if (Diff < Attesa)
    return LOW;
    else
    return HIGH;
  }  
}

Compilato in questo modo il codice non da errori, ma se dopo la riga ‚Äúmcp.begin();‚ÄĚ contenuta nel setup aggiungo la riga ‚ÄúmySerial.begin(9600);‚ÄĚ, il compilatore genera il seguente errore:

Arduino:1.5.5 (Windows 7), Scheda:"ATtiny x5, ATtiny85 @ 8 MHz  (internal oscillator; BOD disabled)"

d:/arduino/arduino-1.5.5/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o:(.init9+0x0): relocation truncated to fit: R_AVR_13_PCREL against symbol `main' defined in .text.main section in C:\Users\Federico\AppData\Local\Temp\build3322957569721443888.tmp/core.a(main.cpp.o)
d:/arduino/arduino-1.5.5/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn85.o:(.init9+0x2): relocation truncated to fit: R_AVR_13_PCREL against symbol `exit' defined in .fini9 section in d:/arduino/arduino-1.5.5/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/avr25\libgcc.a(_exit.o)

Ringraziandovi per la pazienza, spero che qualcuno sappia dirmi qualcosa, che io non ci capisco niente =(

Quello dovrebbe essere un "buco" del linker che è incluso nell'IDE di Arduino quando fai il link per Attiny con dimensioni del codice che superano i 4 KBytes ...

Devi aggiornare il "ld" (.../hardware/tools/avr/avr/bin/) ... :roll_eyes:

Su che piattaforma sei ? Linux, Win o OS X ?

Guglielmo

Se hai preso il core Tiny che ho sul mio sito, c'è anche il file ld allegato per Mac e Win, che sono le 2 piattaforme che soffrono della cosa.

gpb01:
Quello dovrebbe essere un "buco" del linker che è incluso nell'IDE di Arduino quando fai il link per Attiny con dimensioni del codice che superano i 4 KBytes ...

Devi aggiornare il "ld" (.../hardware/tools/avr/avr/bin/) ... :roll_eyes:

Su che piattaforma sei ? Linux, Win o OS X ?

Guglielmo

Arduino:1.5.5 (Windows 7), Scheda:"ATtiny x5, ATtiny85 @ 8 MHz (internal oscillator; BOD disabled)"

leo72:
Se hai preso il core Tiny che ho sul mio sito, c'è anche il file ld allegato per Mac e Win, che sono le 2 piattaforme che soffrono della cosa.

Molto confortante, pensavo non ci fosse la soluzione al problema. Se il programma funziona vi faccio sapere.
Qual'é il tuo sito, Leo?
Scusate ancora ma il baco in questione di cosa si tratta? Sono curioso per natura.

Federico_Paiano:
Qual'é il tuo sito, Leo?

Trovato :sweat_smile:

PROBLEMA RISOLTOOOOOOOOOOOOOOOO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
XD XD XD XD XD XD XD XD XD XD XD XD XD XD XD XD XD XD XD XD XD XD

Ottimo :wink:

Se lanci a mano ld.exe -V che versione ti da ???

Guglielmo

gpb01:
Se lanci a mano ld.exe -V che versione ti da ???

Guglielmo

Se lancio la versione precedente a quella di Leo72 mi da "WinAVR 20081205 - 2.19".
Se lancio la versione di Leo72 mi da "WinAVR 20090313 - 2.19"

Mmm ‚Ķ ti passo una versione ancora pi√Ļ aggiornata ‚Ķ 2.23.2 ‚Ķ :wink:

Lo devi mettere in ‚ÄúC:\Program Files (x86)\Arduino\hardware\tools\avr\avr\bin‚ÄĚ (‚Ķ almeno questa √® la path con la 1.0.5) :wink:

Guglielmo

P.S. : Poi rilancia ld.exe -V e verifica che sia la versione 2.23.2 :slight_smile:

ld.zip (325 KB)

gpb01:
Mmm ... ti passo una versione ancora pi√Ļ aggiornata ... 2.23.2 ... :wink: :blush:

Lo devi mettere in "C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\bin" (... almeno questa è la path con la 1.0.5) :wink:

Guglielmo

P.S. : Poi rilancia ld.exe -V e verifica che sia la versione 2.23.2 :slight_smile:

Wow, grazie ..................... :wink:
Ma scusa ................ mi spieghi cos'è il file in questione? Ancora non l'ho capito :blush:

E 'il "linker" ...
... cioè quel pezzo di software che prende i moduli "oggetto" generati dal compilatore e crea l'eseguibile vero e proprio :wink:

Guglielmo

Un programmino inutile.... :grin: :grin: :grin: