Iepriekšējā apmācībā mēs uzzinājām par gaismas diode mirgošanu, izmantojot PIC mikrokontrolleru, un uz Perf plāksnes izveidojām to pašu shēmu. Tad mēs izmantojām PICkit 3, ICSP un MPLAB IPE programmas izgāšanai uz mūsu Perf dēļa. Tagad šajā apmācībā mēs sevi virzīsim uz vairāku PIC mikrokontrollera tapu izmantošanu. Mēs izmantosim 7 izejas (gaismas diodes) un vienu ieeju. Šajā apmācībā mēs izmantosim veco Perf dēli (parādīts zemāk) un pievienosim bergu nūjas, lai uz otrā LED dēļa izvilktu vajadzīgās tapas. Šīs apmācības beigās mēs ģenerēsim mirgojošu gaismas diodu secību, izmantojot PIC mikrokontrolleru PIC16F877A, un uzzināsim, kā izmantot vairākas ieejas un izejas, dažus pamatus par “par” cilpu un funkciju izsaukšanu.
LED dēlis ir nekas cits kā vēl viena perf plāksne, uz kuras mēs lodēsim gaismas diodes ar strāvu ierobežojošo rezistoru (parādīts zemāk). Mēs arī pievienosim spiedpogu, lai sāktu secīgas gaismas diode mirgo.
Ķēdes shēma:
PIC mikrokontrolleris PIC16F877A LED mirgo secības kods un darba skaidrojums:
Pilns kods ir norādīts zemāk (pārbaudiet beigās), šeit mēs to saņemsim pa rindām pa rindām. Šis kods sāks mirgot gaismas diodes secīgi, nospiežot spiedpogu. Lai saprastu secības, lūdzu, noskatieties videoklipu apmācības beigās. Es iesaku jums salīdzināt video parādīto izvadi ar zemāk esošo kodu un mēģināt izprast programmu.
Apskatīsim kodu pa rindām. Pirmās rindas ir paredzētas konfigurācijas bitu iestatīšanai, kas tika izskaidroti iepriekšējā apmācībā, tāpēc es tos tagad izlaižu. Labākais veids, kā saprast jebkuru programmu, ir sākt no galvenās ( void main () ) funkcijas, tāpēc darīsim to
TRISB0 = 1; // Norādiet MCU, ka PORTB tapa 0 tiek izmantota kā pogas ievade. TRISD = 0x00; // Norādiet MCU, ka visas tapas tiek izvadītas PORTD = 0x00; // Inicializējiet visas tapas līdz 0
Vārds TRIS tiek izmantots, lai definētu, vai tapa tiek izmantota kā ievade / izvade, un vārds PORT tiek izmantots, lai tapu izveidotu augstu / zemu. Līnija TRISB0 = 1 padarīs PORT B 0. kontaktu par ievadi. Tas būs mūsu spiedpoga. Līnijas TRISD = 0x00; PORTD = 0x00; padarīs visas porta D tapas kā izvadi un šīm tapām piešķirs sākotnējo vērtību LOW.
Tā kā mēs teicām, ka B0 tiek izmantots kā ieeja, mēs savienosim vienu spiedpogas galu ar tapu B0 un otru galu ar zemi. Tad, kad mēs nospiežam pogu, tapa tiks turēta zemē, kā parādīts augšējā savienojuma shēmā. Bet, lai tas notiktu, mums jāizmanto pievilkšanas rezistors, lai tapa tiktu turēta augstu, kad poga netiek nospiesta. Paceļams rezistors ir kaut kas līdzīgs šim.
Bet mūsu PIC MCU ir iekšējs vājš pretestības pretestība, kuru programmatūra var aktivizēt, tādējādi ietaupot daudz problēmu (kad jāpievieno vairāk pogu).
Kas ir vājš rezistors?
Ir divu veidu pievilkšanas rezistori, viens ir vājš pievilkšanas un otrs ir spēcīgs pievilkšanas uz augšu. Vājiem pievilkšanas rezistoriem ir liela vērtība, tādējādi ļaujot plūst vājajai strāvai, un spēcīgajiem pievilkšanas rezistoriem ir maza vērtība, tādējādi ļaujot plūst spēcīgai strāvai. Visi MCU pārsvarā izmanto vājus pievilkšanas rezistorus. Lai to aktivizētu mūsu PIC MCU, mums ir jāpārbauda mūsu OPTION_REG (opciju reģistrs) datu lapa, kā parādīts zemāk esošajā momentuzņēmumā.
Kā parādīts, bits 7 attiecas uz vāju pievilkšanas rezistoru. Lai to aktivizētu, vajadzētu būt nullei. To veic OPTION_REG <7> = 0 . Tas īpaši attiecas uz bitu 7, atstājot pārējos bitus tā noklusējuma vērtībās. Ar to mēs nonākam mūsu while ciklā, kur tā pārbauda, vai poga ir nospiesta, izmantojot if (RB0 == 0). Ja nosacījums ir izpildīts, mēs saucam savu funkciju ar parametriem 1, 3, 7 un 15.
sblink (1); // FUNCTION CALL 1 ar 1. parametru sblink (3); // FUNCTION CALL 3 ar 3. parametru sblink (7); // FUNCTION CALL 7 ar parametru 7 sblink (15); // FUNCTION CALL 4 ar 15. parametru
Kāpēc mēs izmantojam funkcijas?
Funkcijas tiek izmantotas, lai samazinātu mūsu koda rindu skaitu. Tas ir tas, ko lielākā daļa no mums būtu zinājuši. Bet kāpēc mums jāsamazina līniju skaits, it īpaši, ja runa ir par MCU programmēšanu. Iemesls ir ierobežots vietu mūsu programmas atmiņā. Ja mēs pareizi neoptimizējam kodu, atmiņā var pietrūkt vietas. Tas būs noderīgi, kad mēs rakstīsim garas kodu lapas.
Jebkurai funkcijai būs funkcija Definīcija (mūsu gadījumā sblink (int get) ) un funkcija Call (mūsu gadījumā sblink (1) ). Funkcijas deklarācija ir obligāta, lai no tās izvairītos, pirms funkcijas izsaukšanas savā galvenajā funkcijā esmu ievietojis savas funkcijas definīciju.
Funkcijas parametri ir vērtība, kas tiks pārsūtīta no funkcijas izsaukuma uz funkcijas definīciju. Mūsu gadījumā veselā skaitļa vērtības (1, 3, 7, 15) ir parametri, kas tiek nodoti no funkcijas izsaukuma, un mainīgais "get" parametru vērtību iekļauj funkcijas definīcijā, lai tos apstrādātu. Funkcijai var būt vairāki parametri.
Kad funkcija ir izsaukta, tiks izpildītas zemāk norādītās rindas funkcijas definīcijā.
par (int i = 0; i <= 7 && RB0 == 0; i ++) {PORTD = iegūt << i; // gaismas diodes pārvietošana pa kreisi secība __delay_ms (50); } par (int i = 7; i> = 0 && RB0 == 0; i--) {PORTD = iegūt << i; // LED pārvietošanās pa kreisi secība __delay_ms (50); }
Tagad šī rinda, šķiet, ir nepāra: PORTD = get << i . Es paskaidrošu, kas šeit faktiski notiek.
"<<" ir kreisās maiņas operators, kurš visus bitus pārvieto kreisajā pozīcijā. Tagad, kad mēs izsaucam funkciju sblink (int get) ar parametru '1' kā sblink (1), tas padara vērtību 'get' kā 1, kas binārā formātā ir 0b00000001. Tādējādi šī rinda būs tāda kā PORTD = 0b00000001 << i .
"I" vērtība mainīsies no 0 līdz 7, jo esam izmantojuši “for loop” (int i = 0; i <= 7 && RB0 == 0; i ++). “I” vērtība no 0 līdz 7 mainīs rezultātu šādi:
Kā redzat, mēs ieslēdzām vienu gaismas diodi vienlaikus (no kreisās uz labo), turot pārējo izslēgtu. Nākamais “for loop” (int i = 7; i> = 0 && RB0 == 0; i--) arī darīs to pašu, bet šoreiz LED tiks ieslēgts secībā no labās uz kreiso, kad mēs sākām no 7 un nokāpām līdz 0. Mēs esam izmantojuši 200 ms aizkavi, lai mēs varētu vizualizēt LED ieslēgšanu un izslēgšanu.
Tagad, kad mēs nododam vērtību 3 sblink (int get) funkcijā, tiks izpildīta funkcija sblink (3) , kas “get” vērtību padara par 0b00000011, līdz ar to rezultāts PORTD būs:
Tāpēc šoreiz divas gaismas diodes tiks ieslēgtas jebkurā laikā, izmantojot sblink (3). Līdzīgi kā sblink (7) un sblink (15), trīs un četras gaismas diodes būs ieslēgtas secīgi. Kad tas būs pabeigts, mēs padarīsim visu gaismas diodi ieslēgtu, izmantojot līniju PORTD = 0xFF . Pilnu demonstrāciju skatiet zemāk esošajā videoklipā.
Ceru, ka esat sapratis kodu un tādējādi iemācījies izmantot funkcijas “par” un “kamēr”, lai iegūtu vēlamos rezultātus. Tagad jūs varat pielāgot kodu, lai mirgotu atšķirīgā LED secība. Iet uz priekšu, apkopojiet kodu un nometiet to uz MCU un izbaudiet izvadi. Ja kaut kur iestrēgstat, varat izmantot komentāru sadaļu. Šeit esmu pievienojis arī simulācijas un programmas failus.
Tagad tas ir mūsu nākamajā apmācībā, un mēs iemācīsimies izmantot PIC16F877A taimerus, nevis aizkavēšanās funkcijas. Šeit varat pārlūkot visas PIC mikrokontrolleru apmācības.