Serial newbie: mengapa saya tidak bisa hanya menghubungkan kabel?

14

Saya mencoba mengirim dari ATtiny85 ke PC menggunakan kode Arduino-esque melalui konverter USB-Serial tanpa memahami banyak hal. Saya terkejut dan terkejut bahwa itu tidak berhasil.

Saya mengkonfirmasi bahwa mungil itu berkedip-kedip tegangan pada salah satu pinnya, tetapi ketika saya menghubungkan pin itu untuk mengirim atau menerima pada kabel serial USB dan mencoba mendengarkan menggunakan program terminal, saya tidak mendapatkan apa-apa.

Saya tidak yakin bagaimana cara mengetahui bagian mana yang rusak.

Apakah saya perlu lebih dari VCC, GND, dan TXD untuk mengirimkan serial?


Detail:

Kode untuk yang mungil ini ditulis di lingkungan Arduino dan kode yang sama berhasil mengedipkan semua 4 pin "PORTB", setidaknya sesuai dengan LED. Saya menggunakan kode dari HLT dan Saporetti untuk membiarkan saya menggunakan dialek Arduino dari C ++ untuk memprogramnya. Program ini masih berada di bawah 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

Ada banyak terjemahan yang terlibat, tetapi kodenya cukup mendasar. Kode yang menetapkan baud rate tampaknya mengasumsikan 1MHz, tetapi untungnya attiny saya memiliki sekering default pabrik dan berjalan pada 1MHz. Bagaimanapun, pin 6 berkedip-kedip tegangannya sesuai dengan LED.

Jadi saya menggunakan kabel kecil untuk menghubungkan ujung "ftdi" dari FTDI USB-serial converter ke mungil: hitam ke GND, merah ke VCC, oranye ke 6. Saya membuka program "minicom" pada PC, mengatur baud tingkat ke 4800 dan tunggu, untuk apa-apa. Saat berbicara dengan Boarduino saya , tidak ada masalah.

Kabel konverter FTDI memiliki pinout berikut: hitam adalah GND, coklat adalah "CTS", merah adalah VCC (+ 4.98V), oranye adalah "TXD", kuning adalah "RXD", hijau adalah "RTS".

Jika saya ingin mentransmisikan dari mungil ke PC, haruskah saya berkedip tegangan pada "TXD" atau "RXD"? Dengan kata lain apakah kawat yang mentransmisikan untuk mentransmisikan dari budak ke tuan rumah, atau tuan rumah ke budak?

Saya benar-benar mencoba keduanya, tidak ada yang berhasil. Sejauh ini saya telah menggoreng peralatan seharga kurang dari satu dolar, dan saya menjadi sombong, jadi saya hanya mencolokkan kabel ke kabel. Mungkin saya tidak seharusnya mengabaikan kabel "CTS" dan "RTS"?

Apakah saya perlu menggunakan kabel lain? Apakah RTS dan CTS melakukan sesuatu?

Perangkat kerasnya adalah paket ATTiny85-PU (DIP-8, berjalan pada 1MHz, diberi peringkat 20MHz) yang ditenagai oleh USB pada 4.98V. Host PC adalah MacBook, dan berhasil melakukan semua hal arduino, termasuk menggunakan ArduinoISP untuk memprogram ATtiny untuk mengedipkan hati kecilnya.

Jack Schmidt
sumber

Jawaban:

9

Anda pasti dapat mengirimkan data hanya menggunakan TX & GND.

Pertama, Anda ingin menghubungkan garis TX ATtiny85 ke garis RX FTDI (kuning pada TTL-232R). Pastikan adaptor USB dapat menangani 5V - Saya cukup yakin bahkan 3.3V TTL-232R adalah 5V toleran.

Menurut halaman contoh untuk SoftwareSerial , Anda perlu mengatur arah garis TX & RX di fungsi pengaturan Anda:

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

Baudrate akan menjadi 4800 untuk Anda. Pustaka SoftwareSerial tampaknya tidak mendukung CTS & RTS, jadi pastikan Anda tidak menggunakannya pada perangkat lunak host.

Lihat halaman referensi untuk detail lebih lanjut, di mana mereka berbicara tentang beberapa masalah waktu potensial yang dapat diperburuk jika Anda menjalankan 1MHz menggunakan osilator internal pada mungil tersebut.

Peter Gibson
sumber
Terima kasih! Halaman referensi memperjelas bahwa 4800 terlalu cepat, jadi saya turun ke 300 baud dan semuanya "lebih baik". PinMode tidak memengaruhi pengiriman, tetapi saya menambahkannya untuk membuat segalanya lebih jelas. Saya sekarang mencoba memperlambat mengubah penundaan antara bit sampai sesuatu diterima. Minicom baru saja menunjukkan? tanda sekarang. Kasus terburuk, osilator 16mhz dan 20mhz saya tiba hari Jumat.
Jack Schmidt
Apakah Anda pikir itu bisa menjadi masalah tegangan? Menyesuaikan waktunya masih belum berhasil, dan saya mendapatkan banyak tanda tanya, jadi sesuatu sedang dikirim. Dapatkah saya memperbaikinya hanya dengan menurunkan Vcc ke kecil ke 3V, yaitu, bisakah saya menghubungkannya ke beberapa baterai, bukan USB? Apakah saya menghubungkan ground ke ground USB dan ground baterai?
Jack Schmidt
Oh, juga terima kasih telah menunjukkan kabel kuning untuk mungil saya untuk mentransmisikan. Kabel oranye tampaknya banyak berkedip-kedip (terhubung ke LED dari PC). Apakah PC mentransmisikan, atau sebagian besar tetap "menyala"?
Jack Schmidt
Ya, harus tetap HI saat idle dan flicker saat mentransmisikan - Saya tidak yakin apakah FTDI mampu memasok arus yang cukup untuk menggerakkan LED. AVR akan baik-baik saja, tapi saya akan menghapus LED dari garis FTDI-TX. Kristal harus memperbaiki masalah pengaturan waktu (tetapi Anda harus mengatur sekering untuk beralih dari osilator internal).
Peter Gibson
Masih mengerjakannya, tapi saya yakin ini masalah waktu atau masalah perangkat lunak Arduino-on-ATTiny yang mengerikan. Beberapa 2-3 byte tengah diterima (tetapi tidak ditampilkan) dan sisanya kacau 0x80. Saya akan menulis sendiri fungsi pengiriman serial AVR (sepele) saya sementara saya menunggu kristal. Apakah ada cara mudah / murah untuk melihat apa yang sedang dikirim? 300 baud masih cukup cepat untuk mata lamaku.
Jack Schmidt
7

Jadi jawabannya memang tampak: Anda hanya dapat menghubungkan kabel, memang hanya GND (hitam) dan RXD (kuning), dan semuanya berfungsi selama perangkat lunaknya baik.

Hal-hal yang tidak masalah:

  • Osilator internal berfungsi dengan baik. Tampaknya relatif stabil untuk pengujian terbatas saya. Pada 9600 baud masalah apa pun yang ada dapat diabaikan.

  • Menggunakan daya USB pada sinyal berfungsi dengan baik. Anda dapat menggunakan sumber tegangan terpisah (berbagi kesamaan), tetapi kabel FTDI membaca sinyal 3V dan 5V dengan sempurna. Saya menghubungkan paket baterai, - ke GND FTDI dan mungil, + ke VCC mungil, dan ini bekerja dengan baik. Namun hanya menggunakan VCC (merah) dari FTDI (USB power 5V) jauh lebih sederhana dan sama efektifnya.

Hal-hal yang saya lakukan salah:

  • Garis Yellow FTDI "RXD" menerima bit dari mikrokontroler, sehingga terhubung ke transmit pada mikrokontroler. Saya bisa mengetahuinya sendiri dengan menghubungkan transmisi dan menerima jalur (oranye dan kuning) ke LED atau Arduino dan memeriksa tegangan yang berkedip ketika saya ditransmisikan dari PC.

  • Baik SoftwareSerial maupun NewSoftSerial tidak bekerja dengan ATtiny. Sementara ATmega328p dan ATtiny85 memiliki banyak kesamaan, ada cukup banyak perbedaan bahwa hanya mendapatkan perangkat lunak lama untuk dikompilasi untuk chip baru tidak cukup.

  • Laju baud yang lebih lambat tidak menyembuhkan. 300 baud membutuhkan rutinitas keterlambatan yang lebih rumit karena jumlah siklus antara bit secara signifikan lebih dari penghitung 8bit. 9600 baud bekerja dengan baik, dan tingkat baud yang lebih tinggi dapat dilakukan.

  • Berhati-hatilah menulis kode waktu kritis dalam C, terutama dalam fungsi sebaris. Waktu yang diperlukan untuk mengeksekusi akan tergantung pada bagaimana kompiler mengoptimalkannya. Secara khusus, ketika mengkalibrasi keterlambatan dengan hanya mengubahnya ke atas dan ke bawah, Anda akan mendapatkan jawaban yang berbeda dari ketika menggunakan penundaan konstan (waktu kompilasi terdeteksi), karena perakitan yang dihasilkan dapat sangat berbeda. Bukannya C itu "lambat", tapi itu terlalu cepat. Pada satu titik saya mengirim 1s lebih cepat dari 0s (mungkin mereka lebih aerodinamis).

  • Untuk memulai transmisi, Anda membawa garis RENDAH (bit mulai) dan kemudian Anda perlu memastikan saluran berada pada tegangan yang tepat di masing-masing 8 titik sampel berikutnya, dan kemudian pastikan tegangannya TINGGI pada sampel ke-9 . NewSoftSerial menyebutkan melakukan penundaan setengah panjang pada bit awal, tetapi ini tidak bekerja dengan baik untuk saya. Saya menggunakan 75% keterlambatan di awal dan 125% keterlambatan di akhir.

  • Kekhawatiran nyata tentang tegangan mungkin bahwa beberapa "serial" (terutama RS232) adalah ± 12V, bukan 0V / 5V. Saya menghabiskan banyak waktu untuk mencoba memahami bagaimana saya dapat mengatur tegangan dari 5V ke 3.3V, tetapi saya pikir itu sama sekali tidak relevan.

Bagaimanapun, mentransmisikan serial itu mudah, tetapi mendapatkan waktunya "sempurna" tampaknya cukup penting. Bagi saya, ini hanya masalah pengkodean transmisi dalam perakitan sehingga saya bisa menghitung siklus.

Jack Schmidt
sumber
2
+1 untuk 1 lebih aerodinamis :) FTDI TTL232R mengeluarkan sinyal tingkat sinyal uart (0-5V), jika Anda berinteraksi langsung dengan port serial standar, Anda akan memerlukan IC antarmuka seperti MAX232, yang mengubah tegangan tingkat kedua cara.
Peter Gibson
Selamat untuk membuatnya bekerja. Terima kasih atas pos terperinci Anda, saya harap ini membantu banyak orang dengan proyek ATtiny mereka.
davidcary