TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: electronic182 en 11 de Noviembre de 2011, 12:56:46
-
Hola , estoy empezando en este maravilloso mundo y par empezar estoy practicando los ejercicios del libro Desarrollo de PRoyectos de Pic16F84A , pero al entrar a timer , hay una opcion que no encaja es la OPTION_REG , alguien m podria decir que hacer ,xq segun lei hay otra opcion en el pic que se llama OPTION x eso el autor lo ah modificado,al compilar en el MPLAB me sale de que no c encuentra en el banko 0 en fin ak les dejo el programa:
; PULSACIÓN DC (%) SEMIPERIODO ALTO SEMIPERIODO BAJO
; --------- ------- ---------------------- -----------------------
; Inicial 0 % 0 µs = 0 x 100 µs 10000 µs = 100 x 100 µs
; Primera 10 % 1000 µs = 10 x 100 µs 9000 µs = 90 x 100 µs
; Segunda 20 % 2000 µs = 20 x 100 µs 8000 µs = 80 x 100 µs
; Tercera 30 % 3000 µs = 30 x 100 µs 7000 µs = 70 x 100 µs
; Cuarta 40 % 4000 µs = 40 x 100 µs 6000 µs = 60 x 100 µs
; Quinta 50 % 5000 µs = 50 x 100 µs 5000 µs = 50 x 100 µs
; Sexta 60 % 6000 µs = 60 x 100 µs 4000 µs = 40 x 100 µs
; Septima 70 % 7000 µs = 70 x 100 µs 3000 µs = 30 x 100 µs
; Octava 80 % 8000 µs = 80 x 100 µs 2000 µs = 20 x 100 µs
; Novena 90 % 9000 µs = 90 x 100 µs 1000 µs = 10 x 100 µs
; Décima 100 % 10000µs = 100 x 100 µs 0 µs = 0 x 100 µs
;
; Al conectarlo por primera vez se genera un ciclo de trabajo de 0%, al presionar el pulsador
; cambia al 10%, al actuar una segunda vez cambia al 20%, y así sucesivamente.
; El módulo LCD visualiza el ciclo de trabajo vigente en cada momento.
;
; ZONA DE DATOS **********************************************************************
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x0C
CicloTrabajo ; Ciclo de trabajo deseado.
Timer0_ContadorA ; Contador auxiliar.
ENDC
TMR0_CARGA EQU d'256'-d'89' ; El semiperiodo patrón va a ser de 100 µs.
INCREMENTO_DC EQU d'10' ; Incremento de cada paso del ciclo de trabajo.
#DEFINE Salida PORTB,3
#DEFINE Pulsador PORTB,7
; ZONA DE CÓDIGOS ********************************************************************
ORG 0
goto Inicio
ORG .4
goto ServicioInterrupcion
Mensajes
addwf PCL,F
Mensaje_DC
DT "Duty Cycle: ", 0x00
Mensaje_TantoPorCiento
DT "% ", 0x00
Inicio
bsf STATUS,RP0
bcf Salida
bsf Pulsador
movlw b'00001000' ; TMR0 sin prescaler.
movwf OPTION_REG
bcf STATUS,RP0
call LCD_Inicializa
call DC_CeroPorCiento ; Inicializa con un DC=0%, por tanto salida
movlw b'10001000' ; en bajo permanentemente.
movwf INTCON ; Habilita solo interrupción RBI.
Principal
goto Principal
; Subrutina "ServicioInterrupcion" ------------------------------------------------------
;
ServicioInterrupcion
btfsc INTCON,RBIF ; ¿Interrupción por cambio en el Puerto B?
call Pulsador_Interrupcion
btfsc INTCON,T0IF ; ¿Interrupción por desbordamiento del TMR0?
call Timer0_Interrupcion
bcf INTCON,RBIF ; Limpia flags de reconocimiento.
bcf INTCON,T0IF
retfie
; Subrutina "Pulsador_Interrupcion" -----------------------------------------------------
;
; Subrutina de atención a la interrupción por cambio en la línea RB7 donde se ha
; conectado un pulsador.
; Incrementa el registro (CicloTrabajo), desde 0 (que corresponde a un DC = 0%
; hasta d'100' (que corresponde a un ciclo de trabajo del 100%).
;
Pulsador_Interrupcion
call Retardo_20ms
btfsc Pulsador ; Si no es la línea del pulsador sale.
goto Fin_PulsadorInterrupcion
bsf INTCON,T0IE ; En principio habilita interrupciones TMR0.
movlw INCREMENTO_DC ; Se le va a sumar al ciclo de trabajo
addwf CicloTrabajo,W ; (W) = (CicloTrabajo) + INCREMENTO_DC
movwf CicloTrabajo ; Guarda resultado.
sublw .100 ; Si DC ha llegado al 100% la salida pasa a
btfsc STATUS,Z ; alto permanentemente.
goto DC_100PorCiento
btfsc STATUS,C ; Si pasa de 100, lo inicializa.
goto Visualiza
DC_CeroPorCiento
bcf Salida ; Pone la salida siempre en bajo.
clrf CicloTrabajo ; Inicializa el ciclo de trabajo a 0%.
goto InhabilitaInterrupcionTMR0
DC_100PorCiento
bsf Salida ; Pone la salida siempre en alto.
movlw .100 ; Está al máximo, DC=100%.
movwf CicloTrabajo
InhabilitaInterrupcionTMR0
bcf INTCON,T0IE
Visualiza
call VisualizaCicloTrabajo ; Visualiza el ciclo de trabajo seleccionado.
EsperaDejePulsar
btfss Pulsador
goto EsperaDejePulsar
Fin_PulsadorInterrupcion
movf CicloTrabajo,W ; Carga todos los contadores.
movwf Timer0_ContadorA
movlw TMR0_CARGA
movwf TMR0
return
; Subrutina "Timer0_Interrupcion" -------------------------------------------------------
;
; Mantiene la salida en alto un tiempo igual a 100µs x (CicloTrabajo)
; y en bajo un tiempo igual a 100µs x (100-CicloTrabajo).
;
Timer0_Interrupcion
movlw TMR0_CARGA
movwf TMR0
decfsz Timer0_ContadorA,F ; Decrementa el contador.
goto Fin_Timer0_Interrupcion
btfsc Salida ; Testea el anterior estado de la salida.
goto EstabaAlto
EstabaBajo
nop
bsf Salida ; Estaba bajo y lo pasa a alto.
movf CicloTrabajo,W ; Repone el contador nuevamente con el tiempo en
movwf Timer0_ContadorA ; alto.
nop
goto Fin_Timer0_Interrupcion
EstabaAlto
bcf Salida ; Estaba alto y lo pasa a bajo.
movf CicloTrabajo,W ; Repone el contador nuevamente con el tiempo
sublw .100 ; en bajo.
movwf Timer0_ContadorA
Fin_Timer0_Interrupcion
return
; Subrutina "VisualizaCicloTrabajo" -----------------------------------------------------
;
; Visualiza el ciclo de trabajo en el visualizador LCD. Se hace de manera tal que cuando
; haya que visualizar un número mayor de 9, las decenas siempre se visualicen aunque sean
; cero. Y cuando sea menor de 99 las decenas no se visualicen si es cero.
;
VisualizaCicloTrabajo
call LCD_Linea1 ; Visualiza el ciclo de trabajo seleccionado.
movlw Mensaje_DC
call LCD_Mensaje
movf CicloTrabajo,W
call BIN_a_BCD ; Lo pasa a BCD.
movf BCD_Centenas,W ; Visualiza las centenas.
btfss STATUS,Z ; Si son cero no visualiza las centenas.
goto VisualizaCentenas
movf CicloTrabajo,W ; Vuelve a recuperar este valor.
call BIN_a_BCD ; Lo pasa a BCD.
call LCD_Byte ; Visualiza las decenas y unidades.
goto VisualizaTantoPorCiento
VisualizaCentenas
call LCD_Nibble ; Visualiza las centenas.
movf CicloTrabajo,W ; Vuelve a recuperar este valor.
call BIN_a_BCD ; Lo pasa a BCD.
call LCD_ByteCompleto ; Visualiza las decenas (aunque sea cero) y
VisualizaTantoPorCiento ; unidades.
movlw Mensaje_TantoPorCiento ; Y ahora el simbolo "%".
call LCD_Mensaje
return
INCLUDE <LCD_MENS.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
INCLUDE <BIN_BCD.INC>
END
-
No existe tal cosa. Si bajas el datasheet del PIC, y lo revisas, veras que no existe.
-
Otro tuto para seguir: http://www.todopic.com.ar/foros/index.php?topic=24720.0 ;-)
-
Vamos a ver, si miramos el datasheet del 16f84a tenemos que en el banco 1 en la dirección 81h tenemos el registro OPTION, ahora si miramos el archivo "P16F84A.INC" vemos que a ese registro lo han definido como OPTION_REG, esto es debido a que algunos pic tienen una instrucción llamada "option" y por eso le cambian el nombre al registro.
Y sobre tu pregunta, ¿es este el "error" que te sale?
Message[302] C:\aa.ASM 29 : Register in operand not in bank 0. Ensure that bank bits are correct.
Ya que si es esto no es un error sino una advertencia para que te asegures que estas trabajando en el banco 1 y no en el 0.
Un saludo
-
gracias !
de grandisima ayuda.. nos vemos