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