Saya baru mengenal pemrograman mikrokontroler. Saya menggunakan ATmega32-A controller dan compiler CodeVisionAVR. Saya menggunakan generator bentuk gelombang (AD9833) untuk menghasilkan sinyal sinewave menggunakan komunikasi SPI. Saya dapat menghasilkan gelombang sinus dengan sukses. Sekarang saya meneruskan sinyal itu ke sensor. Output sensor dipilih melalui multiplexer dan dikirim ke ADC. Sekarang saya ingin membaca nilai ADC menggunakan komunikasi SPI. Saya telah mencoba banyak untuk mengatur register ADC. Masih tidak berfungsi. Untuk melihat Kode komunikasi SPI lihat posting saya sebelumnya register register menggunakan komunikasi SPI . Saya menggunakan komunikasi USART (RS232) untuk mencetak nilai pada PC (Putty).
Seseorang menyarankan saya untuk menggunakan bit-banging. Saya baru mengenal konsep itu. Adakah yang bisa memberikan saya contoh kode bit banging komunikasi SPI. Bagaimana cara memulai prosedur itu? Adakah yang bisa memberi saya bahan yang bagus? Apakah saya memerlukan perangkat keras eksternal?
Saya telah menulis ini, termasuk koneksi pin:
#define ADC_CS PORTB.3
#define MOSI PORTB.5
#define MISO PINB.6
#define SCK PORTB.7
void send_8bit_serial_data(unsigned char data)
{
int i;
ADC_CS=0;
for (i = 0; i < 8; i++)
{
// consider leftmost bit
// set line high if bit is 1, low if bit is 0
if (data & 0x80)
output_high(PORTB.5);
else
output_low(PORTB.5);
// pulse clock to indicate that bit value should be read
output_low(PORTB.7);
output_high(PORTB.7);
// shift byte left so next bit will be leftmost
data <<= 1;
}
// deselect device
ADC_CS=1;
}
sumber
Jawaban:
Bit banging menciptakan seluruh rangkaian pulsa dalam perangkat lunak, alih-alih mengandalkan perangkat keras di dalam mikrokontroler.
Banyak mikrokontroler memiliki SPI perangkat keras, dan yang harus Anda lakukan hanyalah menulis byte ke register keluaran, dan pengontrol SPI akan menggeser data keluar, dan pada saat yang sama menerima data dari slave. Anda bisa mendapatkan interupsi ketika transfer selesai, dan kemudian membaca data yang diterima.
Tetapi beberapa mikrokontroler tidak memiliki perangkat keras SPI di papan dan kemudian Anda harus mensimulasikannya dengan melakukan semuanya secara manual. SPI memiliki sejumlah mode berbeda, saya akan menggunakan diagram pulsa ini sebagai contoh:
Jadi, sementara pengontrol SPI yang berdedikasi menangani semua pulsa, pemindahan data, dan waktu, ketika melakukan bit-banging, Anda harus mengambil sendiri setiap tindakan:
Bit-banging SPI relatif sederhana, kode untuk bit-banging I2C misalnya akan lebih kompleks, dan Anda akan memerlukan timer entah bagaimana jika Anda ingin bit-bang protokol UART.
sumber
Bit-banging mengacu pada konsep memiliki sinyal yang keluar atau masuk ke perangkat yang dihasilkan / disampel oleh perangkat lunak daripada perangkat keras. Jelas beberapa perangkat keras diperlukan, tetapi ketika menggunakan bit-banging, satu-satunya perangkat keras untuk setiap output adalah kait yang dapat secara eksplisit diatur atau dihapus oleh perangkat lunak, dan satu-satunya perangkat keras untuk setiap input adalah antarmuka untuk memungkinkan perangkat lunak untuk menguji apakah itu adalah tinggi atau rendah (dan biasanya menjalankan cabang kondisional untuk satu negara tetapi tidak yang lain).
Kecepatan maksimum yang dapat dicapai dengan bit-banging umumnya akan menjadi sebagian kecil dari apa yang bisa dicapai dengan perangkat keras yang dibuat khusus, tetapi di luar batasan yang diberlakukan oleh kecepatan prosesor, bit-banging jauh lebih fleksibel, dan dapat digunakan dalam keadaan di mana perangkat keras tujuan umum tidak cukup cocok dan perangkat keras tujuan khusus tidak akan hemat biaya.
Sebagai contoh, banyak pengontrol memiliki port "SPI-style" yang pada dasarnya berperilaku sebagai berikut: ketika byte ditulis ke register tertentu, perangkat keras akan menghasilkan sejumlah pulsa clock (biasanya delapan), mencatat bit data pada terdepan dari setiap pulsa jam dan mengambil sampel bit data yang masuk pada trailing edge. Umumnya, port gaya SPI pengendali akan memungkinkan berbagai fitur untuk dikonfigurasikan, tetapi dalam beberapa kasus mungkin diperlukan antarmuka prosesor dengan perangkat yang melakukan sesuatu yang tidak biasa. Perangkat mungkin mengharuskan bit data diproses dalam kelipatan selain delapan, atau mungkin mengharuskan data menjadi output dan sampel pada tepi jam yang sama, atau mungkin memiliki beberapa persyaratan yang tidak biasa lainnya. Jika perangkat keras tertentu pada pengontrol yang digunakan dapat mendukung persyaratan akurat seseorang, hebat (beberapa memberikan jumlah bit yang dapat dikonfigurasi, mentransmisikan secara terpisah - dan menerima timing, dll.) Jika tidak, bit-banging mungkin bermanfaat. Bergantung pada pengontrolnya, sedikit membenturkan antarmuka SPI-ish akan sering memakan waktu 2-10 kali selama membiarkan perangkat keras menanganinya, tetapi jika persyaratan tidak sesuai dengan perangkat keras yang dimilikinya, bertukar data lebih lambat mungkin lebih baik daripada tidak bisa melakukannya sama sekali.
Satu hal penting yang perlu diperhatikan dengan desain bit-banged adalah bahwa itu adalah yang paling sederhana dan paling kuat dalam keadaan di mana salah satu perangkat yang sedang berkomunikasi dengan sedang menunggu pada bit-banging controller untuk menghasilkan semua waktu mereka, atau di mana controller akan diizinkan untuk tunggu, tanpa gangguan, sampai suatu peristiwa tiba, dan di mana ia akan dapat melakukan semua yang perlu dilakukan dengan peristiwa itu sebelum peristiwa lain tiba yang perlu ditindaklanjuti. Mereka jauh kurang kuat dalam keadaan di mana perangkat harus mampu bereaksi terhadap rangsangan eksternal dalam jangka waktu yang relatif singkat, tetapi tidak dapat menempatkan 100% energinya untuk mengawasi rangsangan tersebut.
Sebagai contoh, misalkan seseorang ingin agar prosesor mengirimkan data gaya UART secara serial dengan kecepatan yang sangat tinggi relatif terhadap kecepatan clock-nya (misalnya PIC yang menjalankan 8.192 instruksi per detik ingin mengeluarkan data pada 1200 bps). Jika tidak ada gangguan yang diaktifkan, transmisi seperti itu tidak sulit (clock satu bit setiap tujuh siklus instruksi). Jika PIC tidak melakukan apa-apa selain menunggu byte data 1200bps masuk, itu bisa mengeksekusi loop 3-siklus menunggu bit mulai, dan kemudian melanjutkan ke jam dalam data pada interval tujuh siklus. Memang, jika PIC memiliki byte data yang siap dikirim ketika byte data yang masuk tiba, tujuh siklus per bit akan cukup waktu bagi PIC untuk mengirim byte datanya secara bersamaan dengan membaca byte yang masuk. Juga,jika balasan semacam itu akan memperbaiki waktu relatif terhadap transmisi asli . Di sisi lain, tidak akan ada cara bagi PIC yang mempercepat untuk menangani komunikasi bit-bang sedemikian rupa sehingga perangkat mana pun diizinkan untuk mengirim kapan saja ia mau (sebagai lawan memiliki satu perangkat yang dapat mengirimkan ketika melihat cocok, dan melakukan apa pun yang diinginkannya ketika tidak mentransmisikan, dan satu perangkat yang harus menghabiskan sebagian besar waktunya tidak melakukan apa-apa selain menunggu transmisi dari perangkat pertama).
sumber