Tutorial PIC: de registres a interrupcions

Proveu El Nostre Instrument Per Eliminar Problemes





Abans d’entrar en els detalls mínims de la programació PIC, primer seria important aprendre uns quants bons mètodes de programació.

Comprensió dels registres

Per començar, suposem que escriviu un (punt i coma) en qualsevol punt del programa, el compilador ignorarà tot el que passi després d’aquest punt i coma, fins que, per descomptat, el carro torni a estar a la posició.



La funció anterior ens permet afegir comentaris o comentaris de manera que no passin a formar part del programa, tot i que ens facilita identificar el programa amb l'ajuda dels comentaris al costat. Posar comentaris és una pràctica recomanable mentre es programa qualsevol IC.

La següent cosa important del curs és assignar noms a les diferents constants (els aprendreu més endavant de manera elaborada). Això fa que sigui més fàcil entendre a què s’escriu o sobre els valors implicats, en lloc de confondre’s amb els números inclosos.



L’anterior s’ha de fer en forma de noms reals per al reconeixement instantani, per exemple COUNT, seria important tenir en compte que aquí s’utilitzen totes les majúscules per diferenciar-lo i també indicar que és un valor constant.


Com podem veure, l’anterior es fa en forma de caixa feta de punts i coma, cosa que fa que sembli més net. A més, proveu de documentar el programa en paper també, aquesta pràctica us ajudarà a entendre les coses d'una manera senzilla.

2. Els registres.

El registre dins d'un PIC és una àrea que accepta detalls escrits i permet llegir-ne. Podeu comparar-lo amb un full de paper on podeu visualitzar el contingut i afegir-hi també escrivint-hi.

La figura següent mostra un mapa de fitxers de registre típic incrustat dins d’un PIC16F84. El format no s’estableix dins del PIC, sinó simplement per indicar com es poden disposar els bits dins del xip i per entendre algunes de les ordres implicades.

Podeu veure que bàsicament es divideix en el banc 0 i el banc 1. El banc 1 s’encarrega de controlar el funcionament real del PIC, per exemple, que comunica al PIC quins bits del port A s’assignen com a entrades i quines són com a sortides.

El banc 2 és només per manipular la informació.

Anem a entendre-ho a través de l’exemple següent:

Suposem que desitgem assignar un bit a PortA high. Per a això, primer hauríem d’anar al banc 1 per establir el bit o pin especificat al port A en forma de sortida. Després d'això, tornem al banc 0 i lliurem una lògica 1 (bit 1) a aquest pin específic.

Els registres més comuns que ens agradaria utilitzar al banc 1 són STATUS, TRISA i TRISB.

STATUS ens ajuda a tornar al banc 0, TRISA ens permet escollir quins pins del port A són sortides i quines poden ser entrades, mentre que TRISB facilita la selecció entre el pin de sortida i d’entrada al port B. El registre SELECT de BANK 0 permet a l’usuari per passar al banc 1.

Resumim tot el concepte amb la següent descripció:

ESTAT:

Per canviar del banc 0 al banc 1, comandem el registre STATUS. Això s’implementa configurant el bit número 5 del registre STATUS a 1. Per tornar al banc 0, assignem el bit 5 del registre STATUS a 0. El registre STATUS es troba a l’adreça 03h, aquí h significa tat el número pot ser en hexadecimal.

TRISA i TRISB:

Es troben a la direcció 85h i 86h corresponentment. Per programar un pin com a sortida o entrada, només lliurem un zero o un al bit concret del registre. Ara es pot fer de dues maneres, mitjançant binari o hexadecimal. En cas que un no pugui convertir el paràmetre, pot optar per una calculadora científica per implementar els valors.

Ara tenim 5 pins al port A, que correspon a 5 pins. Si pretenem arreglar un dels pins com a entrades, lliurem un '1' al bit concret.

En cas que volguéssim assignar un dels pins com a sortides, establiríem el pin específic a '0'. Els bits es redueixen exactament en funció dels bits, o més exactament el bit 0 és RA0, el bit 1 seria RA1, el bit 2 = RA2 i així successivament. Entenguem-ho d’aquesta manera:

Suposem que voleu corregir RA0, RA3 i RA4 com a sortides, mentre que RA1 / RA2 com a i / ps, ho faríeu enviant 00110 (06h). Comproveu que el bit 0 és cap a la dreta tal com s’indica aquí:

Port A Pin RA4 RA3 RA2 RA1 RA0

Número de bits 4 3 2 1 0

Binari 0 0 1 1 0

El mateix passa amb TRISB.

PORTA i PORTB

Per oferir un dels pins de sortida alts, només oferim un '1' per introduir el bit respectiu al nostre registre PORTA o PORTB. Es pot seguir un procediment idèntic també per als registres TRISA i TRISB. Abans d’entrar en el primer exemple de codificació, entenguem un cupé de més registres, a saber: w i f.

O i F

El registre W és un registre ordinari que us permet assignar qualsevol valor que trieu. Tan bon punt assigneu una magnitud a W, podeu procedir afegint-lo a un altre valor o simplement moure'l. Amb un altre valor assignat, els detalls simplement se sobreescriuen a W.

El registre F reenvia la seva matèria escrita a un registre. Necessitaríem que aquest registre F assigni un valor sobre un registre, pot ser sobre els registres STATUS o TRISA, ja que no ens permetran posar els valors directament sobre ells. Un programa d’exemple

Examinem el següent exemple de codi que ens mostrarà com s’implementa la instrucció anterior i que també seria testimoni d’algunes de les instruccions del curs.

Comencem solucionant el port A tal com es va esmentar anteriorment.

Per a això, hem de passar del banc 0 al banc 1, per fer-ho configurant el registre STATUS situat a l’adreça 03h, bit 5 a 1.

BSF 03h, 5

El BSF significa el conjunt de bits F. Estem utilitzant dos números després d’aquesta instrucció: 03h, que és l’adreça del registre STATUS, i el número 5 que correspon al número de bits.

Per tant, el que diem és 'Estableix el bit 5 a l'adreça 03h a 1'.

Ara som al banc 1.

MOVLW 00110b

Introduïm el valor binari 00110 (la lletra b significa que el número està en binari) al nostre registre de propòsit general W. Naturalment, ho hauria pogut fer en hexadecimal, en aquest cas la nostra instrucció seria:

MOVLW 06h

Qualsevol dels dos funciona. MOVLW significa 'Moveu el valor literal a W', que en anglès significa posar el valor que segueix directament al registre W.

Ara hem de posar aquest valor al nostre registre TRISA per configurar el port:

MOVWF 85h

Aquesta instrucció indica 'Moveu el contingut de W a l'adreça de registre que segueix', en aquest cas l'adreça fa referència a TRISA.

El nostre registre TRISA en aquest moment porta la figura 00110 o es presenta gràficament:

Port A Pin RA4 RA3 RA2 RA1 RA0

Binari 0 0 1 1 0

Entrada / Sortida O O I I O

Per tant, ara tenim els passadors del port A, hem de tornar al banc 0 per ajustar una de les dades.

BCF 03h, 5

Aquesta instrucció realitza el revers de BSF. Implica 'Bit Clear F'. El parell de números que corresponen són l'adreça del registre, aquí el registre STATUS, així com la xifra de bits, en aquest cas el bit cinc. El que hem completat exactament actualment és el bit cinc definit al nostre

REGISTRE D'ESTAT a 0

En aquest moment hem tornat al banc 0.
A continuació es mostra el codi en un bloc:

BSF 03h, 5 Aneu al banc 1
MOVLW 06h Posa 00110 a W
MOVWF 85h Mou 00110 a TRISA
BCF 03h, 5 Torna al banc 0

Dins de la darrera instrucció, us vam confirmar la manera d’establir els pins del port IO al PIC per tal d’entrada o sortida.

Amb aquest curs, deixeu-me ajudar-vos a enviar dades als ports.

Enviament de dades als ports

En el següent tutorial, completarem intermitent un LED encès i apagat que consisteix en un detall complet del programa i un diagrama de circuits senzill perquè pugueu veure el PIC realitzant exactament el que esperem.

No intenteu ajuntar i programar el vostre PIC amb els resultats següents, ja que només són il·lustracions. Inicialment, establirem el port A bit 2 com a sortida:

Això es podria reconèixer a partir de la instrucció anterior. L'única distinció podria ser: Hem fixat tots els bits dels pins en A com a sortida, lliurant 0h al registre de tres estats. Per tant, el que ara ha de fer és encendre un LED.

Ho aconseguim programant un dels pins (el que té el LED enllaçat) d’alt. Per dir-ho d’una altra manera, apliquem un ‘1’ al passador. És exactament així com es duu a terme (observeu els comentaris per obtenir aclariments sobre cada línia):

Per tant, el que ara hem aconseguit és apagar el LED una vegada. El que desitgem és que el LED s’encengui posteriorment apagat contínuament.

Ho aconseguim obtenint el programa per tornar al principi. Ho aconseguim establint inicialment una etiqueta al principi del nostre programa, i posteriorment informem al programa de tornar-hi. Especifiquem una etiqueta de manera senzilla.

Escrivim un terme, per exemple, START, a continuació, escrivim el codi:

Com es demostra, inicialment esmentàvem l’expressió “Comença” immediatament al principi del programa.

A continuació, al final del programa hem esmentat clarament 'anar a Inici'. La instrucció 'anar' fa exactament el que declara.

Aquest programa encendria i apagaria constantment el LED sempre que encenguéssim el circuit, tendint a apagar-se un cop retirem l’electricitat. Potser hauríem de tornar a comprovar el nostre programa:

Segurament hem omès els comentaris desactivats, però encara podem observar les instruccions i els números.

Això pot ser una mica desconcertant més endavant en cas que proveu de solucionar problemes del programa i mentre escriviu el codi, heu memoritzat totes les adreces.

Tot i que es poden fer comentaris, es pot convertir en una mica desordenat. Això requerirà posar noms als números i es pot aconseguir mitjançant una instrucció addicional: 'equ' La instrucció 'equ' suggereix que algunes coses poden ser iguals a altres coses.

Pot ser que no sigui una instrucció per a PIC, més aviat per al muntador. Aquesta instrucció facilita l'assignació del nom a una ubicació de l'adreça de registre o d'una constant a un terme de programació.

Establirem algunes constants per al nostre programa i també serem testimonis de la senzillesa que està llegint el programa.

Des d’ara hem fixat els valors constants que podem procedir configurant-los al nostre programa. Cal definir els valors constants abans d’utilitzar-los.

per tant, assegureu-vos de situar-los sempre al principi del programa. Tornarem a escriure el programa excloent els comentaris una vegada més, per tal de comparar l'etiquetatge anterior amb l'últim.

Potser sou capaços de notar que les constants permeten una comprensió lleugerament més senzilla del programa, però encara estem sense comentaris, però no ens preocupem, ja que encara no hem acabat.

És possible que hi hagi un desavantatge menor en el nostre programa LED intermitent.
Totes les instruccions necessiten 1 seqüència de rellotge per acabar. En cas que utilitzem un cristall de 4 MHz, totes les instruccions requereixen 1/4 MHz o 1 uS per acabar.

Com que només hem utilitzat cinc instruccions, el LED s’activaria i s’apagaria en 5uS. Això pot ser massa ràpid perquè la gent ho noti, a més, semblarà que el LED està completament encès.

El que hauríem d’aconseguir és produir una inhibició entre l’encesa del LED i l’apagada. La teoria de la inhibició és que comptem enrere a partir d'una quantitat anterior, de manera que quan arriba a zero, deixem de comptar.

El valor zero significa la conclusió del retard i continuem treballant el nostre procés durant tot el programa. Per tant, el primer que hem de fer és determinar una constant a utilitzar com a comptador.

Anomenem aquest CONTE constant. Després d'això, hem de determinar la significació d'un nombre a partir del qual començar a comptar. Segurament, la xifra més gran que podríem incloure és 255, o FFh en hexadecimal. Com he parlat al tutorial anterior, la instrucció equ assigna una expressió a una situació de registre.

Això implica que, independentment de la quantitat que assignem el nostre COUNT, coincidiria amb els elements d'un registre. En cas que intentem designar el valor FFh, ens equivocarem un cop arribem a compilar el programa.

La raó de ser la ubicació FFh és, per tant, no hi podem accedir. Per tant, com hem de designar un número genuí? Certament, requerirà una petita quantitat de reflexió lateral.

Si potser designem el nostre COUNT a l'adreça 08h, per exemple, això indicaria un objectiu bàsic de registre del destí. Per defecte, les àrees intactes s'estableixen en FFh. En conseqüència, si COUNT porta a les 08h, trobareu el valor de FFh mentre encenem per primera vegada. Tanmateix, jo, com podem fixar COUNT en un altre número ?, l’únic que apliquem és “traslladar” primer una valoració a aquesta destinació.

Com a il·lustració, suposem que desitjàvem que COUNT tingués un valor de 85h, no podem esmentar COUNT equ 85h ja que aquesta és la posició del registre triestatal fora del port A. Precisament el que aconseguim és el següent: movlw 85h el valor de 85h al registre W movwf 08h

Ara moveu-lo al nostre registre de 8 hores. Posteriorment, en cas que expressem COUNT equ 08h, COUNT coincidiria amb el valor 85h. Delicat, oi? Per tant, inicialment determinem la nostra constant: COUNT equ 08h Després hem de reduir aquest COUNT en un fins que es converteixi en zero.

Simplement es produeix que hi ha una instrucció dissenyada per aconseguir-ho, fent ús d'un 'anar' i una etiqueta.

La instrucció que aplicarem és: DECFSZ COUNT, 1 Aquesta instrucció indica 'Decrementar el registre (aquí és COUNT) pel nombre que fa un seguiment de la coma. Si aconseguim el zero, salta dos punts per davant. ”Anem a trobar-lo en acció abans de col·locar-lo al nostre rumb.

El que hem realitzat és establir inicialment el nostre COUNT constant a 255. El segment posterior col·loca una etiqueta, anomenada LABEL, prop de la nostra instrucció decfsz.

El decfsz COUNT, 1 redueix el valor de COUNT en un i conserva el resultat final directament en COUNT. A més, verifica si COUNT té un valor de 0.

Si no ho fa, en aquest cas es desencadena que el programa passi a la línia següent. Ara tenim una declaració 'anar' que ens retorna a la nostra instrucció decfsz.

En cas que el valor de COUNT funcioni igual, la instrucció decfsz dóna com a resultat que el nostre programa passi 2 punts per davant i s'enviï a on hem reclamat 'Continuar aquí'.

Per tant, com podeu observar, hem dut a terme el programa per seure en un lloc durant un temps predestinat abans de continuar. Això es podria anomenar bucle de retard.

Comprensió dels bucles de retard

En cas que necessitem un retard més substancial, podríem seguir un bucle pel següent. Els bucles addicionals augmenten el retard. En fem almenys dos, suposant que volem observar el flaix LED. Posarem aquests bucles de retard al nostre programa i ho aconseguirem convertint-lo en un programa genuí introduint comentaris:

És possible compilar aquest programa després de quin programa el PIC. Viouslybviament, assegureu-vos que proveu el circuit per comprovar si efectivament funciona. El següent és un diagrama de circuits que hauríeu de construir tan bon punt hàgiu programat el PIC.


Ben fet, podríeu haver compost el vostre primer programa PIC, a més de construir un circuit per parpellejar i encendre un LED. Fins ara, en cas que hàgiu seguit aquests cursos, és possible que hàgiu après un total de set instruccions sobre 35, però fins ara sense dubte podríeu controlar els ports d'E / S.

Intentaríeu canviar els bucles de retard per fer més ràpid el flaix LED: quin és el valor mínim de COUNT per veure essencialment el flaix LED? O potser voldreu incloure un tercer bucle de retard addicional o complementari després del inicial per estabilitzar el LED cap avall. una constant única per a cada bucle de retard.

Potencialment, podríeu jugar amb els bucles de retard per representar el flaix LED a una velocitat específica, per exemple al cap d’un segon. Dins de la següent instrucció, vegem com podem utilitzar alguna cosa coneguda com a subrutina per mantenir el programa compacte i bàsic. Una subrutina és una part integral del codi o programa, que es pot referir quan i quan ho necessiteu. Les subrutines s’utilitzen en casos en què realitzeu la mateixa funció amb freqüència.

Què són les subrutines

Els avantatges d’emprar una subrutina són que probablement serà més senzill modificar el valor una vegada dins d’una subrutina en lloc de, per exemple, deu vegades durant tot el programa, a més de contribuir en gran mesura a disminuir el nivell de memòria que el programa consumeix a la PIC. Comprovarem una subrutina:

Inicialment, hem de proporcionar una designació a la nostra subrutina i, en aquesta situació, hem seleccionat ROUTINE. Després d’aquest tipus, escrivim el codi que ens agradaria dur a terme amb normalitat. Per això, hem seleccionat el retard del nostre programa de leds intermitents. Finalment, concloguem la subrutina teclejant la instrucció RETURN.

Per començar la subrutina des de qualsevol lloc del nostre programa, escrivim ràpidament la instrucció CALL i després la designació de la subrutina.

Ho considerarem amb una mica més de profunditat. Un cop arribem a la secció del nostre programa CALL xxx, en la qual xxx és el nom de la nostra subrutina, el programa salta a qualsevol lloc on estigui instal·lada la subrutina xxx. Es duen a terme les instruccions dins de la subrutina.

Sempre que s'aconsegueix la instrucció RETURN, el programa torna al nostre programa principal a la instrucció posterior a la nostra instrucció CALL xxx.

És possible trucar a la subrutina similar diverses vegades com vulgueu, la qual cosa explica per què utilitzar subrutines disminueix la durada general del nostre programa.

No obstant això, hi ha un parell de factors que hauríeu de conèixer. Inicialment, igual que amb el nostre programa principal, cal reconèixer qualsevol constant específica abans de poder utilitzar-les.

Aquests es poden reconèixer possiblement dins de la pròpia subprograma o directament al començament del programa principal. Us proposo que ho reconegueu tot al principi del vostre programa principal, des de llavors reconegueu que les coses estan en una posició idèntica. A continuació, s'ha d'assegurar que el programa principal salti sobre la subrutina.

El que implico amb això és si col·loqueu la subrutina directament a la conclusió del vostre programa principal, excepte si utilitzeu una declaració 'Vés' per saltar d'on es troba la subrutina, el programa continuaria i implementaria la subrutina independentment de si ho requereixen o no.

El PIC no distingiria entre una subrutina i el programa principal. Comprovarem el nostre programa intermitent de leds, però aquesta vegada farem ús d’una subrutina per al bucle de retard. L’ideal és que descobriu quant menys complicat apareix el programa, així com podríeu trobar com s’aplica pràcticament la subrutina.

Finalment, podeu observar que, mitjançant la utilització d’una subrutina per al nostre bucle de retard, podríem haver reduït les dimensions del programa.

Cada vegada que desitgem un retard, possiblement quan el LED està encès o apagat, anomenem bàsicament la subrutina de retard. Al final de la subrutina, el programa torna a la línia seguint la nostra instrucció 'Truca'. A la il·lustració anterior, encenem el LED.

Després d’això, ens posem en contacte amb la subrutina. Aleshores el programa torna per tal que puguem apagar el LED. Tornem a trucar a la subrutina, en cas que la subrutina s'hagi completat, el programa torna i la instrucció posterior que reconeix és 'anar a Inici'. Per a qualsevol persona que estigui intrigada, el nostre primer programa tenia una longitud de 120 bytes.

Mitjançant l’ús de la subrutina, podríem reduir la mida del programa fins a 103 bytes. Això no pot semblar tan fantàstic, tot i que tenint en compte que només tenim 1024 bytes en general dins del PIC, cada petita quantitat es beneficia.

Dins de la següent instrucció, fem una ullada a la lectura des dels ports.

Fins ara hem estat redactant al port A per tal que puguem encendre i apagar un LED. En aquest punt, veurem com llegirem els pins d'E / S als ports.

Lectura de ports d'entrada / sortida

Això és exactament per assegurar-nos que podem enllaçar un circuit extern i influir en les sortides específiques que ofereix.

Si voleu memoritzar els nostres cursos anteriors, si voleu establir els ports d'E / S, hauríem de passar del banc 0 al banc 1. Ho aconseguirem inicialment:

En aquest punt hem fixat el bit 0 del port A per a l'entrada. ara hem d’examinar si el pin és alt o baix. Per aconseguir-ho, només es pot utilitzar una de les dues instruccions:

BTFSC i BTFSS.

La instrucció BTFSC significa 'Feu una prova de bit al registre, així com el bit que designem.

En cas que sigui un 0, en aquest cas ometem la instrucció posterior ». BTFSS implica ‘Feu una prova de bit al registre i bit que establim. En cas que estigui establert a 1, ignorem la instrucció posterior.

El que fem servir està determinat precisament per la forma en què desitgem que respongui el nostre programa mentre estudiem les aportacions. A tall d’il·lustració, en cas que només esperem que l’entrada sigui un 1, és possible que puguem utilitzar la instrucció BTFSS de la següent manera:

Codi aquí:

BTFSS PortA, 0Goto start Continua aquí:
:

El programa només passaria a 'Continuar aquí', sempre que el bit 0 a PortA estigui programat a 1.

Actualment escriurem un programa que pot provocar un LED a un ritme, però si es limita un interruptor, el LED parpellejarà dues vegades més lent.

Potser és possible exercir aquest programa pel vostre compte, tot i així, hem incorporat el llistat d'alguna manera.

Podeu provar i escriure tot el programa per comprovar si heu entès els principis. Utilitzarem el circuit equivalent com abans, amb la inclusió d’un commutador connectat RA0 del PIC i el rail positiu del nostre subministrament.

El que hem aconseguit aquí és encendre el LED. Posteriorment, determinaré si l'interruptor està tancat.

En cas que estigui confinat, a continuació em connecto a la nostra rutina de retard. Això ens proporciona el retard equivalent a l'anterior, tot i que en aquest moment ens hi posem en contacte dues vegades.

El mateix s'aplica a quan el LED està apagat. En cas que l’interruptor no estigui tancat, tenim els nostres períodes d’encès i apagat previs.

Si heu seguit aquestes lliçons des del principi, és possible que busqueu comprendre que actualment heu descobert deu de les 35 instruccions del PIC 16F84. I cada part d’això s’aprèn simplement encenent i apagant un LED.

Fins ara, hem compost el PIC parpellejant un LED encès i apagat.

Posteriorment, vam poder fer servir el nostre PIC incloent un commutador i, per tant, variant la velocitat del flaix.

Ús eficient de l’espai de memòria

L'únic problema és que el programa és bastant llarg i té poc espai de memòria. Semblava correcte mentre incloïa les ordres per primera vegada, però hauria d’haver una manera més senzilla d’executar-la. De manera positiva, analitzarem com literalment enceníem i apagàvem el LED.

movlw 02hmovwf PORTAmovlw 00hmovlw PORTA

Al principi vam omplir el nostre registre w amb 02h, després el vam transferir al nostre registre PortA per encendre el LED. Per apagar-lo, vam empaquetar w amb 00h i després el vam canviar al nostre registre PortA.

Entre totes aquestes rutines, ens vam veure obligats a posar-nos en contacte amb una subrutina per assegurar-nos que podíem observar el LED intermitent.

Per tant, havíem de transferir dos conjunts d’informació un parell de vegades (una vegada al registre w i després a PORTA), així com trucar a una subrutina dues vegades (una vegada per encès i una vegada per fora). Per tant, com podríem aconseguir-ho amb una eficiència afegida? Molt simple.

Utilitzem una instrucció diferent coneguda com XORF. La instrucció XORF funciona amb una funció OR exclusiva al registre que estipulem amb la informació que proporcionem. Crec que he d’aclarir què és al món una OR exclusiva abans de continuar. En cas que tinguem dues entrades i una sortida, l’entrada només pot ser un 1 si, i sempre que les dues entrades siguin diferents. Tot i que són iguals, el resultat probablement serà 0. La següent és una taula de veritat per a les persones que opten per comprovar-les:

A B F0 0 00 1 11 0 11 1 0

En aquest moment comprovarem què passa si fem B igual que la nostra sortida anterior, i simplement alterem el valor de A:

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

Si mantenim el valor de A igual a 1, i el fem exclusiu O amb la sortida, la sortida es commutaria. En cas que no ho noteu a la taula de veritat, a continuació es pot comprovar mitjançant el binari:

0 Sortida actual
EX-OR Amb 1 1 nova sortida
EX-OR Amb 1 0 sortida nova

Potser podreu trobar que, si exclusivament OReu la sortida amb 1, ara canviarem la sortida de 0 a 1 a 0.
Per tant, per encendre i apagar el LED, només necessitem un parell de frases:

MOVLW 02h
PORTA XORWF, 1

El que precisament aconseguirem és afegir el nostre registre w a les 02h. En aquest cas, estem en exclusiva per O aquest número sense importar el que porti al nostre PortA. En cas que el bit 1 sigui 1, canviarà a 0. En cas que el bit 1 sigui 0, canviarà a 1. Examinem aquest codi una o dues vegades per mostrar com funciona binari:

PORTA
00010
xorwf 00000
xorwf 00010
xorwf 00000
xorwf 00010

En realitat, no hem de carregar el valor idèntic al registre w cada vegada, per tant, és possible aconseguir-ho una sola vegada al principi i simplement tornar al nostre ordre de commutació. A més, no hem de fixar cap valor al nostre registre PortA. La raó? Segurament, ja que en cas d’engegar és un 1, el podem canviar fàcilment. Jo, alternativament un 0 a l’engegada, fins i tot ara ho canviaríem.

Per tant, voldríeu veure el nostre codi recentment format. El primer representa el nostre codi LED parpellejant, mentre que el segon mostra el que afegeix l’interruptor:

Desitgem que pugueu trobar que, simplement fent servir una instrucció senzilla, ara hem reduït l'escala del nostre programa. La veritat és que, per mostrar fins a quin punt podríem reduir els nostres programes, hem demostrat els dos programes, exactament el que es van compondre, i les seves dimensions a la taula següent:

Dimensions de l'alteració del programa (bytes)
LED intermitent original 120
S'ha afegit 103 subrutina LED intermitent
Funció XOR LED intermitent utilitzada 91
LED amb interruptor original 132
LED amb funció XOR del commutador utilitzat 124.

Per tant, no només hem descobert algunes instruccions noves, sinó que, a més, hem reduït la mida dels nostres guions.

A continuació, analitzarem com podeu moure bits individuals, dur a terme determinades aritmètiques senzilles, així com taules de dades.

Gestors lògics

Dins de l'últim tutorial vaig presentar l'operació OR exclusiva. La funció ExOR s’entén com un operador lògic.

Dins d’aquest tutorial il·lustraré els operadors lògics addicionals que promou el PIC. No hi haurà cap tipus de cas en els programes puntuals, però aprendrem mètodes fàcils d’utilitzar els operadors aplicant petites àrees de codi.

AND La funció AND analitza bàsicament dos bits i proporciona un 1 si són iguals i un 0 en cas que siguin distintius. Per exemple, si esmentés 1 I 1, el resultat serà 1, mentre que en cas que declaréssim 1 I 0 la conseqüència seria 0.

No cal dir que també som capaços d’avaluar les paraules, a més de que tota la funció I que realitza és revisar els dos termes a poc a poc. La instància següent mostra dues paraules de 8 bits que es converteixen en AND juntament amb el producte:

11001011
I 10110011
És igual a 10000011

Espero que hi estigueu d'acord, el resultat només tindrà un 1 cada 2 1s de la mà l'un amb l'altre en un parell de paraules. Per exemple, podem utilitzar la funció AND per verificar els ports.

En cas que estiguem comprovant uns quants pins d'E / S que estan enllaçats a un circuit i hauríem de vigilar una situació particular en què només alguns dels pins són alts, en aquest cas podem llegir gairebé el port, després del qual I el resultat amb la condició que hem estat examinant, idèntic a la instància anterior.

El PIC ens proporciona dos ingredients per a AND.
Són ANDLW i ANDWF. ANDLW ens permet realitzar una funció AND amb les dades del registre W i la quantitat que estipulem.

La sintaxi és: ANDLW en què és exactament el que anem I el contingut de W amb.

La conseqüència de la funció AND s’emmagatzemaria directament al registre W.
ANDWF ens permet dur a terme una funció AND al registre W i a un registre diferent, per exemple un PORT. La sintaxi és: ANDWF, d en què es troba el registre que ens entusiasma, per exemple. PORTA, i d mostra el PIC on haureu de situar el resultat. Si d = 0, el resultat es posa al registre W i de d = 1 el resultat final es guarda al registre que estipulem. Les dues parts del codi següents mostren un bon exemple de cada funció AND.

La inicial examina l’estat de la PORTA, en la qual hem de comprovar si les entrades són 1100. Podem tornar a col·locar el resultat al registre W

1100 movlw
ANDWF 05h, 0 La segona il·lustració ara pot verificar el contingut del registre W:
ANDLW 1100

O

Ja hem descobert una funció OR, per precisar la XOR. Això es converteix en un 1 si dos bits no són iguals, però són diferents. Podeu trobar una altra funció OR anomenada IOR, que és la OR inclusiva. Aquesta funció generarà un 1 en cas que qualsevol bit sigui 1, però, a més, si cada bit és 1. A continuació es mostra una taula de veritat clara per il·lustrar-ho:

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

Què són els operadors aritmètics

AFEGEIX

Aquesta funció compleix el que sol afirmar. Aporta dues xifres! En cas que la conseqüència d'afegir les dues xifres superi els 8 bits, en aquest cas probablement s'establirà un indicador CARRY. La bandera CARRY es troba a l'adreça 03h bit 0.

Quan es programa aquest bit, les dues xifres superen els 8 bits. Quan és un 0, en aquest cas la conseqüència es troba dins dels 8 bits. Com abans, el PIC ens ofereix dos estils d'ADD, específicament ADDLW i ADDWF. Com podríeu haver suposat, és similar a la funció anterior. ADDLW ofereix el contingut del registre W al que estipulem. La sintaxi és: ADDLW ADDWF afegim el contingut del registre W i algun altre registre que designem.

La sintaxi és: ADDWF, d és on

SUB

En aquest moment, suposo que no es pot presumir del que fa aquesta funció. De fet, ho sospitava, aquesta funció
resta un bit d'un altre. De nou, el PIC ens proporciona dos gustos: SUBLW i SUBWF. La sintaxi és exactament similar a la de la funció ADD, a més d’evidentment escriviu SUB en lloc d’ADD.

Increment En cas que volguéssim incloure 1 a un número al PIC, podríem fer ús de la funció ADD i utilitzar el número u. ~ La dificultat d'això és que primer hem de col·locar la figura al registre W i, posteriorment, utilitzar el control ADDLW 1 per incrementar-la. En cas que volguéssim incloure 1 a un registre, encara pot ser pitjor. Primer hem de col·locar el número 1 al registre W, després d’utilitzar ADDWF, 1. Per tant, per exemple, per incloure 1 a la ubicació 0C, per exemple, hauríem de tenir la següent part de l'script:

movlw 01
addwf 0c, 1

Existeix un mètode més senzill per dur-ho a terme. Podem exercir l'ordre INCF. La sintaxi és: INCF, d on, és el registre o el lloc que ens ocupa, i d mostra el PIC on haureu de situar el resultat. En el cas d = 0, el resultat es troba dins del registre W i, en el cas d = 1, la conseqüència s’estableix al registre que estipulem.

En utilitzar aquesta instrucció individual, som capaços de fer el cinquanta per cent de la codificació. En cas que desitgéssim que el resultat es restablís al registre W, en aquest cas utilitzant la instància anterior, hauríem d'haver inclòs una ordre addicional per tornar a canviar els elements de 0C al registre W, després de la qual cosa torneu a posar el registre 0C a no. importa el que fos.

Existeix una ordre d'increment. És INCFSZ. Aquesta ordre pot incrementar el registre que estipulem, però si el registre és igual a 0 després de l'increment (que es produirà mentre incloguem de l'1 al 127) després, el PIC probablement passarà la instrucció posterior. La part del codi següent reflecteix això:

Bucle incfsz 0C
Vés al bucle
:
:
Resta del programa.

A la part anterior del codi, 0C s'incrementarà en 1. Seguidament posseïm una instrucció que informa el PIC de tornar a la nostra etiqueta anomenada bucle i incrementem 0C en 1. Això continua fins que 0C és igual a 127. En aquesta circumstància, quan incrementem 0C per 1, 0C ara coincidirà amb 0. La nostra instrucció INCFSZ podria molt bé informar el PIC d'ometre la instrucció posterior, que en aquest cas és la declaració de goto, per tant, el PIC seguirà endavant amb la resta del programa.

Decrement

A hores d’ara hem comentat la funció de disminució en entrenaments anteriors, per tant, ja no la revisaré.

Complement

La instrucció final d’aquesta discussió revertiria cada bit del registre que estipulem. La sintaxi és: COMF, d en què

Comprensió de les operacions de bits

Això es podria utilitzar, per exemple, per canviar ràpidament els pins d'un port de sortida a entrada, etc. Les funcions de bits ens permeten donar forma a un sol bit dins d’una expressió. Ens permeten procedir, configurar i desfer-nos dels bits individuals dels registres o números que estipulem.

A la conclusió d’aquest curs, donarem a conèixer un programa dissenyat per crear un conjunt de llums de seqüenciació que avancin, i que siguin inverses. Vam observar això aconseguit anteriorment quan vam examinar la funció OR exclusiva, en què vam OR exclusivament els ports amb una expressió. Hem vist fins ara algunes funcions de bit quan establim els ports al PIC i

Permeteu-me reiterar la seva utilització aquí.

BCF

Aquesta instrucció esborrarà una mica que estipulem en un registre que designem. La sintaxi
és:
BCF,

Hem utilitzat això anteriorment per canviar de pàgina 1 a pàgina 0 eliminant una mica al registre STATUS. També el podem utilitzar per fixar una mica en 0 en qualsevol registre / ubicació diferent. Per exemple, en cas que volguéssim establir el tercer bit a 11001101 desat a la secció 0C a 0, és possible
inserir:

BCF 0C, 03

BSF

Aquesta instrucció solucionaria qualsevol bit que estipulem a 1 en qualsevol registre que indiquem. Hem utilitzat això anteriorment per passar de la pàgina 0 a la pàgina 1. La sintaxi és: BSF, i s’utilitza precisament en el mateix mètode que BCF anterior.

Fins ara, podríem establir o esborrar una mica en un registre. Tanmateix, imagineu-vos si bàsicament hem de comprovar si un bit és un 1 o un 0 en un registre?

Segurament, és possible utilitzar BTFSC. Indica el registre de prova de bits F i Omet si està clar. Aquesta instrucció analitzarà el bit que designem al registre. En cas que el bit sigui 0, la instrucció informaria al PIC de passar la instrucció posterior.

Podríem utilitzar aquesta instrucció en cas que vulguéssim comprovar una bandera, per exemple la bandera de transport. Això ens estalvia la necessitat de llegir el registre STATUS i de cercar els bits individuals per saber quines marques es fixen. 29 Per exemple, en cas que volguéssim comprovar si la bandera de transport estava establerta en 1 després d'haver afegit 2 xifres, podríem escriure el següent:

BTFSC 03h, 0
continuar aquí si es defineix a 1
o aquí si s'estableix a 0

En cas que l'estat del bit sigui un 1, en aquest cas es completaria la instrucció posterior a BTFSC. En cas que s'estableixi a 0, en aquest cas s'omet la instrucció posterior. La part següent del codi mostra en què es podria utilitzar:

Bucle:
:
:
BTFSC 03,0
Vés al bucle

Al codi anterior, el PIC simplement sortirà del bucle en cas que el bit 0 del registre STATUS (o el senyalador Carry) estigui definit a 0. O bé, es duria a terme l'ordre goto.

BTFSS

Aquesta instrucció indica el registre de proves de bits F, i Omet si està definit. Això pot ser comparable a la instrucció BTFSC, a part que el PIC ometria la instrucció posterior si el bit que hem avaluat està establert en 1, en lloc de 0.

CLRF

Aquesta instrucció fixaria tots els detalls d’un registre a 0. La sintaxi és:

CLRF
Hem utilitzat això anteriorment per establir la sortida dels ports a 0, aplicant CLRF 85h. A més, l’hem emprat per arreglar els ports per incloure tots els pins a la sortida mitjançant CLRF
05h.

CLRW

Això podria semblar-se a la instrucció CLRF, tret que esborri el registre W. La sintaxi és senzilla:

CLRW

RLF i RRF

Aquestes adreces transportarien una mica en un registre una sola ranura cap a l'esquerra (RLF) o cap a la dreta (RRF) en un registre. Per exemple, si necessitàvem 00000001 i utilitzàvem RLF, en aquest cas podríem tenir 00000010. En aquest punt, què passa si hi ha 10000000 i apliquem la instrucció RLF? Segurament, l’1 es posicionaria a la bandera de transport. En cas que tornéssim a aplicar la instrucció RLF, l'1 tornaria a aparèixer a l'inici. Igualment es produeix, per contra, per a la instrucció RRF. El cas que es mostra a continuació ho mostra per a la instrucció RLF, en la qual Tenim, podem veure els 8 bits d’un registre, així com el senyal de transport:

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

Exemple de programa

Ara veurem un exemple de codi que es pot compilar i conduir. Generaria una llum de seqüenciació que començaria al bit 0 de PortA, que aniria al bit 8 i al PortB
després tornant.
Connecteu els LEDs a cadascun dels pins del port. En tindrem una mica
procediments assenyalats en aquest tutorial.

TIME EQU 9FH Variable per al bucle de retard.
PORTB EQU 06H Adreça del port B.
TRISB EQU 86H Port B Tristate address.
PORTA EQU 05H Port A address.
Adreça TRISA EQU 85H Port A Tristate.
STATUS EQU 03H Registre de selecció de pàgina.
COUNT1 EQU 0CH Registre de bucle.
COUNT2 EQU 0DH Registre de bucle.

ESTAT BSF, 5 Aneu a la pàgina 1
MOVLW 00H i configuració
MOVWF TRISB tant els ports A com B
MOVLW 00H a la sortida,
Torneu a MOVWF TRISA
ESTAT BCF, 5 pàgines 0.
MOVLW 00H Port clar A.
PORTA MOVWF

Inici del programa principal

RUNMOVLW
01H Estableix el primer bitMOVWF
PORTB al port B.CALL
RETARD Espera una estona Truca
RETARD
Mou el bit del port B cap a l’esquerra i, a continuació, posa en pausa.RLF
PORTB, 1CALL
RETARD
DELAYRLF
PORTB, 1CALL
RETARD
DELAYRLF
PORTB, 1CALL
RETARD
DELAYRLF
PORTB, 1CALL
RETARD
DELAYRLF
PORTB, 1CALL
RETARD
DELAYRLF
PORTB, 1CALL
RETARD
DELAYRLF
PORTB, 1CALL
RETARD
DELAYRLF
PORTB, 1 Mou el bit a la bandera de transport
Ara passeu al port A i moveu el bit a l'esquerra
PORTA, 1 Mou el bit de la bandera zero a PortACALL
DELAYCALL DELAYRLF
PORTA, 1CONVOCAT .RIA
RETARD
DELAYRLF
PORTA, 1CONVOCAT .RIA
RETARD
DELAYRLF
PORTA, 1CONVOCAT .RIA
RETARD
RETARD
Torneu a moure el bit al port ARRF
PORTA, 1CONVOCAT .RIA
RETARD
DELAYRRF
PORTA, 1CONVOCAT .RIA
RETARD
DELAYRRF
PORTA, 1CONVOCAT .RIA
RETARD
DELAYRRF
PORTA, 1 Això mou el bit a la bandera zero Ara mou el bit
de tornada al port BRRF
PORTB, 1CALL
RETARD
DELAYRRF
PORTB, 1CALL
RETARD
DELAYRRF
PORTB, 1CALL
RETARD
DELAYRRF
PORTB, 1CALL
DELAYCALL DELAYRRF
PORTB, 1CALL
RETARD
DELAYRRF
PORTB, 1CALL
RETARD
DELAYRRF
PORTB, 1CALL
RETARD
RETARD Ara tornem on vam començar, GOTO
CORRE anem de nou.

Hi ha una gran opció al conjunt de formació que us permet fer ús d’una taula de dades.

Una taula de dades és només una llista de pressupostos de dades, en què es revisa tot basant-se en algunes consideracions.
Per exemple, podeu tenir un circuit que utilitzi un PIC que compti la quantitat d’instàncies que un pin d’entrada augmenta en 1 segon. Després, podeu mostrar el número en una pantalla de 7 segments.

Tan bon punt s’ha iniciat el temps, el PIC comença a comptar la quantitat d’ocasions que el pin augmenta. Al cap d'1 segon, visita la taula i fa una ullada cap amunt de les dades, ha de mostrar el número a la pantalla que simbolitza la quantitat de situacions que el pin ha elevat. Això pot ser beneficiós, ja que no determinem quina podria ser la xifra fins que el PIC no hagi complert la seva estimació.

Mitjançant la utilització d’una taula, podem permetre que el PIC determini quina figura representar. En aquest punt, abans de continuar mostrant-vos com funciona la taula de dades, potser us hauria de dir que el PIC manté la ruta del lloc on es troba mentre el programa funciona.

Facilita a aquells que han realitzat determinades programacions en BASIC. En cas contrari, no us preocupeu, potser voldreu continuar aprenent sobre la teoria. Imagineu que hi ha un programa BASIC similar al que es presenta a continuació:

10 ANYS K = 0
11 K = K + 1
12 IF K> 10 THEN GOTO 20 ELS GOTO 11
20 IMPRIMIR K
21 FI

El programa comença a la línia 10. Tan aviat com K està programat a 0, avança a la línia 11. Després d’haver inclòs l’1 al K, passem a la línia 12.

Arribats a aquest punt, podríem tenir curiositat si K és superior a 10. En cas que sigui, a continuació anem cap a la línia 20, o bé tornem a la línia 11.

La línia 20 documenta la K i la línia 21 conclou el programa. BASIC utilitza estadístiques de línia per ajudar el programador a mantenir un registre d’on són els problemes, ja que les etiquetes no estan autoritzades. El PIC utilitza etiquetes per escapar entre destinacions - o pot ser realment?

Utilitzem les etiquetes per assegurar-nos que som conscients d’on es troben els problemes, així com per assegurar-nos que som capaços d’informar el PIC d’una manera senzilla on cercar.

Precisament, el que passa és que el PIC aprofita un comptador de línia interior anomenat comptador de programes. El comptador de programes (abreujat a PC) rastreja la destinació de memòria on es troba la present instrucció.

Sempre que informem el PIC de visitar una etiqueta seleccionada, comprèn el punt de memòria i, per tant, augmenta el PC fins que veu aquesta destinació de memòria. Aquest és precisament el mateix mètode que comprovem el programa BASIC anterior. A continuació es mostra un segment de codi, amb els espais de memòria o els elements del PC, al costat de totes les instruccions:

Instruccions per a PC0000 movlw 03
0001 movwf 0C
0002 bucle decfsc 0C
0003 anar a bucle
0004 final

A la demostració anterior, hem fixat el PC a 0000. En aquest cas tenim la instrucció movlw 03. Quan el PIC ha implementat aquestes dades, augmenta el PC per tal que s’explorin les instruccions posteriors. En aquest punt, el PIC visualitza movwf 0C. El PC es torna a incrementar.

Ara el PIC estudia decfsc 0C. En cas que els detalls de 0C no siguin 0, en aquest cas el PC s'incrementa en 1, així com la següent instrucció, anar al bucle, informa al PC que torni a la posició 0003, que és l'esmentat bucle. En cas que els detalls de 0C siguin 0, es recomana al PC augmentar en 2, simplement ometeu la instrucció posterior.

Comprensió de les taules de dades

Això situa el PC a la posició 0004, on finalitza el programa. Les destinacions les fixa el muntador i, generalment, no ens hauria de preocupar el que està realitzant el PC. Fins que trobem la necessitat de controlar-lo de la mateixa manera que ho fem quan s'utilitzen taules de dades. La forma més convenient de descriure el funcionament d’una taula de dades és començar amb una il·lustració.

PC equ 02
movlw 03
taula de trucades
:
taula addwf PC
retlw 01
retlw 02
retlw 03
retlw 04
retlw 05
retlw 06
retlw 07
tornar

La instrucció inicial assigna l’etiqueta PC amb l’adreça del comptador de programes (02h). Poc després posarem el valor de 03h al registre w. Després, ens comuniquem a taula. La línia més important de la taula de subrutines augmenta els detalls del registre W (03h) al comptador de programes.

Això fa que el comptador del programa augmenti en 3 o, d'una altra manera, estimula que el comptador del programa baixi 3 línies. Mentre el comptador arriba 3 línies cap avall, el PIC reconeix la instrucció de resposta. Aquesta ordre envia el valor que el segueix al registre W, després del qual torna de la subrutina. RETLW significa bàsicament Retorn, literal a W.

Vegeu que he posat una coma després de la paraula Retorn. Com que estem en una subrutina, necessitem una instrucció de Retorn per afegir-la. Per tant, el RET a la instrucció. Després de la instrucció RETLW hi ha un número, i això és exactament el que es posa al registre W.

En aquest cas es tracta de la figura 3. Podríem designar qualsevol quantitat al registre W, sempre que aquesta figura es combini amb el comptador de programes de la subrutina de la taula, descobrirem una instrucció de resposta. A la il·lustració anterior, això implica que podem posseir qualsevol número de l'1 al 7. En cas que passem més enllà de la subrutina, podríem acabar de realitzar una secció addicional del programa. Per aquest motiu, sol ser un moviment intel·ligent situar la taula de dades exactament cap al final del programa PIC, per tant, si superem en aquest cas, arribarem a la conclusió del programa de totes maneres.

El tema de les interrupcions pot ser que sigui el més llarg i difícil d’aconseguir.

No podeu trobar cap mètode senzill de detallar les interrupcions, tot i que amb una mica de sort cap al final d'aquesta part podeu aplicar interrupcions als vostres propis programes.
Hem separat la secció en 2 etapes. Això és permetre separar el tema en seccions, també per proporcionar-vos una pràctica pràctica per facilitar-ne la comprensió.

Què és exactament una interrupció? Segurament, com indica el terme, una interrupció és una tècnica o un senyal que impedeix que un microprocessador / microcontrolador faci qualsevol cosa que faci que pugui passar alguna cosa diferent.

Permeteu-me fer-vos una il·lustració diària. Penseu que us relaxeu a casa vostra conversant amb una altra persona. De cop, sona el telèfon.

Deixeu de parlar i agafeu el telèfon per parlar amb la persona que truca. Un cop tingueu la interacció telefònica, decidiu tornar a conversar amb la persona abans de sonar. És possible tenir en compte la rutina principal mentre xategeu amb algú, el telèfon que sona provoca una interrupció de la conversa i el trencament de la rutina és el mètode de parlar per telèfon.

Mentre finalitza la discussió telefònica, torneu a la vostra rutina principal de xatejar. Aquesta il·lustració és precisament com interrompre un processador per actuar.

El programa principal està funcionant, realitzant determinades funcions en un circuit, però quan es produeix una interrupció el programa primari s'atura mentre es realitza una rutina diferent. finalitza la rutina, el processador torna a la rutina principal igual que abans.

Comprensió de les interrupcions

El PIC té 4 fonts d'interrupció. Es podrien dividir en un parell de grups. Dues són fonts d’interrupcions que es poden utilitzar exteriorment al PIC, mentre que les altres dues són processos interns. Permeteu-me aclarir els dos tipus externs aquí. Els altres dos es descriuran en diferents tutorials un cop arribem als temporitzadors i emmagatzemem dades.

Si comproveu el pin-out del PIC, notareu que el pin 6 és RB0 / INT. En aquest moment, RB0 és clarament el port B bit 0. L'INT significa que també es podria configurar com un pin d'interrupció exterior. A més, els pins 4 a 7 del port B (pins 10 a 13) també es poden utilitzar per a interrupcions. Abans de poder emprar els pins INT o un altre port B, hem de realitzar dues tasques. Primerament, hem d'informar el PIC que utilitzarem interrupcions.

A continuació, hem de designar quin pin de port B utilitzarem com a interrupció en lloc de com a pin d'E / S. Dins del PIC podeu trobar un registre conegut com a INTCON, que es troba a l’adreça 0Bh. En aquest registre descobrireu 8 bits que poden estar habilitats o desactivats. El bit 7 d’INTCON es coneix com a GIE. Aquesta és la funció Global Interrngupt Enable. Si ho solucioneu a 1, s'informa al PIC que utilitzarem una interrupció.

El bit 4 d’INTCON es coneix com INTE, INTerrupt Enable. Posar aquest bit a 1 transmet al PIC que RB0 serà un pin d'interrupció. La configuració del bit 3, anomenat RBIE, informa el PIc que utilitzarem els ports 4 a 7. del port B. En aquest moment, el PIC entén quan aquest pin pot ser alt o baix, ha de detenir el que està realitzant i procedir amb una interrupció rutina. En aquest punt, hem d’informar al PIC si la interrupció probablement serà o no en la transformació del senyal de la vora ascendent (0V a + 5V) o de la vora descendent (+ 5V a 0V).

En poques paraules, volem que el PIC interrompi cada vegada que el senyal es mou de menor a major o de més alt a més baix. Per delinqüència, es pot establir per situar-lo a la vora ascendent.

El 'desencadenament' de la vora està programat en un registre addicional anomenat registre OPTION, a l'adreça 81h. El que ens entusiasma és el bit 6, sovint anomenat INTEDG.

Si l’ajusteu a 1, el PIC s’interromprà a la vora de muntatge (estat per defecte) i establir-lo a 0 estimularà que el PIC es produeixi a la vora lliscant. Si voleu que el PIC s’activi a l’alça ascendent, segur que no haureu de fer res amb aquest bit.

En aquest punt, lamentablement, el registre d’opcions es troba al banc 1, és a dir, ens agrada modificar del banc 0 al banc 1, establir el bit al registre d’opcions, després d’aquest retorn al banc 0. La clau aquí és aconseguir cada bit del banc 1 es registra en una sola vaga, per exemple, establint els pins de port, després de tornar al banc 0 si heu acabat.

Molt bé, per tant, hem notificat al PIC quin pin probablement serà la interrupció, i a quin cantó s'ha d'activar, què passa al programa i al PIC cada vegada que passa la interrupció? Hi ha un parell de coses. Primerament, està programada una 'bandera'.

Això informa al processador intern del PIC que ha passat una interrupció. A continuació, el comptador de programes (del qual vaig parlar al tutorial anterior) dóna consells a una adreça específica dins del PIC. Vegem ràpidament tots aquests aspectes de manera individual. Senyal d'interrupció Al nostre registre INTCON, el bit 1 és el senyal d'interrupció, anomenat INTF. En aquest moment, sempre que es produeixi una interrupció, és probable que aquest indicador es fixi en 1.

Quan no hi ha cap interrupció, la bandera es col·loca a 0. A més d’això és pràcticament tot el que s’aconsegueix. Arribats a aquest punt, podríeu estar pensant en 'quin sentit té?' Segurament, tot i que aquesta bandera està programada a 1, el PIC no pot reaccionar davant d’una altra interrupció i no ho farà. Per tant, expressem que produïm una interrupció. És probable que el senyalador estigui fixat a 1 i que el PIC pugui anar a la nostra rutina per treballar la interrupció.

Quan aquest indicador no es va fixar en 1 i es va permetre que el PIC continués responent a la interrupció, aleshores pulsant contínuament el pin, el PIC podria tornar al començament de la nostra rutina d’interrupcions i, en cap cas, completar-lo. Tornant a la meva il·lustració del telèfon, és similar a aixecar-lo i, immediatament, un cop procedit a discutir-lo, torna a sonar, ja que una altra persona vol parlar amb vosaltres.

Es recomana completar un diàleg i, a continuació, agafar de nou el telèfon per parlar amb la persona posterior. Podeu trobar un petit problema amb aquesta bandera. Tot i que el PIC estableix ràpidament aquesta marca a 1, no la torna a posar a 0. Aquesta activitat l'ha d'exercir el programador, és a dir, vosaltres. Això es pot aconseguir sense esforç, ja que segur que suposo, i s’ha d’aconseguir després que el PIC hagi dut a terme la rutina d’interrupcions.

Ubicació de la memòria Sempre que engegueu el PIC, o en cas que hi hagi un restabliment, el comptador de programes dóna consells per abordar 0000h, que podrien ser immediatament al principi de la memòria del programa. Però, en cas que hi hagi una interrupció, el comptador del programa indicaria l'adreça 0004h.

Per tant, mentre composem el nostre programa que tindrà interrupcions, primer hem d’informar el PIC per saltar l’adreça 0004h i mantenir la rutina d’interrupcions que comença a l’adreça 0004h discreta des de la resta del programa.

Es pot fer sense problemes. Inicialment, comencem el nostre programa amb una ordre coneguda com a ORG. Aquesta ordre indica Origen o inici. Ens hi adherim amb una adreça. Com que el PIC comença a l'adreça 0000h, escrivim ORG 0000h. Després d'això, hem de passar per alt l'adreça 0004h. Ho aconseguim posant una instrucció GOTO, acompanyada d’una etiqueta que dóna consells al nostre programa principal.

Després d’això, ens adherim a aquesta ordre GOTO amb un ORG més, aquest moment amb l’adreça 0004h. Serà després d’aquesta ordre que inserirem la nostra rutina d’interrupcions. En aquest punt, és possible que siguem capaços d’escriure la nostra rutina d’interrupcions seguint la segona ordre ORG, o bé podrem situar una sentència GOTO que apunti a la rutina d’interrupcions.

Realment està relacionat amb l'opció de la vostra part. Per informar el PIC que ofereix arriba a la conclusió de la rutina d’interrupció, hem de situar l’ordre RTFIE cap al final de la rutina. Aquesta ordre significa retorn de la rutina d’interrupcions. Mentre el PIC ho nota, el comptador de programes indica la posició final en què es trobava el PIC abans que es produís la interrupció. A continuació, hem establert una breu secció de codi per mostrar el següent:

Hi ha un parell de coses que hauríeu d’estar informades quan feu servir interrupcions. La inicial tendeix a ser que si utilitzeu el registre idèntic al programa principal i la rutina d’interrupcions, tingueu en compte que és probable que els detalls del registre s’alterin quan es produeixi la interrupció.

Per exemple, fem servir el registre w per reenviar dades al programa principal del port A, per tant podeu utilitzar el registre w a la rutina d’interrupcions per canviar les dades d’una destinació a una altra.

En cas que no tingueu precaució, el registre w inclouria l'últim valor que va rebre mentre havia estat a la rutina d'interrupció, de manera que quan torneu de la interrupció, aquesta informació es lliurarà al port A en lloc del valor que teníeu abans es va produir la interrupció.

El mitjà d’aquest problema és desar momentàniament els detalls del registre w abans de fer-lo servir una vegada més a la rutina d’interrupcions. El segon és el fet que podeu trobar un retard entre quan es produeix una interrupció i quan es pot produir la següent. Tot i que ho enteneu, el PIC posseeix un rellotge exterior, que podria ser un cristall o un combinat de resistència-condensador.

No importa quina sigui la freqüència d’aquest rellotge, el PIC el divideix per 4, després d’això s’utilitza per al seu temps interior. Per exemple, si teniu un cristall de 4 MHz vinculat al vostre PIC, en aquest cas el PIC realitzaria les instruccions a 1 MHz. Aquesta sincronització interior es coneix com a cicle d’instruccions. En aquest moment, el full de dades afirma (sens dubte en minúscules) que heu d’habilitar de 3 a 4 rondes d’instruccions entre interrupcions.

La meva seria habilitar 4 rondes. El motiu del retard és que el PIC requereix temps per saltar a l’adreça d’interrupció, el senyalador, i arribar enrere de la rutina d’interrupcions. Per tant, tingueu-ho en compte si treballeu amb un circuit alternatiu per activar una interrupció del PIC.

En aquest punt, cal assenyalar el fet que si utilitzeu els bits 4 a 7 del port B com a interrupció. No podeu triar pins específics al port B per funcionar com a interrupció.

Per tant, en cas que permeteu aquests pins, probablement es podrien obtenir tots. Per tant, per exemple, no es pot tenir simplement els bits 4 i 5; és probable que els bits 6 i 7 s’habilitin al mateix temps. Quin és exactament el propòsit d'aconseguir quatre bits per representar una interrupció? Segurament, és possible que tingueu un circuit connectat al PIC, per si algú de quatre línies puja, en aquest cas pot ser un problema en què necessiteu que el PIC influeixi instantàniament.

Una mostra d’això podria ser una alarma de seguretat domèstica, en què s’uneixen quatre sensors als pins 4 a 7. del port B. Qualsevol sensor específic pot demanar al PIC que activi una alarma i la rutina de senyalització d’alarma és la rutina d’interrupció. Això evita el control constant dels ports i permet al PIC continuar amb diferents qüestions. Dins del següent tutorial, elaborarem un programa per gestionar una interrupció.

Vam tractar molts aspectes bàsics durant l'últim tutorial, per tant, crec que ha arribat el moment que vam compondre el nostre primer programa.

El programa que escriurem comptarà la quantitat d’ocasions en què activem un interruptor i, a continuació, en mostraríem el número.

El programa comptarà de 0 a 9, es podrà visualitzar en 4 LEDs en forma binària, juntament amb l'entrada o la interrupció probablement a RB0.

El primer que hem de dur a terme és informar el PIC per saltar sobre l’adreça en què apunta el comptador del programa cada vegada que es produeix una interrupció.

Observareu que estem emprant un mètode únic per exhibir nombres hexadecimals. Abans de passar, apliqués F9h en què h indicava hexadecimal. Podríem escriure-ho com a 0xF9, que és l’estructura que farem servir a partir d’ara.

Ara hem de dir al PIC que utilitzarem interrupcions i que fem servir el pin 6 RB0 com a pin d'interrupció:

bsf INTCON, 7GIE - Activació de la interrupció global (1 = habilitació)
bsf INTCON, 4INTE - habilitació d'interrupció RB0 (1 = habilitació)
Vaig a esborrar la senyal d'interrupció per si de cas (mai no confio en res!)
bcf INTCON, 1INTF: neteja el bit de senyalador per si de cas

Actualment hem d'establir els nostres 2 ports. Tingueu en compte que, com que ara fem servir RB0 com a pin d'interrupció, cal establir-ho com a entrada:

Utilitzarem una variable anomenada COUNT per emmagatzemar el nombre de recomptes de commutadors. Podríem simplement incrementar el valor al port A, però veureu per què estic fent servir una variable quan escrivim la nostra rutina d’interrupcions.

Per tant, el nostre programa principal està compost i, en aquest moment, hem d'informar el PIC de com procedir sempre que es produeixi una interrupció. Dins d’aquest exemple, la nostra interrupció probablement serà l’interruptor. El que voldríem que fos el PIC és el COUNT ajustable cada vegada que es limita l’interruptor.

Tot i això, només volem mostrar quantes vegades el commutador es tanca de 0 a 9. Més amunt, he afirmat que podríem haver incrementat simplement el valor del port A cada vegada que hi ha una interrupció. Tot i això, el port A té 5 bits, en cas que simplement incrementem el port, tindrem el nombre més alt de 31. Hi ha un parell d’explicacions per què he seleccionat no passar-ne fins a 31.

Inicialment, utilitzarem una pantalla de 7 segments, que com a màxim només podia anar de 0 a 15 (0 a F en hexadecimal). A continuació, també vull mostrar-vos algunes de les ordres aritmètiques que heu ensopegat en les darreres lliçons.

Per tant, continuarem amb la nostra rutina d’interrupcions. Actualment, el primer que hem d’aconseguir és emmagatzemar breument els detalls del nostre registre w, ja que ho hem estat aplicant per canviar el contingut de COUNT a PORTA. En cas que no el guardem, en aquest cas podríem lliurar un nombre totalment diferent a causa de la nostra aritmètica. Per tant, ho fem primer:

En aquest moment entenem si el valor de COUNT és de 9 o més. El que hem d’aconseguir ara és si COUNT és superior a 9, torneu a situar-lo a 0 o bé torneu al programa principal per assegurar-vos que el podem lliurar al port A. L’ordre BTFSS ja que enteneu seria la següent
instrucció en cas que la bandera de transport estigui programada, és a dir, COUNT = 10:

L'únic que queda per fer ara és introduir col·lectivament i determinar els valors de les nostres constants, que podem realitzar just al començament del nostre programa.

Cada vegada que activeu l’interruptor, els LED comptaran en binari de 0000 a 1010 i tornaran a 0000.

La següent figura mostra el diagrama de circuits compatible amb el codi explicat anteriorment. Curiosament, trobareu que el condensador de temporització s'ha inclòs en el disseny. Es tracta d'una petita estratègia que us permet obtenir la llibertat d'evitar la inclusió del condensador per si no en teniu cap durant aquest temps.

Aquí la capacitat entra en joc a través de la capacitat perduda a través del pin i de la terra de l'oscil·lador.
Per descomptat, pot no semblar una manera molt intel·ligent d’evitar un condensador pràcticament, ja que el valor perdut pot variar segons les condicions donades.

Una altra secció que es pot presenciar al circuit és la xarxa denunciant a través del commutador. D’aquesta manera s’eviten interferències durant el canvi mecànic i s’evita que el PIC es confongui si el canvi ha estat d’un sol o de diversos commutadors.




Anterior: Circuit de temporitzador de motor bidireccional programable Següent: Com funcionen els circuits Buck-Boost