Apa yang sedikit menggedor

26

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;
}
verendra
sumber
Kode Anda terlihat oke selain dari output clock rendah harus sebelum pengaturan bit dan penundaan. Anda perlu beberapa penundaan untuk memperbaiki pengaturan waktunya (jadi jam rendah / tinggi kira-kira periode yang sama) Lihatlah kode Steven lagi. Jika Anda ingin membaca juga, Anda perlu menambahkan kode untuk itu juga.
Oli Glaser
@ OliGlaser Dapatkah saya menggunakan kode ini secara langsung, bukan Kode SPI normal yang mengatur register.
verendra
@verendra - tidak yakin apa yang Anda maksud dengan "kode SPI normal". Jika maksud Anda alih-alih SPI perangkat keras, maka ADC tidak peduli bagaimana pulsa dihasilkan selama mereka setuju dengan protokol dan waktu.
Oli Glaser

Jawaban:

25

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:

masukkan deskripsi gambar di sini

Jadi, sementara pengontrol SPI yang berdedikasi menangani semua pulsa, pemindahan data, dan waktu, ketika melakukan bit-banging, Anda harus mengambil sendiri setiap tindakan:

Make Slave Select low  
Short delay
Do 8 times
  Make the SCK (Serial Clock) pin low 
  Make the MOSI (Master-Out-Slave-In) pin high or low depending on bit 7 of the data  
  Add brief delay  
  Make the SCK output high
  Read MISO (Master-In-Slave-Out) pin
  Shift received data left, and shift the bit just read in as bit 0   
  Add brief delay  
  Shift the data byte 1 bit left
Make Slave Select high again  

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.

stevenvh
sumber
2
Bisakah Anda memberikan kode sampel c.
verendra
1
@verendra - Saya menambahkan contoh pseudocode, yang seharusnya bisa Anda terjemahkan dengan mudah ke C.
stevenvh
Saya berhasil membuat Wavefrom menggunakan komunikasi SPI. Saya punya masalah dengan membaca nilai ADC hanya menggunakan SPI. Saya harus menggunakan bit banging untuk keduanya atau hanya hanya untuk membaca nilai ADC. Bisakah Anda melihat kode saya untuk mengirim 8 bit, apakah itu menulis. tapi saya bingung bagaimana menggunakannya. Dapatkah saya menempatkan kode ini secara langsung daripada kode SPI saya untuk mengatur register.
verendra
@ Seven - diagram yang Anda tunjukkan adalah MSB pertama, jadi Anda harus meninggalkan shift keluar dari 7 dan shift kiri dari 0. Saya tahu tidak ada standar sehingga bisa menjadi LSB pertama, tapi saya pikir sebagian besar perangkat SPI melakukannya dengan cara ini .
Oli Glaser
2
@Li - Poin bagus, saya melewatkan itu. Saya akan memperbaikinya, terima kasih atas umpan baliknya. Alasan tidak ada standar adalah bahwa itu tidak masalah asalkan jumlah bit yang ditransfer sama dengan panjang register geser. Baru-baru ini beberapa mikrokontroler (seperti NXP Cortec-M3) memiliki register shift panjang variabel, dan kemudian arah mungkin penting. IIRC dalam AVR Anda dapat memilih MSB pertama atau LSB pertama.
stevenvh
6

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

supercat
sumber