# Configurar reloj interno del PIC16F88 en ensamblador



## MordorInc (Mar 11, 2008)

Hola a todos,
me presento, soy Colombiano con gran pasion por aprender, he empezado con asembler y el PIC 16F88, la pregunta es:
como puedo configurar el clock interno del PIC a 8Mhz en el CONFIG


```
title	"Prende y Apaga un LED usando xtal interno"
#define _version "0.01"
;==================================================================================
;	Autor: MordorINC
;	Fecha: 2008 - 03 - 10
;	Historia del programa
;	
;	descripcion del programa:
;
;	Notas de Hardware
;	Cristal Interno de 8Mhz
;=====================================================================================
;	ENCABEZADOS
;=====================================================================================
	list p=16f88, r=dec		;especificaciones del micro
#include <p16f88.inc>		; inclusion de archivos y registros

	__CONFIG _CONFIG1, _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _MCLR_OFF & _LVP_ON

	;errorlevel -207
```
En espera de sus comentarios, les agradezco de antemano su ayuda,
Luis


----------



## Javier Rambaldo (Mar 12, 2008)

```
title   "Prende y Apaga un LED usando xtal interno"
#define _version "0.01"
;==================================================================================
;   Autor: MordorINC
;   Fecha: 2008 - 03 - 10
;   Historia del programa
;   
;   descripcion del programa:
;
;   Notas de Hardware
;   Cristal Interno de 8Mhz
;=====================================================================================
;   ENCABEZADOS
;=====================================================================================
   list p=16f88, r=dec      ;especificaciones del micro
#include <p16f88.inc>      ; inclusion de archivos y registros

	__CONFIG _CONFIG1, _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _MCLR_OFF & _LVP_ON & _INTRC_IO

	bsf		STATUS,RP0
	clrf	PORTA
	bcf		STATUS,RP0
loop
	bsf		PORTA,0
	call	retardo
	bcf		PORTA,0
	call	retardo
	goto	loop
retardo
	;(ahora te toca a ti...)
	return
	END
```


----------



## MordorInc (Mar 12, 2008)

Te agradezco en el alma, es una gran ayuda...
espero terminarlo hoy mismo y eviare el listado final, quizas a alguien en el futuro le sirva.
Luis


----------



## MordorInc (Abr 2, 2008)

Como habia prometido la versión final del programa, que prende dos leds con xtal interno de 8Mhz.
ojala a alguien le sirva en el futuro:
solo tengo una duda, pues me sale un WARNING:
Warning[219] Z:\HOME\MORDOR\PIC\TMR0\TMR0.ASM 621 : Invalid RAM location specified.
que no es critico, pero que me gustaria saber como solucionarlo.

de antemano gracias


```
title	"Prende y Apaga dos LEDs usando xtal interno"
#define _version "1.00"
;==================================================================================
;	Autor: Mordor Inc
;	Fecha: 2008 - 03 - 10
;	Historia del programa
;	
;	descripcion del programa:
;	prende dos leds que se encuentran en RA0 y RA1,
;	funciona el MCLR
;
;	Notas de Hardware
;	Cristal Interno de 8Mhz
;	Bits de Configuracion (15.0 SPECIAL FEATURES OF THE CPU
;	Pagina 131 del manual PIC16F87-88 30487c	
;_CONFIG1
;_CONFIG2
;Configuration Byte 1 Options
;_CP_ALL		;All Program Memory Protected
;_CP_OFF		;No Code Protection
;_CCP1_RB0		CCP1 function on RB0
;_CCP1_RB3		CCP1 function on RB3
;_DEBUG_OFF		In-Circuit Debugger disabled, RB6 and RB7 are general purpose I/O pins
;_DEBUG;_ON		In-Circuit Debugger enabled, RB6 and RB7 are dedicated to the debugger
;_WRT_PROTECT;_OFF		;No program memory write protection
;_WRT_PROTECT_256		;First 256 program memory protected
;_WRT_PROTECT_2048		;First 2048 program memory protected
;_WRT_PROTECT_ALL		;All of program memory protected
;_CPD_ON			Data EE Memory Code Protection Enabled
;_CPD_OFF			Data EE Memory Code Protection Disabled
;_LVP_ON			Low-Voltage Programming Enable Enabled
;_LVP_OFF			Low-Voltage Programming Enable Disabled
;_BODEN_ON			Brown Out Reset Detec Enabled
;_BODEN_OFF			Brown Out Reset Detec Disabled
;_MCLR_ON			Pin function is MCLR
;_MCLR_OFF			Pin function is digital Input, MCLR internally tied to VDD
;_PWRTE_OFF			72 msec. Time Up Delay Off
;_PWRTE_ON			72 msec. Time Up Delay On
;_WDT_ON			Watchdog Timer Enable bit On
;_WDT_OFF			Watchdog Timer Enable bit Off
;_EXTRC_CLKOUT
;_EXTRC_IO		;Habilita el Clock Externo - 
;_INTRC_CLKOUT
;_INTRC_IO		;Habilita el Oscilador Interno - Pines RA6 y RA7 activados
;_EXTCLK
;_HS_OSC		HS oscillator
;_XT_OSC		XT oscillator
;_LP_OSC		LP oscillator
;Configuration Byte 2 Options
;_IESO_ON		Internal External Switchover mode enabled
;_IESO_OFF		Internal External Switchover mode disabled
;_FCMEN_ON		Fail-Safe Clock Monitor enabled
;_FCMEN_OFF		Fail-Safe Clock Monitor disabled

;=====================================================================================
;
;=====================================================================================
;	ENCABEZADOS
;=====================================================================================
	list p=16f88, r=dec		;especificaciones del micro
#include <p16f88.inc>		; inclusion de archivos y registros

	__CONFIG _CONFIG1, _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _MCLR_ON & _LVP_ON & _INTRC_IO
	__CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF
	


;=====================================================================================
;	ETIQUETAS y Declaracion de Variables
;	se debe poner en CBLOCK el inicio de la memoria RAM 
;	segun el Microcontrolador a usar
;=====================================================================================
	;son 80 BYTES, BANCO 0
	;va desde la posicion de memoria H'20' hasta H'6F'
	CBLOCK	H'20' ;se puede escribir en octal O'23' en binario B'101' y en ASCII 'a'
	d1
	d2
	d3
	ENDC


	;*** VARIABLES PARA TODOS LOS BANCOS ***	
	; son 16 bytes en Bank0/1/2/3
	;*******************************************	
	CBLOCK	H'70'	;van desde H'70' hasta H'7F'
	;son Variables usadas en la subrutina INTERRUPCION
	W_TEMP, STATUS_TEMP 
	FSR_TEMP, PCLATH_TEMP
	ENDC

	;BANCO 1 -- son 80 BYTES, desde H'A0' hasta H'EF' 
	;y luego vienen 16 Bytes compartidos desde H'F0' hasta H'FF'
	CBLOCK	H'A0' 	
	ENDC

	;BANCO 2 son 80 BYTES, desde H'110' hasta H'16F' 
	;y luego vienen 16 Bytes compartidos desde H'170' hasta H'17F'
	CBLOCK	H'110' 	
	ENDC
	
	;BANCO 3 son 80 BYTES, desde H'190' hasta H'1EF' 
	;y luego vienen 16 Bytes compartidos desde H'1F0' hasta H'1FF'
	CBLOCK	H'190' 	
	ENDC
;==================================
;	CARGAR DATOS EN LA EEPROM
;==================================
;	;son 128 bytes
	ORG 2100H	;posicion de memoria de la EEPROM
	DE "Mordor Inc"

;===============================
; 	DEFINICION DE VARIABLES
;	eJ: 
;	variable A = 37
;===============================
#DEFINE	LED_0_ON	BSF	PORTA,0	;entran los pulsos del jumper
#DEFINE	LED_0_OFF	BCF	PORTA,0	
#DEFINE	LED_1_ON	BSF	PORTA,1	;entran los pulsos del jumper
#DEFINE	LED_1_OFF	BCF	PORTA,1	
;===============================

;============================= 
;	DECLARACION DE MACROS    = 
;=============================
;============================ 
;	MACRO BANK0
;	para direcionamiento 
;	memoria de datos RAM
;============================
BANK0	MACRO
		BCF		STATUS,RP0		
		BCF		STATUS,RP1	
		BCF		STATUS,IRP		;Limpia el Bit de direccionamiento indirecto	
		ENDM

;============================
;	MACRO BANK1
;	para direcionamiento 
;	memoria de datos RAM
;============================
BANK1	MACRO
		BSF		STATUS,RP0		
		BCF		STATUS,RP1	
		BCF		STATUS,IRP		;Limpia el Bit de direccionamiento indirecto	
		ENDM 
;============================
;	MACRO BANK2
;	para direcionamiento 
;	memoria de datos RAM
;===========================
BANK2	MACRO
		BCF		STATUS,RP0		
		BSF		STATUS,RP1
		BSF		STATUS,IRP		;Pone a 1 el Bit de direccionamiento indirecto		
		ENDM 
;============================
;	MACRO BANK3
;	para direcionamiento 
;	memoria de datos RAM
;===========================
BANK3	MACRO
		BSF		STATUS,RP0		
		BSF		STATUS,RP1		
		BSF		STATUS,IRP		;Pone a 1 el Bit de direccionamiento indirecto
		ENDM 
;===========================
;	MACRO PAGE0
;	para direcionamiento 
;	memoria de programa
;===========================
PAGE0	MACRO
		BCF	PCLATH,3
		BCF	PCLATH,4
		ENDM 
;===========================
;	MACRO PAGE1
;	para direcionamiento 
;	memoria de programa
;===========================	
PAGE1	MACRO
		BSF	PCLATH,3
		BCF	PCLATH,4
		ENDM	 

;==============================
;	MACRO PUSH
;	para guardar los registros
;	W, STATUS y PCLATH 
;==============================
PUSH	MACRO
		MOVWF	W_TEMP			;Guarda el valor de W
		SWAPF	STATUS,W	
		MOVWF	STATUS_TEMP		;guardo el registro STATUS
		MOVF 	PCLATH,W
  		MOVWF 	PCLATH_TEMP  	;GUARDA PCLATH
  		CLRF 	PCLATH    	 	;APUNTA A PAGINA 0
  		MOVF	FSR,W
  		MOVWF	FSR_TEMP		;Guarda registro FSR
		ENDM 
;==============================
;	MACRO PULL
;	para restaurar los registros
;	W, STATUS y PCLATH 
;==============================
PULL	MACRO
		MOVF	FSR_TEMP,W		;Copia en W el registro FSR
		MOVWF	FSR				;Lo restaura
		MOVF 	PCLATH_TEMP,W  	;RECUPERA PCLATH
  		MOVWF 	PCLATH
		SWAPF	STATUS_TEMP,W	;restauro el registro STATUS		
		MOVWF	STATUS
		SWAPF	W_TEMP,F		;restauro el registro W				
		SWAPF	W_TEMP,W
		ENDM

;********************************************
;**********************************************
;**
;**  PROGRAMA PRINCIPAL
;**  PAGE 0: 0x0000
;**
;**********************************************
;**********************************************

reset	ORG		00
		CLRF	STATUS		;se asegura que este en el BANK0	
		CLRF    PCLATH    	;Se asegura que este en el PAGE0
		GOTO	inicio

;==============================
;	MANEJO DE INTERRUPCIONES
;===============================
		ORG	04	;Debera saltar a la subrutina de INTERRUPCION
		PUSH	;Guarda los registros
		CALL	INTERRUPCION
		PULL	;restaura los registros
		RETFIE  ;retorna de la interrupcion


;===================================
;	PARTE PRINCIPAL DEL PROGRAMA
;===================================
inicio	CALL	config_xtal_interno
		CALL	config_puertos		;configura los puertos

;===============================
;	PARTE PRINCIPAL DEL PROGRAMA
;===============================
	LED_1_ON
	CALL	retardo_1seg
	CALL	retardo_1seg
	CALL	retardo_1seg
	LED_1_OFF
salto_01
	LED_0_ON
	CALL	retardo_1seg
	LED_0_OFF
	CALL	retardo_1seg
	GOTO	salto_01

;=========================================
;	MANEJO DE LAS INTERRUPCION
;=========================================
INTERRUPCION	
				
		;.... codigo de la interrupcion.................
		
		
		
		;....fin codigo interrupcion.................
		RETURN			;retorna de la interrupcion

;=================================================
;		Configuracion del XTAL Interno
;=================================================
config_xtal_interno
		BANKSEL	OSCCON
		MOVLW 	0x72			;Oscilador a 8 MHz interno mirar pag 40 y 41 del manual 30487c
		MOVWF 	OSCCON	^ 0x080	
xtal_estable
		BTFSS	OSCCON ^ 0x080,IOFS	;Preguntando si ya se estabilizo
		GOTO	xtal_estable		;el cristal interno a 8 MHz se estabilizo?
		RETURN

;======================================
; 	SUBRUTINA 
;	CONFIGURACION PUERTOS
;	esta subrutina debe inicializar 
;	los puertos del Microcontrolador
; 	OJO el PIN RA5 en el 16F88 SOLO SE PUEDE USAR DE ENTRADA Y NO DE SALIDA
;	[url]http://www.prc68.com/I/PIC16F88.shtml[/url]
;======================================
; 	OJO para que no salga el mensaje de advertencia sobre el banco
;	se debe tener en cuenta hacer el XOR = ^ si esta en:
;	BANCO		RP0	RP1		Rango Dir.			Valor XOR
;	0			0	0		0x0000 a 0x007F		Ninguno
;	1			1	0		0x007F a 0x00FF		0x0080
;	2			0	1		0x00FF a 0x017F		0x0100
;	3			1	1		0x017F a 0x0180		0x0180

config_puertos
	BANKSEL	ANSEL			;se pasa al BANCO 1
	CLRF	ANSEL ^ 0x080

	MOVLW	0x00 ^ (1 << 5)		;Configura todo el PTO A como salida excepto el pin 5 
	MOVWF	TRISA ^ 0x080
	CLRF	TRISB ^ 0x080
	;pone en 0 los pines de salida del micro
	BANKSEL	PORTA
	CLRF	PORTA
	CLRF	PORTB
	
	;salta al banco 0
	BANK0							
	RETURN
;======================================
; 	SUBRUTINA 
;	CONFIGURACION INTERRUPCIONES
;	esta subrutina debe inicializar 
;	las interrupciones; en este 
;	ejemplo queda funcionando RB0/INT
;======================================
config_interrupcion	
			NOP
			
			
			RETURN
;===================================
; 	retardo_1seg
;===================================
retardo_1seg
			;1999996 cycles
	movlw	0x11
	movwf	d1
	movlw	0x5D
	movwf	d2
	movlw	0x05
	movwf	d3
Retardo_1seg_0
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	$+2
	decfsz	d3, f
	goto	Retardo_1seg_0

			;4 cycles
	goto	$+1
	goto	$+1
	RETURN

;================
;	FIN PROGRAMA
;================
		END
```


----------



## Meta (Abr 2, 2008)

No entiendo nada del 16F88, pero dicen que ese PIC podría sustituir al famoso y popular 16F84.

¿Tan bueno es ese PIC?

Tiene 4 kb de memoria flash, ¿realmente vale la pena ese PIC o es mejor empezar con los 16F876A que es lo que ahcen ultimamente?


----------



## MordorInc (Abr 2, 2008)

La verdad el 16f88 me parece muy bueno y trae muchas caracteristicas.
y es pequeñito con el cual es facil empezar.
http://www.finitesite.com/d3jsys/16F88.html
More memory (comparison of the 16F88 to the 16F84A):

    * More program memory (4K to 1K)
    * More data memory (368 to 68 bytes),
    * more data EEPROM (256 to 64 bytes) 
More hardware:

    * hardware serial USART,
    * 3 timers as compared to 1 for the 16F84A
    * hardware PWM
    * hardware compare/capture registers
    * dual onboard comparators
    * programmable voltage reference
    * 7 input channel 10 bit Analog/Digital Converter
    * Syncronous serial port supporting SPI and slave I2C 

por lo que es facil domar la fierecilla... eso creo


----------



## Meta (Abr 2, 2008)

http://www.finitesite.com/d3jsys/16F88.html 

Bastante interesante, aún así veo mucho los 16F876A y ahora la nueva versión 16F886 para empezar a usar PIC.

El 16F88 aunque algunos creen que podría ser el sustituto del 16F84A, la verdad creo que usarán más los 16F876A y los 18F2550.

Vamos a ver como queda la cosa.


----------



## Javier Rambaldo (Abr 3, 2008)

Aqui el F88 es mas barato que el F876.

Al F84 lo podria reemplazar el F628 que es mas barato y tiene mas prestaciones.

El 88 y el 876 son un poco mas caros por tener Analog/Digital Converter.


----------



## Meta (Abr 3, 2008)

Bueno, no se si lo reemplazaría pero lo probaría (el 16F628A), hablan bien de él. Por ahora dicen que el sustituto directo y recomendable del 16F84A es el 16F88, el 16F876A es el 16F886, el 16F877A es el 16F887. En tal caso muchos recomienda centrarse en los 18F2550 y 18F4550 ya que tienen más prestaciones, calidad por el mismo precio.

*16F628A*
http://ww1.microchip.com/downloads/en/DeviceDoc/40044F.pdf

*16F88*
http://ww1.microchip.com/downloads/en/DeviceDoc/30487c.pdf

Prefiero el 16F88, aunque depende para que lo vas a usar recomendable uno más barato como el 16F628A si no vas a utilizar más memoria y cosas de esas.


----------



## danie uribe (Abr 19, 2009)

buenas tardes, soy un estudiante de ingenieria electronica que apenas está aprendiendo a programar pics y el unico que medio me sale es el 16f88, (digo medio me sale porque es el unico que me sale build succeeded).
el problema es que aun me salen algunos warnings y quisiera pedirles su ayuda para saber por que.
lo estoy trabajando con mplab ide v7.01.
le muestro el codigo y los warnings y si ustedes saben por que me seria de mucha ayuda si me dijeran. 
estoy decidido a aprender y todo lo que me digan sera de mucha ayuda. gracias a todos.

he aqui el codigo lo que quiero es activar una salida a partir del estado de una entrada.


```
; Activar una salida a partir del estado de una entrada.
; Zona de direccionamiento de registros y configuracion de bits.

LIST  P=16f88   ; microcontrolador a utilizar
#INCLUDE P16F88.INC  ;Se incluye archivos con registros especiales.

__CONFIG _CONFIG1, _CP_OFF & _LVP_OFF & _BODEN_ON & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _XT_OSC

; Zona de programa

; ETIQ         OPERAC       OPERANDO       COMENTARIOS
               ORG          0X00            ; inicio memoria de programa en direccion 00
               GOTO         INICIO         ; voy al inicio de programa
               ORG          0X05             ; salvo el vector de interrupcion

INICIO         
               BANKSEL      TRISB          ; voy al banco 1 de la memoria de datos.
               MOVLW        0X00           ; cargo registro ANSEL con ceros para
                                           ; dejar los pines de los puertos como
               MOVWF        ANSEL          ; I/O digitales
               CLRF         TRISB          ; configuro el puerto B como salidas
               MOVLW        B'11111111'    ; configuro el puerto A com entradas
               MOVWF        TRISA          
               BANKSEL      PORTB          ; vuelvo al banco 0 de memoria de datos

CICLO
               BTFSC        PORTA,0        ; Si el bit 0 del puerto A está en 0 salto una instruccion
               GOTO         APAGUE         ; si no lo está salto a la etiqueta APAGUE
               MOVLW        B'00000001'    ; saco un 1 por el pin B0 del puerto B
               MOVWF        PORTB          ; para prender el led
               GOTO         CICLO          ; regreso a repetir el ciclo

APAGUE
               CLRF        PORTB           ; limpio el puerto B (apago led)
               GOTO        CICLO           ; regreso al inicio del programa
               END                         ; final del programa.
```



y lo que al darle build all me aparece es lo siguiente.

Clean: Deleting intermediary and output files.
Clean: Deleted file "1 led.err".
Clean: Deleted file "C:\microcontorladores\proyecto 1\1 led.cod".
Clean: Deleted file "C:\microcontorladores\proyecto 1\1 led.hex".
Clean: Deleted file "1 led.lst".
Clean: Done.
Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F88 "1 led.asm" /l"1 led.lst" /e"1 led.err"
Warning[205] C:\MICROCONTORLADORES\PROYECTO 1\1 LED.ASM 4 : Found directive in column 1. (LIST)
Warning[205] C:\MICROCONTORLADORES\PROYECTO 1\1 LED.ASM 7 : Found directive in column 1. (__CONFIG)
Message[302] C:\MICROCONTORLADORES\PROYECTO 1\1 LED.ASM 20 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Message[302] C:\MICROCONTORLADORES\PROYECTO 1\1 LED.ASM 21 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Message[302] C:\MICROCONTORLADORES\PROYECTO 1\1 LED.ASM 23 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Loaded C:\microcontorladores\proyecto 1\1 led.COD
BUILD SUCCEEDED: Sun Apr 19 19:07:32 2009


----------



## MordorInc (Abr 19, 2009)

Hola,  las directiva LIST y CONFIG deben estar un poco justificadas a la derecha.
te envio un template que funciona, ojala te sirva:

```
;******************************************************************************

;   This file is a basic code template for code generation                    *

;   on the  PIC16F88. This file contains the basic code building              *

;   blocks to build upon.                                                     *

;                                                                             *

;   Refer to the MPASM User's Guide for additional informaciónrmation on             *

;   features of the assembler.                                                *

;                                                                             *

;   Refer to the respective data sheet for additional                         *

;   informaciónrmation on the instruction set.                                       *

;                                                                             *

;******************************************************************************

;                                                                             *

;    Filename:         xxx.asm                                                *

;    Date:                                                                    *

;    File Version:                                                            *

;                                                                             *

;    Author:                                                                  *

;    Company:                                                                 *

;                                                                             *

;                                                                             *

;******************************************************************************

;                                                                             *

;    Files required: P16F88.INC                                               *

;                                                                             *

;******************************************************************************

;                                                                             *

;    Features of the 16F88:                                                   *

;                                                                             *

;    1 10-bit PWM                                                             *

;    8 MHz Internal Oscillator                                                *

;    ICD support                                                              *

;    256 bytes of EEPROM data memory                                          *

;    Capture/Compare Module                                                   *

;                                                                             *

;******************************************************************************

;                                                                             *

;    Notes:                                                                   *

;                                                                             *

;                                                                             *

;******************************************************************************

;                                                                             *

;    Revision History:                                                        *

;                                                                             *

;******************************************************************************



;------------------------------------------------------------------------------

; PROCESSOR DECLARATION

;------------------------------------------------------------------------------



     LIST      p=16F88              ; list directive to define processor

     #INCLUDE <P16F88.INC>          ; processor specific variable definitions



;------------------------------------------------------------------------------

;

; CONFIGURATION WORD SETUP

;

; The 'CONFIG' directive is used to embed the configuration word within the 

; .asm file. The lables following the directive are located in the respective 

; .inc file.  See the data sheet for additional informaciónrmation on configuration 

; word settings.

;

;------------------------------------------------------------------------------



     __CONFIG    _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_ON & _PWRTE_ON & _WDT_OFF & _INTRC_IO

     __CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF



;------------------------------------------------------------------------------

;

; VARIABLE DEFINITIONS

;

; Available Data Memory divided into Bank 0 through Bank 3.  Each Bank contains

; Special Function Registers and General Purpose Registers at the locations 

; below:  

;

;           SFR           GPR               SHARED GPR's

; Bank 0    0x00-0x1F     0x20-0x6F         0x70-0x7F    

; Bank 1    0x80-0x9F     0xA0-0xEF         0xF0-0xFF  

; Bank 2    0x100-0x10F   0x110-0x16F       0x170-0x17F

; Bank 3    0x180-0x18F   0x190-0x1EF       0x1F0-0x1FF

;

;------------------------------------------------------------------------------



    CBLOCK 0x20 ; Sample GPR variable registers allocated contiguously

        MYVAR1  ; User variable

        MYVAR2  ; User variable

        MYVAR3  ; User variable

    ENDC



W_TEMP         EQU        0x7D  ; w register for context saving (ACCESS)

STATUS_TEMP    EQU        0x7E  ; status used for context saving (ACCESS)

PCLATH_TEMP    EQU        0x7F  ; variable used for context saving



;------------------------------------------------------------------------------

; EEPROM INITIALIZATION

;

; The 16F88 has 256 bytes of non-volatile EEPROM, starting at address 0x2100

; 

;------------------------------------------------------------------------------



DATAEE    ORG  0x2100

    DE    "MCHP"  ; Place 'M' 'C' 'H' 'P' at address 0,1,2,3



;------------------------------------------------------------------------------

; RESET VECTOR

;------------------------------------------------------------------------------



RESET     ORG     0x0000            ; processor reset vector

          PAGESEL START

          GOTO    START             ; go to beginning of program



;------------------------------------------------------------------------------

; INTERRUPT SERVICE ROUTINE

;------------------------------------------------------------------------------



ISR       ORG     0x0004            ; interrupt vector location



;         Context saving for ISR

          MOVWF   W_TEMP            ; save off current W register contents

          MOVF    STATUS,W          ; move status register into W register

          MOVWF   STATUS_TEMP       ; save off contents of STATUS register

          MOVF    PCLATH,W          ; move pclath register into W register

          MOVWF   PCLATH_TEMP       ; save off contents of PCLATH register



;------------------------------------------------------------------------------

; USER INTERRUPT SERVICE ROUTINE GOES HERE

;------------------------------------------------------------------------------



;         Restore context before returning from interrupt

          MOVF    PCLATH_TEMP,W     ; retrieve copy of PCLATH register

          MOVWF   PCLATH            ; restore pre-isr PCLATH register contents

          MOVF    STATUS_TEMP,W     ; retrieve copy of STATUS register

          MOVWF   STATUS            ; restore pre-isr STATUS register contents

          SWAPF   W_TEMP,F

          SWAPF   W_TEMP,W          ; restore pre-isr W register contents

          RETFIE                    ; return from interrupt



;------------------------------------------------------------------------------

; MAIN PROGRAM

;------------------------------------------------------------------------------



START



;------------------------------------------------------------------------------

; PLACE USER PROGRAM HERE

;------------------------------------------------------------------------------



          GOTO $



          END
```
me comentas como te fue,
suerte


----------



## danie uribe (Abr 20, 2009)

muchisimas gracias mordorinc al justificarlas un poco a la derecha desaparecieron los warnings.
eso que haz hecho lo tendré presente siempre. a eso le llamo un buen compatriota.

que pena molestarte otra vez pare ¿sabrias decirme porque me aparecen los tres mensajes? parece que no estubiera en el banco correcto y si es asi¿como podria corregirlo o no es necesario?

ahora me aparece el siguiente mensaje:

Clean: Deleting intermediary and output files.
Clean: Deleted file "1 led.err".
Clean: Deleted file "C:\microcontorladores\proyecto 1\1 led.cod".
Clean: Deleted file "C:\microcontorladores\proyecto 1\1 led.hex".
Clean: Deleted file "1 led.lst".
Clean: Done.
Executing: "C:\Archivos de programa\Microchip\MPASM Suite\MPAsmWin.exe" /q /p16F88 "1 led.asm" /l"1 led.lst" /e"1 led.err"
Message[302] C:\MICROCONTORLADORES\PROYECTO 1\1 LED.ASM 20 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Message[302] C:\MICROCONTORLADORES\PROYECTO 1\1 LED.ASM 21 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Message[302] C:\MICROCONTORLADORES\PROYECTO 1\1 LED.ASM 23 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Loaded C:\microcontorladores\proyecto 1\1 led.COD
BUILD SUCCEEDED: Mon Apr 20 13:49:39 2009


----------



## MordorInc (Abr 20, 2009)

Mira debes asegurarte que estes trabajando en los bancos que son.
mira mi template ojala te sirva, en especial la zona de configuracion de puertos para que no te salga los errores debido a los bancos:

```
title	"Prende y Apaga un LED usando xtal interno"
#define _version "0.01"
;==================================================================================
;	Autor: LBBJ
;	Fecha: 2008 - 03 - 10
;	Historia del programa
;	
;	descripcion del programa:
;
;	Notas de Hardware
;	Cristal Interno de 8Mhz
;	Bits de Configuracion (15.0 SPECIAL FEATURES OF THE CPU
;	Pagina 131 del manual PIC16F87-88 30487c	
;_CONFIG1
;_CONFIG2
;Configuration Byte 1 Options
;_CP_ALL		;All Program Memory Protected
;_CP_OFF		;No Code Protection
;_CCP1_RB0		CCP1 function on RB0
;_CCP1_RB3		CCP1 function on RB3
;_DEBUG_OFF		In-Circuit Debugger disabled, RB6 and RB7 are general purpose I/O pins
;_DEBUG;_ON		In-Circuit Debugger enabled, RB6 and RB7 are dedicated to the debugger
;_WRT_PROTECT;_OFF		;No program memory write protection
;_WRT_PROTECT_256		;First 256 program memory protected
;_WRT_PROTECT_2048		;First 2048 program memory protected
;_WRT_PROTECT_ALL		;All of program memory protected
;_CPD_ON			Data EE Memory Code Protection Enabled
;_CPD_OFF			Data EE Memory Code Protection Disabled
;_LVP_ON			Low-Voltage Programming Enable Enabled
;_LVP_OFF			Low-Voltage Programming Enable Disabled
;_BODEN_ON			Brown Out Reset Detec Enabled
;_BODEN_OFF			Brown Out Reset Detec Disabled
;_MCLR_ON			Pin function is MCLR
;_MCLR_OFF			Pin function is digital Input, MCLR internally tied to VDD
;_PWRTE_OFF			72 msec. Time Up Delay Off
;_PWRTE_ON			72 msec. Time Up Delay On
;_WDT_ON			Watchdog Timer Enable bit On
;_WDT_OFF			Watchdog Timer Enable bit Off
;_EXTRC_CLKOUT
;_EXTRC_IO		;Habilita el Clock Externo - 
;_INTRC_CLKOUT
;_INTRC_IO		;Habilita el Oscilador Interno - Pines RA6 y RA7 activados
;_EXTCLK
;_HS_OSC		HS oscillator
;_XT_OSC		XT oscillator
;_LP_OSC		LP oscillator
;Configuration Byte 2 Options
;_IESO_ON		Internal External Switchover mode enabled
;_IESO_OFF		Internal External Switchover mode disabled
;_FCMEN_ON		Fail-Safe Clock Monitor enabled
;_FCMEN_OFF		Fail-Safe Clock Monitor disabled

;=====================================================================================
;
;=====================================================================================
;	ENCABEZADOS
;=====================================================================================
	list p=16f88, r=dec		;especificaciones del micro
#include <p16f88.inc>		; inclusion de archivos y registros

	__CONFIG _CONFIG1, _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _MCLR_OFF & _LVP_ON & _INTRC_IO
	__CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF



;=====================================================================================
;	ETIQUETAS y Declaracion de Variables
;	se debe poner en CBLOCK el inicio de la memoria RAM 
;	segun el Microcontrolador a usar
;=====================================================================================
	;son 80 BYTES, BANCO 0
	;va desde la posicion de memoria H'20' hasta H'6F'
	CBLOCK	H'20' ;se puede escribir en octal O'23' en binario B'101' y en ASCII 'a'
	d1
	d2
	d3
	i, j, k
	ENDC


	;*** VARIABLES PARA TODOS LOS BANCOS ***	
	; son 16 bytes en Bank0/1/2/3
	;*******************************************	
	CBLOCK	H'70'	;van desde H'70' hasta H'7F'
	;son Variables usadas en la subrutina INTERRUPCION
	W_TEMP, STATUS_TEMP 
	FSR_TEMP, PCLATH_TEMP
	
	ENDC

	;BANCO 1 -- son 80 BYTES, desde H'A0' hasta H'EF' 
	;y luego vienen 16 Bytes compartidos desde H'F0' hasta H'FF'
	CBLOCK	H'A0' 	
	ENDC

	;BANCO 2 son 80 BYTES, desde H'110' hasta H'16F' 
	;y luego vienen 16 Bytes compartidos desde H'170' hasta H'17F'
	CBLOCK	H'110' 	
	ENDC
	
	;BANCO 3 son 80 BYTES, desde H'190' hasta H'1EF' 
	;y luego vienen 16 Bytes compartidos desde H'1F0' hasta H'1FF'
	CBLOCK	H'190' 	
	ENDC
;==================================
;	CARGAR DATOS EN LA EEPROM
;==================================
;	;son 128 bytes
	ORG 2100H	;posicion de memoria de la EEPROM
	DE "AAhola mundoAA"
	DE	"BB AA BB"

;===============================
; 	DEFINICION DE VARIABLES
;	eJ: 
;	variable A = 37
;===============================
#DEFINE	LED_0_ON	BSF	PORTA,0	;entran los pulsos del jumper
#DEFINE	LED_0_OFF	BCF	PORTA,0	
#DEFINE	LED_1_ON	BSF	PORTA,3	;entran los pulsos del jumper
#DEFINE	LED_1_OFF	BCF	PORTA,3	
;===============================
; 	DEFINICION DE CONSTANTES
;	eJ: 
;	dato_b	EQU 2
;===============================
;	dato_b	EQU 2
;============================= 
;	DECLARACION DE MACROS    = 
;=============================
;============================ 
;	MACRO BANK0
;	para direcionamiento 
;	memoria de datos RAM
;============================
BANK0	MACRO
		BCF		STATUS,RP0		
		BCF		STATUS,RP1	
		BCF		STATUS,IRP		;Limpia el Bit de direccionamiento indirecto	
		ENDM

;============================
;	MACRO BANK1
;	para direcionamiento 
;	memoria de datos RAM
;============================
BANK1	MACRO
		BSF		STATUS,RP0		
		BCF		STATUS,RP1	
		BCF		STATUS,IRP		;Limpia el Bit de direccionamiento indirecto	
		ENDM 
;============================
;	MACRO BANK2
;	para direcionamiento 
;	memoria de datos RAM
;===========================
BANK2	MACRO
		BCF		STATUS,RP0		
		BSF		STATUS,RP1
		BSF		STATUS,IRP		;Pone a 1 el Bit de direccionamiento indirecto		
		ENDM 
;============================
;	MACRO BANK3
;	para direcionamiento 
;	memoria de datos RAM
;===========================
BANK3	MACRO
		BSF		STATUS,RP0		
		BSF		STATUS,RP1		
		BSF		STATUS,IRP		;Pone a 1 el Bit de direccionamiento indirecto
		ENDM 
;===========================
;	MACRO PAGE0
;	para direcionamiento 
;	memoria de programa
;===========================
PAGE0	MACRO
		BCF	PCLATH,3
		BCF	PCLATH,4
		ENDM 
;===========================
;	MACRO PAGE1
;	para direcionamiento 
;	memoria de programa
;===========================	
PAGE1	MACRO
		BSF	PCLATH,3
		BCF	PCLATH,4
		ENDM	 


;********************************************
;**********************************************
;**
;**  PROGRAMA PRINCIPAL
;**  PAGE 0: 0x0000
;**
;**********************************************
;**********************************************

reset	ORG		00
		CLRF	    STATUS		;se asegura que este en el BANK0	
		CLRF    PCLATH    	;Se asegura que este en el PAGE0
		GOTO	inicio

;==============================
;	MANEJO DE INTERRUPCIONES
;===============================
		ORG	04	;Debera saltar a la subrutina de INTERRUPCION
		PUSH	;Guarda los registros
		CALL	        INTERRUPCION
		PULL  	;restaura los registros
		RETFIE  ;retorna de la interrupcion


;===================================
;	PARTE PRINCIPAL DEL PROGRAMA
;===================================
inicio	CALL 	config_xtal_interno
		CALL 	config_puertos		;configura los puertos

;===============================
;	PARTE PRINCIPAL DEL PROGRAMA
;===============================
prueba
	LED_0_ON
	
	CALL 	retardo_1seg
	LED_0_OFF
	CALL 	retardo_1seg
	GOTO	prueba
	
	CALL 	retardo_1seg
	LED_1_OFF
	LED_0_ON
	CALL 	retardo_1seg
	CALL 	retardo_1seg
	CALL 	retardo_1seg
salto_01
;	LED_0_ON
	LED_1_ON
	CALL 	retardo_1seg
	CALL 	retardo_1seg
	CALL 	retardo_1seg
	CALL 	retardo_1seg
	CALL 	retardo_1seg
	CALL 	retardo_1seg
	LED_1_OFF
	CALL 	retardo_1seg
	CALL 	retardo_1seg
	CALL 	retardo_1seg
	CALL 	retardo_1seg
	CALL 	retardo_1seg
	CALL 	retardo_1seg
;	GOTO	$
;	CALL	     retardo_1seg
;	LED_0_OFF
;	CALL 	retardo_1seg
	GOTO	salto_01

;=========================================
;	MANEJO DE LAS INTERRUPCION
;=========================================
INTERRUPCION	
				
		;.... codigo de la interrupcion.................
		
		
		
		;....fin codigo interrupcion.................
		RETURN			;retorna de la interrupcion

;=================================================
;		Configuracion del XTAL Interno
;=================================================
config_xtal_interno
		BANKSEL	OSCCON
		MOVLW 	0x7E			;Oscilador a 8 MHz interno mirar pag 40 y 41 del manual 30487c
		MOVWF 	OSCCON	^ 0x080	
xtal_estable
		BTFSS	OSCCON ^ 0x080,IOFS	;Preguntando si ya se estabilizo
		GOTO	xtal_estable		;el cristal interno a 8 MHz se estabilizo?
		RETURN

;======================================
; 	SUBRUTINA 
;	CONFIGURACION PUERTOS
;	esta subrutina debe inicializar 
;	los puertos del Microcontrolador
; 	OJO el PIN RA5 en el 16F88 SOLO SE PUEDE USAR DE ENTRADA Y NO DE SALIDA
;	[url]http://www.prc68.com/I/PIC16F88.shtml[/url]
;======================================
; 	OJO para que no salga el mensaje de advertencia sobre el banco
;	se debe tener en cuenta hacer el XOR = ^ si esta en:
;	BANCO		RP0	RP1		Rango Dir.			Valor XOR
;	0			0	0		0x0000 a 0x007F		Ninguno
;	1			1	0		0x007F a 0x00FF		0x0080
;	2			0	1		0x00FF a 0x017F		0x0100
;	3			1	1		0x017F a 0x0180		0x0180
;***************************************
;	EJEMPLOS DE CONFIGURACION
;***************************************
;	Configura todo el puerto A como Salida
;	CLRF	    TRISA & 0x7F	
;
;	OJO si se desea todo el puerto A 
;	como entradas digitales se debe hacer lo siguiente:
;	MOVLW 	0x06
;	MOVWF   ADCON1 ^ 0x080	;quedan A y E como entradas digitales
;	MOVLW	0xFF				
;	MOVWF	TRISA ^ 0x080		
;********************************************************************************
;	Configura todo el Puerto B como Entradas
;	MOVLW	0xFF				
;	MOVWF	TRISB ^ 0x080	
;********************************************************************************
;	Asi se configura todo el puerto C para salida	
;	MOVLW	0x00 ^ (1 << 2) + (1 << 5)		;Excepto los Bits 2 y 5 
;	MOVWF	TRISC ^ 0x080			
;********************************************************************************
;	Configura todo el Puerto D como entradas 	
;	MOVLW	 0xFF ^ ((1 << 3) + (1 << 4))	;Excepto los bits 3 y 4
;	MOVWF	TRISD ^ 0x080				
;*********************************************************************************

config_puertos
	BANKSEL	ANSEL			;se pasa al BANCO 1
	CLRF 	ANSEL ^ 0x080
	
	MOVLW	0x00 ^ (1 << 5)		;Configura todo el PTO A como salida excepto el pin 5 
	MOVWF	TRISA ^ 0x080
	CLRF	        TRISB ^ 0x080
	;pone en 0 los pines de salida del micro
	BANKSEL	PORTA
	CLRF 	PORTA
	CLRF 	PORTB
	

	
	;salta al banco 0
	BANK0							
	RETURN
;======================================
; 	SUBRUTINA 
;	CONFIGURACION INTERRUPCIONES
;	esta subrutina debe inicializar 
;	las interrupciones; en este 
;	ejemplo queda funcionando RB0/INT
;======================================
config_interrupcion	
			; ****** SE ACTIVA SEGUN LA INTERRUPCION *******
			; ***** si hay RB0-INT se debe ejecutar:
			;BORRAR_FLAG_RB0_INT	;Borra la bandera que indica que
								;hubo una interrupcion por el pin
								;RB0
								
			;****************************************************
			; SI HAY INTERRUPCION POR TMR0 SE EJECUTA LO SIGUIENTE
			;BORRAR_FLAG_TMR0_INT	;Borra la bandera que indica que
							;hubo una interrupcion TMR0
			
			;*****************************************************
			
			
			
			;ENABLE_IRQ	;Activa las interrupciones de forma global
			
			
			RETURN
;===================================
; 	retardo_1seg
;===================================
retardo_1seg
			;1999996 cycles
	movlw	0x11
	movwf	d1
	movlw	0x5D
	movwf	d2
	movlw	0x05
	movwf	d3
Retardo_1seg_0
	decfsz	d1, f
	goto	$+2
	decfsz	d2, f
	goto	$+2
	decfsz	d3, f
	goto	Retardo_1seg_0

			;4 cycles
	goto	$+1
	goto	$+1
	RETURN

;===================================
; 	SUBRUTINA 2
;===================================
;		nop


;===================================
; 	SUBRUTINA 3
;===================================
;		nop

;**********************************************
;**********************************************
;**
;**  PROGRAMA 
;**  PAGE 1: 0x0400
;**
;**********************************************
;**********************************************
;		ORG	0x0400

;===================================
; 	SUBRUTINA 1
;===================================
;		nop


;===================================
; 	SUBRUTINA 2
;===================================
;		nop


;===================================
; 	SUBRUTINA 3
;===================================
;		nop


;================
;	FIN PROGRAMA
;================
		END
```
Ojla te sirva...
Mordor


----------



## danie uribe (Abr 21, 2009)

muchas gracias he notado que el problema parece estar estar en el xor (se los coloqué y dos de los tres mensajes desaparecieron). el otro no desaparece prque el prgrama no reconoce el registro anse ¿por qué?

muchisimas gracias por tu ayuda, me centraré en comprender bien esta configuracion y que pena molestarlo tanto. 

daniel uribe l.


----------



## EmilianoG (Jun 30, 2009)

Hola! tengo una dudas acerca de si hay que configurar algun registro para usar osc xt en el pic 16f88 y otra acerca de los retardos que se necesitan para la comunicacion serie (con el mismo PIC ), de cuanto tienen que ser?

Emiliano


----------



## MordorInc (Jun 30, 2009)

Hola como estas.
en la palabra de configuracion debes usar 
    _XT_OSC
en vez de 
    _INTRC_IO
los retardos dependen de la comunicacion, por la pregunta creo que estas trabajando por software la comunicacion y no haciendo uso del periferico, estoy correcto.
bajate el manual de MID RANGE de Microchip y busca USART.
saludos


----------



## EmilianoG (Jun 30, 2009)

Hola mordor, ok le agrego eso! Claro eso estoy haciendo, lo probe sin la palabra de configuracion y no me andaba por eso la pregunta..Lo raro es que en el proteus me funciona igual, no se si para este pic hay que configurar algo mas sobre los osc.

Emiliano


----------



## EmilianoG (Jul 1, 2009)

Hola! Estoy usando este pic hace poco, antes usaba el 16f84a, y tengo problemas para calcular retardos de bucles anidados.
Para calcularla el retardo y use una formula que te dan para el  PIC16f84a pero en este pic no me funciona. Por ahi me estare equivocando en algo, pero si hay otra formula me interesaria saberla.

EMiliano


----------



## MordorInc (Jul 1, 2009)

Hola EmilianoG. 
mira la pagina 35 del manual DS30487C (PIC16F88) en que forma debes trabajar el ocilador externo, aparte de eso solo necesitas definirlo en los fusibles de configuracion _XT_OSC .
para el retardo mira la siguiente pagina: http://www.piclist.com/techref/piclist/codegen/delay.htm donde podras generar el retardo que desees.
Saludos


----------



## soyleyenda (Sep 3, 2009)

Estimados amigos, por google he llegado a este formo y encontre mucha ayuda, estoy cambiando de una programa que tenia en el 16F84 a un 16F88, este programa es un secuencial para vehiculos de emergencia el cual lo puedo seleccionar los efectos con un switch seleccionador, he armado este programa con una base que saque de este foro pero al momento de simularlo en el proteus solo funciona el efecto1 y colocando la llave en 0x00. si me pueden ayudar estaria muy agradecido


```
title	"secuencial LED usando xtal interno"
	#define _version "0.01"

	list p=16f88, r=dec		;especificaciones del micro
#include <p16f88.inc>		; inclusion de archivos y registros

	__CONFIG _CONFIG1, _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _MCLR_ON & _LVP_ON & _INTRC_IO
	__CONFIG    _CONFIG2, _IESO_OFF & _FCMEN_OFF

	CBLOCK	H'20' ;se puede escribir en octal O'23' en binario B'101' y en ASCII 'a'
	d1
	d2
	d3
	i, j, k
	llave				;creo que aqui deberian guardarse los efectos seleccionados
	ENDC


	;*** VARIABLES PARA TODOS LOS BANCOS ***	
	; son 16 bytes en Bank0/1/2/3
	;*******************************************	
	CBLOCK	H'70'	;van desde H'70' hasta H'7F'
	;son Variables usadas en la subrutina INTERRUPCION
	RET		
	RET1	
	RET2	
	PDel0   
	PDel1	
	
	ENDC

	
	CBLOCK	H'A0' 	
	
	ENDC

	CBLOCK	H'110' 	
	ENDC
	
	;BANCO 3 son 80 BYTES, desde H'190' hasta H'1EF' 
	;y luego vienen 16 Bytes compartidos desde H'1F0' hasta H'1FF'
	CBLOCK	H'190' 	
	ENDC
	ORG 2100H	;posicion de memoria de la EEPROM
	DE "AAhola mundoAA"
	DE	"BB AA BB"


estado	equ	0x03	; Haciendo asignaciones
trisa	equ	0x05
trisb	equ	0x06	      
porta	equ	0x05
portb	equ	0x06
BANK0	MACRO
		BCF		STATUS,RP0		
		BCF		STATUS,RP1	
		BCF		STATUS,IRP		;Limpia el Bit de direccionamiento indirecto	
		ENDM


BANK1	MACRO
		BSF		STATUS,RP0		
		BCF		STATUS,RP1	
		BCF		STATUS,IRP		;Limpia el Bit de direccionamiento indirecto	
		ENDM 
BANK2	MACRO
		BCF		STATUS,RP0		
		BSF		STATUS,RP1
		BSF		STATUS,IRP		;Pone a 1 el Bit de direccionamiento indirecto		
		ENDM 

BANK3	MACRO
		BSF		STATUS,RP0		
		BSF		STATUS,RP1		
		BSF		STATUS,IRP		;Pone a 1 el Bit de direccionamiento indirecto
		ENDM 
PAGE0	MACRO
		BCF	PCLATH,3
		BCF	PCLATH,4
		ENDM 
	
PAGE1	MACRO
		BSF	PCLATH,3
		BCF	PCLATH,4
		ENDM	 


;********************************************
;**  PROGRAMA PRINCIPAL
;**  PAGE 0: 0x0000
;**
;**********************************************

reset	ORG		00
		CLRF	STATUS		;se asegura que este en el BANK0	
		CLRF    PCLATH    	;Se asegura que este en el PAGE0
		GOTO	inicio


		ORG	04	;Debera saltar a la subrutina de INTERRUPCION
PUSH	;Guarda los registros
		CALL	        INTERRUPCION
PULL  	;restaura los registros
		RETFIE  ;retorna de la interrupcion


;	PARTE PRINCIPAL DEL PROGRAMA

inicio	CALL 	config_xtal_interno
		CALL 	config_puertos		;configura los puertos


;	PARTE PRINCIPAL DEL PROGRAMA

swich   MOVF	porta,0		; carga w con el puerto A
        ANDLW   b'00001111' 	; retiene los 4 bits de interes (las llaves)
		MOVWF   llave	; y los guarda en llaves
        XORLW   0x01		; verifica si es el primer efecto
        BTFSC   estado,2	; si es así
        CALL    efect1		; lo llama y lo ejecuta
        MOVF    llave,0		; sino, carga llaves en w
        XORLW   0x02		; y verifica si es el segundo efecto
        BTFSC   llave,2		; si es así
        CALL    efect2		; lo llama y lo ejecuta
        MOVF    llave,0		; y así con los demás
        XORLW   0x04		; ya me aburrí
        BTFSC   estado,2	; como verás el resto es lo mismo
        CALL    efect3
        MOVF    llave,0
		XORLW	0x08
		BTFSC	estado,2
		CALL	efect4
		MOVF	llave,0
		GOTO    swich		; Comienza a revisar de nuevo

;======================== Efectos =========================

efect1	MOVLW b'10000000'
		MOVWF PORTB
		CALL clokon
		MOVLW b'11000000'
		MOVWF PORTB
		CALL clokon
		MOVLW b'11100000'
		MOVWF PORTB
		CALL clokon
		MOVLW b'11110000'
		MOVWF PORTB	
		CALL clokon
		MOVLW b'11111000'
		MOVWF PORTB
		CALL clokon
		MOVLW b'11111100'
		MOVWF PORTB	
	    CALL clokon
		MOVLW b'11111110'
		MOVWF PORTB
		CALL clokon
		MOVLW b'11111111'
		MOVWF PORTB	
		CALL clokon
		MOVLW b'01111111'
		MOVWF PORTB
		CALL clokon
		MOVLW b'00111111'
		MOVWF PORTB
		CALL clokon
		MOVLW b'00011111'
		MOVWF PORTB
		CALL clokon
		MOVLW b'00001111'
		MOVWF PORTB	
		CALL clokon
		MOVLW b'00000111'
		MOVWF PORTB
		CALL clokon
		MOVLW b'00000011'
		MOVWF PORTB	
	    CALL clokon
		MOVLW b'00000001'
		MOVWF PORTB
		CALL clokon
		MOVLW b'00000000'
		MOVWF PORTB	
		CALL clokon
        

efect2  CLRF    portb		
        BSF     portb,0		; (00000001)
        CALL    clokon
        BSF     portb,1		; (00000011)
        CALL    clokon
        BSF     portb,2		; (00000111)
        CALL    clokon
        BSF     portb,3		; (00001111)
        CALL    clokon
        BSF     portb,4		; (00011111)
        CALL    clokon
        BSF     portb,5		; (00111111)
        CALL    clokon
        BSF     portb,6		; (01111111)
        CALL    clokon
        BSF     portb,7		; (11111111)
        CALL    clokon
        BCF     portb,0		; (11111110)
        CALL    clokon
        BCF     portb,1		; (11111100)
        CALL    clokon
        BCF     portb,2		; (11111000)
        CALL    clokon
        BCF     portb,3		; (11110000)
        CALL    clokon
        BCF     portb,4		; (11100000)
        CALL    clokon
        BCF     portb,5		; (11000000)
        CALL    clokon
        BCF     portb,6		; (10000000)
        CALL    clokon
        ;RETURN			    ; a revisar nuevamente las llaves

efect3   BCF     portb,7		; (01111111)
        BCF     portb,0		; (01111110)
        CALL    clokon
        BCF     portb,6		; (00111110)
        BCF     portb,1		; (00111100)
        CALL    clokon
        BCF     portb,5		; (00011100)
        BCF     portb,2		; (00011000)
        CALL    clokon
        BCF     portb,4		; (00001000)
        BCF     portb,3		; (00000000)
        CALL    clokon
        CALL    clokon
        BSF     portb,3		; (00001000)
        BSF     portb,4		; (00011000)
        CALL    clokon
        BSF     portb,5		; (00111000)
        BSF     portb,2		; (00111100)
        CALL    clokon
        BSF     portb,6		; (01111100)
        BSF     portb,1		; (01111110)
        CALL    clokon
        BSF     portb,7		; (11111110)
        BSF     portb,0		; (11111111)
        CALL    clokon
 		BCF     portb,3		; (11110111)
        BCF     portb,4		; (11100111)
        CALL    clokon
        BCF     portb,5		; (11000111)
        BCF     portb,2		; (11000011)
        CALL    clokon
        BCF     portb,6		; (10000011)
        BCF     portb,1		; (10000001)
        CALL    clokon
        BCF     portb,7		; (00000001)
        BCF     portb,0		; (00000000)
        CALL    clokon
        
 
efect4	MOVLW B'00001111'
        MOVWF PORTB
        CALL  DEMORA ;retardo de 500mS
        CLRF  PORTB
        CALL  DEMORA
	   	MOVLW B'00001111'
        MOVWF PORTB
        CALL  DEMORA
        CLRF  PORTB
		CALL  DEMORA
		MOVLW B'00001111'
        MOVWF PORTB
        CALL  DEMORA
        CLRF  PORTB
		CALL  DEMORA
		   
		MOVLW B'11110000'
        MOVWF PORTB
        CALL  DEMORA
        CLRF  PORTB
        CALL  DEMORA
		MOVLW B'11110000'
        MOVWF PORTB
        CALL  DEMORA
        CLRF  PORTB
        CALL  DEMORA
		MOVLW B'11110000'
        MOVWF PORTB
        CALL  DEMORA
        CLRF  PORTB
        CALL  DEMORA

		MOVLW B'11111111'
        MOVWF PORTB
        CALL  DEMORA
        CLRF  PORTB
        CALL  DEMORA
		MOVLW B'11111111'
        MOVWF PORTB
        CALL  DEMORA
        CLRF  PORTB
        CALL  DEMORA
		MOVLW B'11111111'
        MOVWF PORTB
        CALL  DEMORA
        CLRF  PORTB
        CALL  DEMORA
		
				
        ;RETURN


;=========================================
;	MANEJO DE LAS INTERRUPCION
;=========================================
INTERRUPCION	
				
clokon			MOVLW H'2'
				MOVWF RET
LOOP2			MOVLW H'90'
				MOVWF RET1
LOOP1			MOVLW H'90'
				MOVWF RET2
LOOP			DECFSZ RET2,F
				GOTO LOOP
				DECFSZ RET1,F
				GOTO LOOP1
				DECFSZ RET,F
				GOTO LOOP2
				RETURN

DEMORA      movlw     .100     
            movwf     PDel0    
PLoop1      movlw     .100      
            movwf     PDel1    
PLoop2      clrwdt              
PDelL1      goto      PDelL2         
PDelL2      goto      PDelL3         
PDelL3      clrwdt              
            decfsz    PDel1,  1
            goto      PLoop2   
            decfsz    PDel0,  1 
            goto      PLoop1    
PDelL4      goto      PDelL5         
PDelL5      goto 	  PDelL6         
PDelL6      goto      PDelL7         
PDelL7      clrwdt              
            return    


DELAY		MOVLW h'2'
			MOVWF RET
LOOP21		MOVLW h'75'
			MOVWF RET1
LOOP12		MOVLW h'86'
			MOVWF RET2
BLOOP		DECFSZ RET2,f
			GOTO BLOOP
			DECFSZ RET1,f
			GOTO LOOP12
			DECFSZ RET,f
			GOTO LOOP21
			return


;		Configuracion del XTAL Interno

config_xtal_interno
		BANKSEL	OSCCON
		MOVLW 	b'110'			;Oscilador a 4 MHz interno mirar pag 40 y 41 del manual 30487c
		MOVWF 	OSCCON	^ 0x080	
xtal_estable
		BTFSS	OSCCON ^ 0x080,IOFS	;Preguntando si ya se estabilizo
		GOTO	xtal_estable		;el cristal interno a 4 MHz se estabilizo?
		RETURN


config_puertos
	BANKSEL	ANSEL			;se pasa al BANCO 1
	CLRF 	ANSEL
	
	MOVLW	0x1F 	;Configura puertA como entrada 
	MOVWF	trisa

	MOVLW   b'00000000'	
    MOVWF   trisb		; y Al puerto B como salida

	;pone en 0 los pines de salida del micro
	BANKSEL	PORTA
	CLRF 	PORTA
	CLRF 	PORTB
	
	;salta al banco 0
	BANK0							
	RETURN

      end
```


----------



## retrotero (Nov 27, 2009)

Hola, soy nuevo en programacion y quisiera hacer una pregunta aunque sea un poco torpe.

¿El 16F84A se puede configurar para que utilice su reloj interno (si es que tiene) sin gastar el cristal exterior? Ya se que tiene sus patillas 15-16 para ello.

Si es así diganme como tengo que configurar los fuses en Icprog.

Muchas gracias y perdon por la torpeza.


----------



## Meta (Dic 14, 2009)

Hola:

Iba a comprar un LCD y un 16F876A, para mi sorpresa en la Web oficial ya no se vende el 16F876A, sino el sustituto que es el 16F886. El del 16F877A ahora es el 16F887.

Otra sorpresa que poco a poco ya están trayendo para vender el 16F88, sustituto del 16F84A de toda la vida.

Ya usar los 16F84A espero que todavía lo sigan vendiendo ya que lo uso mucho y estoy aprendiendo con él con este libro.

En cuanto al 16F886/887 por alguna razón lo han cambiado brúscamente, aunque han avisado desde hace un año.

saludo.


----------



## misterlee (Jun 10, 2010)

Mira lei tu comentario apenas pero el ejemplo que mencionas si mal no recuerdo para hacer los efectos tienes que cambiar la llave pero lo que hace cambiar el encendido y apago de leds de cada secuencia es una señal que entra por ra4 en el pic 16f84 esa señal la envia el chip 555 y la toma ra 4 del pic.


----------



## smd10 (Sep 23, 2010)

Hola Retrotero
Con el pic16f84a no puedes poner el reloj interno porque no dispone de él. No te queda más remedio que usar el cristal.
Si quieres disponer de reloj interno puedes usar por ejemplo el 16f88, que es mejor y tiene más funciones que el 16f84.

Saludos a todos.


----------

