TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: JaM0N en 02 de Agosto de 2010, 22:37:24

Título: Ayuda con prog. basico
Publicado por: JaM0N en 02 de Agosto de 2010, 22:37:24
Hola, hace bastante que vengo visitando estos foros para desengrasarme dudas, asi que primero queria agradecer a todos por la inmensa cantidad de material cuanto menos interesante que postean. Ahora si, dicho esto, vamos al problema...

Resulta que programe un asm basico para reemplazar una alarma en mal estado. Despues de varios tumbos pude hacer andar todo... y ahora me encuentro con algo que no le veo solucion: al minuto suena sola :@ ...

Código: [Seleccionar]
activada
bsf PORTB,led
call estado
call tZ1
call tZ2
; call tZ3
call tT
goto activada

estado
btfsc PORTB,L
goto desactivada
return
tZ1
btfss PORTB,Z1
goto entrando
return
tZ2
btfss PORTB,Z2
goto suena
return
tZ3
btfss PORTB,Z3
goto alerta
return
tT
btfss PORTB,T
goto suena
return

Ese el el pedazo de codigo que controla las distintas zonas y actua dependiendo cual se activa.

Z1: Zona Temporizada             :oops:
Z2: Zona Instantanea              :5]
Z3: Zona Perimetral de Alerta   :-/
T: Tamper

PORTB,L es el bit que, comandado por el teclado, indica si esta activada o no

Bueno, es bastante facil notar que, mientras esos 5 bits del PORTB se mantengan en cero, va a estar en un bucle infinito. Salvo que infinito en este caso es 1min. Luego de ese tiempo no estoy seguro que es lo que ocurre, pero los pins de salida se ponen en 1 (recien ahora se me ocurre ver si es porque salta a la funcion "suena")

Por favor, si a alguien se le ocurre que es lo que puede hacer que esa rutina falle, le voy a estar muy agradecido

PD: Alguien podra decirme "porque no lo hiciste con interrupciones"... la ironica respuesta es "para no complicarme y que salga bien de una" ... Grrr


EDIT: Olvide poner PIC 16F88 y la config
Código: [Seleccionar]
    __CONFIG _CONFIG1, _WDT_OFF & _PWRTE_ON & _INTRC_IO & _MCLR_OFF & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_PROTECT_OFF & _DEBUG_OFF & _CCP1_RB0 & _CP_OFF
    __CONFIG _CONFIG2, _FCMEN_OFF & _IESO_OFF
Título: Re: Ayuda con prog. basico
Publicado por: pibe en 03 de Agosto de 2010, 01:08:50
Hola: Primero, tengo lagañas aún  :mrgreen:
Segundo, sube todo el programa que sino no me entero por donde otra parte puedes haberla pifiado.
Tercero, a simple vista no veo las rutinas antirrebotes para las entradas.
Cuarto, me voy a lavar la cara  :D
Título: Re: Ayuda con prog. basico
Publicado por: JaM0N en 03 de Agosto de 2010, 13:28:42
Primero, pibe, a las 01:08 tenias lagañas  :shock:? o esta mal la hora del post ?
Segundo, adjuntado esta el programa completo.
Tercero, son sensores de apertura magneticos, no me parecio necesario, y si hace rebotes en realidad no influye porque una vez que toma el primer pulso, o suena o temporiza 30 seg. independentemente de si vuelve/n a abrirce o cerrarse la/s puerta/s. El bit PORTB,L viene del teclado de la alarma y es digital
Cuarto, me voy a comer  :-/
Título: Re: Ayuda con prog. basico
Publicado por: JaM0N en 06 de Agosto de 2010, 13:56:22
No es de cargoso e insistente, pero de verdad no le veo la salida, y es lo unico que me falta para que quede andando. Por favor, si a alguien se le enciende el led de que puedo estar haciendo mal, que me tire unos anteojos asi lo veo  :P

El watchdog esta desactivado, hay algun otra cosa que pueda hacer que luego de 60s el programa haga algo inesperado?
Título: Re: Ayuda con prog. basico
Publicado por: tapi8 en 06 de Agosto de 2010, 15:37:02
A mi en el MPLAB no me salta, lo he dejado varios minutos y sigue en el bucle.
Tuve que cambiar esto porque me tiraba errores:

;--- Salidas ---
si   equ   0   ;Sirena interna (a relay via transistor)
se   equ   1   ;Sirena externa (idem)
led   equ   2   ;Led activada/desactivada (directo a masa onboard)

Puede que por alguna razon portb,z2 se te ponga a 0? mira que sensor lleva ahi, posiblemente se te este activando por alguna razon.

tZ2
   btfss   PORTB,Z2   ;Si Z2=0
   goto   suena      ;entraron por la ventana (al estilo juez) sona la sirena
   return
Título: Re: Ayuda con prog. basico
Publicado por: willynovi en 06 de Agosto de 2010, 16:22:43
hola, como va eso, mira hace tiempo que no toco el assembler pero creo que he notado algo, seguro alguien mas en el tema y que este bien canchero te lo sepa asegurar.

Cuando dices que haces el loop infinito creo te refieres cuando ves el estado de PORTB,L y creo aqui es donde podrías poner el antirrebote.
A partir de la etiqueta activada llamas a unas subrutinas, primero estado, luego tZ1 y así, pero veo que en estado es donde vuelves a ver el estado de PORTB,L y sales con un goto hacia desactivada, y aqui es donde creo esta el error, porque si usas la llamada a una funcion con call, debes volver con return.

El por qué de esto es que por cada llamada con call, el pic guarda esa posición para volver con return, y si sales con un goto en el proximo return que encuentre quien sabe lo que hara el pic, ademas de que si no me equivoco el stack tiene solo 8 niveles, es decir, puedes hacer solo 8 llamadas con call.

Esto es algo muy simple, y veo que en tu programa usas muchos goto, y justamente es lo que deberias evitar.

Y con respecto a esto de los call y los goto, creo que deberias escribir tu código así:

Código: [Seleccionar]
inicio
bcf PORTB,si ;Apaga las sirenas
bcf PORTB,se ;^^^^^ ^^^ ^^^^^^^
bcf PORTB,led ; y el led
btfsc PORTB,L ;L=0 -> Activada
goto inicio ;podria ir un delay anti rebote

activada
bsf PORTB,led ;Enciende el led
btfss PORTB,Z1 ;Testea si se abrio la zona 1 y actua en consecuencia, Z1=0 -> Activada
call Zona1Act ;en Zona1Act haces lo que corresponda, prender un led, activar la sirena,
;lo que corresponda y vuelves con return
btfss PORTB,Z2 ;
call Zona2Act ;Idem Zona1Act
btfss PORTB,Z3 ;
call Zona3Act ;Idem Zona1Act
btfss PORTB,L ;L=1 -> Desactivada va hacia el inicio donde apaga las sirenas y comienza otra ves
goto activada ;L=0 -> Activada sigue en este bucle
goto inicio

Es muy simple el código que he hecho, pero seria el comienzo.

Y ahora una pregunta, este programa lo estas probando en un circuito físico?
Si es así, estas poniendo las entradas con resistencias de pull-up o pull-down?
Los sensores de las puertas tipo magneticos son normal cerrado, o deberian, para evitar que te corten el cable y no se active.

Título: Re: Ayuda con prog. basico
Publicado por: tapi8 en 07 de Agosto de 2010, 05:18:48
Yo no he llegado a esa parte pero creo que ahi no hay problema willy, el donde llama con goto despues retorna con otro goto, y asi funciona igual que con call y return, con los call es mas organizado el programa, pero a lo mejor el le quiere dar preferencia a los sensores que estan primero en el programa y por eso regresa siempre al principio de la etiqueta. De todos modos el fallo que el dice en el simulador no lo da, lo he tenido varios minutos y no sale del bucle, la unica manera de que salga del bucle a la etiqueta suena es por activacion de portb,z2, es decir que ese sensor se ponga a 0. Esto lo dice el simulador en la realidad......
Título: Re: Ayuda con prog. basico
Publicado por: willynovi en 07 de Agosto de 2010, 11:08:22
Claro puede ser así lo de los goto, es que tratando de no usarlos queda mas legible el programa.

Y entonces puede ser que portb, z2 se este activando por ruido?
Título: Re: Ayuda con prog. basico
Publicado por: tapi8 en 07 de Agosto de 2010, 11:53:11
Citar
[Y entonces puede ser que portb, z2 se este activando por ruido?/quote]


Pues si que puede ser, el ruido nos hace muchas putadas
Título: Re: Ayuda con prog. basico
Publicado por: JaM0N en 08 de Agosto de 2010, 18:57:07
Bueno antes que nada gracias por la ayuda.

El tema del ruido me parece que no puede ser porque lo cronometre y da siempre 60 seg. Pero ahora me surgio otra teoria... puede ser que el problema en realidad, este en el teclado de la alarma.

El sistema consta de un teclado (made in cordoba) y una central (que tambien era made in cordoba). Andaban bien, hasta que un dia dejo de andar bien... y asi estubo por mucho tiempo, sin andar. Y ahora surgio la necesidad de hacerla funcionar nuevamente y, sin mas objeciones, decidi programar la central en un pic, con el interes de darle mejores funcionalidades en un futuro. Lo que hice entonces fue hacer este prog, y usar el mismo teclado que esta diseñado para almacenar las contraseñas, verificar los codigos ingresados y controlar el tiempo de salida. Al introducir un codigo de activacion, el teclado cuenta 30 seg y luego pone en cero el pin de activacion (PORTB,L) dejando el resto a la central. Lo que me parece que puede estar fallando es el teclado, ya que tiene una funcion de anulacion de zona que, tal vez, este fallando. Tendre que probar eso, y si no es ese el problema... pues tendre que hacer un nuevo teclado xD

De todas formas voy a seguir adelante con este proyecto y vere de programar todo, realizar esquematicos, etc. por si alguien lo necesitase.

Saludos
Título: Re: Ayuda con prog. basico
Publicado por: JaM0N en 08 de Agosto de 2010, 23:19:45
Bueno, estoy abrumado...

No entiendo que es lo que esta fallando

todo anda bien, pero despues de 1min de estar en el bucle de activada... salta a suena... todo lo demas esta bien, suena durante 5 min y corta, sigue activada, si L=1 se desactiva, etc etc etc...
Pero despues de 1min en este bucle... se muere! y salta a suena...

Código: [Seleccionar]
activada
bsf PORTB,led ;Enciende el led
call estado ;Pregunta si se desactivo...
call tZ1 ;Testea si se abrio la zona 1 y actua en consecuencia
call tZ2 ;Testea si se abrio la zona 2 y actua en consecuencia
call tT ;Testea si se abrio algun sensor tamper y actua en consecuencia
goto activada ;y queda haciendo esto por siempre (fatal error: luego de un minuto salta a suena)

estado
btfsc PORTB,L ;Si L=1
goto desactivada ;desactiva
return
tZ1
btfss PORTB,Z1 ;Si Z1=0
goto entrando ;entro alguien por la puerta
return
tZ2
btfss PORTB,Z2 ;Si Z2=0
goto suena ;entraron por la ventana (al estilo juez) sona la sirena
return
tT
btfss PORTB,T ;Si T=0
goto suena ;Me estan desarmando los sensoress... sonaa
return


Estoy provando el circuito en una proto, con las Z1, Z2 y T conectadas a Vcc y L conectado a Vss y durante 60 seg esta activada sin sonar, y luego por 300 seg esta activada sonando, y luego pasa a estar activada sin sonar por otros 60 seg... y asi lleva unos 5 ciclos...
Título: Re: Ayuda con prog. basico
Publicado por: JaM0N en 08 de Agosto de 2010, 23:37:15
Tengo una pregunta... cuando programo el dispositivo (con piklab) programa y verifica todo, pero me da error al "Verificar memoria: User IDs " me dice "Memoria de dispositivo no coincide con archivo hex (en User IDs en dirección 0x2000: leído 0x0000 esperando 0x000E). " pero nunca le di mucha importancia, ya que la memoria de codigo y los bits de configuracion son correctos...

Puede haber un problema ahi?
Título: Re: Ayuda con prog. basico
Publicado por: tapi8 en 14 de Agosto de 2010, 05:51:58
Nunca use el piklab pero no creo que sea ese el problema, lo que puedes hacer es bajarte de la pag. de microchip el MPLAB ( es gratuito ) y lo programas desde ahi y sales de dudas.

Saludos y suerte.
Título: Re: Ayuda con prog. basico
Publicado por: BrunoF en 14 de Agosto de 2010, 08:50:27
Hola. No estas descargando correctamente el STACK.

Ejemplo:

Código: ASM
  1. activada
  2.         bsf     PORTB,led       ;Enciende el led
  3.         call    estado          ;Pregunta si se desactivo... ACA EL STACK SE CARGA en 1 NIVEL
  4.         ...
  5.  
  6.  
  7. estado
  8.         btfsc   PORTB,L         ;Si L=1
  9.         goto    desactivada     ;desactiva          PERO ACA NO. DESACTIVADA NO TIENE NINGUN RETURN, por lo que siempre estas cargando el STACK..Causando un overflow seguramente
  10.         return                       ;ACA LO DESCARGAS BIEN, PERO ESTA LINEA SOLO SE EJECUTA SI PORTB, L ESTA EN 0...

Este error aparece múltiples veces en tu código. Te vas a tener que sentar a corregirlo, con paciencia, revisando todos los calls,goto return, retlw o retfie para que la carga y descarga del stack se realice correctamente.

Saludos.
Título: Re: Ayuda con prog. basico
Publicado por: willynovi en 14 de Agosto de 2010, 09:50:40
Si yo creo que es eso, estas usando mucho los goto, como te comentaba en este mensaje anterior.

Prueba de rehacer el programa de la forma que te proponia con los call.
Título: Re: Ayuda con prog. basico
Publicado por: Fidel Martins en 14 de Agosto de 2010, 12:53:27
de dentro de un CALL, puedes tener varios GOTO, pero que no escapen de la subrutina y contanto que al final de esta tenga un RETURN.
Por otro lado, de dentro de un CALL, puedes poner otro (s) CALL (hasta 8 niveles).
Cuando haces un CALL, entras en una sala que solo tiene una puerta para entrar y p/salir. No hay otra salida (sin atajos), no puedes salir por la ventana. Puedes ir a otra sala, pero dendras que volver, siempre sin atajos.
Si lo proyectaras con Niple, no te dejaria cometer ese error. Te obliga a ponerle fin a la subrutina,
Para que puedas ir adelante con la logica.
Título: Re: Ayuda con prog. basico
Publicado por: tapi8 en 14 de Agosto de 2010, 14:50:12
Es cierto lo que dice Bruno, tendras que corregirlo, sin embargo el problema que tu dices creo que no es ese, lo he tenido en ese bucle 3078seg=51.3min y sigue ahi y el stack esta en la primera posicion, cuando sale del bucle si te dara problemas, pero es que no deberia de salir, en la simulacion que yo hago no se salio, no se si me escapa algo, pero el stack despues de casi una hora sigue ahi, en la primera posicion.
Título: Re: Ayuda con prog. basico
Publicado por: JaM0N en 14 de Agosto de 2010, 18:38:38
Bueno, intentando solucionar el overflow del stack, decidi reemplazar todo por gotos, de esa forma el stack no se deberia usar... pero el problema persiste.

Adjunto el prog. reescrito (faltan algunos comentarios)
El programa funciona practicamente igual al anterior.

El motivo por el cual no uso calls es porque no es un programa lineal, es decir, si se detecta que se abre una ventana, debe sonar la alarma y luego ir a activada, no debe regresar al punto de donde detecto el sensor abierto.

Bueno, lo otro que se me ocurre es el tema de las "User Ids" que me dan error al programar, tiene algo que ver?

Puede ser que el 16f88 tenga algo mas que lo haga hacer algo inesperado a los 60seg? Se que tiene 3 timers internos, pero no los activo en ningun momento... los comparadores estan desactivados... el DAC esta desactivado... las interrupciones estan desactivadas... el circuito de pruebas es muy basico asi que no puede haber error...

Puede ser problema del PIC??? voy a ver si en la semana compro otro...

Muchas gracias :D
Título: Re: Ayuda con prog. basico
Publicado por: BrunoF en 14 de Agosto de 2010, 19:00:31
Hola.

Olvidaste adjuntar el archivo...
Título: Re: Ayuda con prog. basico
Publicado por: JaM0N en 14 de Agosto de 2010, 22:42:28
OOops...

Ahora si :D
Título: Re: Ayuda con prog. basico
Publicado por: Fidel Martins en 15 de Agosto de 2010, 01:45:14
y en el hardware, estan garantizados los estados (los puertos de entradas con poolup y etc)
Título: Re: Ayuda con prog. basico
Publicado por: BrunoF en 15 de Agosto de 2010, 02:05:15
Forza RB7 a Vdd para asegurar que no sea problema del teclado activador. Si no es eso, o tenes un error en el hard, o en los fuses o tenés un PIC defecuoso.

Saludos.
Título: Re: Ayuda con prog. basico
Publicado por: JaM0N en 15 de Agosto de 2010, 03:34:13
El hard esta armado en una proto con Z1y Z2 conectados a Vcc y L a Vss.

El tema de los fuses, estan definidos en el asm adjuntado, si hay que cofigurarle algo mas no se, pero leyendo el datashit no figura nada...

Voy a probar comprando otro pic.. ya veo que tanto lio y es que vino malito de fabrica
Título: Re: Ayuda con prog. basico
Publicado por: tapi8 en 15 de Agosto de 2010, 05:57:45
Tienes que ponerle esto:

list p=16F88

Y suprimir esto

STARTUP CODE 0x000
PROG CODE

Sino te tira 35 errores.