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.
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.
fonte