Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

10/02/2009 #1


PIC 16f84a Problema extraño (programacion), proyecto alarma
Buenas, por suerte logre comenzar nuevamente con el pic tras problemas personales.
Pero vuelvo a tener un problema... el siguiente programa (copiado abajo), no es mas que un sencillo sistema de alarma de 4 zonas, donde titila al desconectarse una de las zonas la luz debida y se iran sumando las luces de las correspondientes zonas. Hasta que oprimamos el reset.

mi problema lo encuentro en el boton de reset usando la condicion:

btfsc k,0 (bit menos significativo para utilizar como boton reset.)
veran que el paso anterior fue almacenar PORTA en K para que este sea leido faciltmente, pero por alguna razon K en ves de almacenar PORTA me almacena el numero 5. Podrian ayudarme por favor a entender cual es el bug que me altera tanto esta tarde?


((PROGRAMA SACADO PARA NO EXTENDER DEMASIADO EL FORO))



PD: utilizo el simulador picsimulator IDE, porque es el unico que me permite modificiar la entrada... el MPLAB sim (dbugger) como se puede modificiar la entrada en el caso de tener una entrada?

PD2: que es el error que tira de la fila 60? alguien lo logra identificar?

MUCHAS GRACIAS!
10/02/2009 #2


Te carga a K con 5, porque es el valor en dónde está implementado el PORTA ya que le erraste en la instrucción

movlw PORTA
movwf k

La instrucción tiene que ser

movFw PORTA
movwf K

Con respecto a la línea 60, ¿Cuál es la línea 60?
10/02/2009 #3


Sigo viendo que tienes varios errores y por la misma instrucción. Tu intentas recuperar el valor guardado en una pocición de la RAM, ya sea un registro o la pocición de la RAM para el usuario con la siguiente instrucción

movlw

Esta instrucción, carga un literal, no recupera el valor guardado. Si PORTA está guardado en la pocición 5, al poner movlw PORTA el ensamblador interpreta movlw 0x05

Para recuperar el valor guardado en una pocición de la RAM la instrucción es

MOVFW

Revisa todo el programa y modifica según sea necesario y vuelve a intentar.
10/02/2009 #4

Avatar de Meta

Hola:

Quizás este tutorial te ayude.

http://www.forosdeelectronica.com/po...39.html#169439

Un cordial saludo.
11/02/2009 #5


Ahora deberia de estar arreglado. (la verdad disculpen ese error, ya me estoy olvidando cosas) pero resulta que sigue sin andar mi programa, podrian nuevamente hacerme el mismo favor?



((PROGRAMA SACADO PARA NO EXTENDER DEMASIADO EL FORO))




el error que me tiro el compilador es:

Warning[202] D:\MAURO\PIC PROGRAMA REALIZADOS\CENTRAL DE ALARMA\ARGENVASES ALARMA.ASM 60 : Argument out of range. Least significant bits used.
Warning[202] D:\MAURO\PIC PROGRAMA REALIZADOS\CENTRAL DE ALARMA\ARGENVASES ALARMA.ASM 63 : Argument out of range. Least significant bits used.

conocen la razon?
11/02/2009 #6


xorwf k,j

movfw j
iorwf h,f
movf f,h
solo puedes usar yas sea W o F , o 0 o 1 como segundos argumentos en xorwf y movf
11/02/2009 #7


Tal cual, como lo dice mabauti. Estás confundiendo argumentos. Los Warning, no son errores y no evita que se crea el archivo .hex. Sin duda debes atenderlos para ver si el ensamblador hiso las cosas como pretendías.

Repasa el tutorial que estoy armando y te daras cuenta del error. El link te lo pasó Meta.
12/02/2009 #8


Nuevamente muchas gracias. El programa ya esta corriendo en el simulador de la forma adecuada.... ahora, me encuentro nuevamente en problema

el pic realiza el ciclo una vez y vuelve el PORTB a d'1' (borrando las señales de alarma por zona), cuando en el simulador no se detiene (es una alarma que debe quedar prendida hasta que se oprima el reset (RA0)) alguna explicacion)?

Pareciera que se reinicie con cada ciclo completo del programa.... ME IGNORA EL JLOOP Y LO MANDA AL MLOOP (no dice eso)?

el programa lo que hace es acumular las luces de las zonas que cambian a estado 0 (si estas vuelven a levantar sus indicadores quedan retenidos) hasta que se oprima el reset RA0


Tambien realice un segundo programa que hace lo mismo.... con diferente codigo y forma de llegar a lo mismo (mas sencillo pero menos "avanzado") y me hace el mismo problema no retiene la memoria.


PD: No puede fallar el pic, estoy utilizando 2 a la par.

-------------------------------------
COMO QUEDO EL PROGRAMA ORIGINAL
-------------------------------------



list p=16F84A
#include <p16F84a.inc>

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

j equ h'1F'
k equ h'1E'
h equ h'1C'
i equ h'1B'
f equ h'1A'
e equ h'10'
TIEMPO equ h'09'
org 0


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

;Definiendo A

bsf STATUS,5
movlw b'1111111'
movwf PORTA
bcf STATUS,5


;Definiendo B

bsf STATUS,5
movlw b'00000000'
movwf PORTB
bcf STATUS,5


;************************************************* ***
; Puerto A
; 0-Reset 1-Zona1 2-Zona2 3-Zona3 4-Zona4
;
; Puerto B
; 0-Encendido 1-Zona1 2-Zona2 3-Zona3 4-Zona4;
;
;************************************************* ***

movlw d'70'
movwf TIEMPO

;************************************************* ***
;
; TIEMPO DE ON/OFF EN LUZ
;
; para simular poner en 1
; para practica poner en 70
;
;************************************************* ***


mloop movlw b'00000001'
movwf PORTB

movlw b'00000000'
movwf h
movwf j
movwf k
movwf i
movwf f
movwf e


jloop movfw PORTA
movwf k

btfsc k,0
goto mloop

xorlw b'00011111'
iorwf h,f

movfw h
movwf PORTB


;***** Bucle *****
movfw TIEMPO
movwf j
aloop movwf e
bloop decfsz e,f
goto bloop
decfsz j,f
goto aloop
;*****


movlw b'00000001'
movwf PORTB


;***** Bucle *****
movfw TIEMPO
movwf j
zloop movwf e
xloop decfsz e,f
goto xloop
decfsz j,f
goto zloop
;*****

goto jloop


end





-----------------------------------------------------------
SEGUNDO PROGRAMA *** hace lo mismo
-----------------------------------------------------------



list p=16F84A
#include <p16F84a.inc>

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

j equ h'1F'
k equ h'1E'
h equ h'1C'
e equ h'10'
TIEMPO equ h'09'


org 0


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

;Definiendo A

bsf STATUS,5
movlw b'1111111'
movwf PORTA
bcf STATUS,5


;Definiendo B

bsf STATUS,5
movlw b'00000000'
movwf PORTB
bcf STATUS,5


;************************************************* ***
; Puerto A
; 0-Reset 1-Zona1 2-Zona2 3-Zona3 4-Zona4
;
; Puerto B
; 0-Encendido 1-Zona1 2-Zona2 3-Zona3 4-Zona4;
;
;************************************************* ***

movlw d'1'
movwf TIEMPO

;************************************************* ***
;
; TIEMPO DE ON/OFF EN LUZ
;
; para simular poner en 1
; para practica poner en 70
;
;************************************************* ***


mloop movlw b'00000001'
movwf PORTB
movwf h




jloop movfw PORTA
movwf k

btfsc k,0
goto mloop

btfss k,1
bsf h,1

btfss k,2
bsf h,2

btfss k,3
bsf h,3

btfss k,4
bsf h,4

movfw h
movwf PORTB


;***** Bucle *****
movfw TIEMPO
movwf j
aloop movwf e
bloop decfsz e,f
goto bloop
decfsz j,f
goto aloop
;*****


movlw b'00000001'
movwf PORTB


;***** Bucle *****
movfw TIEMPO
movwf j
zloop movwf e
xloop decfsz e,f
goto xloop
decfsz j,f
goto zloop
;*****

goto jloop


end
12/02/2009 #9


Te ingnora eso, porque en ambos programas, núnca modificas a K. Solo cuando lo pones a 0 al principio del programa, pero luego, no lo tocas más.

Haz un pequeño diagrama de flujo, para saber como es que fuciona la alarma, que pasos debe seguir. Así, será mas fácil encontrar el error o si no, agrega comentario para entender el porqué o que intentas hacer.
12/02/2009 #10


¡no?! fiejese que el programa a menos que sea RESETEADO vuelve siempre al punto jloop de inicio. para directamte leer el puerto A (que son todas entradas) y enviarlo a K

acaso me equivoco?

jloop movfw PORTA
movwf k
12/02/2009 #11


para leer el puerto debes usar movf PORTA,W ;leer el contenido de PORTA y almacenarlo en W

la instruccion movfwno esta propiamente documentada
12/02/2009 #12

Avatar de agustinzzz

Faltan puntos...
Amigo maurogonzales, me parece que te faltan los dos puntos ( en todas las etiquetas...
ej.: jloop movfw PORTA
debería ser jloop: movfw PORTA
Saludos.
12/02/2009 #13


maurorgonzalez dijo:
¡no?! fiejese que el programa a menos que sea RESETEADO vuelve siempre al punto jloop de inicio. para directamte leer el puerto A (que son todas entradas) y enviarlo a K

acaso me equivoco?

jloop movfw PORTA
movwf k
¡¡¡Aaaa! lo que pasa es que haces esto

jloop movfw PORTA
movwf k

btfsc k,0
goto mloop

xorlw b'00011111'
iorwf h,f

Salta una instrucción si el bit 0 de K es 0, como se ve que no es 0 este bit, el CP no salta y va a goto mloop. ¿Que es lo que quieres hacer? si el bit 0 es cero que salte o si K vale 0?
13/02/2009 #14


realize la modificacion de:

* movf PORTA,w

(y obtuve el mismo resultado, pero es cierto que el disembler jamas escribe movfw.Igual la instruccion parece ser leida sin problemas por el pic, ya que lo realiza. El problema es que no retiene en "h" lo leido)

* poner los ":" en las etiquetas

(no hay hubo diferencia. Inclusiva el manual del que lei el tema de pic, acotaba que no era relevante)


* btfsc k,0 --> goto mloop

(lo que intento hacer aca es que, si yo oprimo RA0 me mande el bit 1 y entonces entre a MLOOP para resetear la retensión de las zonas, RB1-2-3-4. Por las dudas, para probar si es lo que dijiste inclusive BORRE LA FUNCION y saque el reinicio. Y aun asi sigue sucediendome )


Aun el caso no se pudo resolver. (lo mas frustrante es que es mi primer proyecto)
13/02/2009 #15

Avatar de Ardogan

Unas observaciones...
1) En los programas (http://www.forosdeelectronica.com/po...51.html#169851) no veo el típico
org 0x0000
goto Main
org 0x0004
goto Interrupt (o se puede escribir el código de interrupción acá mismo)

Main
;código del programa

2) En ningún momento configuras para los puertos que pines/terminales/patas son de salida y cuales de entrada. En su lugar tenés:
Código:
;Definiendo A

bsf STATUS,5
movlw b'1111111'
movwf PORTA
bcf STATUS,5


;Definiendo B

bsf STATUS,5
movlw b'00000000'
movwf PORTB
bcf STATUS,5
En vez de cargar PORTA y PORTB tenes que cargar TRISA y TRISB.

3) Arriba de todo tenés TIEMPO equ h'09'. La dirección 09 corresponde (según el mapa de memoria de la página 13 de la hoja de datos del pic16f84) a EEADR. No creo que sea buena idea usar un registro de propósito especial (SFR, asociado a control/estado de periféricos) para hacer la tarea de un registro de propósito general (GPR). A no ser que uno uso todos los GPR y no le queda otra, pero no parece ser el caso.

Bueno, a ver si modificando eso va mejor, no me fijé en el cuerpo del programa. Lo haré si seguís teniendo problemas a pesar de todo.

Saludos
13/02/2009 #16


El problema aun persiste pero igual quiero demostrar que realize las modificaciones y que valoro toda la ayuda aclarando cosas

1 -
org 0x0000
goto Main
org 0x0004
goto Interrupt

2- En ningún momento configuras para los puertos que pines/terminales/patas

el codigo que copiaste es exactamente un metodo de definir las "patas" o puerto. lo que hago modificando el bit 5 del STATUS ( o nombrado RP0) es en que banco de memoria escribo.

en el 00 es el banco A donde trabajamos habitualmente. el 01 nos da el banco B, el que almacena los "TRIS" y algunas yerbas mas escondidas por ahi!



yo tenia tan solo: " ORG .0" que resultaba ser lo mismo, pero por las dudas puse lo que me dijisite

3- Arriba de todo tenés TIEMPO equ h'09'. La dirección 09 corresponde (según el mapa de memoria de la página 13 de la hoja de datos del pic16f84) a EEADR

muchisimas gracias no me habia dado cuenta de que la memoria estaba siendo utilizada. eso lo cambie.

por las dudas vuelvo a poner el programa asi lo ven.
---------------------------------------------

Código:
  list p=16F84A
  #include <p16F84a.inc>
  __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

j	equ	h'1F'
k	equ	h'1E'
h	equ	h'1C'
e	equ	h'10'
TIEMPO	equ	h'1B'

	org 0x0000
	goto Main
	org 0x0004
	goto interrupt
Main

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

;Definiendo A
 
		bsf	STATUS,5
		movlw	b'1111111'
		movwf	PORTA 
		bcf	STATUS,5

;Definiendo B

		bsf	STATUS,5
		movlw	b'00000000'
		movwf	PORTB 
		bcf	STATUS,5

;****************************************************
; Puerto A
; 0-Reset 1-Zona1 2-Zona2 3-Zona3 4-Zona4
;
; Puerto B
; 0-Encendido 1-Zona1 2-Zona2 3-Zona3 4-Zona4;
;
;****************************************************

		movlw	d'1' 
		movwf	TIEMPO

;****************************************************
; 
; TIEMPO DE ON/OFF EN LUZ
;
; para simular poner en 1
; para practica poner en 70
;
;****************************************************

COMIENZO:	movlw	b'00000001'
		movwf	PORTB
		movwf	h
		
BOOTEO:		movf	PORTA,w
		movwf	k

		btfsc	k,0
		goto	COMIENZO

		btfss	k,1
		bsf	h,1

		btfss	k,2
		bsf	h,2

		btfss	k,3
		bsf	h,3

		btfss	k,4
		bsf	h,4			

		movfw	h
		movwf	PORTB

;*****  Bucle  *****
		movf	TIEMPO,w
		movwf	j
aloop:		movwf	e
bloop:		decfsz	e,f
		goto	bloop
		decfsz	j,f
		goto	aloop
;*****

		movlw	b'00000001'
		movwf	PORTB

;*****  Bucle  *****
		movf	TIEMPO,w
		movwf	j
cloop:		movwf	e
dloop:		decfsz	e,f
		goto	dloop
		decfsz	j,f
		goto	cloop
;*****
		goto	BOOTEO
interrupt:
		end
13/02/2009 #17

Avatar de Ardogan

Ups, tenés razón en lo del TRIS, por lo del org da igual el formato en que se ponga el argumento (.0 = 0x0000) lo que importaba era no sobreescribir el vector de interrupción.

Bueno, lo prometido es deuda, a ver el programa.... comenté algunas cosas, abajo de la ventana de código van mis consideraciones:

Código:
	list p=16F84A
	#include <p16F84a.inc>
	__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _RC_OSC

j equ h'1F'
k equ h'1E'
h equ h'1C'
e equ h'10'
TIEMPO equ h'1B'

	org 0x0000
	goto Main
	org 0x0004
	goto interrupt
Main

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

;Definiendo A

	bsf STATUS,5
	movlw b'1111111'
	movwf PORTA
	bcf STATUS,5

;Definiendo B

	bsf STATUS,5
	movlw b'00000000'
	movwf PORTB
	bcf STATUS,5

;****************************************************
; Puerto A
; 0-Reset 1-Zona1 2-Zona2 3-Zona3 4-Zona4
;
; Puerto B
; 0-Encendido 1-Zona1 2-Zona2 3-Zona3 4-Zona4;
;
;****************************************************

	movlw d'1'
	movwf TIEMPO

;****************************************************
;
; TIEMPO DE ON/OFF EN LUZ
;
; para simular poner en 1
; para practica poner en 70
;
;****************************************************

COMIENZO: movlw b'00000001'; leds de zona apagados, led de encendido = on
	movwf PORTB
	movwf h; h al parecer es un respaldo de PORTB
	
	
	
BOOTEO: movf PORTA,w
	movwf k; k = respaldo de PORTA
	
	;si reset = 0 no pasa nada, si es =1 va a comienzo
	btfsc k,0
	goto COMIENZO
	;**************************
	;este tramo copia los bits 1 a 4 de k a h
	;se puede reemplazar por 
	;movf k, w
	;andlw b'00011110'
	;iorwf h,1
	
	btfss k,1
	bsf h,1
	
	btfss k,2
	bsf h,2
	
	btfss k,3
	bsf h,3
	
	btfss k,4
	bsf h,4
	;*************************
	;que es movfw? imagino que querés copiar h a PORTB -> movf h,w

	movfw h; 
	movwf PORTB
	; se copia en definitiva los 4 bits del porta a los 4 bits del portb
	; se podría haber hecho desde booteo hasta acá con:
	; movf PORTA,w
	; andlw b'00011110'
	; iorwf PORTB,1
	
	;ahora que lo veo, en realidad no se copia los bits del porta al portb
	; solo se ponen a 1 los bits del portb si están en 1 los bits correspondientes de porta
	; pero si los bits de porta fueran todos 0
	; los bits de portb no se ponen a cero (no se apagan los leds), sino que continuan encendidos 
	;(siempre que hayan sido encendidos antes)
	; aaahhh.... más abajo veo que pones PORTB= b'00000001' -> no dije nada
	
	;***** Bucle *****
	movf TIEMPO,w
	movwf j
	;	j = tiempo
aloop: movwf e ; e =tiempo
bloop: decfsz e,f; lazo de espera de tiempo x 2 ciclos de instrucción
	goto bloop
	decfsz j,f ; otro lazo de espera de tiempo x 2 ciclos de instrucción
	goto aloop
	;*****
	;la espera total fue = (tiempo x 2) x (tiempo x 2) = 4x tiempo ^2 + 2 ciclos de instrucción
	
	movlw b'00000001'
	movwf PORTB
	
	;leds de zonas apagados
	
	;***** Bucle ***** otra espera del mismo tiempo que la anterior
	movf TIEMPO,w
	movwf j
cloop: movwf e
dloop: decfsz e,f
	goto dloop
	decfsz j,f
	goto cloop
	;*****
	goto BOOTEO
interrupt:
	end
Según veo el puerto B maneja los leds que indican que zona está OK (led titila), y que zona se desconectó (led apagado). RA0 es para resetear todo (en realidad no cambiaría mucho la situación al dar un reset).
En resumen el programa lo que hace es:


Código:
comienzo
  apaga leds de zonas de PORTB

booteo
  ¿se presiono boton de reset?
  por el si: va a comienzo
  por el no:
    enciende cada led de zona de PORTB si los bits de PORTA correspondientes están en 1
    espera
    apaga leds de zonas de PORTB
    espera
    va a booteo
No veo el problema, ¿que es lo que querías que hiciera el programa?.

Saludos
13/02/2009 #18


los leds de las zonas debian quedarse "titilando" hasta que yo prima reset. no debian resetearse solos.
incluso, si yo doy un 0 al RA1 titilaria el RB1 para siempre (hasta que oprima RA0) aunque se vuelva 1 el RA1. y ha esto sumarsele alguna otra zona que yo de a encender. Por eso existe el ciclo comienzo (para que retenga las luces) y el ciclo boteo ( para que me mande todo a cero)
13/02/2009 #19


postea el diagrama del circuito que tienes armado fisicamente
13/02/2009 #20


si les hace falta mas definicion solo avisen.

los cuadrados son resistencias de 330 ohms. las otras 2 unicas resistencias que uso son de 10k ohms en el osc RC y el MCLR.

la Capacitancia del RC son 2x400pf en serie... haciendose 200pf.

el resto son puros leds!.
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.