Jadi, saya seorang LENGKAP dan pemula di pemrograman. Saya telah melakukan beberapa hal dasar pada Arduinos (secara harfiah mengubah LED dan menampilkan sesuatu pada LCD) dan saya mencoba untuk belajar sendiri tentang cara memprogram dalam C. Saya seorang insinyur perangkat keras berdagang, tetapi itu mengganggu saya bahwa saya tidak bisa lakukan salah satu sisi firmware / perangkat lunak dan tidak ada kursus malam untuk mengajarkannya, dan saya ingin melanjutkan opsi karir saya. Saya berjuang untuk memahami bagaimana beberapa dari perintah ini berjalan bersama dan telah mengalami masalah yang saya tidak bisa mengerti mengapa itu tidak berhasil.
Jadi, saya punya input dan output. Output saya adalah mengaktifkan gerbang FET yang menyalakan LED. Input berasal dari gerbang AND. Jadi, LED saya selalu menyala, dan ketika saya mendapatkan sinyal input dari gerbang AND (2 kondisi telah terpenuhi) Saya ingin output (LED toggle) menjadi RENDAH (matikan LED. Karena output juga terhubung ke salah satu input DAN, ini juga akan mengubah sinyal input RENDAH.
Yang ingin saya lakukan: Saya hanya ingin membaca input sebagai 'kondisi terpenuhi' dan mematikan LED. Kemudian harus dimatikan selama 1 detik, dan hidupkan kembali. Jika input menjadi TINGGI lagi, proses berulang. Saya menggunakan push sederhana untuk beralih sebagai input gerbang AND lainnya dan telah mengukur bahwa output (input MCU) menjadi tinggi ketika tombol ditekan, namun toggle LED (output) tidak akan mati. Kode saya (saya pikir) sangat sederhana, tetapi jelas saya tidak mengerti sesuatu dengan benar karena tidak berfungsi.
Jadi ini kode yang saya gunakan:
#include "mbed.h"
DigitalIn ip(D7);
DigitalOut op(D8);
int main() {
if (ip == 1){
op = 0;
wait (1.0);
op = 1;
}else{
op = 1;
}
}
Dan bagi saya, itu masuk akal. Dalam keadaan biasa, outputnya TINGGI. Jika input mendapatkan sinyal dari gerbang AND, LED akan mati selama 1 detik, lalu nyalakan lagi.
Apa yang saya lakukan salah karena itu terlihat seperti cara logis untuk melakukannya dan saya tidak mengerti mengapa itu tidak berhasil?
Jika itu membantu, saya menggunakan Nucleo F103RB. Ketika saya menggunakan kode 'blink' dan hanya menghidupkan dan mematikan LED seperti itu, itu berfungsi dengan baik, itu hanya ketika saya menambahkan pernyataan 'jika' itu salah.
Ini adalah sirkuit yang disederhanakan:
mensimulasikan rangkaian ini - Skema dibuat menggunakan CircuitLab
PS Saya tahu saya tidak menambahkannya dalam skema, tetapi gerbang DAN memang memiliki resistor pull-down pada input dan output.
DigitalIn
sudah termasukvolatile
.Jawaban:
Saya akan berpikir bahwa Anda akan memerlukan loop di sekitar kode Anda -
Sebelum Anda memiliki kesempatan untuk menekan tombol, kode Anda akan selesai dan keluar. Anda perlu waktu untuk menjaga pernyataan if berulang kali berjalan.
sumber
loop()
, tetapi kerangka kerja Arduino menambahkan kode yang kira-kira berperilaku seperti ituint main() { setup(); while(1) { loop(); } }
.Prosesor menjalankan instruksi secara berurutan . Dimulai dengan lompatan ke
main()
dari dalam kode inisialisasi pustaka mbed dariDigitalIn
danDigitalOut
.Kemudian lakukan perbandingan
ip == 0
, jalankan instruksi di dalam{}
dan kemudianmain()
berakhir ... tidak ada instruksi lagi ... Apa fungsinya?Ini dapat diatur ulang karena menemukan operan ilegal di memori flash kosong. Atau itu bisa menggantung di penangan kesalahan dan berkedip SOS seperti mbeds lakukan. Ini tergantung pada bagaimana ini diterapkan, dan mungkin akan melampaui Anda sekarang.
Tetapi jika Anda penasaran, Anda dapat meneliti ARM Fault Handling, atau mencari tahu dari mana
main()
sebenarnya namanya.Sekarang, bagaimana cara memperbaikinya?
sumber
while(1 == 1)
bukan hanyawhile(1)
. Yang terakhir adalah C idiomatik, tetapi yang pertama lebih jelas bagi manusia karena "akan selalu mengevaluasi ke benar". Setiap kompiler yang layak harus menghasilkan kode biner yang sama untuk kedua varian.Seperti yang disebutkan dengan benar oleh orang lain, satu loop akan memungkinkan kode Anda berjalan berulang kali. Namun, ada cara built-in untuk melakukan ini untuk Arduino tanpa perlu
while
loop. Ini dilakukan olehloop
fungsi - penerapannya pada masalah Anda tergantung pada apakah Anda menggunakan Arduino IDE.Seharusnya terlihat seperti ini:
Fungsi utama Anda sekarang disembunyikan dan hanya ditambahkan ke program Anda saat dikompilasi. Inilah diskusi yang bagus tentang ini: http://forum.arduino.cc/index.php?topic=379368.0
sumber
loop()
dansetup()
fungsi dari Arduino tidak digunakan di sebagian besar sistem. Untuk referensi, Arduino hanya mendefinisikanmain()
sesuatu seperti ini:void setup(); void loop(); int main() { setup(); while (true) loop(); }
Jika Anda fimiliar dengan perakitan, ini bisa menjadi sedikit lebih di zona nyaman Anda juga:
int main () {
}
sumber
goto
** sangat ** menunjukkan "keajaiban terjadi di sini", mungkin dengan pengecualiangoto cleanup;
. Dalam contoh di sini, pembaca akan dibiarkan dengan pertanyaan membingungkan "apa yang istimewa yang tidak Anda gunakan diwhile(1) { }
sini ???".