Parametri di comunicazione attiny85

Ciao, so già che mi verrà detto di presentarmi e di leggere il regolamento, ho cercato in internet ma non ho trovato le sezioni :frowning:

Il problema che ho è il seguente:

Sto usando un attiny85 per realizzare una scheda che genera un segnale ad onda quadra e riceve due segnali in ingresso da un altro dispositivo. Sto realizzando poi la GUI per mandare i parametri al microcontrollore tramite seriale. Ho a disposizione diversi controllori e da ieri sera ho notato che la seriale "non va più". Smanettando un po' con i parametri del tool che uso come monitor seriale ho visto che ha ripreso a funzionare quando ho impostato la porta con 7 bit di dati (quando ne ho sempre usati 8, nessuna parità ed 1 di stop). Con lo STESSO codice caricato su un altro micro la comunicazione avviene in modo corretto con 8 bit di dati.

Per ora il codice legge i dati in arrivo sulla seriale (9600 baud) e li riscrive sulla stessa linea, istruzioni che ho già comprovato che funzionano in altre applicazioni con lo stesso controllore.

La posrta seriale del micro è di tipo SoftwareSerial, per la serial integrata in Arduino so che si possono specificare i parametri nel metodo Begin mettendo dopo la velocità un "SERIAL_XXX" dove XXX corrisponde ad una signa che indica bit di dati, parità e stop.

Grazie in anticipo.

1 Like

Non serve cercare in internet, serve guardare dentro il forum...

presentazione

regolamento

1 Like

Fatto!

Ottimo. Adesso tocca aspettare qualcuno che ne capisca qualcosa perché io non ne so nulla...
Prova a postare il codice che usi, magari aiuta.

Il codice è molto semplice. Creo l'oggetto di classe SoftwareSerial assefnando i pin 0 e 1 (RX, TX). Nel setup chiamo il metodo Begin sull'oggetto citato con velocità 9600.

Nel loop, quando il buffer si riempie, leggo un carattere alla volta, lo accodo in un array tramite un while che adpetta che il buffer sia vuoto e una volta uscito scrivo tutto sulla seriale.

Una cosa che ho tralasciato è:

La quantità di caratteri che ho come risultato è giusta: se mando 3 byte me ne tornano 3 ma diversi. Questo non succede per tutti i caratteri, ad esempio i numeri (intesi come caratteri ascii) sono giusti come il carattere ':'. Altri, tipo le lettere no. Ho notato che questi caratteri che non mi tornano giusti è come se fossero incrementati di 128 posizioni nella tabella ascii.

Ma la cosa stana è che lo stesso software sullo stesso hardware funzioni in modo diverso...

Però i pin 0 e 1 sono riservati alla seriale hardware, quindi c'è conflitto. Solitamente si assegnano due pin diversi da 0 e 1 alla seriale software.

Meglio vedere il codice.

Ciao.

Gli ATtiny85 NON hanno una seriale hardware e NON ci sono pin riservati ad essa. :wink:

Guglielmo

Pur non essondo il massimo, la SoftwareSerial comunque funziona su ATtiny85 e, limitando la velocità a 9600 bps, non da problemi (usata svariate volte su tantissimi progetti).

Piuttosto, hai impostato correttamente i FUSE del' ATtiny85?

E comunque ... metti il codice, NON un tuo riassunto di ciò che fa (mi raccomando, come da regolamento, il codice, una volta inserito va TUTTO selezionato e va premuta l'icona </> nella barra degli strumenti per contrassegnarlo, appunto come codice. Inoltre, affinché sia ben leggibile, esso deve essere correttamente "indentato" ... questo lo si fa premendo ctrlT su un PC o cmd T su un Mac all'interno del IDE).

Guglielmo

1 Like

Ciao, ecco il codice:

#define TX 11
#define RX 10

#include <SoftwareSerial.h>

SoftwareSerial port = SoftwareSerial(RX, TX);

void setup()
{
  pinMode(RX, INPUT);
  pinMode(TX, OUTPUT);

  port.begin(9600);
}

void loop()
{
  if (port.available())
  {
    while (port.available())
    {
      char c = port.read();
      port.print(c);

      delay(10);
    }
  }
}

Comunque credo di aver fatto qualcosa di sbagliato: oggi ho riscontrato molti più problemi (potrei aver rovinato i due ATtiny con una scheda "fatta in casa" per programmarli e rendere il loro utilizzo più piacevole). Oppure il driver del convertitore USB-seriale (FT-232) si è corrotto.
Ho avuto problemi sia settando il monitor seriale a 8 che a 7 bit, su entrambi i microcontrollori ATtiny85 (di cui uno pensavo fosse buono) e pure sull'arduino uno (cosa che mi fa mal pensare sul fatto di aver danneggiato i micro siccome questo non lo uso su schede fatte da me).

I fuse bit sono abbastanza certo che siano quelli giusti siccome li ho sempre tenuti così e non ho mai avuto problemi. Uso il clock interno a 8 MHz, lascio i valori dei bits:

L: 0xE2
H: 0xDF
E: 0xFF
LB: 0xFF

Grazie,

Ricardo

I FUSE sono corretti, ma ... che "core" stai usando ? Perché ...

... non mi corrisponde a nulla su ATtiny85 (che ha 8 pin)

Guglielmo

Scusami. Ho fatto di fretta purché ero in pausa.
Questo è il codice usato su arduino uno, su attiny85 uso i pin 0 e 1 come detto precedentemente...

Ok, beh, a parte queste totalmente inutili righe che NON servono (ci pensa la libreria a mettersi i pin come gli servono a lei):

... non vedo altro per cui non vada, evidentemente hai problemi nell'hardware con cui ti colleghi o, come dici, nei chip danneggiati ... :roll_eyes:

Guglielmo

Si, sono le uniche conclusioni che sono riuscito a trarre.
Domani provvederò a testare il convertitore su una seriale della quale sono sicuro al 100% che funziona (ovvero quella di Arduino Uno). In caso non riuscissi provo a reinstallare il driver in modo da poter capire dove sta il problema.

Grazie mille!

Eccomi ancora. Allora ho fatto qualche test:

-Provato questo codice su Arduino scollegando il cavo USB e usando il mio convertitore collegando i pin 0 e 1 (rispettivamente RX e TX).

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  if (Serial.available())
  {
    while (Serial.available())
    {
      char c = Serial.read();
      Serial.print(c);

      delay(500);
    }
  }
}

Dal monitor seriale andando ad aprire la comunicazione sulla COM adeguata posso mandare caratteri e riceverli senza problemi.

-Provato poi questo altro codice sempre su Arduino uno:

#define TX 11
#define RX 10

#include <SoftwareSerial.h>

SoftwareSerial port = SoftwareSerial(RX, TX);

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  if (port.available())
  {
    while (port.available())
    {
      char c = port.read();
      port.print(c);

      delay(500);
    }
  }
}

Il risultato non è buono: ricevo caratteri "a caso".

In base al primo codice provato mi verrebbe da pensare che il convertitore ed il driver siano a posto. Quindi quello che mi viene da pensare ora è di aver corrotto la libreria SoftwareSerial.

Proverò a scaricarla e a sostituirla.

Scusa, ma il begin() della SoftwareSerial dove è ? ? ?

Guglielmo

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