Show Posts
Pages: 1 2 3 [4] 5 6 ... 17
46  International / Software / Re: Non riesco a leggere una stringa da seriale ..... l'ennesima richiesta!!!! on: January 07, 2013, 02:16:30 am
si Leo... se metto un delay al posto dei serial print .. funziona di nuovo tutto. Ma non mi piace la soluzione. Voglio trovare una soluziione che vada bene sempre e che non rallenti il codice più di quanto non sa srettaene necessario.

l'uscita con timeout la vedo corretta perchè:
Quote
2) se invece la stringa è piu corta, al raggiungimento dell'ultimo carattere dovrebbe iniziare a contare millis - count (con count che contiene l'ultimo valore di millis di quando ha letto l'ultimo carattere, quindi appena supera il tempo max di attesa significa che non ci sono più caratteri ed esce lo stesso.

il count viene inizializzato con millis al momento della letttura dell'ultimo carattere .... quindi esce se
(millis() - count > countMax) ... che diventa vero dopo che sono passati countMax  mS ...
mi pare che questa logica sia correttà...

sto pennsando di controllare la cancellazione del buffer con un altro controllo anzichè con seruial.available... perchè e lì che cè il punto critico...

ciao







47  International / Software / Re: Non riesco a leggere una stringa da seriale ..... l'ennesima richiesta!!!! on: January 06, 2013, 12:16:43 pm
Grazie Leo..... allora:
A parte che il codice è scritto un po' male.... si mette in genere una istruzione per riga, la "riga" che tu elimini in realtà sono più istruzioni.... poi gli spazi tra la fine di una istruzione ed il ";" di fine riga proprio non si possono vedere  smiley-sweat
Poi c'è un controllo che non capisco.
 fineLettura = ( (index >= dimVettore) || (millis() - count > countMax));

Fatto così, che senso ha? Carichi millis subito prima del check. Quella parte lì sarà sempre false finché ricevi caratteri. Sarà sempre vera se non li ricevi perché count non lo inizializzi con millis() prima di fare l'if.


Ok... per lo stile che sicuramente è da rivedere....

il controllo dovrebbe disporre l'uscita dal do-while al verificarsi di una delle due condizioni:
1) se l'indice supera la dimesione del vettore (questo si verifica quando la stringa ricevuta  è più lunga della dimesione del vettore dove conservo i byte (char) ricevuti;
2) se invece la stringa è piu corta, al raggiungimento dell'ultimo carattere dovrebbe iniziare a contare millis - count (con count che contiene l'ultimo valore di millis di quando ha letto l'ultimo carattere, quindi appena supera il tempo max di attesa significa che non ci sono più caratteri ed esce lo stesso.

ma questa parte mi pare che funzioni bene...

ciò che non funziona è la parte che dovrebbe cancellare il buffer di ricezione della seriale, cioè questa:
Code:
     Serial.print("\n  VUOTA il BUFFER: eliminati:");
     byte tempByte;
     while (Serial.available()) {tempByte = Serial.read(); Serial.write(tempByte);}
     Serial.print("\n    ---------------------\n");

e questo, io credo, sia dovuto al fatto che mentre prima la riga che contiene le quattro istruzioni di serial print, introducono un certo ritardo, fanno si che quando l'struzine passa sul serial.available lo trova positivo, perchè nel frattempo è arrivato un altro carattere, quindi entra e cancella il buffer ...

se invece tolgo quei serial.print, passa troppo rapidamente a fare quella valutazione e serial.available è false... quindi non entra e non calcella il buffer... io credo sia quasto ma non trovo la soluzione .... ogni volt che mi sembra di aver trovato qualcosa basta che tolgo qualche serial print e non funziona più....


48  International / Software / Re: Non riesco a leggere una stringa da seriale ..... l'ennesima richiesta!!!! on: January 06, 2013, 03:14:28 am
Chiedo scusa ma ieri è successo un piccolo problema dopo che ho insrito mezzo post.... è mancata l'energia elettrica, poi non c'era collegamento, posi sono dovuto uscire e sono rientrato tardissimo.. quindi in realtà ho postato solo metà della descrizione...

e vi ringrazio anche per esserevi trattenuti negli improperi ....

adesso l'ho corretto ed all'incirca si dovrebbe leggere tutta la descrizione del problema che cerco di riassumere anche qui ..

il problema consiste nel mettere in un array di char (voglio fare così.. non con una stringa) ... i primi n caratteri ricevuti dalla seriale e svuotare i caratteri che eventualmente ancora ci fossero in attesa di essere letti ...


il primo schetc funziona, finche ci sono anche le righe di serial.print che uso per il debug ... nel secondo script, dove cancello una riga di debug .. non funziona più..... ci sono sopra due giorni e non trovo soluzione .. porka miseria!!!!!

... se per esempio, digito la seguente stringa "abcdefghilmno"  mi da questo output

 
Code:
dopo do ---------------------

  VUOTA il BUFFER: eliminati:
    ---------------------

 INIZIO VETTORE MEMORIZZATO
 index:5
k=0    97    a
k=1    98    b
k=2    99    c
k=3    100    d
k=4    101    e
 FINE VETTORE MEMORIZZATO



   dopo do ---------------------

  VUOTA il BUFFER: eliminati:mno
    ---------------------

 INIZIO VETTORE MEMORIZZATO
 index:5
k=0    102    f
k=1    103    g
k=2    104    h
k=3    105    i
k=4    108    l
 FINE VETTORE MEMORIZZATO
cioè il vettore alla fine contiene "fghil" anzichè i primi 5 caratteri "abcde"

invece di quello corretto che dovrebbe essere questo
Code:
97    index:0
98    index:1
99    index:2
100    index:3
101    index:4
   dopo do ---------------------

  VUOTA il BUFFER: eliminati:fghilmno
    ---------------------

 INIZIO VETTORE MEMORIZZATO
 index:5
k=0    97    a
k=1    98    b
k=2    99    c
k=3    100    d
k=4    101    e
 FINE VETTORE MEMORIZZATO
con il vettore che, correttamemte, alla fine contiene solo i primi 5 caratteri ....

credo di essere stato maggiormente chiaro ... saluti ciao
49  International / Software / Non riesco a leggere una stringa da seriale .....RISOLTO!!!! on: January 05, 2013, 12:56:37 pm
Non riesco a leggere un stringa dalla seriale come vorrei io..
cioè sto cercando di mettere in un vettore di char la stringa che invio dalla seriale .. per il processamento successivo.

cioè se invio "ABCDEFGHIL" (senza gli apici) e fisso la lunghezza del vettore a 4, vorrei avere questo
stringa(0) ---> A
stringa(1) ---> B
stringa(2) ---> C
stringa(3) ---> D

ho cercato e letto decine di post che riguardano questo problema.
Ho capito che il problema è originato dalla velocità di lettura rispetto alla velocità di ricezione dei dati sulla seriale ..

ho fatto questo script e funziona, fintanto che ci sono le stampe su serial monitor per il debug:



Code:
#define dimVettore 5            // lunghezza max del buffer di lettura (stringa seriale)
char stringaSERIALE[dimVettore + 1]; // stringa buffer for contenente le letture estratte dal GPS
boolean fineLettura;                 // controllo sul checksum della stringa Seriale ricevuta

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

void loop()
{if (Serial.available()>0){leggiSeriale();}}

void leggiSeriale()
 {
   unsigned long count;      //interrompe la lettura dalla seriale se passano più di countMax ms senza che arrivino caratteri
   int const countMax = 5;  // limite max millisecondi senza che arrivino caratteri .. oltre chiude il ciclo di lettura (non scendere sotto i 5)
  
   int index=0;
   do    
     {
        if(Serial.available()> 0)                
         {
           stringaSERIALE[index]=Serial.read();  
           Serial.print("\n\t"); Serial.print(stringaSERIALE[index]); Serial.print("  \t"); Serial.print(stringaSERIALE[index], DEC); Serial.print("   \t index:"); Serial.print(index);
           index++; count = millis();                            
            }
            
      fineLettura = ( (index >= dimVettore) || (millis() - count > countMax));
      }
    while (!fineLettura);  
    Serial.print("\n   dopo do ---------------------\n");
 
  
     Serial.print("\n  VUOTA il BUFFER: eliminati:");
     byte tempByte;
     while (Serial.available()) {tempByte = Serial.read(); Serial.write(tempByte);}
     Serial.print("\n    ---------------------\n");
      
  
  
     Serial.print("\n INIZIO VETTORE MEMORIZZATO");
     Serial.print("\n index:"); Serial.print(index);
     for(int k=0; k<index; k++){
                            Serial.print("\n\t k=")   ; Serial.print(k);
                            Serial.print("\t   ")     ; Serial.print(stringaSERIALE[k], DEC);
                            Serial.print("\t   ")     ; Serial.print(stringaSERIALE[k]);
                          }
      Serial.print("\n FINE VETTORE MEMORIZZATO \n\n\n");
}

tutto questo funziona, ma basta che elimino una riga e già non funziona più...
Code:
#define dimVettore 5            // lunghezza max del buffer di lettura (stringa seriale)
char stringaSERIALE[dimVettore + 1]; // stringa buffer for contenente le letture estratte dal GPS
boolean fineLettura;                 // controllo sul checksum della stringa Seriale ricevuta

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

void loop()
{if (Serial.available()>0){leggiSeriale();}}

void leggiSeriale()
 {
   unsigned long count;      //interrompe la lettura dalla seriale se passano più di countMax ms senza che arrivino caratteri
   int const countMax = 5;  // limite max millisecondi senza che arrivino caratteri .. oltre chiude il ciclo di lettura (non scendere sotto i 5)
  
   int index=0;
   do    
     {
        if(Serial.available()> 0)                
         {
           stringaSERIALE[index]=Serial.read();  
           //Serial.print("\n\t"); Serial.print(stringaSERIALE[index]); Serial.print("  \t"); Serial.print(stringaSERIALE[index], DEC); Serial.print("   \t index:"); Serial.print(index);
           index++; count = millis();                            
            }
            
      fineLettura = ( (index >= dimVettore) || (millis() - count > countMax));
      }
    while (!fineLettura);  
    Serial.print("\n   dopo do ---------------------\n");
 
  
     Serial.print("\n  VUOTA il BUFFER: eliminati:");
     byte tempByte;
     while (Serial.available()) {tempByte = Serial.read(); Serial.write(tempByte);}
     Serial.print("\n    ---------------------\n");
      
  
  
     Serial.print("\n INIZIO VETTORE MEMORIZZATO");
     Serial.print("\n index:"); Serial.print(index);
     for(int k=0; k<index; k++){
                            Serial.print("\n\t k=")   ; Serial.print(k);
                            Serial.print("\t   ")     ; Serial.print(stringaSERIALE[k], DEC);
                            Serial.print("\t   ")     ; Serial.print(stringaSERIALE[k]);
                          }
      Serial.print("\n FINE VETTORE MEMORIZZATO \n\n\n");
}

... mi sta facendo impazzire.... se già non lo sono!!!! ... che cavolo gli devo fare perchè funzioni sempre ..
50  International / Software / Re: Comunicazione seriale tra due microcontrollori .. on: December 29, 2012, 04:14:12 pm
Grazie ad entrambi ....

in fondo mi pare sia abbastanza semplice .. comincio subito a lavorarci .. grazie
ciao
51  International / Software / Comunicazione seriale tra due microcontrollori .. on: December 28, 2012, 03:15:24 pm
Ciao .. vorrei sentire la vostra opinione a questo riguardo:

... devo mettere in collegamento due microcontrollori, un ATmega644 ed un 328 (credo sia un 328) sull'arduino ethernet.

... non posso e non voglio usare i normali pin tx e rx (di ciascuno dei due micro) che sono riservati per la comunicazione al pc (serial monitoe e per la progrmmazione)... quindi userò altri pin tra quelli liberi.

Se non ho capito male, posso usare qualsiasi pin tramite la libreria NewSoftSerial.h ...questo credo di aver capito.

poi ... la comunicazione consiste nella richiesta del contenuto di alcuni byte nella eeprom del 644, che il 328 dovrebbe richiedere appunto al 644, e nell'impostazione del contenuto di alcune viariabili .

.. che voi sappiate esiste già, di uso libero, un protocollo facilmente adattabile a questi usi?..
 o mi consigliate di riscriverlo tutto?

... si lo sò qualcuno dirà ... ma questo vuole la pappa pronta'??... ebbene si, se la trovo e più o meno quello che sto chiedendo. Ma mi impegno a pubblicare tutto il lavoro una volta ultimato!!!
..

comunque se dovessi scriverlo, questo protocollo via seriale, doveri usare gli interrupt per avvisare il micro destinatario che cè una richiesta, o una disposizione nella seriale?... giusto per non lasciarlo sempre in lettura sulla seriale???...

... ringrazio, come sempre, chi mi darà un qualsiasi suggerimento, indizio o consiglio ...

Saluti
... e buon anno!!!!





52  International / Hardware / Re: programmare il 644 ... ma come???? on: December 23, 2012, 01:12:41 pm
io intanto vi seguo in silenzio!!!!
53  International / Hardware / Re: Quale decoder DTMF? on: December 22, 2012, 12:38:46 pm
io uso questi:
http://www.ebay.it/itm/N-8-MT8870DE-Integrato-decodificatore-DTMF-Dual-Tone-Multi-Freq-decoder-MT8870-/170832440158?pt=Componenti_elettronici_attivi&hash=item27c6682b5e

4 bit per la decodifica + 1 per l'interrupt


dallo stesso venditore acquisto anche i quarzi....
54  International / Software / Re: sintetizzatore vocale..... quale usare? RISOLTO!!! on: December 22, 2012, 08:24:29 am
no... er finestra no!!! .... dovrei noleggiarmi una pronunciatrice professionale!!!! ....

balabolka funziona bene.
ho già generato i primi 10 numeri e qualche altro messaggio ... buono grazie.

55  International / Software / Re: sintetizzatore vocale..... quale usare? on: December 22, 2012, 05:00:08 am
Grazie leo... ma tu fai in tempo ad accudire qualsiasi post in qualsiasi forum? ... ok scherzi a parte. L'ho scaricato e lo sto provando
ciao
56  International / Hardware / Re: programmare il 644 ... ma come???? on: December 21, 2012, 03:27:23 pm
si.. confermo le letture rx e tx, come sotto, lette direttamente dalla serigrafia del convertitore ....


 per le pizzicate non ero sicuro fosse solo una battuta, ma pittosto ho pensato: "ma questo Michele, pur essendo indubbiamente bravo e meritatamente dovrei includerlo nei "credits" ... non è che è un pò polemico???? .... ma no scherzo!!! ciao..
57  International / Software / sintetizzatore vocale..... quale usare? RISOLTO!!! on: December 21, 2012, 01:43:07 pm
Salve.... in un progetto uso questa schedina,  
http://arduino.cc/forum/index.php/topic,123046.msg925215.html#msg925215
per generare dei suoni di sistema e dei messaggi vocali:
.. ho bisogno di generare i file audio, in qualsiasi formato va bene, perchè tanto, poi li dovrò adattare al formato idoneo per la schedina SOMO di che trattasi.
devo poter disporre di tanti file, ciascuno contenente in formato audio valido, per esempio mp3, o wav, per esempio
0000.wav  (che contiene la pronuncia dello zero)
0001.wav (che contiene la pronincia dell'1 )...

etc..
etc..
nonche altre parole stabilite.. come .. "password riconosciuta".

.. tutto questo perchè non voglio usare la mia voce e registrare con il comune "registratore" di windows.

avete qualche software da suggerire??? ....qualche sistetizzatore vocale, dove posso digitare la parola e questo software me la pronuncia, consentendomi anche di registrarla in un file audio valido ???

qualche suggerimento?

(
58  International / Hardware / Re: programmare il 644 ... ma come???? on: December 21, 2012, 01:27:43 pm
@Michele: ti dò atto che me li hai suggeriti da subito, ma non mi funzionava. COME TI SCRITTO MOLTE VOLTE.  smiley-wink ... Non sò perchè. Sicuramente sbagliavo qualcosa. La maggior parte dei tentativi li facevo sempre con l'arduino non con il convertitore. Forse cè qualcosa che non va nell'arduino!!! ....
Quindi non ho capito qual'era il problema. Ipotizzo, come voi, che fosse qualcosa nei collegamenti, magari qualche collegamento un pò lasco. Bho!!!!
 Mi limito a comunicarvi, con gratitudine (CON GRATITUDINE), la mia soddisfazione. Di più non posso fare.

Ciao....
PS sto andando a mettere un altro post nella sezione software .... se vuoi partecipare ..... smiley-wink
59  International / Hardware / Re: programmare il 644 ... ma come???? on: December 21, 2012, 11:57:34 am
... finalmente posso stare un pò seduto davanti al pc a fare ciò che mi piace!!!!

... allora ieri sera ho provato un pò... e per un attimo ho avuto la sensazione che la "gufata" di michele potesse aver avuto seguito ....

.. allora, messe le resistenza di pull up 10K (+5V)  sulla linea Tx e Rx ...
.. condensatore in serie nella linea RX da 100pF .... ma niente!!! Niente programmazione via seriale.

Stavo per mollare.... quindi smonto tutto e riprovo a collegare direttamente sul convertitore
linee tx e rx dirette, senza resistenze nè condensatori, solo il condensatore sulla linea di reset, come lo "jetatt"... pardon Michele, non perde occasione di ricordare. E voilà... tutto funziona alla perfezione.

Quindi ho cablato tutto in modo stabile, eliminando fili volanti etc... e và alla grande.
Programma benissimo ad ogni tentativo.. serial monitor perfetto.. esattamente come sulla scheda arduino.... Innesto il cavetto USB e via.... niente più metti-togli 328 sulla scheda arduino ...

quindi riassumendo
RX del convertitore ----> pin 14 (RXD0) del 644 : diretto senza alcuna resistenza di pull up;
TX del convertitore ----> pin 15 (TXD0) del 644: come sopra ..
DTR del convertitore ---> pin 9 (RESET) del 644: interrotto con un condensatore ceramico da 100K pF, ma ho riscontrato che anche
molto diversi va bene comunque ....
naturalmente + 5V e GND dal convertore al 644 ...

funziona tutto alla grande ...

ah.. per michele, anche se in uno dei primi post avevi "criticato" il mio acquisto "superfluo": smiley
Quote
, però non possiamo pensare che questi chipponi si programmino via seriale SOLO mediante Arduino, che poi è la cosa più deprecabile a motivo di dover tirare fuori l'ATmega328 dallo zoccolo; quindi dobbiamo vedere come si comportano con un Convertitore esterno;
io stò usando questo:
http://www.ebay.it/itm/1x-ATMEGA328P-PU-Arduino-UNO-USB-2-0-TO-RS232-UART-KIT-ATMEGA328-/221121384301


adesso continuiamo con lo sviluppo ...
Grazie a tutti ....
Ciao smiley-wink
60  International / Hardware / Re: programmare il 644 ... ma come???? on: December 20, 2012, 10:47:58 am
... ok!!! grazie....

caro Leo .... spero di poterti menzionare tra i "credits" ..  nel lavoro in corso ...
Pages: 1 2 3 [4] 5 6 ... 17