problema con SoftwareSerial e NewSoftSerial

ok ok ora va tutto, finalmente ho capito bene come funziona, grazie a tutti! :wink:
un'ultima domanda... posso creare più di una NewSoftSerial giusto? non vanno in conflitto fra di loro?

Ricordati che ogni NewSoftSerial crea un buffer ed inserisce un codice in background gestito da un interrupt sul cambio di stato del pin di ricezione. Quindi 1 o 2 istanze non creano problemi, ma se ne metti molte rallenti il funzionamento del micro e rischi di esaurire la memoria.

ok ho capito grazie mille :wink:

Ciao,
proprio questa mattina ha fatto delle prove con l'ultima versione dell'ide e la softserial inclusa, tutto funziona bene e non ci sono problemi.

Alberto

IMG_20111210_111518.jpg

Funziona anche in ricezione sul Tiny? A me non funzionava.
Se a te funziona, forse allora la nuova NewSoftSerial dell'IDE 1.0 è stata aggiornata.

Io ho usato la SoftwareSerial con arduino uno e va.
Non ho il Tiny.

Alberto

Siccome stavamo parlando di Tiny, negli ultimi post, e siccome vedevo un piccolo chip sul tuo schedino, pensavo che ti riferissi a questo :wink:

leo72:
Ricordati che ogni NewSoftSerial crea un buffer ed inserisce un codice in background gestito da un interrupt sul cambio di stato del pin di ricezione. Quindi 1 o 2 istanze non creano problemi, ma se ne metti molte rallenti il funzionamento del micro e rischi di esaurire la memoria.

attenzione, la NewSoftSerial può escoltare solo un RX alla volta... la funzione listen() è stata fatta apposta per qundi si hanno più istanze, per scegliere chi deve ascoltare in quel momento. Quindi niente simil parallelismo delle comunicazioni su più seriali virtuali (anche se sincermaente non capisco questa limitazione)

ok ok per adesso non mi servono ancora 2 NewSoftSerial, magari in futuro...

comunque non capisco perchè se mando una sringa "1234567890" dal serial monito del mega al 2009, il 2009 riceve "1234567890"; mentre se mando la stessa stringa dal serial monitor del 2009 al mega, sul serial monitor del mega vedo solo "123"... il codice è quello postato in precedenza con l'unica variazione dei baud da 115200 a 9600... dov'è il problema? mi sono dimenticato di considerare qualcosa? ho modificato la libreria per adattarla agli ATtiny può aver creato qualche problema?

per i tiny sto provando per inviare inviano senza problemi a quanto pare, ma non capisco in ricezione cosa ricevono e se ricevono soprattutto...
ma questo argomento lo lascio nel topic degli ATtiny: http://arduino.cc/forum/index.php/topic,77374.75.html :wink:

lasciate stare il problema precedente a quanto pare si è sistemato da solo... magia :slight_smile:
non ho capito una cosa della NewSoftSerial... perchè non mi compila la funzione write? non è prevista dalla libreria?

La NewSoftSerial non ha il metodo .write ma solo i metodi .print e .println

peccato :frowning:
per curiosità perchè non c'è? cosa hanno di così diverso le funzioni print e write?

Il motivo della sua assenza andrebbe chiesto al suo sviluppatore :wink:

ok ok no problem sarebbe stato comodo avercela ma alla fine mi basta convertire gli int in chat e viceversa e ottengo lo stesso risultato no? altre proposte? ci sono già funzioni che lo fanno?

scusa Leo, tu che predichi il vangelo degli ATtiny, sai dirmi perchè mi da questo errore compilando un programma per i tiny con la NewSoftSerial?

c:/arduino-0022/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr25/crttn84.o:(.init9+0x2): relocation truncated to fit: R_AVR_13_PCREL against symbol `exit' defined in .fini9 section in 
c:/arduino-0022/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/avr25\libgcc.a(_exit.o)

se imposto come board il mega2560 non mi da più errore quindi penso sia un problema riguardante i tiny...

Stai usando la NewSoftSerial modificata da me oppure quella di serie? Che versione di IDE usi? Puoi postare il codice che stai compilando per vedere se anche a me fa la stessa cosa?

si uso la versione 0022, e la NewSoftSerial modificata secondo la tua guida :wink:
il codice è questo, ma non chiedermi cosa dovrebbe fare dettagliatamente perchè è un po' complicato da spiegare :grin: ma in sostanza legge 6 segnali PWM, elabora i dati e se l'arduino manda a 1 il pin 2, lui inizia a mandargli i dati con la seriale e poi aspetta che l'arduino lo rimetta a 0 per riprendere a leggere i dati...

#include <NewSoftSerial.h>
NewSoftSerial TinySerial(0,1); //RX=0;TX=1;
unsigned int er[2][3][10];
byte k, n, r, re, last;
char out[5];

void setup() 
{
 TinySerial.begin(9600);
 DDRB=B010;
 DDRA=B0000000;
 for(k=0;k<10;k++)
 {for(n=0;n<3;n++)
  {er[0][n][k]=1000;
   er[1][n][k]=1000;}}
 for(n=0;n<5;n++)
 {out[n]='0';} 
 last=0; 
}

void loop() 
{
 if(digitalRead(2)==HIGH)
 {
  out[0]='0'+r;
  out[1]='0'+(re/1000);
  out[2]='0'+((re%1000)/100);
  out[3]='0'+((re%100)/10);
  out[4]='0'+(re%10);
  for(n=0;n<5;n++)TinySerial.print((char)out[n]); //se io commento questa riga non mi da più errore
  while(digitalRead(2)==HIGH)delayMicroseconds(1);
 }
 
 else
 { 
  for(k=0;k<10;k++)
  {
   for(n=0;n<3;n++) 
   {
    er[0][n][k]=pulseIn(n+3, HIGH,1000);
    er[1][n][k]=pulseIn(n+6, HIGH,1000);
   }
   
   for(n=0;n<3;n++)
   {
    if((er[0][n][k]==0)&&(er[0][n][last]>100)) er[0][n][k]=1000;
    if((er[1][n][k]==0)&&(er[1][n][last]>100)) er[1][n][k]=1000;
   }
   
   for(n=0;n<3;n++)
   {
    for(r=1;r<10;r++)
    {
     er[0][n][0]=er[0][n][0]+er[0][n][r];
     er[1][n][0]=er[1][n][0]+er[1][n][r];
    }
    er[0][n][0]=er[0][n][0]/10;
    er[1][n][0]=er[1][n][0]/10;
   }
  
   er[0][0][0]=(er[0][0][0]+er[0][1][0]+er[0][2][0])/3;
   er[1][0][0]=(er[1][0][0]+er[1][1][0]+er[1][2][0])/3;

   if(er[0][0][0]<er[1][0][0]) r=0;
   else r=1;
   re=er[r][0][0];
  
   last=k;
  }
 }
}

A me compila perfettamente contro un Attiny84....

mmmmm strano provo a ricontrollare tutto non capisco il motivo... :~

Prova a postare il file boards.txt contenuto nella cartella /hardware/tiny per vedere se è tutto OK