Vodič za PIC - Od registara do prekida

Isprobajte Naš Instrument Za Uklanjanje Problema





Prije ulaska u detaljne detalje programiranja PIC-a, prvo bi bilo važno naučiti nekoliko dobrih metoda programiranja.

Razumijevanje registara

Za početak pretpostavimo da upišete (zarez) u bilo koju točku programa, sve što dolazi nakon ovog zareza kompajler će ignorirati, sve dok se naravno kočija ne vrati u položaj.



Gornja značajka omogućuje nam dodavanje komentara ili primjedbi tako da oni ne postanu dio programa, ali nam olakšava prepoznavanje programa uz pomoć komentara uz njega. Davanje komentara je preporučena praksa tijekom programiranja bilo kojeg IC-a.

Sljedeća važna stvar na tečaju je dodijeljivanje imena različitim konstantama (kasnije ćete ih detaljno naučiti). Ovo također olakšava razumijevanje onoga na što se piše ili vezano uz uključene vrijednosti, umjesto da se zbunjuje s uključenim brojevima.



Gore navedeno mora biti izvedeno u obliku stvarnih imena za trenutno prepoznavanje, na primjer COUNT, bilo bi važno napomenuti da se ovdje koriste sva velika slova kako bi se to razlikovalo i ukazuje na to da je to konstantna vrijednost.


Kao što vidimo, gore navedeno je izvedeno u obliku kutije izrađene od zareza, što samo čini da izgleda čišće. Osim toga, pokušajte dokumentirati program i na papiru, ova praksa će vam pomoći razumjeti stvari korak po korak.

2. Registri.

Registar unutar PIC-a područje je koje prihvaća pisane detalje, a omogućuje i čitanje iz njega. Možete ga usporediti s listom papira na kojem možete vizualizirati sadržaj i dodati ga tako što ćete ga prepisati.

Slika dolje prikazuje tipičnu mapu datoteke registra ugrađenu u PIC16F84. Format nije nešto što je zapravo postavljeno unutar PIC-a, on jednostavno pokazuje kako se bitovi mogu rasporediti unutar čipa i razumijevanje nekoliko uključenih naredbi.

Možete vidjeti da je u osnovi podijeljen na banku 0 i banku 1. Banka 1 odgovorna je za kontrolu stvarnog rada PIC-a, na primjer, ona javlja PIC-u koji su bitovi u luci A dodijeljeni kao ulazi, a koji kao izlazi.

Banka 2 je samo za manipulaciju informacijama.

Razumijemo to kroz sljedeći primjer:

Pretpostavimo da želimo dodijeliti jedan bit na PortA high. Za to bismo prvo trebali otići do banke 1 za postavljanje navedenog bita ili pina na priključku A u obliku izlaza. Nakon toga vraćamo se na banku 0 i isporučujemo logiku 1 (bit 1) na taj određeni pin.

Najčešći registri koje bismo željeli koristiti u banci 1 su STATUS, TRISA i TRISB.

STATUS nam pomaže da se vratimo u banku 0, TRISA nam omogućuje da odaberemo koji su pinovi na portu A izlazi, a koji mogu biti ulazi, dok TRISB olakšava odabir između izlaznog i ulaznog pina na portu B. REGISTAR SELECT u BANK 0 omogućava korisniku prebaciti na banku 1.

Sažeto ćemo cijeli koncept sa sljedećim opisom:

STATUS:

Da bismo se prebacili s banke 0 na banku 1, zapovijedamo STATUS registrom. To se provodi postavljanjem bita 5 registra STATUS na 1. Da bismo se vratili natrag u banku 0, dodijelili smo bit 5 registra STATUS 0. Registar STATUS nalazi se na adresi 03h, ovdje h označava tat broj može biti u heksadecimalnom.

TRISA i TRISB:

Oni se nalaze na adresi 85h i 86h, sukladno tome. Za programiranje pin-a kao izlaza ili ulaza, samo isporučujemo nulu ili jedinicu određenom bitu u registru. Sada se to može učiniti na dva načina, putem binarnog ili Hex-a. U slučaju da netko ne može pretvoriti parametar, on ili ona može potražiti znanstveni kalkulator za implementaciju vrijednosti.

Sada imamo 5 pinova na priključku A, što odgovara 5 pinova. Ako namjeravamo popraviti jedan od pinova kao ulaze, isporučujemo '1' na određeni bit.

U slučaju da bismo željeli dodijeliti jedan od pinova kao izlaze, postavili bismo određeni pin na '0'. Bitovi su pomoć koja točno odgovara bitovima, ili preciznije bit 0 je RA0, bit 1 bi bio RA1, bit 2 = RA2 i tako dalje. Shvatimo to na ovaj način:

Pretpostavimo da želite popraviti RA0, RA3 i RA4 kao izlaze, dok RA1 / RA2 kao i / ps, to biste učinili slanjem 00110 (06h). Provjerite je li bit 0 usmjeren udesno kako je ovdje naznačeno:

Priključite pin RA4 RA3 RA2 RA1 RA1 RA0

Bit broja 4 3 2 1 0

Binarni 0 0 1 1 0

Isto vrijedi i za TRISB.

PORTA i PORTB

Da bismo visoko priveli jedan od izlaznih pinova, samo nudimo '1' na odgovarajući bit u našem registru PORTA ili PORTB. Identičan postupak može se slijediti i za TRISA i TRISB registre. Prije nego što prijeđemo na naš prvi primjer kodiranja, samo shvatimo nekoliko dodatnih registara, naime: w i f.

W i F

W registar je uobičajeni registar koji vam omogućuje dodjeljivanje bilo koje vrijednosti po vašem izboru. Čim W dodijelite veličinu, možete nastaviti dodavanjem ove vrijednosti ili jednostavno pomicanjem. S dodijeljenom drugom vrijednošću, detalji se jednostavno prepišu na W.

F registar prosljeđuje svoj pisani materijal u registar. Morali bismo zahtijevati da ovaj F registar dodijeli vrijednost registru, može biti STATUS ili TRISA registri, jer nam neće dopustiti da vrijednosti stavimo izravno preko njih. Primjer programa

Ispitajmo sljedeći primjer koda koji će nam pokazati kako se provodi gornja uputa, a svjedočit ćemo i nekoliko uputa u tečaju.

Počnimo s popravljanjem priključka A kako je gore rečeno.

Za to se moramo prebaciti s banke 0 na banku1, to se postiže postavljanjem STATUS registra koji se nalazi na adresi 03h, bit 5 do 1.

BSF 03h, 5

BSF znači skup bitova F. Nakon ove upute koristimo dva broja - 03h, koji je adresa registra STATUS, i broj 5 koji odgovara bitskom broju.

Dakle, ono što govorimo je 'Postavite bit 5 u adresi 03h na 1'.

Sada smo u banci 1.

MOVLW 00110b

Binarnu vrijednost 00110 (slovo b znači da je broj u binarnom znaku) stavljamo u naš opći registar W. To bih naravno mogao učiniti u hex-u, u tom slučaju bi naša uputa bila:

MOVLW 06h

Ili djeluje. MOVLW znači 'Premjesti doslovnu vrijednost u W', što na engleskom znači vrijednost koja slijedi izravno stavite u W registar.

Sada moramo postaviti ovu vrijednost u naš TRISA registar da bismo postavili port:

MOVWF 85h

Ova uputa označava 'Premjestite sadržaj W u adresu registra koja slijedi', u ovom slučaju adresa se odnosi na TRISA.

Naš TRISA registar u ovom trenutku ima sliku 00110 ili je prikazan grafički:

Priključite pin RA4 RA3 RA2 RA1 RA1 RA0

Binarni 0 0 1 1 0

Ulaz / izlaz O O I I O

Dakle, sada posjedujemo pribadače za Port A, moramo se vratiti u banku 0 da prilagodimo jednu od informacija.

BCF 03h, 5

Ova uputa postiže obrnuto od BSF-a. Podrazumijeva 'Bit Clear F'. Par brojeva koji odgovaraju su adresa registra, ovdje je registar STATUS, kao i slika bita, u ovom slučaju bit pet. Što smo točno dovršili u ovom trenutku, definirano je kao bit pet

STATUS registrirati na 0

U ovom smo trenutku vratili u banku 0.
Slijedi kôd u jednom bloku:

BSF 03h, 5 Idite na banku 1
MOVLW 06h Stavite 00110 u W
MOVWF 85h Premjestite 00110 na TRISA
BCF 03h, 5 Vratite se na banku 0

U okviru posljednjeg uputstva potvrdili smo vam način uspostavljanja IO priključaka na PIC-u koji bi mogli biti ulazni ili izlazni.

Kroz ovaj tečaj, dopustite mi da vam pomognem u slanju podataka u luke.

Slanje podataka u luke

U slijedećem uputstvu dovršit ćemo treptanjem LED lampica koje se uključuju i isključuju, a sastoje se od cjelovitih detalja o programu i jednostavnog dijagrama sklopa, tako da možete vidjeti kako PIC izvodi točno ono što mi predviđamo.

Ne pokušavajte sastaviti i programirati svoj PIC s donjim rezultatima, jer su oni samo ilustracije. U početku ćemo uspostaviti Port A bit 2 kao izlaz:

To se može prepoznati iz prethodne nastave. Jedina razlika mogla bi biti da smo fiksirali svaki bit pinova na A kao izlaz, isporučujući 0h u trodimenzionalni registar. Dakle, ono što sada mora učiniti je uključiti LED.

To postižemo postavljanjem jedne visoke pinove (one s LED diodom). Drugim riječima, na iglu primjenjujemo '1'. Upravo se to točno provodi (pogledajte komentare radi pojašnjenja za svaki redak):

Stoga smo ono što smo sada postigli jednokratno uključiti i isključiti LED. Ono što želimo je da se LED dioda naknadno neprestano uključuje.

To postižemo dobivanjem programa za povratak na početak. To postižemo početnim postavljanjem oznake na početku našeg programa, nakon čega obavještavamo program da se vrati tamo. Oznaku navodimo sasvim izravno.

Ukucavamo pojam, recimo START, a zatim upišimo kôd:

Kao što je pokazano, u početku smo spomenuli izraz „Start“ odmah na početku programa.

Dalje, na samom kraju programa jasno smo spomenuli 'goto Start'. Uputa 'goto' izvršava upravo ono što deklarira.

Ovaj bi program neprestano uključivao i isključivao LED diode kad god uključimo strujni krug, nastojeći se ISKLJUČITI nakon uklanjanja električne energije. Možda bismo trebali ponovno provjeriti svoj program:

Sigurno smo izostavili komentare, ali još uvijek možemo poštivati ​​upute i brojeve.

To kasnije može biti pomalo zbunjujuće u slučaju da pokušate riješiti problem programa i dok pišete kôd upamtili ste sve adrese.

Iako se komentari mogu stavljati, ipak bi mogao postati pomalo pretrpan. To će zahtijevati imenovanje brojeva, a to se može postići dodatnom uputom: 'equ' Uputa 'equ' sugerira da bi neke stvari mogle biti jednake drugim stvarima.

To možda nije uputa za PIC, nego za asembler. Ova uputa olakšava dodjeljivanje imena mjestu adrese registra ili konstante programskom terminu.

Utvrdit ćemo nekoliko konstanti za naš program i također ćemo svjedočiti koliko izravno čita program.

Od sada smo fiksirali konstantne vrijednosti koje možemo nastaviti postavljanjem u naš program. Prije njihove upotrebe potrebno je odrediti konstantne vrijednosti.

zato ih pobrinite da ih uvijek postavite na početak programa. Ponovno ćemo napisati program isključujući komentare kako bismo usporedili ranije označavanje s najnovijim.

Možda ste u mogućnosti primijetiti da konstante omogućuju malo lakše razumijevanje programa, no mi smo i dalje bez komentara, bez brige, jer još nismo završili.

Možda postoji manji nedostatak našeg bljeskajućeg LED programa.
Za završetak svake upute potreban je 1 redoslijed sata. U slučaju da koristimo kristal od 4 MHz, svaka uputa traži 1 / 4MHz ili 1uS za završetak.

Budući da koristimo samo pet uputa, LED bi se aktivirao, a zatim ugasio za 5 uS. To bi moglo biti prebrzo da bi ga ljudi primijetili, osim toga, činit će se da je LED u potpunosti uključen.

Ono što bismo umjesto toga trebali postići jest stvaranje inhibicije između uključivanja i isključivanja LED diode. Teorija inhibicije je da odbrojavamo od ranije količine, pa kad dođe do nule, prestajemo brojati.

Nulta vrijednost znači zaključak kašnjenja i nastavljamo raditi svoj proces tijekom cijelog programa. Stoga je prvo što moramo učiniti odrediti konstantu koju ćemo koristiti kao svoj brojač.

Označimo ovu konstantu COUNT. Nakon toga moramo utvrditi koliko je značajan broj od kojeg ćemo početi brojati. Svakako, najveća brojka koju bismo mogli uključiti je 255, ili FFh u heksadecimalnom obliku, kao što sam već govorio u ranijem vodiču, naredba equ dodjeljuje izraz situaciji u registru.

To podrazumijeva da, bez obzira na količinu koju dodijelimo našem COUNT, ona bi se podudarala s stavkama registra. U slučaju da pokušamo odrediti vrijednost FFh, dobit ćemo pogrešku kad jednom sastavimo program.

Razlog tome je što je lokacija FFh, stoga mu ne možemo pristupiti. Stoga, kako moramo odrediti pravi broj? Svakako, trebat će mala količina bočnog promišljanja.

Ako, na primjer, možda označimo svoj COUNT na adresu 08h, to bi ukazivalo na osnovni cilj odredišta. Prema zadanim postavkama netaknuta područja postavljena su na FFh. Prema tome, ako COUNT vodi do 08h, naići ćete na vrijednost FFh dok se prvi put uključimo. Ipak, ja ti, kako možemo popraviti COUNT na drugi broj ?, sve što primjenjujemo je da prvo 'premjestimo' procjenu na ovo odredište.

Kao ilustraciju, pretpostavimo da smo željeli da COUNT ima vrijednost od 85h, ne možemo spominjati COUNT equ 85h jer je to položaj izvan tri-državnog registra za luku A. Upravo ono što postižemo je sljedeće: movlw 85hPrvi put vrijednost 85h u W registru movwf 08h

Sada ga premjestite u naš 08h registar. Nakon toga, u slučaju da izrazimo COUNT jednako 08h, COUNT bi odgovarao vrijednosti 85h. Nježno, zar ne! Stoga u početku određujemo svoju konstantu: COUNT equ 08h Nakon toga moramo COUNT smanjiti za jedan dok ne postane nula.

Jednostavno se dogodi da postoji jedna uputa namijenjena tome da to postigne za nas, korištenjem 'goto' i oznake.

Uputa koju ćemo primijeniti je: DECFSZ COUNT, 1 Ova uputa navodi 'Smanji registar (ovdje je COUNT) brojem koji prati zarez. Ako postignemo nulu, uskočite za dva mjesta naprijed. ’Prvo ga pronađimo u akciji, prije nego što ga smjestimo u svoj kurs.

Ono što smo izveli u početku uspostavljamo našu konstantu COUNT do 255. Sljedeći segment postavlja oznaku, nazvanu LABEL, blizu naše upute decfsz.

Decfsz COUNT, 1 smanjuje vrijednost COUNT za jedan i zadržava krajnji rezultat ravno u COUNT. Štoviše, provjerava da li COUNT ima vrijednost 0.

Ako se to ne dogodi, u tom slučaju program pokreće prelazak na sljedeći redak. Sada imamo deklaraciju 'goto' koja nas vraća natrag u našu decfsz uputu.

U slučaju da je vrijednost COUNT jednaka, tada naredba decfsz rezultira da naš program preskoči 2 mjesta unaprijed i šalje se tamo gdje smo tvrdili da 'Carry on here'.

Stoga, budući da možete primijetiti, pokrenuli smo program da predodređeno vrijeme sjedne na jedno mjesto unaprijed. To bi se moglo nazvati petljom odgode.

Razumijevanje petlji odgode

U slučaju da zahtijeva veće odgađanje, mogli bismo provoditi jednu petlju do sljedeće. Dodatne petlje, produženo kašnjenje. Dopustite nam barem dvoje, pod pretpostavkom da želimo promatrati LED bljeskalicu. Te ćemo petlje kašnjenja smjestiti u naš program i to postići tako da mu napravimo pravi program uvođenjem komentara:

Moguće je sastaviti ovaj program nakon kojeg programa PIC. Očito, budite sigurni da pokušavate sklop provjeriti funkcionira li doista. Slijedi shema spojeva koju biste trebali konstruirati čim programirate PIC.


Bravo, mogli ste zapravo sastaviti svoj prvi PIC program, kao i konstruirati sklop za treptanje LED lampica za uključivanje i isključivanje. Do sada, u slučaju da ste pohađali ove tečajeve, možda ste naučili ukupno sedam poduka od 35, ali bez sumnje ste do sada mogli kontrolirati I / O priključke!

Biste li pokušali promijeniti petlje kašnjenja kako biste brže prikazali LED bljeskalicu - koja se čini minimalna vrijednost COUNT da bi se u biti vidjela LED bljeskalica? Ili ćete možda htjeti uključiti treću ili dodatnu petlju odgode nakon početne kako biste stabilizirali LED. jedinstvena konstanta za svaku petlju kašnjenja.

Tada biste potencijalno mogli petljati u svoje petlje kašnjenja kako biste LED bljeskalicu prikazali određenom brzinom, na primjer nakon sekunde. U sljedećem uputstvu ćemo vidjeti kako možemo iskoristiti nešto što se naziva potprogramom da bismo održali program kompaktnim i osnovnim. Podprogram je sastavni dio koda ili programa koji se može zvati kada i kada vam zatreba. Podprogrami se koriste u slučajevima kada identičnu funkciju obavljate često.

Što su potprogrami

Prednosti primjene potprograma su u tome što će vjerojatno biti jednostavnije izmijeniti vrijednost jednom u potprogramu, umjesto, recimo, deset puta kroz vaš program, kao što uvelike doprinosi smanjenju razine memorije koju vaš program troši unutar PIC. Provjerit ćemo potprogram:

U početku moramo svojoj potprogramu dati oznaku, a u ovoj smo situaciji odabrali RUTINU. Nakon toga upisujemo kôd koji bismo željeli provoditi normalno. Zbog toga smo odabrali kašnjenje u našem bljeskajućem LED programu. Na kraju, potprogram zaključujemo pritiskom na tipku RETURN.

Da bismo započeli potprogram s bilo kojeg mjesta u našem programu, brzo upišemo uputu CALL, a zatim oznaku potprograma.

Razmotrit ćemo ovo malo dublje. Jednom kad dođemo do odjeljka našeg programa koji zove CALL xxx, u kojem je xxx ime naše potprograma, program skače bilo gdje gdje je instalirana potprogram xxx. Izvršavaju se upute unutar potprograma.

Kad god se izvrši naredba RETURN, program skače vraćajući se našem glavnom programu na naredbu koja slijedi nakon naše CALL xxx upute.

Sličnu potprogram moguće je nazvati nekoliko puta koliko želite, što objašnjava zašto upotreba potprograma smanjuje opće trajanje našeg programa.

Ipak, postoji nekoliko čimbenika koje biste trebali znati. U početku, kao i kod našeg osnovnog programa, prije nego što ih možete koristiti, trebate prepoznati sve specifične konstante.

Oni se mogu prepoznati u samoj potprogramu ili izravno na početku glavnog programa. Predlažem vam da sve prepoznate na početku svog glavnog programa, budući da tada prepoznajete da su stvari u identičnom položaju. Dalje, treba osigurati da glavni program preskoči potprogram.

Ono što impliciram s ovim jest da potprogram postavite izravno na završetku svog primarnog programa, osim ako koristite deklaraciju 'Goto' da biste iskočili s mjesta na kojem se nalazi potprogram, program će se nastaviti i provoditi potprogram bez obzira na to jeste li zahtijevati ili ne.

PIC ne bi razlikovao potprogram i glavni program. Provjerit ćemo naš trepćući led program, međutim ovaj put ćemo iskoristiti potprogram za petlju kašnjenja. U idealnom slučaju otkrit ćete koliko je program manje kompliciran, kao i možda kako ćete primijeniti potprogram u praksi.

Na kraju možete primijetiti da smo korištenjem potprograma za našu petlju kašnjenja možda smanjili dimenzije programa.

Svaki put kada poželimo kašnjenje, moguće kada je LED lampica uključena ili isključena, u osnovi nazivamo potprogramom kašnjenja. Na kraju potprograma, program se vraća na liniju slijedeći naše upute 'Poziv'. Na gornjoj ilustraciji uključimo LED.

Mi nakon toga kontaktiramo potprogram. Program se zatim vraća kako bismo mogli isključiti LED. Podprogram nazivamo još jednom, samo u slučaju da je potprogram dovršen, program se vraća i sljedeća uputa koju prepoznaje je 'goto Start'. Za svakoga tko bi mogao zaintrigirati, naš prvi program bio je dugačak 120 bajtova.

Korištenjem potprograma mogli bismo smanjiti veličinu programa na 103 bajta. To ne bi moglo zvučati toliko fantastično, međutim, s obzirom na činjenicu da unutar PIC-a imamo samo 1024 bajta, svaka mala količina koristi.

U sljedećem uputstvu provjerimo čitanje s luka.

Do sada smo komponirali na priključak A kako bismo mogli uključiti i isključiti LED. U ovom ćemo trenutku vidjeti kako ćemo čitati I / O igle na priključcima.

Čitanje ulaznih / izlaznih portova

To je točno kako bi se osiguralo da možemo povezati vanjski krug i utjecati na sve specifične izlaze koje on nudi.

Ako pamtite iz naših ranijih tečajeva, ako želite uspostaviti I / O priključke, morali smo prijeći s banke 0 na banku 1. U početku ćemo to postići:

U ovom smo trenutku fiksirali bit 0 ulaza A za ulaz. sada moramo ispitati je li klin visok ili nizak. Da biste to postigli, možete upotrijebiti samo jednu od dvije upute:

BTFSC i BTFSS.

Uputa BTFSC označava 'Napravite test bita na registru kao i bit koji odredimo.

U slučaju da je 0, u tom slučaju izostavljamo daljnju uputu ’. BTFSS podrazumijeva 'Napravite test bita u registru i bit uspostavimo. U slučaju da je postavljeno na 1, tada zaobilazimo naredne upute.

Koji ćemo koristiti, točno određuje kako želimo da naš program reagira dok proučavamo ulazne podatke. Kao ilustraciju, u slučaju da samo čekamo da unos bude 1, tada bismo mogli koristiti BTFSS naredbu na sljedeći način:

Kod ovdje:

BTFSS PortA, 0Započnite Nosite ovdje:
:

Program bi se samo prebacio na 'Carry on here' pod uvjetom da je bit 0 na PortA zakazan za 1.

Trenutno ćemo napisati program koji bi mogao pokretati LED diodu jednom brzinom, no ako je prekidač ograničen, LED bi bljesnuo dva puta sporije.

Moguće je da ovaj program vježbate sami, ipak smo popis nekako ugradili.

Možete pokušati i napisati cijeli program kako biste provjerili jeste li razumjeli principe. Koristit ćemo ekvivalentni krug kao i prije, uz uključivanje sklopke pričvršćene RA0 PIC-a i pozitivne razvodnice naše opskrbe.

Ono što smo ovdje postigli jest uključiti LED. Naknadno utvrđujem je li sklopka zatvorena.

U slučaju da je ograničen, sljedeći ću se spojiti na našu potprogram kašnjenja. To nam osigurava ekvivalentno kašnjenje kao i prije, no u ovom trenutku kontaktiramo ga dva puta.

Ista stvar odnosi se i kad god je LED isključena. U slučaju da prekidač nije isključen, tada imamo prethodno snimljena razdoblja uključivanja i isključivanja.

Slijedite li ove lekcije od početka, možda želite shvatiti da ste trenutno otkrili deset od 35 uputa za PIC 16F84! I svaki se dio toga nauči pukim uključivanjem i isključivanjem LED diode.

Do sada smo sastavili kako PIC trepće i uključuje i isključuje LED.

Poslije smo bili u mogućnosti s našim PIC-om uključivanjem prekidača, varirajući tako brzinu bljeskalice.

Učinkovito korištenje memorijskog prostora

Jedino je pitanje što je program prilično dugotrajan i prilično neučinkovit u memorijskom prostoru. Činilo se u redu dok sam prvi put uključivao naredbe, no trebao bi postojati lakši način izvršenja. Pozitivno postoji, analizirat ćemo kako smo doslovno uključivali i isključivali LED.

movlw 02hmovwf PORTAmovlw 00hmovlw PORTA

Isprva smo napunili svoj w registar sa 02h, nakon čega smo ga prenijeli u naš PortA registar kako bismo uključili LED. Da bismo ga isključili, spakirali smo w s 00h nakon čega smo ga prebacili u naš PortA registar.

Između svih ovih rutina bili smo prisiljeni stupiti u kontakt s potprogramom kako bismo osigurali da možemo promatrati LED kako treperi.

Stoga smo trebali nekoliko puta prenijeti dva skupa informacija (jednom u w registar, a zatim u PORTA), kao i pozvati potprogram dva puta (jednom uključeno pa jednom isključeno). Dakle, kako bismo to mogli postići s dodatnom učinkovitošću? Jako jednostavno.

Koristimo različite upute poznate kao XORF. Uputa XORF radi ekskluzivnu ILI funkciju na registru koju odredujemo s podacima koje pružamo. Vjerujem da moram pojasniti što je u svijetu Ekskluzivno ILI prije nego što nastavimo. U slučaju da imamo dva ulaza i jedan izlaz, ulaz može biti samo 1 ako i dok god se dva ulaza razlikuju. Iako su isti, tada će izlaz vjerojatno biti 0. Slijedi tablica istine za pojedince koji odluče provjeriti sljedeće:

A B F0 0 00 1 11 0 11 1 0

U ovom ćemo trenutku provjeriti što se događa ako B učinimo baš kao i naš raniji izlaz i jednostavno promijenimo vrijednost A:

A B F
0 0 0
0 0 0
1 0 1
1 1 0
1 0 1

Ako zadržimo vrijednost A jednaku 1, a mi je Isključivo ILI s izlazom, izlaz bi se prebacio. U slučaju da to ne možete primijetiti iz tablice istine, dolje se može svjedočiti upotrebom binarnog:

0 Trenutni izlaz
EX-ILI s 1 1 novim izlazom
EX-ILI s 1 0 novih rezultata

Možda možete pronaći da ćemo isključivanjem OR-a na izlaz s 1 sada prebacivati ​​izlaz s 0 na 1 na 0.
Dakle, za uključivanje i isključivanje LED diode potrebno nam je samo nekoliko rečenica:

MOVLW 02h
XORWF VRATA, 1

Ono što ćemo točno postići je dodavanje našeg registra za 02h. Mi smo u tom slučaju Ekskluzivni ILI postavljamo ovaj broj bez obzira na to što je na našoj PortA. U slučaju da je bit 1 1, promijenit će se u 0. U slučaju da je bit 1 0, promijenit će se u 1. Ispitajmo ovaj kod jednom ili dvaput, kako bismo prikazali kako se binarno izvodi:

VRATA
00010
xorwf 00000
xorwf 00010
xorwf 00000
xorwf 00010

Zapravo ne moramo svaki put učitavati identičnu vrijednost u svoj w registar, stoga je to moguće izvršiti jednom na početku i jednostavno se vratiti na našu naredbu za prebacivanje. Uz to, ne bismo trebali popraviti vrijednost na našem PortA registru. Razlog? Sigurno, budući da je u slučaju uključivanja 1, možemo ga lako prebaciti. Ja, alternativno 0 pri uključivanju, čak bismo i sada to prebacili.

Stoga biste željeli vidjeti naš novoformirani kod. Prvi predstavlja naš trepćući LED kod, dok drugi prikazuje onaj s dodatkom prekidača:

Poželimo da saznate da smo jednostavnim korištenjem jedne jednostavne upute sada smanjili opseg našeg programa. Istina je, da bismo prikazali za koliko bismo mogli smanjiti svoje programe, pokazali smo dva programa, upravo ono što su sastavljeni i njihove dimenzije u donjoj tablici:

Promijenite dimenzije programa (bajtovi)
Bljeskalica LED Original 120
Dodan je trepereći LED potprogram 103
Trepćuća LED XOR funkcija korištena 91
LED s prekidačem Original 132
Korištena LED dioda s prekidačem XOR 124.

Stoga, ne samo da smo otkrili nekoliko novih uputa, već smo sigurno i smanjili veličinu skriptiranja!

U nastavku ćemo analizirati kako možete miješati pojedine bitove, provoditi određene jednostavne aritmetike, kao i tablice podataka.

Logički menadžeri

U okviru zadnjeg tutorijala predstavio sam operaciju Exclusive OR. Funkcija ExOR shvaća se kao logički operator.

Unutar ovog vodiča osvijetlit ću dodatne logičke operatore koje PIC promovira. U point programima neće biti bilo kakvih slučajeva, međutim Naučit ćemo jednostavne metode za upotrebu operatora primjenom malih područja koda.

I funkcija AND u osnovi analizira dva bita i daje 1 jesu li isti, a 0 ako su prepoznatljivi. Na primjer, ako smo spomenuli 1 I 1, ishod je 1, dok bi u slučaju da smo proglasili 1 I 0 posljedica bila 0.

Nepotrebno je reći da smo u mogućnosti procijeniti i riječi, kao i sve što postiže funkcija AND, pregledava dva pojma malo po malo. Primjer u nastavku prikazuje dvije 8-bitne riječi koje zajedno s proizvodom postaju ANDed:

11001011
I 10110011
Jednako 10000011

Nadam se da se slažete, ishod će jednostavno imati 1 kad god se 2 1 ruku pod ruku u paru riječi. Na primjer, možemo koristiti funkciju AND za provjeru priključaka.

U slučaju da provjeravamo nekoliko U / I pinova koji su povezani s krugom, i trebali bismo pripaziti na određenu situaciju u kojoj je samo nekoliko pinova visoko, u tom slučaju možemo prilično pročitati luka, nakon čega I ishod sa stanjem koje ispitujemo, identično gornjoj instanci.

PIC nam pruža dva sastojka za I.
Oni su ANDLW i ANDWF. ANDLW nam dopušta da izvršimo funkciju AND s detaljima W registra i iznosom koji odredimo.

Sintaksa je: ANDLW pri čemu je upravo ono čemu idemo I sadržaj W-a.

Posljedica funkcije AND pohranila bi se izravno u W registar.
ANDWF nam omogućuje izvršavanje funkcije AND na W registru i drugom registru, na primjer PORT. Sintaksa je: ANDWF, d u kojem je registar kojim smo oduševljeni, na pr. PORTA, a d prikazuje PIC gdje biste trebali smjestiti rezultat. Ako je d = 0, ishod se stavlja u W registar, a od d = 1 krajnji rezultat se sprema u registar koji smo odredili. Dva dijela donjeg koda prikazuju dobar primjer svake funkcije AND.

Inicijal ispituje status PORTA-e, u kojem moramo provjeriti jesu li ulazi 1100. Ishod možemo vratiti natrag u W registar

movlw 1100
ANDWF 05h, 0Druga ilustracija sada može provjeriti sadržaj W registra:
ANDLW 1100

ILI

Do sada smo otkrili jednu funkciju OR, točnije XOR. To se razvija u 1 ako dva bita nisu ista, ali su različita. Možete pronaći drugu funkciju ILI koja se naziva IOR, a koja uključuje ILI. Ova će funkcija generirati 1 u slučaju da je bilo koji bit 1, ali dodatno ako su svi bitovi 1. Ispod je jasna tablica istine koja to ilustrira:

A B O / P
0 0 0
0 1 1
1 0 1
1 1 1

Što su aritmetički operatori

DODATI

Ova funkcija ostvaruje ono što obično tvrdi. Donosi dvije brojke! U slučaju da posljedica zbrajanja dviju brojki premaši 8 bita, u tom će se slučaju vjerojatno postaviti zastavica CARRY. Zastava CARRY nalazi se na adresi 03h bit 0.

Kada je ovaj bit zakazan, tada su dvije brojke premašile 8 bitova. Kada je 0, u tom se slučaju posljedica nalazi unutar 8 bita. Kao i prije, PIC nam nudi dva stila ADD-a, posebno ADDLW i ADDWF. Kao što ste mogli pretpostaviti, ovo je vrlo slično gornjoj funkciji. ADDLW nudi sadržaj W registra prema onome što odredimo. Sintaksa je: ADDLW ADDWF dodaj sadržaj W registra i nekog drugog registra koji mi odredimo.

Sintaksa je: ADDWF, d je gdje

POD

U ovom trenutku pretpostavljam da ne možete pretpostaviti što ova funkcija provodi! Doista, sumnjali ste, ova funkcija
oduzima jedan bit od drugog. Ponovno nam PIC pruža dva ukusa: SUBLW i SUBWF. Sintaksa je upravo slična funkciji ADD, osim što očito upisujete SUB umjesto ADD!

Povećanje U slučaju da želimo uključiti 1 na broj u PIC, mogli bismo apsolutno iskoristiti funkciju ADD i koristiti broj jedan. ~ Teškoća je u tome što lik prvo moramo smjestiti u W registar, a zatim upotrijebiti ADDLW 1 kontrolu da bismo ga povećali. U slučaju da smo željeli uključiti 1 u registar, to može biti još gore. Prvo moramo staviti broj 1 u W registar, nakon toga upotrijebiti ADDWF, 1. Stoga, na primjer, da bismo uključili 1 na mjesto 0C, recimo, trebali bismo posjedovati sljedeći dio skripte:

movlw 01
addwf 0c, 1

Postoji lakša metoda provođenja ovoga. Možemo izvršavati naredbu INCF. Sintaksa je: INCF, d gdje je, registar ili mjesto koje nas zanima, a d prikazuje PIC gdje biste trebali smjestiti ishod. U slučaju d = 0, ishod je unutar W registra, a u slučaju d = 1, posljedica se postavlja u registar koji smo odredili.

Korištenjem ove pojedinačne upute zapravo možemo pedeset posto kodiranja. U slučaju da smo željeli da se ishod vrati u W registar, u tom slučaju koristeći gornju instancu, možda bismo morali uključiti dodatnu naredbu za prebacivanje stavki 0C natrag u W registar, nakon čega 0C registar vratimo na no bez obzira što je to bilo.

Postoji naredba prirasta. To je INCFSZ. Ova naredba može povećati registar koji odredimo, međutim ako je registar jednak 0 nakon povećanja (to će se dogoditi dok uključujemo 1 do 127), nakon toga će PIC vjerojatno proći sljedeću uputu. Dio donjeg koda odražava ovo:

Petlja incfsz 0C
Idi u petlju
:
:
Ostatak programa.

U gornjem dijelu koda 0C će se povećati za 1. Sljedeći smo vlasnik upute koja obavještava PIC da se vrati na našu oznaku zvanu Loop i 0C ponovo poveća za 1. To se nastavlja sve dok 0C ne izjednači 127. U ovoj okolnosti, kada 0C povećamo za 1, 0C će se sada podudarati s 0. Naša INCFSZ uputa mogla bi vrlo dobro obavijestiti PIC da izostavi sljedeću naredbu, koja je u ovom slučaju goto deklaracija stoga će PIC nastaviti s preostalim dijelom programa.

Dekrement

Dosad smo raspravljali o funkciji smanjenja na ranijem treningu, stoga je više neću revidirati.

Upotpuniti, dopuna

Konačna uputa u ovoj raspravi preokrenula bi svaki bit u registru koji odredimo. Sintaksa je: COMF, d u kojoj

Razumijevanje radnji bitova

To bi se moglo koristiti, na primjer, za brzu zamjenu pinova porta s izlaza na ulaz i tako dalje. Bit funkcije omogućuju nam oblikovanje jednog bita unutar izraza. Omogućuju nam da nastavimo, postavljamo i rješavamo pojedinačne bitove u registrima ili brojevima koje odredimo.

Na kraju ovog tečaja otkrit ćemo program osmišljen za stvaranje niza lampica za sekvenciranje koje idu naprijed, a zatim obrnuto. To smo primijetili ranije postignuto kada smo ispitivali ekskluzivnu funkciju OR, pri čemu smo ekskluzivno OR uređivali portove izrazom. Do sada smo primijetili nekoliko bitnih funkcija kada uspostavimo portove na PIC-u i

Dopustite mi da ponovim njihovo korištenje ovdje.

BCF

Ova će uputa izbrisati dio koji smo odredili u registru koji smo odredili. Sintaksa
je:
BCF,

To smo ranije upotrijebili za promjenu sa stranice 1 na stranicu 0 uklanjanjem malo u STATUS registru. Također ga možemo koristiti da popravimo bit na 0 u bilo kojem drugom registru / mjestu. Na primjer, u slučaju da želimo postaviti treći bit u 11001101 spremljenom u odjeljku 0C na 0, mogli bismo
umetnuti:

BCF 0C, 03

BSF

Ova će uputa popraviti bilo koji bit koji odredimo na 1 u bilo kojem registru koji naznačimo. To smo koristili ranije da bismo nastavili sa stranice 0 na stranicu 1. Sintaksa je: BSF ,, i koristi se u točno istoj metodi kao i BCF gore.

BTFSCUs do sada smo mogli postaviti ili očistiti malo u registru. Međutim, zamislite trebamo li u osnovi provjeriti je li bit 1 ili 0 u registru?

Sigurno je moguće koristiti BTFSC. Navodi se Registar ispitivanja bitova F i Preskoči ako je jasno. Ova će uputa analizirati bit koji označimo u registru. U slučaju da je bit 0, uputa će obavijestiti PIC-a da proslijedi sljedeću uputu.

Ovu bismo uputu mogli koristiti u slučaju da želimo provjeriti zastavicu, na primjer zastavicu za nošenje. To nas štedi potrebe za čitanjem STATUS registra i traženjem pojedinih bitova kako bismo saznali koje su zastavice fiksne. 29 Na primjer, u slučaju da želimo provjeriti je li zastava Carry postavljena na 1 nakon što smo dodali 2 brojke, tada bismo mogli upisati sljedeće:

BTFSC 03h, 0
nastavi ovdje ako je postavljeno na 1
ili ovdje ako je postavljeno na 0

U slučaju da je status bita 1, u tom bi slučaju bila dovršena uputa nakon BTFSC. U slučaju da je postavljeno na 0, u tom slučaju se slijedeća uputa preskače. Sljedeći dio eksponata koda u kojima bi se mogao koristiti:

Petlja :
:
:
BTFSC 03,0
Idi u petlju

U gornjem kodu, PIC će jednostavno izaći iz petlje u slučaju da je bit 0 registra STATUS (ili zastava Carry) definiran na 0. Inače, izvršila bi se naredba goto.

BTFSS

Ova uputa navodi Registar za testiranje bitova F i preskoči ako je postavljen. To se može usporediti s BTFSC naredbom, osim što bi PIC izostavio sljedeću uputu ako je bit koji smo procijenili postavljen na 1, umjesto na 0.

CLRF

Ova će uputa popraviti sve detalje registra na 0. Sintaksa je:

CLRF
To smo ranije upotrijebili za postavljanje izlaza luka na 0, primjenom CLRF 85h. Nadalje smo ga upotrijebili da popravimo priključke kako bi uključili sve pinove za izlaz upotrebom CLRF-a
05h.

CLRW

Ovo bi moglo nalikovati CLRF uputama, osim brisanja W registra. Sintaksa je prilično jednostavna:

CLRW

RLF i RRF

Ovi bi smjerovi malo transportirali u registar, jedan utor lijevo (RLF) ili desno (RRF) u registru. Na primjer, ako nam je trebalo 00000001 i zaposlili smo RLF, u tom bismo slučaju mogli posjedovati 00000010. U ovom trenutku, što se događa u slučaju da postoji 10000000 i primijeni RLF naredbu? Sigurno bi 1 bio postavljen u zastavu za nošenje. U slučaju da smo još jednom primijenili RLF uputu, 1 bi se ponovno pojavio na početku. Jednako se događa, međutim suprotno, za RRF upute. Slučaj u donjoj točki pokazuje ovo za RLF instrukciju, u kojoj Mi možemo vidjeti 8 bitova registra, kao i zastavu za nošenje:

C 87654321
0 00000001
RLF 0 00000010
RLF 0 00000100
RLF 0 00001000
RLF 0 00010000
RLF 0 00100000
RLF 0 01000000
RLF 0 10000000
RLF 1 00000000
RLF 0 00000001

Primjer programa

Sad ćemo vidjeti primjer koda koji se može kompilirati i pokretati. To bi generiralo svjetlost za sekvenciranje koja započinje na PortA bitu 0, ide na PortB bit 8 i
zatim se vraća.
Priključite LED diode na svaki od priključaka. Imat ćemo malo
postupci istaknuti u ovom vodiču.

TIME EQU 9FH Varijabla za petlju odgode.
PORTB EQU 06H Adresa priključka B.
Adresa TRISB EQU 86H Luka B Tristate.
PORTA EQU 05H Luka Adresa.
Adresa TRISA EQU 85H Port A Tristate.
STATUS EQU 03H Registar za odabir stranice.
COUNT1 EQU 0CH registar petlje.
COUNT2 EQU 0DH Registar petlje.

BSF STATUS, 5 Idite na stranicu 1
MOVLW 00H i postavite
MOVWF TRISB i luke A i B
MOVLW 00H za izlaz,
MOVWF TRISA, a zatim se vratite u
STATUS BCF-a, 5. stranica 0.
MOVLW 00H Čisti priključak A.
MOVWF VRATA

Početak glavnog programa

RUNMOVLW
01H Postavite prvi bit MOVWF
PORTB na luci B.CALL
ODLOŽITI Pričekajte neko vrijeme POZOVITE
ODGODITI
Pomaknite bit na priključku B ulijevo, a zatim pauzirajte.RLF
PORTB, 1 POZIV
ODGODNI POZIV
ODLOŽENJE
PORTB, 1 POZIV
ODGODNI POZIV
ODLOŽENJE
PORTB, 1 POZIV
ODGODNI POZIV
ODLOŽENJE
PORTB, 1 POZIV
ODGODNI POZIV
ODLOŽENJE
PORTB, 1 POZIV
ODGODNI POZIV
ODLOŽENJE
PORTB, 1 POZIV
ODGODNI POZIV
ODLOŽENJE
PORTB, 1 POZIV
ODGODNI POZIV
ODLOŽENJE
PORTB, 1 Ovim se bit premješta u zastavu za nošenje
Sada se pomaknite na priključak A i pomaknite bit lijevo.RLF
PORTA, 1 Ovim se bit pomiče s nulte zastavice u PortACALL
ODGODNI POZIV
VRATA, 1 POZIV
ODGODNI POZIV
ODLOŽENJE
VRATA, 1 POZIV
ODGODNI POZIV
ODLOŽENJE
VRATA, 1 POZIV
ODGODNI POZIV
ODGODITI
Vratite bit natrag na priključak ARRF
VRATA, 1 POZIV
ODGODNI POZIV
DELAYRRF
VRATA, 1 POZIV
ODGODNI POZIV
DELAYRRF
VRATA, 1 POZIV
ODGODNI POZIV
DELAYRRF
PORTA, 1 Ovim se bit pomiče u nultu zastavicu. Sada pomaknite bit
natrag na luku BRRF
PORTB, 1 POZIV
ODGODNI POZIV
DELAYRRF
PORTB, 1 POZIV
ODGODNI POZIV
DELAYRRF
PORTB, 1 POZIV
ODGODNI POZIV
DELAYRRF
PORTB, 1 POZIV
ODGODNI POZIV ODGODI RRF
PORTB, 1 POZIV
ODGODNI POZIV
DELAYRRF
PORTB, 1 POZIV
ODGODNI POZIV
DELAYRRF
PORTB, 1 POZIV
ODGODNI POZIV
ODLOŽENJE Sad smo se vratili tamo gdje smo započeli, GOTO
TRČI idemo opet.

Postoji izvrsna opcija u skupu treninga koja vam omogućuje upotrebu tablice podataka.

Tablica podataka samo je popis citata podataka, u kojem se sve pregledava na temelju nekoliko razmatranja.
Na primjer, mogli biste imati sklop koji koristi PIC koji broji koliko slučajeva ulazni pin postane visok za 1 sekundu. Nakon toga možete prikazati broj na 7-segmentnom zaslonu.

Čim se pokrene mjerenje vremena, PIC započinje računati koliko je puta igla previsoka. Nakon jedne sekunde posjeti stol i pregleda podatke, na zaslonu mora prikazati broj koji simbolizira količinu situacija koje je pin dobio visoko. To može biti korisno, jer ne određujemo koliki bi mogao biti iznos dok PIC ne izvrši procjenu.

Koristeći tablicu, možemo omogućiti PIC-u da odredi koju će figuru prikazati. U ovom trenutku, prije nego što vam nastavim pokazivati ​​kako funkcionira tablica podataka, možda ću vam morati reći da PIC održava put do mjesta boravka u programu u kojem se nalazi dok program radi.

Olakšava onima koji su izveli određeno programiranje u BASIC-u. Inače, ne brinite, možda biste željeli i dalje učiti o teoriji. Zamislite da postoji BASIC program sličan dolje predstavljenom:

10 GODINA K = 0
11 K = K + 1
12 AKO K> 10 ONDA IDITE 20 OSTALO IDITE 11
20 TISAK K
21 KRAJ

Program započinje u retku 10. Čim je K zakazano za 0, slijedi prelazak u red 11. Nakon što smo uključili 1 do K, nakon toga nastavljamo do 12. retka.

U ovom trenutku možda bismo bili znatiželjni je li K veći od 10. U slučaju da jest, sljedeći put idemo na redak 20, ili se pak vratimo na red 11.

Redak 20 dokumentira K, a redak 21 zaključuje program. BASIC koristi linijsku statistiku kako bi pomogao programeru da vodi evidenciju o problemima jer oznake nisu odobrene. PIC zapošljava etikete za bijeg između odredišta - ili može doista?

Oznake koristimo da bismo bili svjesni gdje se nalaze problemi, kao i da bismo na jednostavan način mogli obavijestiti PIC gdje tražiti.

Upravo ono što se događa je da PIC koristi prednost brojača unutarnjih linija koji se naziva Programski brojač. Trag programskog brojača (skraćeno od PC) memorijskog odredišta gdje je sadašnja uputa.

Kad god obavijestimo PIC da posjeti odabranu naljepnicu, on razumije mjesto memorije i stoga povećava računalo dok ne vidi to odredište memorije. To je potpuno ista metoda kao što smo provjerili gore navedeni program BASIC. Ispod je segment koda, s memorijskim prostorima ili stavkama računala, pored svake upute:

Upute za računalo0000 movlw 03
0001 movwf 0C
0002 Petlja decfsc 0C
0003 goto Loop
0004 kraj

U gornjoj demonstraciji, Fiksirali smo računalo na 0000. O tome imamo uputu movlw 03. Kada PIC implementira ove podatke, povećava PC kako bi se naredna uputa skenirala. U ovom trenutku PIC pregledava movwf 0C. Računalo se još jednom povećava.

Sada PIC proučava decfsc 0C. U slučaju da detalji 0C nisu 0, u tom slučaju računalo se uvećava za 1, kao i sljedeća uputa goto Loop, obavještava računalo da se vrati na položaj 0003, a to je spomenuta petlja. U slučaju da su detalji 0C 0, PC se savjetuje da poveća za 2, jednostavno izostavite sljedeću uputu.

Razumijevanje tablica podataka

To postavlja računalo na poziciju 0004, u kojoj se program završava. Odredišta određuje asembler i općenito nas ne bi trebalo brinuti što PC postiže. Do tada nalazimo potrebu da ga stavimo pod kontrolu baš kao i dok radimo kada koristimo tablice podataka. Najprikladniji način opisivanja funkcioniranja tablice podataka je započeti ilustracijom.

PC equ 02
movlw 03
pozivni stol
:
tablica addwf PC
retlw 01
retlw 02
retlw 03
retlw 04
retlw 05
retlw 06
retlw 07
povratak

Početna uputa je dodjela naljepnice PC adresi programskog brojača (02h). Uskoro ćemo nakon unosa vrijednosti 03h u w registar. Mi nakon toga komuniciramo za stolom. Najistaknutiji redak u tablici potprograma uvećava detalje W registra (03h) na brojač programa.

To pokreće podizanje brojača programa za 3, ili drugačije rečeno, stimulira brojač programa da se spusti za 3 reda. Dok brojač dolazi 3 reda niže, PIC prepoznaje naredbu retlw. Ova naredba šalje vrijednost koja slijedi u W registar, nakon čega se vraća iz potprograma. RETLW u osnovi označava Povratak, doslovno prema W.

Vidi, stavio sam zarez nakon riječi Povratak. Budući da smo u potprogramu, trebamo uputu za povratak na njegovu površinu. Stoga RET u uputi. Nakon naredbe RETLW nalazi se broj, a to je upravo ono što se stavlja u W registar.

U ovom je slučaju to slika 3. Mogli bismo odrediti bilo koju količinu u W registar, sve dok se ta brojka kombinira s Programskim brojačem u potprogramu tablice, otkrit ćemo uputu za povrat. Na gornjoj ilustraciji to implicira da možemo imati bilo koji broj od 1 do 7. U slučaju da prođemo ispod potprograma, možda ćemo moći završiti s izvođenjem dodatnog odjeljka programa. Iz tog razloga, obično je pametan potez smjestiti tablicu podataka točno na kraj programa PIC, pa ako u tom slučaju pretjeramo, ionako ćemo doći do zaključka programa.

Tema prekida možda će biti najduža i najteža do kraja.

Ne možete pronaći nekompliciranu metodu detalja prekida, no s malo sreće na kraju ovog dijela možda ćete moći primijeniti prekide u vlastite programe.
Podijelili smo odjeljak u 2 faze. To će omogućiti razdvajanje teme na odjeljke, a također i pružanje praktičnog pribora za lako razumijevanje.

Što je točno prekid? Sigurno je, kako pojam označava, prekid tehnika ili signal koji sprečava mikroprocesor / mikrokontroler od bilo čega što izvodi da se može dogoditi nešto drugačije.

Dopustite mi da vam dam dnevnu ilustraciju. Mislite da se opuštate u vlastitom domu i razgovarate s drugom osobom. Odjednom zazvoni telefon.

Prestanete razgovarati i zgrabite telefon da biste razgovarali s pozivateljem. Nakon telefonske interakcije, odlučite se vratiti razgovoru s osobom prije nego što je telefon zazvonio. Moguće je razmotriti glavnu rutinu dok čavrljate s nekim, zvonjenje telefona ometa vaše razgovore, a prekid rutine je način razgovora putem telefona.

Dok telefonska rasprava završava, vratite se svojoj primarnoj rutini čavrljanja. Ova je ilustracija upravo način na koji prekida procesor da bi krenuo u akciju.

Primarni program radi, izvršavajući određenu funkciju u krugu, međutim kada se dogodi prekid, primarni program se zaustavlja dok se izvodi drugačija rutina. rutina završava, procesor se vraća na primarnu rutinu kao i prije.

Razumijevanje prekida

PIC ima 4 izvora prekida. Mogli bi se podijeliti u nekoliko skupina. Dva su izvori prekida koji se prema van mogu koristiti prema PIC-u, dok su druga dva unutarnji procesi. Ovdje ću pojasniti dvije vanjske vrste. Preostala dva opisat će se u različitim vodičima kad dođemo do odbrojavanja i pohrane podataka.

Ako provjerite pin-out PIC-a, primijetit ćete da je pin 6 RB0 / INT. U ovom je trenutku RB0 očito Port B bit 0. INT predstavlja da bi se mogao konfigurirati i kao vanjski prekidački pin. Nadalje, priključci B priključka 4 do 7 (pinovi 10 do 13) također se mogu koristiti za prekide. Prije nego što uspijemo upotrijebiti INT ili neku drugu pin B, moramo izvršiti dva zadatka. Prvo moramo obavijestiti PIC da ćemo koristiti prekide.

Dalje, moramo odrediti koji ćemo pin B porta koristiti kao prekid, a ne kao I / O pin. Unutar PIC-a možete pronaći registar poznat kao INTCON, a nalazi se na adresi 0Bh. U ovom ćete registru otkriti 8 bitova koji mogu biti omogućeni ili onemogućeni. Bit 7 INTCON-a poznat je kao GIE. Ovo je Global Interrngupt Enable. Ako to popravite na 1, PIC obavještava da ćemo upotrijebiti prekid.

Bit 4 INTCON-a poznat je kao INTE, INTerrupt Enable. Stavljanjem ovog bita na 1 prenosi se na PIC da će RB0 biti prekidni pin. Konfiguriranje bita 3, nazvanog RBIE, obavještava PIc da ćemo koristiti bitove priključka B od 4 do 7. U ovom trenutku PIC razumije kada ovaj pin može biti visok ili nizak, mora zaustaviti svoje izvođenje i nastaviti s prekidom rutina. U ovom trenutku moramo obavijestiti PIC hoće li prekid vjerojatno biti na uzlaznom rubu (0V do + 5V) ili na padajućem rubu (+ 5V do 0V) transformacije signala.

Pojednostavljeno, želimo li da PIC prekida svaki put kad se signal pomakne od niskog prema visokom ili od visokog prema dolje. Delinkventnošću se može utvrditi da se to postavlja na uzlazni rub.

'Okidanje' ruba zakazano je u dodatnom registru koji se naziva OPTION registar, na adresi 81h. Bit kojim smo oduševljeni je bit 6, koji se često naziva INTEDG.

Ako postavite ovo na 1, pokreće se prekid PIC-a na montažnom rubu (zadano stanje), a postavljanje na 0 stimulira PIC da prekida na kliznom rubu. Ako želite da se PIC aktivira na rastućem rubu, tada sigurno ne morate ništa učiniti s ovim dijelom.

U ovom trenutku, nažalost, registar opcija nalazi se u banci 1, što znači da uživamo u promjeni banke 0 u banku 1, postavljanju bita u registar opcija nakon tog povratka u banku 0. Ovdje je ključno ispuniti svaki bit Banke 1 registrira se u jednom štrajku, na primjer uspostavljanjem lučkih čvorova, nakon čega se vraća u Banku 0 ako ste gotovi.

Dobro, posljedično smo obavijestili PIC koji će pin vjerojatno biti prekid i gdje će se rub pokrenuti, što se događa u programu i PIC-u svaki put kad se dogodi prekid? Održava se nekoliko stvari. Najprije je na rasporedu ‘zastava’.

To obavještava interni procesor PIC-a da je došlo do prekida. Dalje, brojač programa (o čemu sam govorio u prethodnom vodiču) daje savjete na određenu adresu u PIC-u. Brzo provjerimo sve ovo pojedinačno. Oznaka prekida U našem INTCON registru bit 1 je oznaka prekida, koja se naziva INTF. U ovom trenutku, kad god dođe do bilo kakvog prekida, ova će zastava vjerojatno biti fiksirana na 1.

Kad nema prekida, zastavica se postavlja na 0. Kao i to je gotovo sve postignuće. U ovom trenutku možda razmišljate o tome u čemu je poanta? Sigurno, iako je ova zastava predviđena za 1, PIC ne može, niti će moći reagirati na novi prekid. Stoga, izrazimo da dovodimo do prekida. Oznaka će vjerojatno biti fiksirana na 1, a PIC bi mogao ići u našu rutinu za rad na prekidu.

Kada ova zastavica nije bila fiksirana na 1, a PIC-u je bilo dopušteno da i dalje odgovara na prekid, tada bi neprekidno pulsiranje pin-a moglo zadržati PIC-a na početku naše rutine prekida, a nikako je ne dovršiti. Vraćajući se na moju ilustraciju telefona, to je slično podizanju telefona i odmah nakon što se razgovara o njemu počinje ponovno zvoniti budući da druga osoba želi razgovarati s vama.

Preporučljivo je dovršiti jedan dijalog, a zatim ponovo zgrabiti telefon da biste razgovarali s osobom koja slijedi. Možete pronaći mali problem s ovom zastavom. Iako PIC ovu zastavicu brzo postavi na 1, ne postavlja je ponovno 0! Tu aktivnost mora vršiti programer - tj. Vi. To se može postići bez napora, jer pretpostavljam, a to treba postići nakon što PIC izvrši rutinu prekida.

Mjesto memorije Kad god prvobitno uključite PIC, ili u slučaju da postoji resetiranje, programski brojač savjetuje da se adresira 0000h, što bi moglo biti odmah na početku programske memorije. Ali, u slučaju prekida, programski brojač će naznačiti adresu 0004h.

Stoga, dok sastavljamo program koji će imati prekide, prvo moramo obavijestiti PIC da preskoči adresu 0004h i održati rutinu prekida koja počinje na adresi 0004h diskretno od ostatka programa.

Ovo se može izvesti bez muke. U početku započinjemo s programom naredbom poznatom kao ORG. Ova naredba označava podrijetlo ili početak. Držimo se adrese. Budući da PIC započinje na adresi 0000h, upisujemo ORG 0000h. Nakon toga moramo zaobići adresu 0004h. To postižemo stavljanjem GOTO upute, popraćene naljepnicom koja daje savjete našem primarnom programu.

Mi se nakon toga pridržavamo ove naredbe GOTO s još jednim ORG-om, ovog trenutka s adresom 0004h. Nakon ove naredbe ubacit ćemo rutinu prekida. U ovom trenutku, možda ćemo moći ukucati našu rutinu prekida ravno nakon druge naredbe ORG, ili možemo postaviti GOTO izraz koji upućuje na rutinu prekida.

Doista je povezano s opcijom s vaše strane. Da bismo obavijestili PIC-a koji nudi da je stigao do završetka rutine prekida, moramo postaviti naredbu RTFIE prema kraju rutine. Ova naredba označava povratak iz rutine prekida. Iako PIC to primjećuje, programski brojač ukazuje na konačni položaj na kojem je bio PIC prije nego što je došlo do prekida. U nastavku smo uspostavili kratki odjeljak koda koji prikazuje gore navedeno:

Postoji nekoliko stvari o kojima biste trebali biti obaviješteni kada koristite prekide. Inicijal je obično takav da, ako možda koristite identični registar u svom primarnom programu i rutini prekida, imajući na umu da će se detalji registra najvjerojatnije promijeniti kada se dogodi prekid.

Na primjer, upotrijebimo w registar za prosljeđivanje podataka na primarni program Port A, stoga možete dodatno koristiti w registar u rutini prekida za prebacivanje podataka s jednog odredišta na drugo.

U slučaju da niste oprezni, w registar će sadržavati zadnju vrijednost koju je primio dok je bio u rutini prekida, pa će se po povratku iz prekida ove informacije dostaviti u port A, a ne vrijednost koju ste prije imali dogodio se prekid.

Sredstvo oko toga je trenutno spremanje detalja o w registru prije ponovnog korištenja u rutini prekida. Druga je činjenica da možete pronaći kašnjenje između trenutka kada se dogodi jedan prekid i kada se može dogoditi sljedeći. Iako razumijete, PIC posjeduje vanjski sat, koji bi mogao biti kristal ili kombinacija otpornika i kondenzatora.

Bez obzira na frekvenciju ovog sata, PIC ga dijeli s 4, nakon čega koristi ovo za unutarnje mjerenje vremena. Na primjer, u slučaju da imate kristal od 4 MHz povezan s vašim PIC-om, PIC bi u tom slučaju izvodio upute na 1 MHz. Taj interijer je poznat kao ciklus uputa. U ovom trenutku podatkovni list tvrdi (nesumnjivo u umanjenom tisku) da trebate omogućiti 3 do 4 runde uputa između prekida.

Moj bi bio omogućiti 4 runde. Razlog kašnjenja je što PIC zahtijeva vrijeme da preskoči na adresu prekida, zastavicu i vrati se dalje od rutine prekida. Stoga, imajte ovo na umu ako radite s alternativnim krugom kako biste aktivirali prekid za PIC.

U ovom trenutku točka je činjenica da ako kao prekid koristite bitove 4 do 7 porta B. Ne možete odabrati određene čiode na priključku B koje će funkcionirati kao prekid.

Stoga, u slučaju da dopustite ove igle, vjerojatno bi se mogle dobiti sve. Stoga, na primjer, ne možete jednostavno imati bitove 4 i 5 - bitovi 6 i 7 vjerojatno će biti istovremeno osnaženi. Koja je točno svrha dobivanja četiri bita za predstavljanje prekida? Sigurno bi vam mogao biti priključen strujni krug na PIC, u slučaju da itko od četiri reda prijeđe visoko, u tom slučaju to može biti problem na koji trebate da PIC odmah utječe.

Jedna od ilustracija ovoga mogao bi biti kućni sigurnosni alarm, u kojem su četiri senzora povezana na priključke B 4 do 7. Svaki određeni senzor može zatražiti od PIC-a da aktivira alarm, a rutina signalizacije alarma je rutina prekida. To štedi stalnu provjeru luka i omogućava PIC-u da nastavi s različitim pitanjima. U sljedećem uputstvu sastavit ćemo program za upravljanje prekidom.

U prošlom smo se tutorijalu pozabavili mnogim osnovama, stoga smatram da je došlo vrijeme da smo sastavili svoj prvi program.

Program koji ćemo napisati računati će koliko ćemo puta uključiti prekidač, a zatim prikazati broj.

Program će brojati od 0 do 9, vidljivo na 4 LED diode u binarnom obliku, zajedno s ulazom ili prekidom vjerojatno će biti na RB0.

Ono što moramo provesti je obavijestiti PIC da preskoči adresu na koju ukazuje programski brojač kad god dođe do prekida.

Primijetit ćete da Mi koristimo jedinstvenu metodu prikazivanja heksadecimalnih brojeva. Prije nego što sam se dogodio, primijenim F9h u kojem h označava heksadecimalnu vrijednost. Mogli bismo to napisati kao 0xF9, što je struktura koju ćemo odsad koristiti.

Sada moramo reći PIC-u da ćemo koristiti prekide i koristimo RB0 pin 6 kao pin prekida:

bsf INTCON, 7GIE - Omogućavanje globalnih prekida (1 = omogućiti)
bsf INTCON, 4INTE - Omogućavanje prekida RB0 (1 = omogući)
Očistit ću zastavicu za prekide za svaki slučaj (nikad ne vjerujem ni u što!)
bcf INTCON, 1INTF - Očistite bit zastavice za svaki slučaj

Trenutno moramo uspostaviti naše 2 luke. Imajte na umu da, budući da sada koristimo RB0 kao prekidni pin, ovo treba uspostaviti kao ulaz:

Upotrijebit ćemo varijablu zvanu COUNT za pohranu broja prebrojavanja. Mogli bismo jednostavno povećati vrijednost na portu A, ali vidjet ćete zašto koristim varijablu kada pišemo rutinu prekida.

Stoga je sastavljen naš glavni program i u ovom trenutku moramo obavijestiti PIC kako postupiti kad god dođe do prekida. Unutar ovog primjera naš će prekid vjerojatno biti prekidač. Samo ono što bismo željeli da PIC bude jedan od podesivih COUNT svaki put kad je prekidač ograničen.

Ipak, samo želimo pokazati koliko se puta prekidač isključuje s 0 na 9. Gore, rekao sam da bismo mogli jednostavno povećati vrijednost na portu A svaki put kad dođe do prekida. Međutim, port A ima 5 bitova, u slučaju da smo jednostavno povećali port, imat ćemo najveći broj 31. Postoji nekoliko objašnjenja zašto sam odabrao da se ne pomaknem na 31.

U početku ćemo upotrijebiti 7-segmentni zaslon koji može biti samo od 0 do 15 (0 do F u heksadecimalnom obliku). Dalje, želim vam pokazati nekoliko aritmetičkih naredbi na koje ste naletjeli u proteklih nekoliko lekcija.

Stoga ćemo nastaviti s našom rutinom prekida. Trenutno prvo što moramo postići je da nakratko pohranimo detalje svog w registra, jer to primjenjujemo za prebacivanje sadržaja COUNT u PORTA. U slučaju da ga ne spremimo, u tom bismo slučaju mogli dostaviti potpuno drugačiji broj zbog naše aritmetike. Stoga prvo učinimo to:

U ovom trenutku razumijemo je li vrijednost COUNT 9 ili više. Ono što sada trebamo postići je ako je COUNT više od 9, vratimo ga na 0 ili se vratimo na glavni program kako bismo osigurali da ga možemo dostaviti na port A. Naredba BTFSS budući da razumijete hoće li naknadno
uputa u slučaju da je zakazana oznaka za prijenos tj. COUNT = 10:

Jedino što sada preostaje je zajednički ući, kao i odrediti vrijednosti za naše konstante, koje smo u stanju izvesti odmah na početku našeg programa.

Svaki put kad aktivirate prekidač, LED će se odbrojavati u binarnom obliku od 0000 do 1010, a zatim natrag do 0000.

Sljedeća slika prikazuje shemu spojeva kompatibilnu s gore objašnjenim kodom. Zanimljivo ćete otkriti da je vremenski kondenzator uključen u dizajn. Ovo je lijep mali trik kroz koji dobivate slobodu izbjegavanja uključivanja kondenzatora u slučaju da ga za to vrijeme nemate kod sebe.

Ovdje kapacitivnost dolazi u obzir preko zalutalog kapaciteta preko oscilatornog zatiča i zemlje.
Naravno, možda se ne čini vrlo inteligentnim načinom izbjegavanja kondenzatora praktički jer se vrijednost zalutalih može razlikovati u različitim danim uvjetima.

Sljedeći odjeljak koji se može vidjeti u krugu je mreža koja raskida preko prekidača. To sprječava smetnje tijekom mehaničkog prebacivanja i sprječava da se PIC zbuni ako je prebacivanje bilo jedno ili više prekidača.




Prethodno: Programabilni dvosmjerni krug timera motora Dalje: Kako funkcioniraju krugovi s pojačanim pojačanjem