Programació en pic-as del PIC 16F690

Referència Trucs Perifèrics   Recursos CITCEA
Tutorial Exemples Projectes   Inici

Programant en assemblador

En assemblador cada instrucció es representa amb el seu mnemònic.

Normalment també donem noms a les variables per no haver d'anar posant les seves adreces. De la mateixa manera, podem posar etiquetes per indicar posicions de programa i així fer els salts sense haver d'anar calculant l'adreça que els correspon. Addicionalment, podem afegir comentaris per deixar clar què fa cada instrucció o tros de programa.

Els valors els introduïm en el format que ens vagi millor (binari, decimal, etc.). El programari compilador s'encarregarà de traduir mnemònics, adreces, variables i valors al codi màquina corresponent.

Agafem el següent tros de programa:

main:
  bsf  PORTC,0  ; Activa el bit 0 del port C
  bcf  PORTC,0  ; Desactiva el bit 0 del port C
  goto  main  ; Repetim...

I anem a comentar els principals elements:

Tros de programa

Hi ha alguns altres elements que també han d'estar en un programa complet. Anem a veure-ho a partir del programa següent.

PROCESSOR 16F690
#include <xc.inc>
config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
; Definició de variables
Retard1 EQU 0x20  ; Definim dues variables de comptador
Retard2 EQU 0x21
Port EQU 0x22
PSECT code, class=CODE, delta=2, abs  ; A l'inicio de la memòria
main:
  bsf  RP0  ; Tria el banc 1
  movlw  0b11110000  ; RC0 a RC3 sortides, la resta entrades
  movwf  TRISC  ; Posa el bit 0 del port C com a sortida
  bcf  RP0  ; Tria el banc 0
  movlw  0b00001000  ; Activa el led de més a l'esquerra
  movwf  Port  ; Ho escriu sobre el port
Bucle:
  movf  Port,w  ; Copia Port a l'acumulador
  movwf  PORTC  ; I ho guarda a PORTC
Ret:
  decfsz  Retard1,f  ; Decrementa la variable
                      ; si dona zero, no fa la instrucció següent
  goto  Ret  ; Salta, excepte si el resultat ha estat zero
  decfsz  Retard2,f  ; Decrementa la variable
  goto  Ret  ; Salta, excepte si el resultat ha estat zero
  bcf  CARRY  ; Desactiva el bit de les que en portem
  rrf  Port,f  ; Roda els bits
  btfsc  CARRY  ; Mira si en portem
  bsf  Port,3  ; Si és el cas, torna a activar RC3
  goto  Bucle  ; Repetim el cicle
  END main

A la primera part (fons groc) fem la configuració general. La primera línia li diu al compilador que fem servir el PIC 16F690. En la segona li demanem que inclogui el fitxer de configuracions; en aquest fitxer hi ha, per exemple, les adreces dels registres específics del processador; així quan nosaltres indiquem PORTC, el compilador sap quina adreça li correspon.

Les altres dues línies fan la configuració general del processador; són uns registres que només poden ser modificats en el moment de programar i que especifíquen la configuració que volem. En aquest cas hem posat la configuració bàsica, amb totes les funcions especials desactivades. En aquesta pàgina hi podeu trobar els detalls.

El segon bloc (fons blau) és la definició de les variables. El el nostre cas, hem posat la primera variable a l'adreça 20h, la primera adreça de memòria de dades disponible. La segona variable l'hem posat a la posició següent (21h). Podeu trobar l'organització de la memòria de dades en aquesta pàgina. En aquest cas definim tres variables.

Al darrer bloc (fons vermell) hi ha el programa pròpiament dit. A la primera línia li diem que el programa comença a la primera adreça de la memòria de programa. Per costum, el programa s'inicia amb l'etiqueta Main i acaba amb END main. L'etiqueta podria ser qualsevol altra. Podeu trobar la llista de les instruccions i la seva descripció a l'apartat 15 del document de característiques del PIC 16F690.

Anem a comentar algunes coses d'aquest programa. La memòria del microcontrolador està estructurada en quatre bancs. Encara que normalment les nostres variables estaran al banc 0, sovint necessitarem accedir a altres bancs (habitualment al banc 1, a vegades al 2 i rarament al 3) per poder llegir o escriure registres interns del microcontrolador. En aquest cas hem d'accedir al banc 1 per canviar la configuració d'entrades i sortides del port C (TRISC) que és on tenim connectats els LED.

El registre STATUS conté els dos bits que controlan els bancs de memòria (RP0 i RP1) i els bits d'estat que ens donen informació sobre el resultat d'algunes instruccions.

Els programes molt senzills tenen un codi que només es repeteix un cop, com és el cas de l' exemple EL. Llavors la darrera línia del programa és:

...
  goto  $  ; Es bloqueja aquí
  END main

El goto indica al programa que salti a una posició concreta i el signe $ indica la posició actual. Així el programa es queda repetint indefinidament aquesta instrucció; fins que desconnectem l'alimentació i la tornem a connectar. Si no hi hagués aquesta línia, el microcontrolador executaria les instruccions que hi pugui haver en les posicions següents i que no sabem quines són; per tant tindríem un funcionament incontrolat.

Els programes més habituals tenen una part que només s'executa quan engeguem el microcontrolador (inicialització) i una part que es repeteix indefinidament. En el programa que hem posat d'exemple més amunt, la part d'inicialització està entre les etiquetes main i Bucle. A partir de l'etiqueta Bucle hi ha el tros de programa que es repeteix indefinidament.

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.