Pemrograman MK dari awal. Pemrograman AVR.

Saya belum sekali dan tidak mengatakan bahwa studi tentang MK harus dimulai dengan assembler. Ini didedikasikan seluruh kursus di situs (walaupun itu tidak terlalu konsisten, tetapi secara bertahap saya menyisirnya ke tipe yang memadai). Ya, itu sulit, hasilnya tidak akan pada hari pertama, tetapi Anda akan belajar memahami apa yang terjadi di pengendali Anda. Anda akan tahu cara kerjanya, dan tidak pada monyet menyalin sumber orang lain dan mencoba memahami mengapa tiba-tiba berhenti bekerja. Selain itu, SI jauh lebih mudah untuk disimpulkan oleh pertengahan dari tidur, yang akan keluar dengan garpu pada saat yang paling tidak berkelanjutan.

Sayangnya, semua orang menginginkan hasilnya segera. Karena itu, saya memutuskan untuk pergi ke sisi lain - untuk membuat pelatihan di SI, tetapi dengan pertunjukan pakaian dalamnya. Programmer-Embedder yang baik selalu memegang sepotong besi untuk squall, tanpa memberinya langkah ke langkah tanpa izin. Jadi itu akan berada di awal kode, lalu yang lahir kompiler dan bagaimana sebenarnya berhasil :)

Di sisi lain, si sisi yang kuat Ini adalah kode portabilitas. Jika, tentu saja, menulis semuanya dengan benar. Memisahkan algoritma kerja dan implementasi zat besi mereka di berbagai bagian proyek. Kemudian, untuk mentransfer algoritma ke MK lain, itu cukup untuk menulis ulang hanya lapisan antarmuka, di mana semua banding ke kelenjar ditulis, dan biarkan seluruh kode kerja seperti itu. Dan, tentu saja, keterbacaan. Sumber sumber selempang lebih mudah dipahami pada pandangan pertama (meskipun .. Saya, misalnya, tidak peduli dengan apa yang harus digoda setidaknya SI, setidaknya AFM :)), tetapi, lagi, jika Anda menulis semuanya dengan benar. Dengan momen ini, saya juga akan memperhatikan.

Sebagai perangkat keras dari perangkat keras di mana bagian Lion dari semua contoh akan menjadi milikku biaya debug.

Program pertama pada C untuk AVR

Memilih kompiler dan pemasangan lingkungan
Untuk AVR, ada banyak kompiler C berbeda:
Pertama-tama itu Iar avr c. - hampir diakui secara unik sebagai kompiler terbaik untuk AVR, karena Pengontrol itu sendiri dibuat oleh kooperator dekat atmel dan spesialis dari IAR. Tetapi untuk semua yang harus Anda bayar. Dan kompiler ini tidak cukup dari apa perangkat lunak komersial yang mahal, itu juga memiliki pengaturan sarapan seperti itu yang hanya mengambil dan mengkompilasinya harus terburu-buru. Saya benar-benar tidak memiliki persahabatan dengannya, proyek itu mabuk kesalahan aneh di panggung tautan (kemudian mengetahui bahwa itu adalah kurva retak).

Yang kedua datang GCC Winavr. - Kompiler mengoptimalkan yang kuat. Penuh terbuka, lintas-lintas, secara umum, semua sukacita kehidupan. Dia juga mengintegrasikan dengan sempurna di AVR Studio yang memungkinkan Anda men-debug di sana neraka yang nyaman. Secara umum, saya memilihnya.

Juga ada CodeVision AVR C.- Kompiler yang sangat populer. Dia menjadi populer sehubungan dengan kesederhanaannya. Program Kerja Anda bisa mendapatkannya dalam beberapa menit - Master dari kode awal sangat dipromosikan, cap inisialisasi semua jenis telinga. Jujur, saya minta maaf dengan kecurigaan kepadanya - entah bagaimana saya harus membongkar prog yang ditulis oleh kompiler ini, semacam dimaksud, tetapi bukan kode itu diperoleh. Jumlah yang mengerikan dari televitasi dan operasi yang tidak perlu, yang dituangkan ke dalam sedikit kode dan kecepatan lambat. Namun, mungkin ada kesalahan dalam DNA menulis firmware asli. Ditambah dia menginginkan uang. Tidak seperti IAR, tetapi terlihat. Dan dalam demozhim memberikan kode lebih dari 2kb.
Crack tentu saja ada, tetapi jika Anda mencuri, jadi sejuta, dalam arti IAR :)

Ada juga Craft Gambar AVR C dan MicroC. dari mikroelektronika. Tidak menggunakan penggunaan lain, tetapi di sini SWG. Sangat membajak Micropascal.Melt adalah lingkungan dan perpustakaan pemrograman yang sangat nyaman. Saya pikir MicroC tidak akan lebih buruk, tetapi juga dibayar.

Seperti yang saya katakan, saya memilih Winavr. Untuk tiga alasan: Gratis, diintegrasikan ke AVR Studio dan ditulis hanya rincian kode jadi untuk semua kesempatan.

Jadi unduh diri Anda untuk menginstal Winavr C dan Avr Studio. Kemudian studio pertama kali dimasukkan, kemudian, dari atas, winavr berguling dan menempel ke studio dalam bentuk plugin. Saya sangat menyarankan menginstal Winavr dengan cara yang singkat, sesuatu seperti C: \\ Winavr dengan demikian, dengan demikian Anda menghindari tumpukan masalah dengan cara-cara.

Membuat proyek
Jadi, studio dikirimkan, SI diikat, saatnya untuk mencoba sesuatu untuk diprogram. Mari kita mulai dengan yang sederhana, paling sederhana. Luncurkan studio, pilih di sana proyek baru, sebagai kompiler AVR GCC dan memasukkan nama proyek.

Membuka bidang kerja dengan file kosong * .c.

Sekarang tidak mencegah mengkonfigurasi tampilan jalur di tab studio. Untuk ini, miring di:
Menu Alat - Opsi - General - Filetabs dan pilih "Nama file saja" di daftar drop-down. Kalau tidak, tidak mungkin untuk bekerja - pada tab akan ada jalur penuh file dan tidak akan ada lebih dari dua tab di layar.

Pengaturan proyek
Secara umum, pembuatan file make di mana semua dependensi akan dijelaskan. Dan ini mungkin benar. Tetapi saya tumbuh pada IDE sepenuhnya terintegrasi seperti isive. atau AVR Studio. Pendekatan ini sangat alien. Karena itu, saya akan melakukannya dengan cara saya sendiri, semua studio.

Tumpukan ke tombol dengan roda gigi.


Ini adalah pengaturan proyek Anda, atau lebih tepatnya pengaturan generasi otomatis file make. Pada halaman pertama Anda hanya perlu memasukkan frekuensi di mana MK Anda akan bekerja. Itu tergantung pada sekering bit, jadi kami percaya bahwa frekuensinya 8000000GZ.
Juga perhatikan string optimasi. Sekarang ada --O adalah optimasi dalam ukuran. Sambil pergi seperti itu, maka Anda dapat mencoba bermain dengan parameter ini. -O0 adalah optimasi yang dapat dilepas sama sekali.

Langkah selanjutnya adalah mengkonfigurasi jalur. Hal pertama yang menambahkan direktori proyek Anda ada - Anda akan menempatkan perpustakaan pihak ketiga di sana. Daftar akan muncul ". \\"

Buat file yang dihasilkan, Anda dapat melihatnya di folder default dalam proyek Anda, hanya menjalankan mata Anda, lihat apa yang ada di sana.


Itu saja. Jim di mana-mana ok dan pergi ke sumbernya.

Perumusan masalah
Lembar kosong begitu melambai untuk mewujudkan beberapa ide yang rumit, karena kedipan dangkal dioda tidak menyisipkan. Mari kita segera mengambil banteng untuk tanduk dan mengimplementasikan koneksi dengan komputer - ini adalah hal pertama yang saya lakukan.

Ini akan berhasil seperti ini:
Di bawah kedatangan port COM, unit (kode 0x31) akan menyalakan diodaon, dan ketika kedatangan nol (kode 0x30) padam. Selain itu, semuanya akan dilakukan pada interupsi, dan tugas latar belakang akan berkedip dioda lain. Sederhana dan dengan makna.

Kumpulkan skema
Kami perlu menghubungkan modul konverter USB-USART dengan konverter mikrokontroler USART. Untuk melakukan ini, ambil jumper dua kabel dan letakkan salib di pin salib. Artinya, pengontrol RX terhubung dengan konverter TX, dan konverter TX dengan pengontrol RX.

Ternyata, sebagai hasilnya, ini adalah skema seperti itu:


Menghubungkan kesimpulan, nutrisi, debit, itu standar

Kami menulis kode

Segera buat reservasi bahwa saya tidak akan memperdalam secara khusus dalam deskripsi bahasa SI itu sendiri. Untuk ini, hanya ada bahan yang luar biasa, mulai dari klasik "bahasa pemrograman SI" dari K & R dan berakhir dengan teknik yang berbeda.

Salah satu metode seperti itu ditemukan di dalam saya di Honeycomb, saya pernah mempelajari bahasa ini di atasnya. Di sana semuanya singkat, dapat dimengerti dan dalam kasus ini. Saya secara bertahap menebusnya dan mengatur ulang ke situs saya.

Benar-benar tidak semua bab ditunda, tapi saya pikir itu tidak lama.

Tidak mungkin saya akan menjelaskan lebih baik, jadi dari kursus pelatihan, alih-alih paparan detail dari seluk-beluk biru, saya hanya akan memberikan tautan langsung ke halaman-halaman tertentu dari teknik ini.

Tambahkan perpustakaan.
Pertama-tama, kami menambahkan perpustakaan dan judul yang diperlukan dengan definisi. Bagaimanapun, SI adalah bahasa universal dan dia perlu menjelaskan bahwa kami bekerja dengan AVR, jadi masuk ke jalur sumber:

1 #Include.

#Include.

File ini ada di folder Winavr. Dan itu berisi deskripsi dari semua register dan port controller. Dan di sana semua licik, dengan mengacu pada pengontrol tertentu, yang ditransmisikan oleh kompiler melalui membuat File dalam parameter MCU. Dan berdasarkan variabel ini dalam proyek Anda, file header dengan deskripsi alamat semua port dan register ada di controller ini. Bagaimana! Tanpa itu juga, itu juga mungkin, tetapi kemudian Anda tidak akan dapat menggunakan nama simbolis dari register seperti Segrus atau UDR dan harus mengingat alamat masing-masing seperti "0xc1", dan ini adalah kepala.

Tim yang sama sendiri #Include.<имя файла> Memungkinkan Anda menambah proyek Anda. Isi file teks apa pun, misalnya, file yang menggambarkan fungsi atau bagian dari kode lain. Dan sehingga arahan dapat menemukan file ini, kami menunjukkan cara untuk proyek kami (direktori Winavr sudah dieja di sana).

Fungsi utama.
Program dalam bahasa SI terdiri dari fungsi. Mereka dapat disematkan dan dibawa satu sama lain dalam urutan apa pun dan dengan cara yang berbeda. Setiap fungsi memiliki tiga parameter yang diperlukan:

  • Nilai pengembalian, misalnya, dosa (x) Mengembalikan nilai sinus x. Seperti dalam matematika, singkatnya.
  • Parameter yang ditransmisikan, x yang sama
  • Fungsi tubuh.

Semua nilai yang ditransmisikan dan dikembalikan harus berupa semua jenis, tergantung pada data.

Setiap program pada C harus berisi fungsi utama. Sebagai titik masuk ke program utama, jika tidak, Nifiga bukan Si :). Menurut keberadaan utama dalam sumber orang lain dari satu juta file, dapat dipahami bahwa ini adalah kepala program di mana semuanya dimulai. Jadi mari kita tanyakan:

1 2 3 4 5 Int main (void) (kembali 0;)

int main (void) (kembali 0;)

Semuanya, program paling sederhana pertama ditulis, tidak masalah bahwa dia tidak melakukan apa-apa, kami baru saja mulai.

Kami akan menganalisis apa yang kami lakukan.
int. Jenis data ini yang merupakan fungsi utama kembali.

Tentu saja, dalam mikrokontroler utama. Saya tidak bisa mengembalikan apa pun pada prinsipnya dan teori seharusnya void Main (Void)Tetapi GCC awalnya diasah pada PC dan di sana program dapat mengembalikan nilai sistem operasi setelah selesai. Oleh karena itu GCC pada. void Main (Void) Peringatan bersumpah.

Ini bukan kesalahan, itu akan berhasil, tetapi saya tidak suka varnings.

kosong. Jenis data yang kami kirimkan ke fungsi dalam hal ini utama. Juga tidak bisa mengambil apa pun dari luar, penyair kosong. - Dummy. Steker diterapkan ketika tidak perlu mentransmisikan apa pun atau kembali.

Ini adalah { } Angka braket adalah blok perangkat lunak, dalam hal ini fungsi tubuh utama., Akan ada kode.

kembali. - Ini adalah nilai pengembalian yang akan diberikan fungsi utamanya, karena kami INT, yaitu, jumlah yang harus kita kembalikan angka. Meskipun masih tidak masuk akal, karena Pada mikrokontroler dari utama, kami kecuali untuk mana. Saya mengembalikan nol. Untuk non fig. Dan kompiler biasanya pintar dan kode tidak menghasilkan kode.
Meskipun, jika Anda cabul, maka dari utama. Anda dapat pergi ke MC - misalnya, jatuh ke bagian bootloader dan memenuhinya, tetapi sudah ada pemilihan firmware tingkat rendah, untuk menyesuaikan alamat transisi. Di bawah ini Anda akan melihat dan memahami cara melakukannya. Untuk apa? Ini adalah pertanyaan lain, pada 99,999% kasus nafig ini tidak perlu :)

Dibuat, melangkah lebih jauh. Tambahkan variabel, itu tidak terlalu diperlukan bagi kami dan tidak perlu untuk memperkenalkan variabel, tetapi kami sedang belajar. Jika variabel ditambahkan dalam tubuh fungsi - maka mereka lokal dan ada hanya dalam fungsi ini. Ketika Anda meninggalkan fungsi, variabel-variabel ini dihapus, dan memori RAM diberikan untuk kebutuhan yang lebih penting. .

1 2 3 4 5 6 Int utama (void) (char unsigned i; return 0;)

int utama (void) (char unsigned i; return 0;)

unsigned. Sangat tidak enak. Faktanya adalah dalam representasi biner, kita memiliki bit senior untuk tanda, yang berarti dalam satu byte (char) angka + 127 / -128, tetapi jika tanda membuang itu sudah menjadi dari 0 hingga 255. Biasanya tanda itu tidak dibutuhkan. Yang seperti itu unsigned..
sAYA. - Ini hanyalah nama variabelnya. Tidak lagi.

Sekarang Anda perlu menginisialisasi port dan UART.. Tentu saja, Anda dapat mengambil dan menghubungkan perpustakaan dan memanggil beberapa jenis UARTINIT (9600); Tetapi kemudian Anda tidak akan tahu apa yang terjadi sebenarnya.

Kami melakukan ini:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Int utama (void) (char unsigned i; #define xtal 8000000l #define baudrate 9600L #Define Bauddivider (XTAL / (16 * Baudrate) -1) #Define hai (x) ((x) \u003e\u003e 8) #define lo (x) ((x) & 0xff) UBRRL \u003d lo (bauddivider); Ubrrh \u003d Hai (Bauddivider); Ucsra \u003d 0; UCSRB \u003d 1.<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

int utama (void) (char yang tidak ditandatangani i; #define xtal 8000000l #define baudrate 9600l #define bauddivider (xtal / (16 * baudrate) -1) #define hai (((x) \u003e\u003e 8) #definine x) ((x) & 0xff) UBRRL \u003d lo (Bauddivider); Ubrrh \u003d Hai (Bauddivider); UCSRA \u003d 0; UCSRB \u003d 1<

Mengerikan? Bahkan, kode asli di sini hanya lima baris terakhir. Segalanya, itu #Menetapkan Ini adalah preprocessor bahasa makro. Tops yang hampir sama seperti pada assembler, tetapi sintaksnya agak berbeda.

Mereka akan memfasilitasi operasi rutin Anda untuk menghitung koefisien yang diperlukan. Di baris pertama kita katakan itu sebagai gantinya XTAL. Anda dapat dengan aman mengganti 80.000.000, dan L.- Spesifikasi tipe, Long Mall adalah frekuensi jam prosesor. Sama baudrate. - Frekuensi data oleh UART.

bauddivider. Sudah lebih rumit, ekspresi yang dihitung oleh rumus dua yang sebelumnya akan diganti.
Baik dan Lo dan HAI Dari hasil ini akan mengambil byte yang lebih muda dan senior, karena Dalam satu byte itu jelas mungkin tidak cocok. DI HAI Pergeseran ICSE dilakukan (parameter input makro) delapan kali di kanan, sebagai hasilnya, hanya byte tertua yang akan tetap ada. A B. Lo Kami membuat batch dan dengan nomor 00FF, sebagai hasilnya, hanya byte termuda yang akan tetap ada.

Jadi semua yang dilakukan sebagai #Menetapkan Anda dapat membuang dengan aman, dan angka yang diinginkan menghitung pada kalkulator dan segera memasukkannya ke dalam UBBRL \u003d baris .... dan Ubbrh \u003d ... ..

Bisa. Tapi! Melakukan hal ini Itu tidak mungkin!

Itu juga akan bekerja untuk bekerja, tetapi Anda akan memiliki apa yang disebut angka ajaib. - Nilai-nilai yang diambil secara tidak dapat dimengerti dari mana tidak jelas mengapa dan jika Anda menyumbangkan proyek semacam itu dalam beberapa tahun, maka sulit untuk memahami bahwa itu akan sialan. Ya, dan sekarang, Anda ingin mengubah kecepatan, atau mengubah frekuensi kuarsa dan semuanya harus menghitung ulang, dan diubah beberapa tsiferok dalam kode dan semuanya sendiri. Secara umum, jika Anda tidak ingin menikmati bydlokoder, maka lakukan kode sehingga mudah dibaca, itu bisa dimengerti dan mudah dimodifikasi.

Maka semuanya sederhana:
Semua "UBRRL dan CO" ini adalah register konfigurasi pemancar yang dengannya kami akan berkomunikasi dengan dunia. Dan sekarang kami telah menetapkan nilai-nilai yang diperlukan dengan mengkonfigurasi kecepatan yang diinginkan dan mode yang tepat.

Rekaman Lihat 1< Berarti yang berikut: Ambil 1 dan letakkan di tempatnya Rxen. Dgn cepat. Rxen. Ini adalah bit ke-4 dari register UCSRB., yang seperti itu 1< membentuk angka biner 00010000, Txen. - Ini sedikit 3, dan 1< Dast 00001000. Single "|" Ini rusak ATAUJadi 00010000 | 00001000 \u003d 00011000. Bit konfigurasi yang diperlukan yang diperlukan dipamerkan dengan cara yang sama dan ditambahkan ke kelompok umum. Akibatnya, nomor perakitan ditulis dalam UCSRB. Detail ditulis dalam datashet pada MC di bagian USART. Jadi jangan terganggu oleh detail teknis.

Siap, sekarang saatnya untuk melihat apa yang terjadi. Pip pada kompilasi dan peluncuran emulasi (Ctrl + F7).

Debugging.
Segala macam progres bar berlari, studio berubah dan panah kuning muncul di dekat fungsi utama. Di sinilah prosesor saat ini saat ini, dan simulasi pada jeda.

Faktanya adalah bahwa pada awalnya, pada kenyataannya, itu berdiri di baris UBRRL \u003d lo (Bauddivider); Bagaimanapun, fakta bahwa kita memiliki dalam menentukan itu bukan kode, tetapi hanya perhitungan awal, maka simulator sedikit diikat. Tapi sekarang dia sadar, instruksi pertama selesai dan jika Anda naik ke pohon I / O View, Di bagian USART dan menangkan di sana di UBBrl Byte, Anda akan melihat bahwa sudah ada! 0x33.

Buat satu langkah lagi. Melihat bagaimana isi dari register lain berubah. Jadi sekering mereka semua, perhatikan fakta bahwa semua bit yang ditunjukkan dipamerkan seperti yang saya katakan, dan itu ditetapkan pada waktu untuk seluruh byte. Pengembalian selanjutnya tidak berfungsi, program ini selesai.

Pembukaan
Sekarang atur ulang simulasi dalam nol. Klik di sana Reset (shift + f5). Buka daftar pembongkaran, sekarang Anda akan melihat apa yang terjadi di controller pada kenyataannya. Lihat -\u003e Disassembler. Dan bukan yyaaaa !!! Assembler !!! Uzhos !!! Tapi kamu harus. Jadi nantinya, ketika ada yang salah, tidak berani ke dalam kode dan tidak meminta masalah lamer di forum, dan segera naik ke kerugian dan menyaksikan tempat Anda memiliki kios. Tidak ada yang mengerikan di sana.

Pertama, itu akan menjadi bagian atas seri:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 +00000000: 940C002A JMP 0x0000002A Jump 00.000.002: 940C0034 JMP 0x00000034 Jump 00.000.004: 940C0034 JMP 0x00000034 Jump 00.000.006: 940C0034 JMP 0x00000034 Jump 00.000.008: 940C0034 JMP 0x00000034 Langsung + 0000000A: 940C0034 JMP 0x00000034 Langsung + 0000000C: 940C0034 JMP 0x00000034 Langsung + 0000000E: 940C0034 JMP 0x00000034 Jump 00.000.010: 940C0034 JMP 0x00000034 Jump 00.000.012: 940C0034 JMP 0x00000034 Jump 00.000.014: 940C0034 JMP 0x00000034 Jump 00.000.016: 940C0034 JMP 0x00000034 Jump 00.000.018: 940C0034 JMP 0x00000034 Langsung + 0000001A: 940C0034 JMP 0x00000034 Langsung + 0000001C : 940C0034 JMP 0x00000034 Langsung + 0000001E: 940C0034 JMP 0x00000034 Jump 00.000.020: 940C0034 JMP 0x00000034 Jump 00.000.022: 940C0034 JMP 0x00000034 Jump 00.000.024: 940C0034 JMP 0x00000034 Jump 00.000.026: 940C0034 JMP 0x00000034 Jump 00.000.028: 940C0034 JMP 0x00000034 Langsung

00000000: 940C002A JMP 0x0000002A Jump 00.000.002: 940C0034 JMP 0x00000034 Jump 00.000.004: 940C0034 JMP 0x00000034 Jump 00.000.006: 940C0034 JMP 0x00000034 Jump 00.000.008: 940C0034 JMP 0x00000034 Langsung + 0000000A: 940C0034 JMP 0x00000034 Langsung + 0000000C: 940C0034 JMP 0x00000034 Langsung + 0000000E : 940C0034 JMP 0x00000034 Jump 00.000.010: 940C0034 JMP 0x00000034 Jump 00.000.012: 940C0034 JMP 0x00000034 Jump 00.000.014: 940C0034 JMP 0x00000034 Jump 00.000.016: 940C0034 JMP 0x00000034 Jump 00.000.018: 940C0034 JMP 0x00000034 Langsung + 0000001A: 940C0034 JMP 0x00000034 Langsung + 0000001C: 940C0034 JMP 0x00000034 Langsung + 0000001E: 940C0034 JMP 0x00000034 Jump 00.000.020: 940C0034 JMP 0x00000034 Jump 00.000.022: 940C0034 JMP 0x00000034 Jump 00.000.024: 940C0034 JMP 0x00000034 Jump 00.000.026: 940C0034 JMP 0x00000034 Jump 00.000.028: 940C0034 JMP 0x00000034 Langsung

Ini adalah tabel vektor interupsi. Kami akan kembali ke sana, sementara hanya melihat dan mengingatnya. Kolom pertama adalah alamat flash dari flash di mana perintah berbohong, kode perintah kedua dari tim mnemonik ketiga, instruksi assembler yang sama, operan ketiga dari tim. Nah, komentar otomatis.
Jadi, jika Anda melihat, maka ada transisi yang solid. Dan kode komando JMP adalah empat byte, itu berisi alamat transisi yang direkam oleh backward - byte yang lebih muda untuk alamat yang lebih muda dan kode perintah transisi 940C

0000002b: be1f out 0x3f, R1 keluar ke lokasi i / o

Merekam alamat nol ke 0x3F ini jika Anda melihat kolom Lihat I / O, maka Anda akan melihat bahwa alamat 0x3F adalah alamat register pengontrol register sreg - flag. Itu. Kami mengatur ulang SREG untuk menjalankan program pada kondisi nol.

1 2 3 4 + 0000002C: E5CF LDI R28.0X5F Muat Segera + 0000002D: E0D4 LDI R29.0X04 Muat Segera + 0000002E: BFDE OUT 0x3E, R29 OUT TO I / O LOKASI + 0000002F: BFCD OUT KE I / O LOKASI

0000002C: E5CF LDI R28.0X5F Muat Segera + 0000002D: E0D4 LDI R29.0X04 Muat Segera + 0000002E: BFDE OUT 0x3E, R29 OUT TO I / O LOKASI + 0000002F: BFCD OUT TO I / O LOKASI

Ini adalah pemuatan pointer tumpukan. Pengiriman langsung di I / O register tidak dapat, hanya melalui register menengah. Oleh karena itu, LDI pertama di perantara, dan kemudian dari sana di I / O. Saya juga akan memberi tahu Anda lebih banyak tentang tumpukan. Sementara itu, diketahui bahwa ini adalah area memori yang dinamis, tergantung di ujung RAM dan membuat alamat dan variabel menengah. Sekarang kami menunjukkan di mana kami akan memiliki tumpukan.

00000032: 940C0041 JMP 0x00000041 Jump

Lompat ke ujung program SaAAEEEE, dan di sana kita memiliki larangan interupsi dan looping dengan sendirinya:

1 2 +00000041: 94F8 CLI Global Interrupt Disable +00000042: CFFF RJMP PC-0x0000 Jump relatif

00000041: 94F8 CLI Global Interrupt Disable +00000042: CFFF RJMP PC-0x0000 Jump relatif

Ini dalam kasus keadaan yang tidak terduga, seperti output dari fungsi utama. Dari loop seperti itu, pengontrol dapat ditampilkan baik dengan reset perangkat keras, atau yang mungkin, debit dari anjing pengawas - WatchDog. Nah, atau, seperti yang saya katakan di atas, perbaiki tempat-tempat ini di editor hex dan perutean di mana kita memiliki jiwa. Juga perhatikan fakta bahwa ada dua jenis transisi JMP dan RJMP yang pertama adalah transisi langsung ke alamat. Dibutuhkan empat byte dan dapat membuat transisi langsung di seluruh area memori. Jenis transisi kedua - RJMP - relatif. Timnya mengambil dua byte, tetapi transisi yang dilakukannya dari posisi saat ini (alamat) sebesar 1024 langkah maju atau mundur. Dan dalam parameternya, offset dari titik saat ini ditunjukkan. Lebih sering digunakan, karena Dibutuhkan ruang dua kali lebih sedikit dalam flush, dan faktor-faktor panjang jarang diperlukan.

1 +000034: 940C0000 JMP 0x00000000 Jump

00000034: 940C0000 JMP 0x00000000 Jump

Dan ini adalah lompatan di awal kode. Mulai ulang sejenis. Anda dapat memeriksa, semua vektor melompat ke sini. Dari output ini - jika Anda mengizinkan Anda untuk mengizinkan interupsi (mereka dilarang secara default) dan Anda akan terputus, tetapi tidak ada pawang, maka akan ada reset program - program akan melempar program di awal.

Fungsi utama. Semuanya serupa, Anda bahkan dapat tidak menjelaskan. Mencari hanya untuk register sudah menghitung jumlahnya. Preprocessor Compiler Taxis !!! Jadi tidak ada angka "ajaib"!

1 2 3 4 5 6 7 8 9 10 11 12 <

00000036: E383 LDI R24.0X33 Muat Segera +000037: B989 OUT 0x09, R24 OUT TO I / O LOCATION 15: UBRRH \u003d HI (BAUDDIVER); +000038: BC10 OUT 0x20, R1 OUT TO I / O LOKASI 16: UCSRA \u003d 0; +000039: B81B OUT 0x0B, R1 OUT TO I / O LOCATION 17: UCSRB \u003d 1<

Dan di sini adalah kusen:

1 2 3 + 0000003e: E080 LDI R24.0X00 Muat langsung + 0000003F: E090 LDI R25.0x00 Muat Segera +00000040: 9508 Ret Subroutine Return

0000003e: E080 LDI R24.0x00 Muat segera + 0000003F: E090 LDI R25.0X00 Muat Segera +000040: 9508 Ret Subroutine Return

Ditanya mengapa kompiler ini menambahkan topmaster seperti itu? Dan ini tidak lain adalah kembali 0, maka kami telah diidentifikasi sebagai int main (void). Jadi saya memenangkan lebih dari empat byte tidak mengerti apa :) Dan jika Anda melakukan void main (void), itu hanya akan RET, tetapi Varning akan menjadi. Apa yang mereka katakan kita tidak mengembalikan apa pun ke fungsi utama. Secara umum, lakukan seperti Anda :)

Rumit? Tampaknya tidak. Saya melewati kinerja langkah demi langkah dalam mode disassembler dan Pokery sebagai prosesor melakukan instruksi individu, yang terjadi dengan register. Cara memindahkan perintah dan looping akhir.

Kelanjutan mengikuti dalam beberapa hari ...

Offtop:
Alexei78. Geng Pemecahan Pemecah Firefox Fasilitating Navigasi di situs dan forum saya.
Diskusi dan unduh

Untuk pemrograman mikrokontroler AVR, ada banyak alat pengembangan, namun, yang paling populer, tidak diragukan lagi, paket harus dikenali AVR Studio. . Ada sejumlah alasan untuk popularitas seperti itu - ini adalah paket gratis yang dikembangkan oleh perusahaan Atmel. , Ini menggabungkan editor teks, assembler dan simulator. Paket AVR Studio juga digunakan bersamaan dengan memperbaiki perangkat keras. Dalam artikel yang diusulkan, contoh-contoh menganggap teknik untuk bekerja dengan suatu paket, yang akan membantu pemrogram pemula untuk memahami interaksi masing-masing komponen AVR Studio.

Di bagian berikutnya dari artikel ini akan dijelaskan tentang debugging di lingkungan studio AVR program yang ditulis dalam SI.

Paket AVR Studio memiliki sejarah perkembangan yang kuat, yang tercermin dalam jumlah versi yang ada. Pada akhir 2003, Versi 4.08 dirilis, yang memiliki sejumlah tambahan yang bermanfaat, dan pada awal 2004 pembaruan (Paket Layanan 1) telah dirilis, menambahkan dukungan untuk pengontrol AVR generasi ketiga ATmega48 keluarga. Produksi chip keluarga ini dijadwalkan pada paruh kedua tahun 2004.

Distribusi paket dan paket layanan dapat diunduh dari www.atmel.com atau mendapatkan CD dengan distribusi ini dari distributor Rusia Atmel.

Pekerjaan paket AVR Studio sangat ditinjau pada program tertentu. Sebagai pendapat, kami akan mempertimbangkan untuk membuat proyek untuk program paling sederhana, yang akan pada gilirannya untuk menyalakan dua LED. Untuk definiteness, ambil mikro Atmega128. dan hubungkan dua LED dalam kesimpulan 31 dan 32 (ini adalah bit 6 dan 7 dari port d chip atmega128). Pengontrol AVR. Memiliki kaskade keluaran yang kuat, arus khas dari setiap output adalah 20 mA, arus output maksimum adalah 40 mA, dan ini merujuk pada arus yang mengalir dan mengalir. Dalam contoh kami, LED terhubung ke anoda untuk kesimpulan pengontrol, dan katoda melalui resistor pendinginan terhubung ke tanah. Ini berarti bahwa LED dinyalakan oleh Feeding "1" ke output port yang sesuai. Diagram skematis ditunjukkan pada gambar. Diagram juga menunjukkan dua tombol yang akan digunakan dalam salah satu program.

Di sini pantas untuk membuat penyimpangan kecil tentang memilih jenis chip untuk contoh paling sederhana. Memang, pada pandangan pertama, mungkin tampak aneh, mengapa Anda membutuhkan kristal yang kuat dalam kasus 64 pin di mana ada cukup chip 8-pin ATTINY12. ? Namun, dalam pendekatan ini ada logika. Diketahui bahwa di jantung hampir semua pengontrol AVR terletak kernel yang sama. Pada umumnya, pengontrol berbeda dalam memori, jumlah port I / O dan satu set modul perifer. Fitur masing-masing pengontrol khusus - mengikat nama logis / output register ke alamat fisik, alamat vektor interupsi, mengidentifikasi bit port, dll. Menjelaskan dalam file dengan Extension.inc, yang termasuk dalam paket AVR Studio. Akibatnya, menggunakan jenis kristal tertentu, Anda dapat men-debug program itu sendiri untuk itu dan untuk kristal yang lebih muda. Selanjutnya, jika Anda menggunakan kristal paling senior sebagai debugging, hari ini adalah ATMEGA128, Anda dapat men-debug program untuk hampir semua pengontrol AVR, Anda hanya perlu menggunakan sumber daya perangkat keras yang hilang dari mikrokontroler target. Jadi, misalnya, Anda dapat men-debug program yang akan dilakukan pada ATmega128 ATTINY13. . Dalam hal ini, kode sumber akan tetap sama, hanya nama file yang terhubung dengan 128def.inc pada tn13def.inc akan berubah. Pendekatan ini juga memiliki kelebihannya. Misalnya, port I / O ekstra "dapat digunakan untuk terhubung. Indikator LCD yang dapat Anda tarik informasi debug. Atau, gunakan emulator intrahemum yang menghubungkan ke port JTAG dari chip ATmega128 (pengontrol ATTINY13 tidak memiliki port ini). Dengan demikian, dimungkinkan untuk menggunakan papan debug tunggal di mana pengontrol AVR "senior" diinstal, untuk men-debug sistem yang baru dikembangkan, secara alami berdasarkan mikrokontroler AVR. Salah satu papan ini disebut as-megam. Itu yang digunakan untuk membuat contoh program yang diberikan dalam artikel. Ini adalah pengontrol papan tunggal universal berdasarkan chip ATmega128, yang berisi RAM eksternal, dua port Rs-232. , port untuk menghubungkan indikator LCD, programmemnoe programmer dan emulator Di JTAG ICE. . Papan juga memiliki tempat untuk membagi chip seri Flash-ROM At45. Di rumah TSOP32 / 40/48 dan seri dua saluran DAC AD5302 / AD5312 / AD5322 . Sekarang, setelah menjelaskan penyebab penggunaan AVR Monster untuk menyalakan sepasang swatodiodes, Anda bisa melangkah lebih jauh.

Ketika pemrograman di lingkungan studio AVR, Anda perlu melakukan urutan tindakan standar:

  • kompilasi
  • Penciptaan proyek dimulai dengan pemilihan proyek \\ menu proyek baru. Di jendela "Buat proyek baru" yang terbuka, Anda harus menentukan nama proyek, (dalam kasus kami - sample1) dan nama file inisialisasi. Setelah menekan tombol "Next", platform debug dan jendela perangkat terpilih terbuka, di mana platform debug (simulator atau emulator) dipilih dan jenis mikrokontroler.

    Anda dapat memilih salah satu emulator intrahemby yang ditawarkan, kami perhatikan bahwa setiap emulator memiliki daftar mikro sendiri yang didukung. Sebagai contoh yang dipertimbangkan, kami memilih sebagai platform debug Simulator AVR dan chip ATMEGA128. Setelah menekan tombol "Selesai", output kami muncul jendela kerja dari paket AVR Studio, sambil kosong. Ini mengikuti jendela yang tepat untuk menempatkan teks sumber program. Ini dapat dilakukan dengan dua cara, atau memanggil semua teks langsung di jendela Editor, atau mengunduh file yang ada. Di bawah ini adalah teks lengkap dari program paling sederhana dengan komentar.

    ; Contoh "Kontrol LED"; ditulis untuk dewan debug as-megam; Frekuensi generator parameter adalah 7,37 MHz; LED terhubung ke kesimpulan PD6 dan PD7 dan melalui resistor - pada kawat bersama. ; Menghubungkan file Sirkuit I / O ATMEGA128 "M128DEF.INC"; Awal dari program awal :; Operasi Pertama - Inisialisasi Stack; Jika ini tidak dilakukan, lalu panggil subrutin atau interupsi; tidak akan mengembalikan kontrol kembali; Pointer di ujung tumpukan diatur ke alamat terakhir RAM internal - ramend LDI R16, RENDAH (RAMEND) OUT, R16 LDI R16, HIGH (RAMEND) OUT SPH, R16; Untuk mengontrol LED yang terhubung ke kesimpulan PD6 dan PD7; Perlu untuk mendeklarasikan output kesimpulan ini. ; Untuk melakukan ini, tulis "1" ke bit register DDRD yang sesuai (Datadirection) LDI R16, (1<<6) | (1<<7) out DDRD,r16 ; основной цикл программы loop: ldi r16,(1<<6) ; светится один светодиод out PORTD,r16 rcall delay ; задержка ldi r16,(1<<7) ; светится второй светодиод out PORTD,r16 rcall delay ; задержка rjmp loop ; повторение цикла; процедура задержки; примерно полсекунды при частоте 7,37 МГц; три пустых вложенных цикла соответственно delay: ldi r16,30 ; 30 delay1: ldi r17,200 ; 200 delay2: ldi r18,200 ; и еще 200 итераций delay3: dec r18 brne delay3 dec r17 brne delay2 dec r16 brne delay1 ret ; возврат в главную программу

    Proyek ini dapat terdiri dari beberapa file, sedangkan satu file ditugaskan yang utama. Semua operasi nyaman untuk diproduksi menggunakan tombol konteks mouse. Setelah menghubungkan file sumber, Windows memiliki formulir berikut.

    Kompilasi proyek dibuat oleh perintah \\ Project \\ Build atau dengan menekan tombol F7. Proses kompilasi ditampilkan di jendela "output". Jendela ini dapat "menarik" perintah \\ view \\ output.

    Pada prinsipnya, kami telah menerima file output dalam format.hex, yang sudah dapat dimuat ke dalam mikro dan amati pengawas LED. Namun, tujuan artikel ini adalah untuk menunjukkan siklus kerja penuh di lingkungan studio AVR, jadi kami pergi ke tahap debug. Ini dilakukan oleh tim debugging \\ debug \\ mulai.

    Sekarang atur frekuensi frekuensi kuarsa 7.3728 MHz di jendela "Opsi Simulator" untuk mengukur waktu eksekusi program secara akurat.

    Opsi yang tersisa harus dibiarkan tidak berubah. Sekarang Anda dapat melakukan program dalam mode langkah demi langkah menggunakan tombol mouse atau F11.

    Paket AVR Studio berisi alat yang kuat untuk melihat dan mengedit keadaan register internal dan port I / O dari mikrokontroler debug, serta waktu, eksekusi program. Akses ke mereka dilakukan melalui jendela "I / O".

    Faktanya, jumlah informasi yang tersedia melalui Windows Studio Package Viewing Windows sangat besar sehingga perlu menggunakan komputer dalam konfigurasi dua monitor untuk mendapatkan kenyamanan maksimal.

    Untuk men-debug contoh kami, untuk mengakses bit port d, Anda perlu mengungkapkan string I / O atmega128 dan kemudian garis portd. Sekarang ketiga register port ini, PortD, DDRD dan Pind terlihat. Untuk melihat bidang nilai, bit dan alamat, Anda harus memperluas batas kanan jendela, berkeringat jendela dengan teks sumber program.

    Sekarang, melewati program dalam mode langkah demi langkah, Anda dapat melihat perubahan pada kondisi saat ini register ini di bidang bit. Dimungkinkan untuk dengan cepat mengubah keadaan sedikit dari register port, dan ini dapat dilakukan dengan menulis kode baru di bidang nilai, atau langsung dengan mengklik bit register yang diinginkan.

    Untuk latihan independen, program berikut diusulkan, yang berbeda dari yang sebelumnya bahwa pengapian LED dikendalikan oleh dua tombol.

    ; Contoh "LED Control dari Tombol"; ditulis untuk dewan debug as-megam; LED terhubung ke kesimpulan PD6 dan PD7 dan melalui resistor - pada kawat bersama. ; Tombol - pada pe4 dan pe5 .include "m128def.inc"; Mulai program utama :; Stack Inisialisasi LDI R16, Rendah (RAMEND) OUT SPL, R16 LDI R16, HIGH (RAMEND) OUT SPH, R16; Inisialisasi LED LED R16, (1<<6) | (1<<7) out DDRD,r16 ; инициализация выводов, к которым подключены кнопки (на вход) ; внутренние подтягивающие резисторы подключены; для этого в PORTE нужно установить соответствующие биты в единицы ldi r16,(1<<4) | (1<<5) out PORTE,r16 ; а в DDRE - в нули ldi r16,0 out DDRE,r16 ; бесконечный цикл forever: in r16,PINE ; теперь в r16 находится текущее "состояние" кнопок com r16 ; кнопка "нажимается" нулем, поэтому инвертируем регистр lsl r16 ; переносим биты 4,5 в позиции 6,7 lsl r16 ; и обновляем "показания" светодиодов andi r16,(1<<6) | (1<<7) out PORTD,r16 rjmp forever ; цикл выполняется бесконечно

    Dengan demikian, pada contoh program paling sederhana, beberapa fitur paket studio AVR ditampilkan. Perlu untuk memahami bahwa ini hanya kenalan pertama yang memungkinkan Anda untuk dengan cepat digunakan dengan perintah paket dasar. Sementara itu, kemampuan paket yang dipertimbangkan jauh lebih luas. Misalnya, di sini Anda dapat men-debug program yang ditulis dalam bahasa tingkat tinggi. Secara khusus, C-Compiler dari perusahaan Imagecraft menggunakan AVR Studio Debugger "sebagai asli". Untuk melakukan ini, ketika mengkompilasi kode sumber, Anda perlu mengatur opsi pembuatan file output dalam format yang kompatibel dengan AVR Studio. Pada saat yang sama, dimungkinkan untuk men-debug dalam kode sumber.

    Banyak karakteristik dari paket AVR Studio adalah kemampuan untuk menghubungkan program eksternal. Misalnya, untuk memastikan bahwa programmer inspeksi AS2 diperlukan untuk melakukan beberapa operasi sederhana.

    Di menu Alat jendela utama AVR Studio, Anda harus memilih Kustomisasi;

    Di jendela Kustomisasi, pilih item alat;

    Mengklik dua kali tombol mouse atau menekan Sisipkan pada keyboard, tambahkan perintah baru ke daftar dan sebut saja "AS2 Programmer";

    Tentukan jalur ke file executable programmer dengan memasukkannya langsung di bidang input "perintah", atau dengan mengklik tombol "..." di sebelah kanan bidang ini;

    Sekarang menu Alat muncul "Programmer AS2".

    Paket AVR Studio 4.08 berarti memungkinkan Anda untuk menghubungkan program tambahan - plugin. Plugin pertama untuk AVR Studio adalah program editor grafis yang menyederhanakan proses inisialisasi indikator LCD, yang secara langsung dapat mengelola AVR Controller ATmega169. Ukuran logika maksimum indikator LCD adalah 100 segmen, setiap elemen indikator dibuat sesuai dengan bit dalam daftar khusus controller. Untuk menyederhanakan prosedur pengikatan rutin untuk bit tertentu ke setiap segmen, Anda dapat menggunakan program yang disebutkan di atas.

    Saat mengunjungi "Motherland of AVR" - Kantor Atmel Norwegia, salah satu penulis artikel itu berbicara dengan Quener Lars, kepala Grup Programmer, yang menciptakan dan mendukung paket AVR Studio. Orang ini, seorang programmer klasik, dengan jenggot, dalam sweater dan anyaman di sandal kaus kaki, berbicara tentang prospek untuk pengembangan paket. Pada versi berikutnya (4.09), antarmuka akan diaktifkan untuk emulator intrahemne baru - JTAGICE MKII (juga disebut di JTAGICE2), yang pada paruh kedua tahun akan diganti di JTAGICE. Emulator ini memiliki dua perbedaan penting. Di satu sisi, dukungan yang didukung untuk antarmuka debug satu kawat baru untuk pengontrol AVR yang lebih muda, debugwire. Antarmuka ini menarik karena tidak menempati kesimpulan tambahan dari mikrokontroler untuk pekerjaannya, seperti yang digunakan untuk menukar output dari mikrokontroler ulang! Di sisi lain (Anda dapat memahami ekspresi ini secara harfiah), di pada emulator JTAGICE2 akan muncul, akhirnya, antarmuka USB untuk berkomunikasi dengan komputer.

    literatur

    1. Bahan seminar teknis pelatihan teknis AVR. Atmel. Norway. Deceptber 2003.
    2. Nikolay Korolev, Dmitry Korolev AVR-Microcontrollers dari generasi kedua: media pengembang. // Komponen dan Teknologi, 2003 No. 7
    3. AVR-Microcontrollers dari generasi kedua: kemampuan perangkat keras baru // Komponen dan Teknologi. 2003. No. 4.
    4. Nikolay Korolev, Dmitry Korolev. Mikrokontroler AVR: besar dalam kecil. // Schemery ", 2001, №5
    5. Nikolay Korolev, Dmitry Korolev. Mikrokontroler AVR: Perangkat Lunak // Komponen dan Teknologi, 2000. No. 4.
    6. Nikolay Korolev. AVR: Pengembang Hardware // Komponen dan Teknologi, 1999 № 1
    7. Nikolay Korolev. Atmel RISC-Microcontrollers // Chip-News 1998, №2
    8. Nikolay Korolev, Dmitry Korolev Avr: Baru 8-bit RISC-Microcontrollers Perusahaan Atmel // Microprocessor Review, 1998, №1

    Entah bagaimana segera ditarik untuk memberikan saran tentang pilihan lingkungan pemrograman untuk pengontrol AVR. Hanya saja, jangan membuang saya sepatu kets. Saya sedikit

    Bahasa pemrograman banyak untuk mikrokontroler. Media pemrograman juga tidak cukup dan dibandingkan dengan mereka secara tidak benar. Tidak ada bahasa pemrograman yang lebih baik. Jadi, Anda harus memilih bahasa yang paling cocok untuk Anda dan lingkungan pemrograman.

    Jika Anda saat ini, berdiri di depan pilihan, pada apa yang harus mulai bekerja, inilah beberapa rekomendasi.

    Pengalaman pemrograman mantan. Jangan abaikan pengalaman sebelumnya dalam pemrograman. Bahkan jika itu adalah Baisik. Bahkan jika itu sudah lama di sekolah. Pemrograman seperti naik sepeda - Anda hanya harus memulai dan dengan cepat mengingat semuanya terlupakan. Mulailah dengan Beysika - yang tidak diadit - nanti akan lebih mudah untuk memilih sesuatu yang lebih cocok untuk keperluan Anda.

    Membantu lingkungan.Apakah teman Anda menulis di Pascal? Bagi Anda, sebuah pertanyaan diselesaikan - tulis di Pascal! Anda akan selalu membantu dengan dewan, perpustakaan akan dilemparkan ke perpustakaan, akan memberikan proyek yang sudah jadi. Secara umum, senang akan dibawa ke komunitas mereka. Jika Anda melakukannya sebaliknya, dapatkan hasil yang berlawanan. Sishers Teman menghibur Anda yang memutuskan untuk belajar assembler. Jangan menunggu bantuan.

    Buku Pemrograman AVR yang Baik Ini akan membantu dengan sangat baik. Sayangnya, ada sangat sedikit dari mereka. Jika Anda di tangan Anda punya buku, dan Anda berpikir semuanya sangat tersedia di dalamnya. - Coba. Saya tidak menyarankan belajar melalui e-book, sebagai pilihan terakhir, cetak. Sangat tidak nyaman untuk beralih antara lingkungan dan teks file file. Jauh lebih menyenangkan membaca buku itu segera mencoba tanpa terganggu dengan beralih, selain itu, Anda dapat membuat tanda pada bidang, tulis ide-ide yang telah muncul.

    Medium pemrograman lebih sederhana. Jika ada pilihan beberapa program pemrograman bahasa Anda - jangan ragu, pilih yang lebih mudah. Biarkan itu kurang fungsional. Biarkan mengkompilasi kode yang menakutkan. Hal utama adalah mulai bekerja. Setelah Anda bersandar di lingkungan yang sederhana, Anda akan dengan mudah pergi ke lingkungan yang lebih maju dan "benar". Dan jangan dengarkan mereka yang mengatakan bahwa Anda akan kehilangan lebih banyak waktu - mereka salah. Murid-murid kelas junior tidak diminta membaca "perang dan kedamaian" mereka memberi mereka buku lebih mudah - dengan gambar.

    Perpustakaan. Kehadiran perpustakaan itu kontroversial untuk belajar bahasa. Tentu saja, kemudian, mereka akan sangat memfasilitasi kehidupan, tetapi pada awalnya "kotak hitam" tidak dapat dipahami dan tidak terlalu membantu pemahaman bahasa. Di sisi lain, itu membuatnya lebih mudah untuk membaca program dan memungkinkan pendatang baru, tidak terlalu mengejan, membangun program yang kompleks. Jadi, kehadiran mereka tidak terlalu bosan. Setidaknya pada awalnya.

    Kode Efektif. Memilih lingkungan pemrograman untuk mempelajari pemrograman hanya dengan seberapa efektif kode kompilasi adalah ide yang buruk. Anda terutama akan mulai belajar - bahwa hal kesepuluh adalah "di pintu keluar". Tentu saja, Anda kemudian dapat mengerjakannya.

    Kedok.Perangkat apa pun di papan kristal perlu dikonfigurasi menggunakan port. Prosedurnya cukup kuat dan lembar data diperlukan. Selain itu, ada nuansa di mana pendatang baru tidak hanya memberi. Oleh karena itu, dalam media itu sangat diinginkan untuk kehadiran para vizards. Rilis adalah SPI otomatis, I2C, USART, dll. Penyesuaian otomatis. Semakin banyak perangkat didukung, semakin baik. Paparkan parameter periferal yang diperlukan, dan visard itu sendiri menghasilkan kode yang akan menyediakan parameter yang ditentukan. Sangat menyederhanakan hidup.


    Rekomendasi Umum Seperti pemrograman pada tahap awal harus sesederhana mungkin (bahkan jika primitif). Lingkungan pemrograman harus mudah dipelajari (sesuai kebutuhan, untuk memulai, mempelajari pemrograman dan tidak membuang waktu untuk memilih di pengaturan). Disarankan untuk Russify. Juga tidak mencegah manual Rusia dan contoh program. Kemungkinan firmware dari kristal dari medium diinginkan. Selanjutnya, ketika meninggalkan dasar-dasar pemrograman, Anda dapat bergerak pada cangkang yang lebih kompleks.


    Rekomendasi lain, akhirnya, bekerja dengan kristal nyata. Jangan takut membakarnya. Meningkatkan pengalaman praktis. Bekerja dengan emulator (misalnya proteus), meskipun akan bebas dari besi solder, tetapi tidak akan pernah bisa memberikan kepuasan yang akan Anda terima dari program yang diperoleh, mug pertama oleh LED! Memahami apa yang Anda lakukan dengan tangan Anda sendiri, rangkaian kerja yang sebenarnya akan menanamkan kepercayaan diri dan stimulus!

    (Mengunjungi 7 377 kali, 1 kunjungan hari ini)

    Konsep programmer pada port LPT ditampilkan pada gambar. Sebagai bekas ban, gunakan chip 74AC 244 atau 74HC244 (K1564AP5), 74LS244 (K5555AP5) atau 74S244 (K1533AP5).

    LED VD1 menunjukkan mode perekaman mikrokontroler,

    vD2 LED - Membaca,

    vD3 LED - keberadaan diagram.

    Tegangan yang diperlukan untuk memberi daya pada skema yang diambil dari konektor ISP, I.E. dari perangkat yang dapat diprogram. Skema ini adalah programmer STK200 / 300 daur ulang (ditambahkan LED untuk pengoperasian yang mudah), sehingga kompatibel dengan semua program programmer PC yang beroperasi dengan skema STK200 / 300. Untuk bekerja dengan programmer ini, gunakan program CVAVR.

    Programmer dapat dilakukan pada papan sirkuit yang dicetak dan menempatkannya di perumahan konektor LPT, seperti yang ditunjukkan pada gambar:




    Untuk bekerja dengan programmer, lebih mudah untuk menggunakan ekstensinel LPT port, yang mudah untuk membuat diri Anda (misalnya, dari kabel Cableronix untuk printer), hal utama adalah "tidak menyesali" konduktor untuk Bumi (18-25 kaki konektor) atau beli. Kabel antara programmer dan mikro yang dapat diprogram tidak boleh melebihi 20-30 cm.

    Halo, Habarites sayang!

    Dalam artikel ini, saya ingin menceritakan tentang bagaimana suatu hari saya memutuskan untuk mulai memprogram mikrokontroler, yang diperlukan untuk ini dan bahwa pada akhirnya ternyata.

    Topik mikrokontroler menarik bagi saya untuk waktu yang lama, tahun 2001. Tetapi kemudian untuk mendapatkan programmer di tempat tinggal bermasalah, dan tidak ada pembelian di Internet dan pidato. Saya harus menunda kasus ini sampai saat terbaik. Jadi, suatu hari saya menemukan bahwa saat-saat terbaik datang tanpa meninggalkan rumah Anda dapat membeli semua yang saya butuhkan. Saya memutuskan untuk mencoba. Jadi, apa yang kita butuhkan:

    1. programmer
    Ada banyak pilihan di pasar - dari programmer ISP (pemrograman dalam sistem) termurah untuk beberapa dolar, hingga programmer debugger yang kuat selama beberapa ratus. Tanpa pengalaman yang lebih besar dalam hal ini, pertama saya memutuskan untuk mencoba salah satu yang termudah dan termurah - usbasp. Saya membeli pada satu waktu di eBay seharga $ 12, sekarang Anda dapat menemukan bahkan untuk $ 3-4. Bahkan, ini adalah versi bahasa Cina dari programmer dari Thomas Fischl. Apa yang bisa saya katakan tentang dia? Hanya satu hal - itu berhasil. Selain itu, ada cukup banyak pengontrol AVR dari ATMEGA dan serialt series. Di bawah Linux tidak memerlukan driver.

    Untuk firmware, Anda perlu menghubungkan output VCC, GND, RESET, SCK, MOSI, MISO dengan output mikrokontroler yang sesuai. Untuk kesederhanaan, saya mengumpulkan skema bantu tepat pada pria:

    Kiri di papan - mikrokontroler yang sama, yang akan kita flash.

    2. Mikrokontroler.
    Dengan pilihan mikrokontroler, saya tidak terlalu repot dan mengambil atmega8 dari atmel - 23 I / O pinus, dua timer 8-bit, satu 16-bit, frekuensi - hingga 16 MHz, konsumsi kecil (1-3,6 mA) murah ($ 2). Secara umum, untuk awal - lebih dari cukup.

    Di bawah Linux untuk mengkompilasi dan mengunduh firmware pada controller, bundel AVR-GCC + Avrdede berfungsi dengan sempurna. Instalasi sepele. Mengikuti instruksi, Anda dapat menginstal semua yang Anda butuhkan dalam beberapa menit. Satu-satunya nean, yang harus dibayarkan ke - avrdude (perangkat lunak untuk merekam pada controller) mungkin memerlukan hak pengguna super untuk mengakses programmer. Keluar - Jalankan melalui sudo (bukan ide yang sangat bagus), atau mendaftarkan hak udev khusus. Sintaks dapat berbeda dalam versi OS yang berbeda, tetapi dalam kasus saya (Linux Mint 15) telah dilakukan dengan menambahkan aturan berikut ke /etc/udev/rules.d/41-atmega.rules:

    # USBASP Programmer Subsyem \u003d\u003d "USB", ATTR (IDVENDA) \u003d\u003d "16C0", ATTR (IDPRODUCT) \u003d\u003d "05DC", grup \u003d "plugdev", mode \u003d "0666"

    Setelah itu, secara alami, restart layanan diperlukan.
    Layanan udev restart.
    Anda dapat mengkompilasi dan mem-flash tanpa masalah langsung dari baris perintah (siapa yang akan ragu), tetapi jika ada banyak proyek, lebih mudah untuk meletakkan plugin dan melakukan semuanya langsung dari lingkungan gerhana.

    Di bawah Windows harus mengirimkan driver. Tidak ada masalah dalam sisanya. Untuk kepentingan ilmiah, saya mencoba bundel AVR Studio + Extreme Burner di Windows. Sekali lagi, semuanya bekerja dengan keras.

    Kami memulai pemrograman

    Pemrograman AVR Controller dapat menjadi keduanya pada assembler (AVR assembler) dan pada C. Di sini, saya pikir setiap orang harus membuat pilihannya sendiri, tergantung pada tugas spesifik dan preferensi. Secara pribadi, saya pertama kali mulai memilih Assembler. Ketika pemrograman pada assembler, arsitektur perangkat menjadi lebih jelas dan perasaan muncul bahwa mereka menggali langsung di bagian dalam pengontrol. Selain itu, saya percaya bahwa dalam program yang sangat penting, pengetahuan tentang assembler dapat sangat berguna. Setelah sosialisasi dengan AVR assembler, saya bergeser pada SI.

    Setelah kenalan dengan arsitektur dan prinsip-prinsip dasar, saya memutuskan untuk mengumpulkan sesuatu yang bermanfaat dan menarik. Putri saya membantu saya, dia melakukan catur dan satu malam yang indah menyatakan bahwa dia ingin memiliki timer arloji untuk batch untuk sementara waktu. Batz! Ini dia - ide proyek pertama! Dimungkinkan untuk memerintahkan mereka di ebay yang sama, tetapi saya ingin membuat jam Anda sendiri, dengan hitam ... eh ... dengan indikator dan tombol. Tidak lama kemudian dikatakan daripada dilakukan!

    Sebagai tampilan, diputuskan untuk menggunakan dua indikator dioda 7-segmen. Untuk mengontrolnya cukup 5 tombol - "Player 1", "Player 2", "Reset", "Pengaturan" dan "Jeda". Yah, jangan lupa tentang indikasi suara permainan. Sepertinya itu saja. Gambar di bawah ini menunjukkan diagram umum menghubungkan mikrokontroler ke indikator dan tombol. Dia akan membutuhkan ketika menguraikan kode sumber program:

    Colcessing flight.

    Mari kita mulai, sebagaimana mestinya, dari titik masuk program - fungsi utama. Bahkan, tidak ada yang luar biasa di dalamnya tidak - menyiapkan port, inisialisasi data dan tombol tak terbatas tombol menekan. Nah, panggilan sei () adalah resolusi pemrosesan interupsi, tentang mereka sedikit nanti.

    Int main (void) (init_io (); init_data (); sound_off (); sei (); sementara (1) (handle_buttons ();) kembali 0;)
    Pertimbangkan setiap fungsi secara terpisah.

    Void init_io () (// atur output ddrb \u003d 0xff; ddrd \u003d 0xff; // atur input ddrc \u003d 0b11100000; // pull-up resistor portc | \u003d 0b00011111; // timer interupsi Timsk \u003d (1<

    Mengatur port I / O sangat sederhana - ke dalam register DDRX (di mana X adalah huruf, menunjukkan port) angka, setiap bit yang berarti apakah pin yang sesuai akan menjadi perangkat input (sesuai dengan 0) atau output (sesuai ke 1). Dengan demikian, Seasushal di DDRB dan Nomor DDRD 0xFF, kami membuat port output B dan D. Dengan demikian, perintah DDRC \u003d 0B11100000; Mengubah 5 port pertama Port C ke pin input, dan sisanya pada akhir pekan. Tim Portc | \u003d 0B00011111; Termasuk resistor pengetatan internal pada 5 input pengontrol. Menurut skema, tombol-tombol terhubung ke input ini, yang ketika ditekan ditutup ke bumi. Dengan demikian, pengontrol memahami bahwa tombol ditekan.

    Selanjutnya, Anda mengikuti pengaturan dua timer, timer0 dan timer1. Kami menggunakan indikator pertama untuk memperbarui, dan yang kedua - untuk hitungan mundur waktu, setelah mengaturnya ke pemicu setiap detik. Penjelasan terperinci dari semua konstanta dan metode pengaturan timer ke interval tertentu dapat ditemukan dalam dokumentasi untuk ATMega8.

    Pemrosesan interupsi

    Isr (tampilan (); if (_buzzer\u003e 0) (_buzzer--; if (_buzzer \u003d\u003d 0) sound_off ();)) isr (timer1_compa_vect) (ifectivetimer \u003d\u003d 1 && timer1\u003e 0) ( ; if (timer1 \u003d\u003d 0) proses_timeoff ();) jika (ActiveMer \u003d\u003d 2 && timer2\u003e 0) (timer2--; if (timer2 \u003d\u003d 0)))

    Ketika timer dipicu, kontrol ditransmisikan ke penangan interupsi yang sesuai. Dalam kasus kami, ini adalah prosesor Timer0_OVF_VECT, yang menyebabkan waktu prosedur output indikator, dan Timer1_Compa_Vect, yang memproses hitung mundur.

    Kesimpulan untuk indikator

    Void Tampilan () (Display_Number ((Timer1 / 60) / 10, 0B00001000); _delay_ms (0,25); display_number ((Timer1 / 60)% 10, 0B00000100); _delay_ms (0,25); display_number (((Timer1% 60) / 10, 0B00000010); _delay_ms (0,25); display_number ((Timer1% 60)% 10, 0B00000001); _delay_ms (0,25); Display_Number ((Timer2 / 60) / 10, 0B10000000); _delay_ms (0,25); display_number ((Timer2 / 60)% 10, 0B01000000); _delay_ms (0,25); display_number ((Timer2% 60) / 10, 0b00100000); _delay_ms (0,25); display_number (((Timer2% 60)% 10, 0b00010000); _delay_ms (0.25) ; PORTD \u003d 0;) Display_Number Void (Int Nomor, Int Topeng) (PortB \u003d Number_Mask (Nomor); PortdD \u003d Topeng;)

    Fitur Tampilan menggunakan metode indikasi dinamis. Faktanya adalah bahwa setiap indikator individu memiliki 9 kontak (7 untuk kontrol segmen, 1 untuk poin dan 1 untuk catu daya). Untuk mengontrol 4 digit, dibutuhkan 36 kontak. Terlalu boros. Oleh karena itu, output dari pembuangan untuk indikator multi-digit diatur menurut prinsip berikut:

    tegangan bergantian diumpankan ke masing-masing kontak bersama, yang memungkinkan Anda untuk menyorot sosok yang diinginkan dalam yang sesuai indikator menggunakan 8 kontak kontrol yang sama. Dengan frekuensi output yang cukup tinggi sepertinya gambar statis. Itulah sebabnya semua 8 kontak pasokan dari kedua indikator pada diagram terhubung ke 8 port port d, dan 16 segmen kontrol kontak terhubung berpasangan dan terhubung ke 8 port port B. Dengan demikian, fungsi tampilan dengan penundaan 0,25 ms bergantian menampilkan jumlah yang diinginkan untuk masing-masing indikator. Di bawah akhir, semua output yang memberi makan tegangan pada indikator dimatikan (perintah portdd \u003d 0;). Jika ini tidak dilakukan, maka digit tampilan terakhir akan terus terbakar sampai panggilan berikutnya disebut fungsi tampilan, yang akan menyebabkan luminescence yang lebih cerah dibandingkan dengan yang lain.

    Pengobatan Press.

    Void handle_buttons () (handle_button (key_setup); handlang_button (key_reset); handlower_button (key_putton); handle_button (key_player1); handle_button (key_player2);) void handle_button (int int) (int bit; switch (tombol) (Case) \u003d Setup_bit; istirahat; case key_reset: bit \u003d reset_bit; break; case key_pause: bit \u003d break; case_player1: bit \u003d pemutar1_bit; break \u003d pemutar \u003d break; bit (bit_is_clear) Tombol_pin, bit)) (if (_pressed \u003d\u003d 0) (_delay_ms (debounce_time); jika (bit_is_clear (button_pin, bit)) (_pressed | \u003d tombol; // kunci tindakan (key_setup: proses_setup (); istirahat; : proses_reset (); istirahat; case key_pause: proses_puse (); break; case key_player1: proses_player1 (); break; case key_player2: proses_player2 (); break;))) lain (kunci _pressed & \u003d ~ ;))

    Fitur ini pada gilirannya jajak pendapat semua 5 tombol dan proses pers, jika itu terjadi. Menekan terdaftar dengan memeriksa bit_is_clear (button_pin, bit), mis .. Tombol ditekan jika input yang sesuai dengan itu terhubung ke tanah, yang akan terjadi sesuai dengan skema, ketika Anda menekan tombol. Durasi durasi tunda yang tertunda dan pemeriksaan ulang diperlukan untuk menghindari beberapa respons yang tidak perlu karena guncang kontak. Menyimpan status pers dalam bit variabel yang sesuai _pressed digunakan untuk menghilangkan pemicu kembali dengan tombol tekan yang panjang.
    Fungsi yang mendesak cukup sepele dan percaya bahwa dalam komentar tambahan tidak perlu.

    Program Teks Lengkap.

    #Define f_cpu 4000000l #include #Include. #Include. #define debounce_time 20 #define button_pin pinc #define setup_bit pc0 #define reset_bit pc1 #define pc2 #define player1_bit pc3 #define player2_bit 0b0000001 #define key_pause 0b00000100 #define key_player1 0b00010000 volatile int ActiveTimer \u003d 0; Volatile int timer1 \u003d 0; Volatile int timer2 \u003d 0; volatile int _buzzer \u003d 0; Volatile int _pressed \u003d 0; // deklarasi fungsi void init_io (); void init_data (); Int number_mask (int num); void handle_buttons (); void handle_button (tombol int); Void Process_Setup (); Void proses_reset (); void proses_pusie (); void proses_timeoff (); Void proses_player1 (); Void proses_player2 (); Void Display (); void display_number (int mask, int number); Void sound_on (int interval); void sound_off (); // interupsi ISR \u200b\u200b(tampilan (); if (_buzzer\u003e 0) (_buzzer--; if (_buzzer \u003d\u003d 0) sound_off ();)) isr (timer1_compa_vect) (if (ActiveMer \u003d\u003d 1 && timer1\u003e 0) ( Timer1--; if (timer1 \u003d\u003d 0) proses_timeoff ();) jika (ActiveMer \u003d\u003d 2 && timer2\u003e 0) (timer2--; jika (timer2 \u003d\u003d 0)))))) (init_io (); init_data (); sound_off (); sei (); sementara (1) (handle_buttons ();) mengembalikan 0;) void_io () (// set output ddrd \u003d 0xff; // Input DDRC \u003d 0B11100000; // Pull-up Resistors Portc | \u003d 0b00011111; // Timer Interrupts Timsk \u003d (1< 5940 || Timer2\u003e 5940) (timer1 \u003d 0; timer2 \u003d 0;)) void proses_reset () (init_data ();) void proses_timeoff () (init_data (); sound_on () (ActiveMer \u003d 0;) void Process_player1 () (ActiveMer \u003d 2;) Void Process_player2 () (aktif) _player2 () (ActiveMer \u003d 1;) void handlang_button (int key) (tombol int) (int.setup: bit \u003d setup_bit: bit \u003d istirahat; Case key_puse: bit \u003d pause_bit; break; case key_player1: bit \u003d player1_bit; break; case_player2: bit \u003d player2_bit; istirahat; default: kembali;) (if (_pressed \u003d\u003d) (if (_pressed \u003d\u003d) ( _delay_ms (debounce_time); jika (bit_is_clear (button_pin, bit)) (_pressed | \u003d tombol; // key_setup: proses_setup (); istirahat; case key_reset: proses_reset (); break; case key_player1; : proses_player1 (); istirahat; case key_player2: proses_player2 (); break;) sound_on (15))) lain (_Pre SSED & \u003d ~ Kunci; )) Void handle_buttons () (handle_button (key_setup); handle_button (key_reset); handle_button (key_puse); handle_button (kunci_player1);) void display () ((((timer1 / 60) / 10, 0b00001000) ; _delay_ms (0.25); display_number ((timer1 / 60)% 10, 0b00000100); _delay_ms (0.25); display_number ((timer1% 60) / 10, 0b00000010); _delay_ms (((((((((((((((((((((((((((((((timer1% 60) % 10, 0b00000001); _delay_ms (0.25); display_number ((timer2 / 60) / 10, 0b10000000); _delay_ms (0,25); display_number ((timer2 / 60)% 10, 0b01000000 (0.25); display_number ((0,25); Timer2% 60) / 10, 0b00100000); _delay_ms (0.25); display_number ((((((timer2% 60)% 10, 0b00010000); _delay_ms (0.25); portdd \u003d 0;) void display_mask) (portb \u003d Number_Mask) ( Angka); portd \u003d mask;) void sound_on (int interval) (_buzzer \u003d interval; // letakkan buzzer pin portc tinggi | \u003d 0b00100000;) void sound_off (// letakkan buzzer pin portc & \u003d ~ 0b00100000;)

    Prototipe dirakit di papan dumping.