Newbie seriale: perché non posso semplicemente collegare i fili?


14

Sto cercando di trasmettere da un ATtiny85 a un PC usando il codice Arduino-esque su un convertitore USB-seriale senza capire molto di niente. Ero scioccato e sconvolto dal fatto che non funzionasse.

Ho confermato che il piccolo sta tremolando la tensione su uno dei suoi pin, ma quando collego quel pin per trasmettere o ricevere sul cavo seriale USB e provo ad ascoltare usando un programma terminale, non ottengo nulla.

Non sono sicuro di come dire quale parte è rotta.

Ho bisogno di più di VCC, GND e TXD per trasmettere seriale?


Dettagli:

Il codice per il piccolo è scritto nell'ambiente Arduino e un codice simile fa lampeggiare con successo tutti e 4 i pin "PORTB", almeno secondo i LED. Uso il codice di HLT e Saporetti per farmi usare il dialetto Arduino di C ++ per programmarlo. Il programma arriva ancora sotto un K.

#include <SoftwareSerial.h>

SoftwareSerial s(0,1); //receive on "0", and transmit on "1" aka "PB1" aka pin 6

void setup() { s.begin(4800); } // assuming 1Mhz, 4800 baud
void loop() { s.println(millis()); } // transmit something at every opportunity

Sono coinvolte molte traduzioni, ma il codice è piuttosto semplice. Il codice che imposta la velocità di trasmissione sembra assumere 1MHz, ma per fortuna il mio attiny ha micce di default di fabbrica e funziona a 1MHz. In ogni caso, il pin 6 sta tremolando la sua tensione in base al LED.

Quindi uso i fili piccoli per collegare l'estremità "ftdi" del convertitore seriale USB FTDI al minuscolo: nero a GND, rosso a VCC, arancio a 6. Apro il programma "minicom" sul PC, imposto il baud tasso a 4800 e attendere, per niente. Quando parlo con il mio Boarduino , non ha problemi.

Il cavo del convertitore FTDI ha il seguente pinout: il nero è GND, il marrone è "CTS", il rosso è VCC (+ 4.98V), l'arancione è "TXD", il giallo è "RXD", il verde è "RTS".

Se voglio trasmettere dal piccolo al PC, dovrei sfarfallare la tensione su "TXD" o "RXD"? In altre parole, il filo di trasmissione deve essere trasmesso dallo slave all'host o dall'host allo slave?

In realtà ho provato entrambi, né ha funzionato. Finora ho frugato meno di un dollaro di attrezzatura e sto diventando arrogante, quindi ho appena collegato i fili al cavo. Forse non dovrei ignorare i fili "CTS" e "RTS"?

Devo usare altri fili? RTS e CTS fanno qualcosa?

L'hardware è un ATTiny85-PU (pacchetto DIP-8, funzionante a 1MHz, valutato a 20MHz) alimentato da USB a 4.98V. Il PC host è un MacBook e fa con successo tutte le cose Arduino, incluso l'uso di ArduinoISP per programmare l'ATtiny in modo da battere le palpebre.

Risposte:


9

Puoi sicuramente trasmettere dati usando solo TX & GND.

Innanzitutto, si desidera collegare la linea ATtiny85 TX alla linea FTDI RX (gialla sul TTL-232R). Assicurati che l'adattatore USB sia in grado di gestire 5 V - Sono abbastanza sicuro che anche il 3,3 V TTL-232R è tollerante a 5 V.

Secondo la pagina di esempio per SoftwareSerial , è necessario impostare la direzione delle linee TX e RX nella funzione di impostazione:

// include the SoftwareSerial library so you can use its functions:
#include <SoftwareSerial.h>

#define rxPin 2
#define txPin 3
#define ledPin 13

// set up a new serial port
SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);
byte pinState = 0;

void setup()  {
  // define pin modes for tx, rx, led pins:
  pinMode(rxPin, INPUT);
  pinMode(txPin, OUTPUT);
  pinMode(ledPin, OUTPUT);
  // set the data rate for the SoftwareSerial port
  mySerial.begin(9600);
}

Il baudrate sarà 4800 nel tuo caso. La libreria SoftwareSerial non sembra supportare CTS e RTS, quindi assicurati di non utilizzarli sul software host.

Controlla la pagina di riferimento per maggiori dettagli, dove parlano di alcuni potenziali problemi di temporizzazione che potrebbero essere esacerbati se stai funzionando a 1MHz usando l'oscillatore interno sul piccolo.


Grazie! La pagina di riferimento ha chiarito che 4800 era troppo veloce, quindi sono sceso a 300 baud e le cose sono "migliori". Il pinMode non influenza la trasmissione, ma l'ho aggiunto comunque per rendere le cose più chiare. Ora sto cercando di rallentare cambiando il ritardo tra i bit fino a quando non viene ricevuto qualcosa. Minicom sta solo mostrando? segni in questo momento. Nel peggiore dei casi, i miei oscillatori da 16mhz e 20mhz arrivano venerdì.
Jack Schmidt,

Pensi che potrebbe essere il problema di tensione? La regolazione dei tempi non ha ancora funzionato e sto ricevendo molti punti interrogativi, quindi qualcosa viene trasmesso. Posso risolverlo solo abbassando il Vcc al piccolo a 3V, cioè posso semplicemente collegarlo ad alcune batterie anziché USB? Collego la terra sia a terra USB che a terra della batteria?
Jack Schmidt,

Oh, grazie anche per aver sottolineato che il filo giallo è per il mio piccolo da trasmettere. Il filo arancione sembra tremolare molto (collegato a un LED dal PC). Il PC sta trasmettendo o rimane "acceso" per la maggior parte del tempo?
Jack Schmidt,

Sì, dovrebbe rimanere HI quando inattivo e sfarfallio durante la trasmissione - non sono sicuro che l'FTDI sia in grado di fornire abbastanza corrente per pilotare un LED. L'AVR andrà bene, ma rimuoverei il LED dalla linea FTDI-TX. Crystal dovrebbe risolvere i problemi di temporizzazione (ma è necessario impostare i fusibili per passare dall'oscillatore interno).
Peter Gibson,

Ci sto ancora lavorando, ma sono convinto che si tratti di un problema di temporizzazione o di un orribile problema del software Arduino-on-ATTiny. Vengono ricevuti alcuni 2-3 byte centrali (ma non visualizzati) e il resto viene confuso come 0x80. Scriverò la mia (banale) funzione di invio seriale soft AVR mentre aspetto il cristallo. C'è un modo semplice / economico per vedere cosa viene inviato? 300 baud è ancora abbastanza veloce per i miei vecchi occhi.
Jack Schmidt,

7

Quindi la risposta sembra essere: puoi semplicemente collegare i fili, anzi solo GND (nero) e RXD (giallo), e tutto funziona finché il software è buono.

Cose che non contavano:

  • L'oscillatore interno funziona perfettamente. Sembra relativamente stabile ai miei test limitanti. A 9600 baud qualunque problema abbia è trascurabile.

  • L'uso dell'alimentazione USB sui segnali funziona perfettamente. È possibile utilizzare una fonte di tensione separata (condividendo una messa a terra comune), ma il cavo FTDI legge perfettamente sia i segnali 3V che 5V. Ho collegato un pacco batteria, - a GND sia dell'FTDI che del tiny, + al VCC del tiny, e questo ha funzionato perfettamente. Tuttavia, l'utilizzo del VCC (rosso) dell'FTDI (alimentazione USB 5 V) è molto più semplice ed efficace.

Cose che ho fatto di sbagliato:

  • La linea FTDI "RXD" gialla riceve bit dal microcontrollore, quindi si collega alla trasmissione sul microcontrollore. Avrei potuto capirlo da solo collegando le linee di trasmissione e ricezione (arancione e giallo) ai LED o ad un Arduino e controllando quale tensione tremolava quando trasmettevo dal PC.

  • Né SoftwareSerial né NewSoftSerial sono pronti all'uso con un ATtiny. Mentre ATmega328p e ATtiny85 condividono molte somiglianze, ci sono abbastanza differenze che non è sufficiente far compilare il vecchio software per il nuovo chip.

  • Baud rate più lenti non curano le cose. 300 baud richiedono routine di ritardo più complicate poiché il numero di cicli tra i bit è significativamente più di un contatore a 8 bit. 9600 baud funzionano bene e sono possibili velocità di trasmissione più elevate.

  • Fare attenzione a scrivere il codice critico di temporizzazione in C, specialmente nelle funzioni in linea. Il tempo necessario per l'esecuzione dipenderà da come il compilatore lo ottimizza. In particolare, quando si calibra il ritardo semplicemente modificandolo su e giù, si otterrà una risposta diversa rispetto a quando si utilizza un ritardo costante (tempo di compilazione rilevabile), poiché l'assemblaggio generato può essere abbastanza diverso. Non è che C sia "lento", ma piuttosto che è stato troppo veloce. A un certo punto stavo inviando 1 più veloce degli 0 (presumibilmente sono più aerodinamici).

  • Per iniziare una trasmissione, porta la linea BASSA (il bit di inizio) e quindi devi assicurarti che la linea sia alla giusta tensione in ciascuno dei successivi 8 punti di campionamento, quindi assicurati che la tensione sia ALTA al 9 ° campione . NewSoftSerial menziona un ritardo di mezza lunghezza sul bit di avvio, ma questo non ha funzionato bene per me. Ho usato un ritardo del 75% all'inizio e un ritardo del 125% alla fine.

  • La vera preoccupazione per la tensione potrebbe essere che alcuni "seriali" (in particolare RS232) sono ± 12V, non 0V / 5V. Ho trascorso molto tempo a cercare di capire come avrei potuto regolare la tensione da 5 V a 3,3 V, ma penso che fosse del tutto irrilevante.

Ad ogni modo, la trasmissione seriale è facile, ma avere un tempismo "perfetto" sembra piuttosto importante. Per me, si trattava solo di codificare la trasmissione in assembly in modo da poter contare i cicli.


2
+1 per 1 è più aerodinamico :) L'FTDI TTL232R emette segnali uart a livello logico (0-5 V), se si interfacciasse direttamente con una porta seriale standard, sarebbe necessario un IC di interfaccia come il MAX232, che converte la tensione livelli in entrambi i modi.
Peter Gibson,

Congratulazioni per averlo fatto funzionare. Grazie per il tuo post dettagliato, spero che questo aiuti molte altre persone con i loro progetti ATtiny.
davidcary,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.