Novato em série: por que não consigo ligar os fios?

14

Estou tentando transmitir de um ATtiny85 para um PC usando código do tipo Arduino em um conversor USB-Serial sem entender muito de nada. Fiquei chocado e horrorizado que não funcionou.

Confirmei que o minúsculo está oscilando a tensão em um de seus pinos, mas quando conecto esse pino para transmitir ou receber no cabo serial USB e tento ouvir usando um programa de terminal, não recebo nada.

Não sei como saber qual parte está quebrada.

Preciso de mais do que VCC, GND e TXD para transmitir serial?


Detalhes:

O código do minúsculo é escrito no ambiente do Arduino e um código semelhante pisca com êxito todos os 4 pinos "PORTB", pelo menos de acordo com os LEDs. Eu uso o código do HLT e Saporetti para me deixar usar o dialeto Arduino do C ++ para programá-lo. O programa ainda vem com um 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

Há muita tradução envolvida, mas o código é bastante básico. O código que define a taxa de transmissão parece assumir 1 MHz, mas felizmente meu attiny possui fusíveis padrão de fábrica e é executado a 1 MHz. De qualquer forma, o pino 6 está oscilando sua tensão de acordo com o LED.

Então, eu uso os pequenos fios para conectar a extremidade "ftdi" do conversor serial USB da FTDI ao pequeno: preto para GND, vermelho para VCC, laranja para 6. Abro o programa "minicom" no PC, defino o baud taxa de 4800 e aguarde, por nada. Ao conversar com meu Boarduino , não há problemas.

O cabo conversor FTDI possui a seguinte pinagem: preto é GND, marrom é "CTS", vermelho é VCC (+ 4,98V), laranja é "TXD", amarelo é "RXD", verde é "RTS".

Se eu quiser transmitir do minúsculo para o PC, devo piscar a tensão em "TXD" ou "RXD"? Em outras palavras, o fio de transmissão deve ser transmitido do escravo para o host ou o host para o escravo?

Na verdade, eu tentei os dois, nem funcionou. Até agora, fritei menos de um dólar em equipamentos e estou ficando convencido, apenas conecto os fios ao cabo. Talvez eu não deva ignorar os fios "CTS" e "RTS"?

Preciso usar outros fios? RTS e CTS fazem alguma coisa?

O hardware é um ATTiny85-PU (pacote DIP-8, rodando a 1 MHz, com classificação de 20 MHz) alimentado por USB a 4,98V. O PC host é um MacBook e executa com êxito todas as coisas no arduino, incluindo o uso do ArduinoISP para programar o ATtiny para apagar seu coração.

Jack Schmidt
fonte

Respostas:

9

Você pode definitivamente transmitir dados usando apenas TX e GND.

Primeiramente, você deseja conectar a linha ATtiny85 TX à linha FTDI RX (amarela no TTL-232R). Verifique se o adaptador USB suporta 5V - tenho certeza que até o 3.3V TTL-232R é tolerante a 5V.

De acordo com a página de exemplo do SoftwareSerial , você precisa definir a direção das linhas TX e RX na sua função de configuração:

// 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);
}

A taxa de transmissão será 4800 no seu caso. A biblioteca SoftwareSerial parece não suportar CTS e RTS, portanto, verifique se você não os está usando no software host.

Confira a página de referência para obter mais detalhes, onde eles falam sobre possíveis problemas de temporização que podem ser exacerbados se você estiver rodando a 1 MHz, usando o oscilador interno do minúsculo.

Peter Gibson
fonte
Obrigado! A página de referência deixou claro que o 4800 era muito rápido, então caí para 300 baud e as coisas estão "melhores". O pinMode não afeta a transmissão, mas eu o adicionei de qualquer maneira para tornar as coisas mais claras. Agora estou tentando retardar a alteração do atraso entre os bits até que algo seja recebido. Minicom está apenas mostrando? marcas agora. Na pior das hipóteses, meus osciladores de 16 e 20 MHz chegam na sexta-feira.
Jack Schmidt
Você acha que poderia ser o problema de tensão? O ajuste do tempo ainda não funcionou, e estou recebendo muitos pontos de interrogação, então algo está sendo transmitido. Posso corrigi-lo abaixando o Vcc para minúsculo a 3V, ou seja, posso conectá-lo a algumas baterias em vez de USB? Eu conecto o terra ao terra do USB e ao da bateria?
Jack Schmidt
Ah, também obrigado por apontar o fio amarelo para o meu pequeno transmitir. O fio laranja parece piscar muito (ligado a um LED do PC). O PC está transmitindo ou permanece "ligado" a maior parte do tempo?
Jack Schmidt
Sim, deve permanecer HI quando estiver ocioso e piscar ao transmitir - não tenho certeza se o FTDI é capaz de fornecer corrente suficiente para acionar um LED. O AVR vai ficar bem, mas eu removo o LED da linha FTDI-TX. O Crystal deve corrigir os problemas de temporização (mas você precisa configurar os fusíveis para alternar do oscilador interno).
Peter Gibson
Ainda estou trabalhando nisso, mas estou convencido de que é um problema de tempo ou um problema horrível de software do Arduino no ATTiny. Alguns 2-3 bytes médios estão sendo recebidos (mas não exibidos) e o restante é ilegível como 0x80. Vou escrever minha própria função de envio serial AVR (trivial) enquanto espero pelo cristal. Existe alguma maneira fácil / barata de ver o que está sendo enviado? 300 baud ainda é muito rápido para meus velhos olhos.
Jack Schmidt
7

Portanto, a resposta parece ser: você pode simplesmente conectar os fios, de fato apenas GND (preto) e RXD (amarelo), e tudo funciona desde que o software seja bom.

Coisas que não importavam:

  • O oscilador interno funciona bem. Parece relativamente estável aos meus testes limitantes. A 9600 bauds, quaisquer que sejam seus problemas, são desprezíveis.

  • O uso da energia USB nos sinais funciona muito bem. Você pode usar uma fonte de tensão separada (compartilhando um terra comum), mas o cabo FTDI lê os sinais de 3V e 5V perfeitamente. Conectei uma bateria, - ao GND do FTDI e do tiny, + ao VCC do tiny, e isso funcionou muito bem. No entanto, apenas o uso do VCC (vermelho) do FTDI (USB power 5V) é muito mais simples e eficaz.

Coisas que fiz de errado:

  • A linha amarela "RXD" do FTDI recebe bits do microcontrolador, portanto, ela se conecta à transmissão no microcontrolador. Eu mesmo poderia ter descoberto isso conectando as linhas de transmissão e recepção (laranja e amarelo) aos LEDs ou a um Arduino e verificando qual tensão piscava quando transmiti do PC.

  • Nem SoftwareSerial nem NewSoftSerial funcionam imediatamente com um ATtiny. Enquanto o ATmega328p e o ATtiny85 compartilham muitas semelhanças, existem diferenças suficientes que apenas a compilação do software antigo para compilar para o novo chip não é suficiente.

  • Taxas de transmissão mais lentas não curam as coisas. 300 baud requer rotinas de atraso mais complicadas, pois o número de ciclos entre os bits é significativamente maior que um contador de 8 bits. 9600 baud funciona muito bem, e taxas de transmissão mais altas são possíveis.

  • Tenha cuidado ao escrever o código crítico de temporização em C, especialmente nas funções embutidas. O tempo necessário para executar dependerá de como o compilador o otimiza. Em particular, ao calibrar o atraso apenas alterando-o para cima e para baixo, você receberá uma resposta diferente da do atraso constante (compilação detectável), porque o conjunto gerado pode ser bastante diferente. Não é que C seja "lento", mas sim que foi muito rápido. Em um ponto, eu estava enviando 1s mais rápido que 0s (presumivelmente eles são mais aerodinâmicos).

  • Para iniciar uma transmissão, você traz a linha LOW (o bit inicial) e, em seguida, é necessário garantir que a linha esteja na voltagem correta em cada um dos próximos 8 pontos de amostra e, em seguida, garantir que a voltagem seja ALTA na 9ª amostra . O NewSoftSerial menciona um atraso de meio comprimento no bit inicial, mas isso não funcionou bem para mim. Usei um atraso de 75% no início e um atraso de 125% no final.

  • A preocupação real com a tensão pode ser que algumas "seriais" (especialmente RS232) sejam ± 12V, não 0V / 5V. Passei muito tempo tentando entender como ajustar a tensão de 5V a 3,3V, mas acho que isso era completamente irrelevante.

De qualquer forma, a transmissão serial é fácil, mas obter o tempo "perfeito" parece muito importante. Para mim, isso era apenas uma questão de codificar a transmissão em montagem para que eu pudesse contar os ciclos.

Jack Schmidt
fonte
2
+1 para 1 ser mais aerodinâmico :) O FTDI TTL232R emite sinais uart de nível lógico (0-5V); se você estivesse interagindo diretamente com uma porta serial padrão, seria necessário um IC de interface como o MAX232, que converte a tensão níveis nos dois sentidos.
Peter Gibson
Parabéns por fazê-lo funcionar. Obrigado por seu post detalhado, espero que isso ajude muitas outras pessoas com seus projetos ATtiny.
Davidcary