Programació en pic-as del PIC 16F690

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

Exemple SL - Mode d'espera

En aquest exemple farem que el microcontrolador entri en mode d'espera i que després en pugui retornar. Mentre no entrem en el mode d'espera el microcontrolador farà una rotació de LED. Farem servir una variable Bloqueig que quan s'activi ens portarà a entrar en el mode d'espera. L'activació del mode d'espera la farem amb el polsador RA3. Quan s'activi prepararem la interrupció externa per poder-lo despertar i desactivarem els LED per estalviar energia. És molt important desactivar la variable Bloqueig just després de la instrucció sleep si no volem que es torni a posar immediatament en mode d'espera. La interrupció externa correspon a RA2, caldrà activar aquesta entrada per despertar el microcontrolador. Si fem servir la placa de la matriu de vuit per vuit LED podem emprar els polsadors BTN1 o BTN2 per a aquesta aplicació. Recordem, però, que cal tenir l'entrada analògica desactivada per tal que funcioni la interrupció.

En aquest cas no fem res a la funció d'interrupció (per tant no cal guardar W ni STATUS) ja que la interrupció només la fem servir per despertar el microcontrolador.

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
Visualit EQU 0x20  ; Una variable on guardem el que mostraran els LED
Bloqueig EQU 0x21  ; Variable que farà el bloqueig del programa
                   ; Si val 1 es bloqueja
Retard1 EQU 0x22  ; Definim dues variables de comptatge
Retard2 EQU 0x23
PSECT code, class=CODE, delta=2, abs
main:  ; Adreça 0 h
  goto	Inici  ; Saltem al lloc on hi ha el programa principal
  nop  ; Zona de memòria de programa que no utilitzem
  nop
  nop
Interrup:  ; La funció d'interrupció no fa res
  retfie  ; Torna al programa principal, on s'havia quedat
Inici:
  bsf RP0  ; Tria el banc 1
  movlw 0xFF  ; Posa l'acumulador a FFh (tot uns)
  movwf TRISA  ; Posa tots els bits del port A com a entrada
  clrf TRISC  ; Posa tots els bits del port C com a sortida
  movlw 11000000B  ; Interrupció a l'activació
                   ; I resistències de pull-up desactivades (valor per defecte)
  movwf OPTION_REG  ; Ho guarda al registre de configuració
  bcf RP0  ; Tria el banc 0
  bsf RP1  ; Tria el banc 2
  clrf ANSEL  ; Desactiva entrades analògiques
  bcf RP1  ; Tria el banc 0
  call RetM  ; Fa un retard per evitar una mala lectura del polsador
  clrf Bloqueig  ; Inicialment el bloqueig està desactivat	
  movlw 00001000B  ; Activa el bit 3 al registre W
  movwf Visualit  ; Copia el valor de W a la variable Visualit
  movlw 00010000B  ; Activem INTE, interrupció externa
  movwf INTCON  ; per poder despertar
Bucle:
  movf Visualit,w  ; Copia la variable Visualit sobre el registre W
  movwf PORTC  ; Copia el valor de W al port C
  call RetM  ; Fa un retard
  bcf CARRY  ; posa a zero el bit d'arrossegament
  rrf Visualit,f  ; Fa rodar els bits cap a la dreta
                  ; el bit d'arrossegament entra per l'esquerra
                  ; i el bit de la dreta passa a l'arrossegament
  btfsc CARRY  ; Comprova si s'ha activat l'arrossegament
               ; Si no s'ha activat, salta una instrucció
  bsf Visualit,3  ; Si s'ha activat, torna a posar un 1
  btfss PORTA,3  	; Mira si s'ha premut el polsador
  bsf Bloqueig,0  ; Si s'ha premut, activa el bloqueig
  btfss Bloqueig,0  ; S'ha activat?
  goto Seguim  ; Si ho és, continua
  clrf PORTC  ; Estalviem energia
  sleep  ; Passa a mode espera
  clrf Bloqueig  ; Desactivem el bloqueig
  bcf INTF  ; Desactiva la bandera de la interrupció externa
            ; Si no la desactivéssim ja no podríem tornar a entrar al mode d'espera
Seguim:
  goto Bucle  ; Repetim
;
; Funció de retard de 0,2 s
;
RetM:
  decfsz Retard1,f		
  goto  RetM		
  decfsz  Retard2,f	
  goto  RetM
  return
END main

 

 

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