TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: pic_877a en 17 de Enero de 2020, 01:44:09
-
amigos del foro un cordial saludo y un feliz año nuevo 2020 para todos y todas.
he estado realizando el siguiente programa que es un secuencial de luces con Pic 10F200.
ERRORLEVEL -302
LIST P = 10F200, r=DEC, n=66
INCLUDE "P10F200.INC"
;-----------------------------------------------------------------------------------------------------------
; Pin del circuito
; ===============================
;-----------------------------------------------------------------------------------------------------------
#define p_rojo GPIO,0 ; pin del canal rojo
#define p_verde GPIO,1 ; pin del canal verde
#define p_azul GPIO,2 ; pin del canal azul
#define IOMap B'111000' ; mapa de los pin del micro: los tres primeros como salidas
;-----------------------------------------------------------------------------------------------------------
; Otras constantes
; ===============================
;-----------------------------------------------------------------------------------------------------------
#define tiempo_rojo 30 ; tiempos distintos de los canales
#define tiempo_verde 37 ; para obtener todas
#define tiempo_azul 45 ; las combinaciones posibles
#define tiempo_general 100 ; velocidad de variación general
; (bajar el valor para obtener mas velocidad)
;-----------------------------------------------------------------------------------------------------------
; Registros en RAM
; ================
;-----------------------------------------------------------------------------------------------------------
cblock 20H ; Dummy Origin
intensidad_verde ; registro intensidad canal verde
intensidad_rojo ; registro intensidad canal rojo
intensidad_azul ; registro intensidad canal azul
divisor_verde ; divisor canal verde
divisor_rojo ; divisor canal rojo
divisor_azul ; divisor canal azul
divisor_general ; divisor general
RegPwm ; registro PWM para regular la intensidad de los tres canales
RegFlags ; registro de uso general
endc
#define aumenta_verde RegFlags,0 ; flag que indica si el canal verde está aumentando su intensidad
#define aumenta_rojo RegFlags,1 ; flag que indica si el canal rojo está aumentando su intensidad
#define aumenta_azul RegFlags,2 ; flag que indica si el canal azul está aumentando su intensidad
;-----------------------------------------------------------------------------------------------------------
; MACRO cambio pagina de la RAM
; ================================
;-----------------------------------------------------------------------------------------------------------
PAG_RAM0 MACRO
bcf STATUS,RP0
ENDM
PAG_RAM1 MACRO
bsf STATUS,RP0
ENDM
;-----------------------------------------------------------------------------------------------------------
; Vector de arranque del micro
;-----------------------------------------------------------------------------------------------------------
ORG 0
PAG_RAM1
call 3FFh ; Ajusta el oscilador a 4MHz
movwf OSCCAL ; usando el valor que se encuentra en 3FFh
PAG_RAM0
goto main
;-----------------------------------------------------------------------------------------------------------
; SUBRUTINAS
;-----------------------------------------------------------------------------------------------------------
ORG 10h ; beginning of program Eprom
;-----------------------------------------------------------------------------------------------------------
; Aumenta o disminuye la intensidad del canal verde
;-----------------------------------------------------------------------------------------------------------
OnOffVerde
decfsz divisor_verde,f ; divisor para disminuir la velocidad de cambio
retlw 0 ; Vuelve al ciclo principal
movlw tiempo_verde ; el divisor se actualiza
movwf divisor_verde ; con la constante tiempo_verde
btfss aumenta_verde ; canal en fase di aumento de la intensidad?
goto DisminuyeVerde ; No, entonces salta a disminuye
incfsz intensidad_verde,f ; Si, entonces aumenta la intensidad
retlw 0 ; Vuelve al ciclo principal
bcf aumenta_verde ; La intensidad llegó al máximo, entonces
decf intensidad_verde,f ; cambia al modo de disminución
retlw 0 ; Vuelve al ciclo principal
DisminuyeVerde
movf intensidad_verde,f ; Modo de disminución
btfsc STATUS,Z ; Controla si no llegó al mínimo
goto DisminuyeVerdeCambia ; Si es si, salta para cambiar el modo
decf intensidad_verde,f ; Disminuye la intensidad
retlw 0 ; Vuelve al ciclo principal
DisminuyeVerdeCambia
bsf aumenta_verde ; Cambia al modo de aumento
retlw 0 ; Vuelve al ciclo principal
;-----------------------------------------------------------------------------------------------------------
; Aumenta o disminuye la intensidad del canal rojo
;-----------------------------------------------------------------------------------------------------------
OnOffRojo
decfsz divisor_rojo,f ; La descripción de esta sub es igual
retlw 0 ; a la del canal verde (OnOffVerde)
movlw tiempo_rojo
movwf divisor_rojo
btfss aumenta_rojo
goto DisminuyeRojo
incfsz intensidad_rojo,f
retlw 0
bcf aumenta_rojo
decf intensidad_rojo,f
retlw 0
DisminuyeRojo
movf intensidad_rojo,f
btfsc STATUS,Z
goto DisminuyeRojoCambia
decf intensidad_rojo,f
retlw 0
DisminuyeRojoCambia
bsf aumenta_rojo
retlw 0
;-----------------------------------------------------------------------------------------------------------
; Aumenta o disminuye la intensidad del canal azul
;-----------------------------------------------------------------------------------------------------------
OnOffAzul
decfsz divisor_azul,f ; La descripción de esta sub es igual
retlw 0 ; a la del canal verde (OnOffVerde)
movlw tiempo_azul
movwf divisor_azul
btfss aumenta_azul
goto DisminuyeAzul
incfsz intensidad_azul,f
retlw 0
bcf aumenta_azul
decf intensidad_azul,f
retlw 0
DisminuyeAzul
movf intensidad_azul,f
btfsc STATUS,Z
goto DisminuyeAzulCambia
decf intensidad_azul,f
retlw 0
DisminuyeAzulCambia
bsf aumenta_azul
retlw 0
;-----------------------------------------------------------------------------------------------------------
; Actualiza intensidad de los 3 canales (rojo, verde y azul)
; en base a los registros de intensidad
;-----------------------------------------------------------------------------------------------------------
PwmRefresh
incf RegPwm,f ; actualiza la intensidad
movf intensidad_verde,W ; del canal verde
subwf RegPwm,W
btfss STATUS,C
bsf p_verde
btfsc STATUS,C
bcf p_verde
movf intensidad_rojo,W ; actualiza la intensidad
subwf RegPwm,W ; del canal rojo
btfss STATUS,C
bsf p_rojo
btfsc STATUS,C
bcf p_rojo
movf intensidad_azul,W ; actualiza la intensidad
subwf RegPwm,W ; del canal azul
btfss STATUS,C
bsf p_azul
btfsc STATUS,C
bcf p_azul
retlw 0
;-----------------------------------------------------------------------------------------------------------
; MAIN
;-----------------------------------------------------------------------------------------------------------
main
PAG_RAM1
movlw IOMap
movwf TRISIO ; Set de los puertos como entradas o salidas
movlw B'11100011' ; RB pull-up on. Prscaler %128 in Watch-Dog (max.time)
movwf OPTION_REG ;
PAG_RAM0
movlw B'00000111' ; Set de los puertos como digitales
movwf CMCON
bcf INTCON,GIE ; Ningun interrupt global activado
bcf INTCON,PEIE ; Ningun interrupt periférico activado
movlw tiempo_verde ; Carga todos los registros
movwf divisor_verde ; con los datos necesarios
movlw tiempo_rojo ; para el correcto funcionamiento
movwf divisor_rojo
movlw tiempo_azul
movwf divisor_azul
movlw tiempo_general
movwf divisor_general
clrf RegFlags
clrf divisor_general
clrf intensidad_azul
clrf intensidad_verde
clrf intensidad_rojo
;-----------------------------------------------------------------------------------------------------------
; CICLO DE TRABAJO PRINCIPAL
;-----------------------------------------------------------------------------------------------------------
Ciclo
clrwdt ; Watchdog para evitar que el micro se pueda bloquear
CicloVerde
call PwmRefresh ; Actualiza los canales (PWM)
decfsz divisor_general,f ; Ciclo para disminuir la velocidad
goto CicloVerde ; de la actualizaz
call OnOffVerde
movlw tiempo_general
movwf divisor_general
clrwdt
CicloRojo
call PwmRefresh
decfsz divisor_general,f
goto CicloRojo
call OnOffRojo
movlw tiempo_general
movwf divisor_general
clrwdt
CicloAzul
call PwmRefresh
decfsz divisor_general,f
goto CicloAzul
call OnOffAzul
movlw tiempo_general
movwf divisor_general
goto Ciclo
;***********************************************************************************************
; Service Interrupt: SELECT
;***********************************************************************************************
service_int
retfie
;***********************************************************************************************
END
luego al compilar dicho programa me sale muchos errores, en total son 12.
adjunto las siguientes imágenes de los errores presentando en el programa que estoy realizando, mi objetivo es poder aprender a programar este pic de la familia 10F y asi probar el programador de Pics y dspic de Mikroelectronics.
espero y me puedan ayudar a corregir estos errores y asi poder aprender mas y por supuesto de ustedes amigos del foro.
gracias
Jose Luis
-
Algunos errores/warning son obvios:
Warning[219] F:\CCS\MPLABX\MPASM.X\MAIN.ASM 249 : Invalid RAM location specified.
Esto es porque el CBLOCK esta ubicado en 0x20, cuando la memoria del PIC10F200 va del 0x10 al 0x1F.
Error[113] F:\CCS\MPLABX\MPASM.X\MAIN.ASM 65 : Symbol not previously defined (RP0)
Error[113] F:\CCS\MPLABX\MPASM.X\MAIN.ASM 207 : Symbol not previously defined (TRISIO)
Error[113] F:\CCS\MPLABX\MPASM.X\MAIN.ASM 210 : Symbol not previously defined (OPTION_REG)
Error[113] F:\CCS\MPLABX\MPASM.X\MAIN.ASM 61 : Symbol not previously defined (RP0)
Error[113] F:\CCS\MPLABX\MPASM.X\MAIN.ASM 215 : Symbol not previously defined (CMCON)
Error[113] F:\CCS\MPLABX\MPASM.X\MAIN.ASM 217 : Symbol not previously defined (INTCON)
Error[113] F:\CCS\MPLABX\MPASM.X\MAIN.ASM 217 : Symbol not previously defined (GIE)
Error[113] F:\CCS\MPLABX\MPASM.X\MAIN.ASM 218 : Symbol not previously defined (INTCON)
Error[113] F:\CCS\MPLABX\MPASM.X\MAIN.ASM 218 : Symbol not previously defined (PEIE)
Los demas tambien es un poco mas obvio...
No existe el registro TRISIO, sino existe una instruccion llamada TRIS para controlarlo. Tampoco existen todos los demas registros como le llamaste.
Concretamente tenes unicamente estos registros:
INDF EQU H'0000'
TMR0 EQU H'0001'
PCL EQU H'0002'
STATUS EQU H'0003'
FSR EQU H'0004'
OSCCAL EQU H'0005'
GPIO EQU H'0006'
y ninguno mas. Claramente ese codigo que tenes es de otro PIC...
Esa version no posee comparador, asi que el CMCON no tiene sentido.
PAG_RAM0 MACRO
bcf STATUS,RP0
ENDM
PAG_RAM1 MACRO
bsf STATUS,RP0
ENDM
Tenes un solo banco, no tiene sentido este codigo, ni siqueira existen los bits.
call 3FFh ; Ajusta el oscilador a 4MHz
movwf OSCCAL ; usando el valor que se encuentra en 3FFh
El lugar donde esta ubicado el valor es en 0xFF donde llega la memoria de ese PIC. y no es un RETLW sino un MOVLW ,
En el reset el PCL apunta directamente a 0xFF por lo tanto lo unico que tense que hacer es el MOVWF al OSCCAL
----------------------------------
Siempre que programes en ASM, si o si tenes que referenciarte al datasheet:
http://ww1.microchip.com/downloads/en/DeviceDoc/40001239F.pdf
-
hola amigo KILLERJC, ante todo un feliz año nuevo y segundo gracias por responder, hasta ahora le respondo razón he estado en el hospital muy seguido por estar recibiendo Quimioterapia y Radioterapia tengo una LEUCEMIA y LINFOMA NO HODKING es un cáncer en la sangre, sobre el código este corre sin problema en el Pic 12F629, y quise probar si en el Pic 10F200 funcionaba, pero veo que NO, tengo que realizar Muchos Cambios y seguir estudiando mas en Asm.
Gracias
Jose Luis