TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: mamsat en 26 de Octubre de 2010, 13:04:26
-
Hola he hecho algun programilla en asm, pero a la hora de compilar me da errores por todos lados. He probado tambien con algun programa qeu me han asegurado qeu funciona y tambien me da tropecientos errores.
copio el codigo es muy simple o eso parece y a ver si me orientais
__CONFIG _CP_OFF& _WDT_OFF& _PWRTE_OFF& _XT_OSC
LIST P=16F84A
INCLUDE P16F84A.INC
status equ 03h
optionr equ 81h
trisa equ 85h
porta equ 05h
trisb equ 86h
portb equ 06h
PDel0 equ 20h
PDel1 equ 21h
PDel2 equ 22h
PDel0b equ 23h
Inicio:
bsf status,5 ; se pasa al banco 1 de RAM
clrf trisa ; se programa el puerto A como salida
movlw 0Fh ; dato para la programación del puerto B
movwf trisb ; parte alta como salida y parte baja como entrada
bcf optionr,7 ; se habilitan resistencias de Pull Up
bcf status,5 ; se pasa al banco 0 de RAM
bcf porta,0
bsf porta,1
bcf portb,0
call DEMORA;
call DEMORA;
call DEMORA;
call DEMORA;
;----espera varios segundos y llama a randon y a play -----
call DEMORA
call DEMORA
call DEMORA
call DEMORA
call DEMORA
call DEMORA
call DEMORA
call DEMORA
call random; llama a la rutina random
call DEMORA
call DEMORA
call DEMORA
call DEMORA
call play; llama a la rutina play
call DEMORA
;----------------------------------Random pulsa por RA0---------------------------
random:
bsf porta,0; enciende el random
call DEMORA
call DEMORA
bcf porta,0; suelta el random
call DEMORA
-----------------------------------Play pulsa por RA1-----------------------------
play:
bsf porta,1; enciende el play
call DEMORA
call DEMORA
bcf porta,1; suelta el play
call demorab
loop:
return
;------------Demora un 1 segundo--------------------------
DEMORA movlw .14 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .72 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .247 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;-------------------------------------------------------------
;----------Demorab de 30 minutos------------------------------
cblock
1
2
1_2
1_3
endc
demorab
;1799999989 cycles
movlw 0xFE
movwf 1
movlw 0xC2
movwf 2
movlw 0xEC
movwf 1_2
movlw 0x0C
movwf 1_3
demorab_0
decfsz 1, f
goto $+2
decfsz 2, f
goto $+2
decfsz 1_2, f
goto $+2
decfsz 1_3, f
goto demorab_0
;7 cycles
goto $+1
goto $+1
goto $+1
nop
;4 cycles (including call)
return
;-------------------------------------------------------------
end
-
Deberias indicar como realizas la conpilacion. Vaya como tiens definidas las rutas de donde se encuentran los ficheros a compilar.
F.
-
Casi todos los errores estan relacionados con la "demora" con minusculas, te cansas de llamarla pero la etiqueta pone demorab, y el MPLAB no traga.
antes de esa demorab haces un "cblock" en muy mal sitio y muy mal hecho, tienes que definirlos al principio, donde estan los PDel, de hecho donde haceslos movwf 1_2 y 1_3 y decfsz tambien te da errores. Todo lo relacionado con esa demora esta mal. cambiala toda, puedes usar este programa que es con el que esta hecha la "DEMORA".
http://www.todopic.com.ar/foros/index.php?topic=5968.0
Tambien te pone muchos warning, esto es porque estas en BANK_1, tienes que ponerlo en BANK_0, si no aun sin errores tampoco te funcionara
bcf STATUS.5 ; ASI SE PONE EN BANK_0
bcf porta,0
bsf porta,1
bcf portb,0
-
en realidad tengo dos demoras, una es la demora a secas para pausas cortas de un segundo y la otra la demorab para tiempos de 30 minutos. y ambas existen, pero ¿tienen qeu estar en mayusculas igual qeu la llamada??
Lo del banco lo tengo en el 0 no se si esta mal hecho pero esta tal cual me indicas.
lo de la demora la he hecho esta misma mañana desde que habia en el foro...
voy a probar la que me dices a ver qeu tal va.
Bueno pues el programa qeu me recomiendas no me funciona con el windows 7 de las narices...
Intentare copiar otra demora de otro codigo...
Pues nada qeu no encuentro ninguna demora tan larga... alguien me puede pasar una para 30 min???
-
.
En realidad no hay problemas con el nombre de las demoras. Lo que sí es un error es el cblock, pero no porque esté al comienzo o al final, sino porque le falta indicar cuál es la 1º dirección de la lista de variables. Según el archivo de ayuda del MPASM, si no hay un cblock anterior, el valor por omisión es 00h. Para evitarte esto, deberías reemplazar por:
cblock 24h ; que es el siguiente valor "libre" después de PDel0b
Otra cosa. Las directivas LIST, INCLUDE, __CONFIG, y todas las otras, así como también cada línea donde haya una instrucción, no pueden ir en la primera columna de código, sino que debe dejarse un margen a la izquierda (así como se ve en las rutinas de demora).
Los mensajes que dicen "302 Register in operand not in bank 0. Ensure that bank bits are correct." (el famoso mensaje 302) lo genera el compilador siempre que modifiques el valor de un registro, ya sea que esté o no en el banco de memoria correcto. Pero que aparezcan no quiere decir que en realidad esté mal el banco de trabajo. Si te molestan, podés agregar al principio del código la línea:
errorlevel -302
Una vez arreglados los errores, compilá de nuevo, pero esta vez tildá la opción de "Generar archivo de error" (o algo así). Se te va a generar una archivo con extensión .err con la lista detallada de los errores, warnings y mensajes que encontró. Así vas a tener una idea mucho más clara de qué es lo que debe modificarse.
Espero que te sirva de ayuda ;-).
¡Saludos!
-
Si hay problemas si le llamas en la etiqueta "demorab" y despues en el programa la llamas call demora (sin b)
En el cblock es posible que al ponerle una direccion donde comenzar se lo admita, tal y como esta da errores, y tambien en la subrutina cuando usa esos registros.
El warning 302, fue un error mio el que da es el 203, si pasa a banco_0, aqui no hay problema.
El PDel (programa que te puse arriba) no hace demoras tan grandes ni de 30m, ni de 10m ni de 5m.
Mansat no se que quires hacer con esto pero te das cuenta que llamas 8 veces seguidas a un retardo de30 minutos, es decir 4 horas, despues haces algo y vuelves a llamarla otras 4 veces, otras 2 horas, no estaras equivocado y querras poner una mas pequeña?.te compadezco cuando quieras probarlo te vas cansar de esperar.
Si quieres te pongo una mas pequeña y la llamas mas veces que te hara lo mismo.
Saludos
-
.
Si hay problemas si le llamas en la etiqueta "demorab" y despues en el programa la llamas call demora (sin b)
Es que hay una rutina DEMORA y otra demorab. Yo no encuentro ningún llamado a demora (en minúsculas) :?
Otra cosa que veo ahora es que la rutina random no termina con un return. Y también que en el programa no hay ningún salto para crear un lazo cíclico, sino que las sentencias se ejecutan en secuencia hasta llegar al end.
Estas dos cosas no se si son intencionales o si representan errores a revisar.
Saludos
-
Pues yo el dia que lo copie (copiar y pegar) esto...
;----espera varios segundos y llama a randon y a play -----
call DEMORA
call DEMORA
call DEMORA
call DEMORA
call DEMORA
call DEMORA
call DEMORA
call DEMORA
call random; llama a la rutina random
call DEMORA
call DEMORA
call DEMORA
call DEMORA
call play; llama a la rutina play
call DEMORA
Esto estaba asi, de hecho la mayoria de los errores los da aqui. Yo deduje, parece que mal, que le faltaba la b. Esto lo acabo de sacar de mi MPLAB que aun lo tenia sin borrar. O hay duendes o ya no se ni hacer copy paste.
;----espera varios segundos y llama a randon y a play -----
call demora
call demora
call demora
call demora
call demora
call demora
call demora
call demora
call random; llama a la rutina random
call demora
call demora
call demora
call demora
call play; llama a la rutina play
call demora
por eso decia lo de las 4 horas.
-
Asi ya no da error, en pago por mis errores, te los he corregido, no se si funciona bien solo lo he "desbravado". :lol: :lol:
Qeadn los warnings 302 pero esta bien, por estos no te preocupes, y los 203,que debes de correr todas las instrucciones a la columna 1.
__CONFIG _CP_OFF& _WDT_OFF& _PWRTE_OFF& _XT_OSC
LIST P=16F84A
INCLUDE P16F84A.INC
status equ 03h
optionr equ 81h
trisa equ 85h
porta equ 05h
trisb equ 86h
portb equ 06h
PDel0 equ 20h
PDel1 equ 21h
PDel2 equ 22h
PDel0b equ 23h
Inicio:
bsf status,5 ; se pasa al banco 1 de RAM
clrf trisa ; se programa el puerto A como salida
movlw 0Fh ; dato para la programación del puerto B
movwf trisb ; parte alta como salida y parte baja como entrada
bcf optionr,7 ; se habilitan resistencias de Pull Up
bcf status,5 ; se pasa al banco 0 de RAM
bcf porta,0
bsf porta,1
bcf portb,0
call DEMORA;
call DEMORA;
call DEMORA;
call DEMORA;
;----espera varios segundos y llama a randon y a play -----
call DEMORA
call DEMORA
call DEMORA
call DEMORA
call DEMORA
call DEMORA
call DEMORA
call DEMORA
call random; llama a la rutina random
call DEMORA
call DEMORA
call DEMORA
call DEMORA
call play; llama a la rutina play
call DEMORA
;----------------------------------Random pulsa por RA0---------------------------
random:
bsf porta,0; enciende el random
call DEMORA
call DEMORA
bcf porta,0; suelta el random
call DEMORA
;-----------------------------------Play pulsa por RA1-----------------------------
play:
bsf porta,1; enciende el play
call DEMORA
call DEMORA
bcf porta,1; suelta el play
call demorab
loop:
return
;------------Demora un 1 segundo--------------------------
DEMORA movlw .14 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .72 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .247 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;-------------------------------------------------------------
;----------Demorab de 30 minutos------------------------------
cblock 0x24
PDel3
PDel4
PDel5
PDel6
endc
demorab
;1799999989 cycles
movlw 0xFE
movwf PDel3
movlw 0xC2
movwf PDel4
movlw 0xEC
movwf PDel5
movlw 0x0C
movwf PDel6
demorab_0
decfsz PDel3, f
goto $+2
decfsz PDel4, f
goto $+2
decfsz PDel5, f
goto $+2
decfsz PDel6, f
goto demorab_0
;7 cycles
goto $+1
goto $+1
goto $+1
nop
;4 cycles (including call)
return
;-------------------------------------------------------------
end
-
Lo primero agradecer a Mtristan y tapi8 la ayuda qeu me habeis dado.
Lo segundo explicare un poco de qeu se trata este proyecto, y no es ni mas ni menos que de hacer pequeños montajes sencillos para ir soltandome en esto de programar, he tratado de emular un montaje qeu hice recientemente con un 12f629 a base de corta y pegas y que consegui hacer, pero quiero centrarme en programar unicamente con el 16f84 por lo qeu trate de hacer el mismo proyecto y no era capaz de hacerlo.
Respecto a los tiempos tan largos es por qeu el uso qeu le di al 12f629 era para hacer un arrancador automatico de cd, lo qeu hacia era qeu si estabas escuchando musica y se iba la luz, cuando volvia esperaba unos segundos (para qeu leyese el disco) y volvia a pulsar el play automaticamente, de hay qeu haya qeu esperar para el primer pulso 10 segundos o mas, y el ciclo era algo indiferente, que lo introduje para aprender a hacerlo observando las diferencias.
Como os dije gracias por la ayuda y vuestro tiempo, un saludo.