[RISOLTO] Arduino SPI con ENC28J60 e Display Nokia 6100

Salve a tutti. Questo è il mio primo post su questo forum che leggo molto spesso per risolvere problematiche relative ad Arduino, ma su questo problema che vi riporto qui di seguito non sono
riuscito a trovare nulla.

Come da titolo, ho acquistato un modulo Ethernet ENC28J60 e uno Shield Nokia 6100 Sparkfun Compatibile (con controller Philips).
Purtroppo non sono riuscito a farli funzionare assieme, con il codice sotto riportato il Display viene inizializzato correttamente (lo sfondo diventa bianco) ma poi non riesco più a scriverci nulla, mentre l’Ethernet funziona regolare (Arduino prende un IP e riesco a pingarlo):

#include <gLCD.h>
#include <EtherCard.h>

#define BUFFER_SIZE 400
byte Ethernet::buffer[BUFFER_SIZE];

const char RST = 8;
const char CS = 9;
const char Clk = 13;
const char Data = 11;
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

gLCD graphic(RST,CS,Clk,Data,HIGH_SPEED); //High speed

void setup () {

   // Inizializzo LCD
  graphic.begin(0,0,0,PHILLIPS_0);
  graphic.setBackColour(GLCD_WHITE);
  graphic.Contrast(0x3F);
  graphic.Clear();

  // Inizializzo l'interfaccia Ethernet ENC28J60
  ether.begin(sizeof Ethernet::buffer, mymac, 10);
  ether.dhcpSetup();

  // Scrivo qualche cosa a Display
  graphic.setFont(12);
  graphic.setForeColour(15,0,0); 
  graphic.print("TEST");
}

void loop (){
  ether.packetLoop(ether.packetReceive());
  delayMicroseconds(100);
}

Se inverto i “ruoli”, quindi inizializzo prima il modulo ethernet, il Display rimane scuro, mentre l’ethernet funziona regolarmente.
Entrambi i moduli usano il Bus SPI per poter comunicare con Arduino:
l’ENC28J60 usa i Pin 13, 12, 11 e il CS che ho impostato sul 10, mentre il Display Nokia 6100 i Pin 13, 11, il 9 come CS e l’8 il Reset.
Quindi i due moduli condividono la linea MISO/MOSI e CLK, mentre il pin di abilitazione CS è separato.
Ho provato anche a settare il CS per ogni modulo manualmente facendo un digitalWrite LOW o HIGH sul pin CS dell’eth o del display per escluderli alternatamente (LOW sul Display e HIGH sull’eth per escludere l’ETH, viceversa per escludere il Display), ma purtroppo senza successo.

Se li utilizzo separati, cioè tolgo dal codice la parte relativa all’inizializzazione del modulo ethernet, il display funziona correttamente, stessa cosa per l’ethernet.
Le librerie che uso sono la EtherCard per l’ENC28J60 (https://github.com/jcw/ethercard) e la ColorLCDShield per il display (https://github.com/sparkfun/ColorLCDShield/tree/master/firmware/Arduino/libraries/ColorLCDShield)

Potete darmi una mano?

EDIT: mi sono accorto che la libreria riportata nell’esempio non è la ColorLCDShield ma la gLCD-Library (GitHub - TCWORLD/gLCD-Library: Arduino Nokia 128x128 Graphic LCD Library.), comunque il problema si presenta anche con l’altra libreria.

Se usi un Arduino UNO sará sicuramente un problema di RAM. Se usi una Mega pure. Entrambe le librerie hanno bisogno di parecchia RAM.

Ciao Uwe

Ciao Uwefed, grazie per la risposta! Hai ragione, nella fretta di scrivere il messaggio non ho indicato che stò sviluppando su Arduino Duemilanove (in realtà un Clone, ma sempre con un ATmega328 abbiamo a che fare :slight_smile: ). Ho a disposizione anche un Arduino Leonardo, ma tanto come risorse è uguale all'UNO/Duemilanove.

Per il discorso della RAM, c'è un modo per controllare l'effettivo utilizzo una volta compilato lo sketch (tipo abilitando qualche tipo di debug)?
Comunque un Arduino Mega 2560 ha a disposizione 8k di RAM, 4 volte tanto quella dell'ATMega328 (2k), considerando che usando una libreria alla volta sul Duemilanove il programma funziona, vuol dire che AL MASSIMO ognuna delle due librerie può occupare 2k di RAM, quindi entrambe 4k...sul Mega dovrebbero andare...

È possibile che invece che un problema di risorse sia un problema della libreria EtherCard che magari non "libera" il Bus SPI dopo l'inizializzazione?
Il fatto che il risultato sia lo stesso utilizzando due librerie per pilotare il display nokia mi fa pensare che a questo punto sia un problema dell'Eth...

EDIT: Ho trovato sul Playground come controllare la memoria RAM libera, e utilizzando entrambe le librerie risulta che ho ancora a disposizione 1159 Bytes...quindi a questo punto escluderei un problema di risorse...altre ipotesi?

Da non esperto, ma da uno che ha letto qualcosina sullo SPI, ti direi che MISO, MOSI e CK devono essere gli stessi per tutte le periferifhe.
Solo il CS deve cambiare.

Tu hai scritto che usi 13, 12, 11, 10 per ENC
e 13, 11, 9, 8 per display.

Ciao Acik, grazie per la risposta.

il Modulo ENC28J60 usa infatti il MISO/MOSI (12 e 11), il CLK (13) e il CS (10), mentre il Display usa il CLK (13), MOSI (11), CS (9) e Reset (8), quindi i Pin del Bus SPI sono condivisi (13 e 11, il display non usa il MISO sul pin 12), mentre i due Pin CS sono separati (10 per l'Eth e 9 per il Display). Il display in più usa il pin di Reset sul'8.

Comunque dopo vari tentativi sono riuscito a far funzionare il Display con la libreria gLCD-Library, utilizzando i Pin 9, 8, 7 e 6 al posto dei 13, 11, 9 e 8 e inizializzando il costruttore gLCD con questi pin...in pratica pare che la libreria/display non faccia veramente uso del Bus SPI, ma ha solo bisogno di 4 Pin digitali (non sò se dipende dalla libreria che emula una specie di protocollo SPI o del Display, fatto stà che funziona).

Grazie a tutti per l'interesse!