Ciao, so già che mi verrà detto di presentarmi e di leggere il regolamento, ho cercato in internet ma non ho trovato le sezioni
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.
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...
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 cmdT su un Mac all'interno del IDE).
#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:
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.
-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.