Autor Tema: Problema estableciendo variable Fija  (Leído 2324 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado richard12

  • PIC10
  • *
  • Mensajes: 12
Problema estableciendo variable Fija
« en: 18 de Octubre de 2006, 12:25:28 »
Hola a todos mi interrogante es la siguiente nescesito fijar una variable que normalmente se inicie en cero mi programa la ponga a uno y no vuelva a cero bajo ningun reset del programa ni otro tipo de interupcion o sea que solo vuelva a ser cero despues de desenergisarse el pic lo que trato de hacer es un subprograma dentro de mi programa principal que se ejecute una sola ves al comienzo mientras trabaje el PIC ya lo he trata do de hacer creando variables normales y con algunas propias del pic pero estas se me resetean y se vuelve a ejecutar mi subprograma que nescesito ejecutar solo una ves uso un PIC16F84A y programo con MPLAB :-).

    De antemano gracias a todos SUPERBUENO ESTE SITIO PARA MI EL MEJOR DE LA RED

Deimos

  • Visitante
Re: Problema estableciendo variable Fija
« Respuesta #1 en: 18 de Octubre de 2006, 12:52:10 »
Tienes en el F84A dos bits, el TO y el PD con los ke puedes testear cual era el estado anterior de la maquina, es decir, si viene de una bajada de tension o si viene de reset. Unicamente has de mirar en primer momento como está el bit, y dependiendo como esté le haces pasar por la rutina de cargar la variable o no.

Espero haberte ayudado.

Salu2

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Problema estableciendo variable Fija
« Respuesta #2 en: 18 de Octubre de 2006, 13:27:59 »
Hola richard12!

Yo he hecho exáctamente lo mismo que tú comentas como dice el amigo Deimos y funciona perfectamente.

Hazlo así que te irá muy bien.


Un saludo desde Alicante.

Desconectado richard12

  • PIC10
  • *
  • Mensajes: 12
Re: Problema estableciendo variable Fija
« Respuesta #3 en: 19 de Octubre de 2006, 22:14:12 »
Gracias creo si que esta bien logico pero no se si es que estoy un poco bloqueado por haber programado mucho pero la verda no hallo la forma de detectar el reset pues si los bits TO y PD se ponen a 1 automaticamente despues de vcc on o reset no se como detectar si se conecta el vcc o es reset para cargar la variable si no es mucho pedir pudieran mostrarme un pequeño ejemplo por favor se que es sensillo pero me parece que estoy un poco extenuado y la verdad nescesito terminar mi programa cuanto antes no tengo tiempo de recesar.

                  Saludos y gracias por su incondicional ayuda

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Problema estableciendo variable Fija
« Respuesta #4 en: 20 de Octubre de 2006, 04:38:50 »
Hola richard12!

Un ejemplo en C puede ser:

Código: [Seleccionar]
switch(restart_cause())
{

case WDT_FROM_SLEEP:

variable=1;
ACCION1();
PITAR();

case WDT_TIMEOUT:

ACCION1();
variable=1;
PITAR();

case MCLR_FROM_SLEEP:

ACCION1();
variable=1;
PITAR();

case MCLR_FROM_RUN:

ACCION1();
variable=1;
PITAR();

case NORMAL_POWER_UP:

ACCION1();
variable=1;
PITAR();

case BROWNOUT_RESTART: // Aqui se mete casi siempre que sufre ruido la pba
// Reiniciamos la pba pero sin que el usuario se de cuenta
// por eso ni encendemos leds ni pitamos nio nada.

}


Yo utilicé esto porque una PCB que había hecho sufría ruido cuando le acercabas cables de alta tensión y se reiniciaba. Según la tenía la PCB pitaba cada vez que se encendía, entonces, con esta funcíon detectaba la causa del reinicio y... si lo había hecho por ruido, yo impedía que pitara. ¿Resultado final? Aunque el usuario estuviera trasteando la PCB nunca se daría cuenta de estos reseteos.

En asm hice algo parecido pero... sabe dios por donde parará ese código.


Un saludo desde Alicante.
« Última modificación: 25 de Noviembre de 2008, 14:58:40 por Azicuetano »

Desconectado richard12

  • PIC10
  • *
  • Mensajes: 12
Re: Problema estableciendo variable Fija
« Respuesta #5 en: 20 de Octubre de 2006, 19:36:25 »
Muchas gracias de todo corazon alicante aunque de veras el ejemplo que nesesito es en ASM pues no entiendo el C si si por casualidad encuentras el pedacito de codigo en ASM me lo pudieras hacer llegar mientras deja ver que puedo hacer con este lenguaje C si algun amigo mio me lo puede traducir a asm aunque lo veo dificil voy a preguntar quien conoce de C de todas formas Muchas gracias nuevamente.
                                richard12

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Problema estableciendo variable Fija
« Respuesta #6 en: 20 de Octubre de 2006, 19:49:36 »
Hola richard12!

Buscaré mi código en asm pero... no es tan completo como este en C, en cualquier caso, lo buscaré por mis antiguos proyectos a ver si hay suerte.
Como muy tarde te respondo el Lunes y te confirmo si lo tengo o no.


Un saludo desde Alicante.

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Problema estableciendo variable Fija
« Respuesta #7 en: 21 de Octubre de 2006, 08:34:46 »
Aquí estoy otra vez!

Este es el código en ASM que encontré en internet y utilicé en su dia. Sólo hay un problema y es que... no se que versión de programa es, es decir, no se si funcionará bien o no. De todas formas, fijándote en esto y con el datasheet no tienes por que tener ningún problema en dejarlo perfecto.

Código: [Seleccionar]
; DETECTAMOS LA Cusa del reset !!!!

bsf STATUS,RP0
bcf STATUS,RP1

btfss PCON,0
goto BOR_0
goto BOR_1

BOR_0

btfss PCON,1
goto BOR_0_POR_0
goto BOR_0_POR_1

BOR_1

btfss PCON,1
goto BOR_1_POR_0
goto BOR_1_POR_1

BOR_0_POR_0

bcf STATUS,RP0
bcf STATUS,RP1

bcf PORTD,0
bcf PORTD,1

goto fin_BOR_POR

BOR_0_POR_1 ; BROWN-OUT RESET, FALLO EN LA ALIMENTACION (si apagamos y encendemos rapidamente)

bcf STATUS,RP0
bcf STATUS,RP1

bcf PORTD,0
bsf PORTD,1

goto fin_BOR_POR

BOR_1_POR_0

bcf STATUS,RP0
bcf STATUS,RP1

bsf PORTD,0
bcf PORTD,1

goto fin_BOR_POR

BOR_1_POR_1 ; FALLO EN MCLR

bcf STATUS,RP0
bcf STATUS,RP1

bsf PORTD,0
bsf PORTD,1

goto fin_BOR_POR

fin_BOR_POR

bsf STATUS,RP0
bcf STATUS,RP1

bsf PCON,0 ; BOR = 1
bsf PCON,1 ; POR = 1

bcf STATUS,RP0
bcf STATUS,RP1

; DETECTAMOS LA Cusa del reset !!!!

btfss STATUS,3
goto PD_0
goto PD_1

PD_0

btfss STATUS,4
goto PD_0_TO_0
goto PD_0_TO_1

PD_1

btfss STATUS,4
goto PD_1_TO_0
goto PD_1_TO_1

PD_0_TO_0

bcf PORTD,2
bcf PORTD,3

goto fin_PD_TO

PD_0_TO_1 ; BROWN-OUT RESET, FALLO EN LA ALIMENTACION (si apagamos y encendemos rapidamente)

bcf PORTD,2
bsf PORTD,3

goto fin_PD_TO

PD_1_TO_0

bsf PORTD,2
bcf PORTD,3

goto fin_PD_TO

PD_1_TO_1 ; FALLO EN MCLR

bsf PORTD,2
bsf PORTD,3

goto fin_PD_TO

fin_PD_TO

Vamos a ver un poco por encima que es lo que hace esto.

Yo utilicé el PIC16F877 para este proyecto, entonces, cogemos el datasheet y miramos en la página 127. Ahí podremos ver la tabla que nos dice cual ha sido la causa del RESET en función de los bits POR, BOR, TO y PD.

Los bits POR y BOR se encuentran en los bits 1 y 0 del registro PCON (si miras en la página 13 verás que este registro se está en el banco 1).

Los bits TO y PD se encuentran en los bits 4 y 3 del registro STATUS.

Pues bien, lo que este programa hace (en teoría) es ir testeando esos bits e ir encendiendo unos leds para que el usuario pueda ver la causa del reset. Lo que yo hacía era conectar unos leds en las patillas 0, 1, 2 y 3 del PORTD. Entonces, viendo que leds se encendían me daba cuenta del tipo de reset.

Bueno, está todo un poco enfollonado pero... si leyendo esto te ahorras unos cuantos minutos de calentura de cabeza, buenos son, ¿no? jeje


Un saludo desde Alicante.
« Última modificación: 25 de Noviembre de 2008, 15:32:14 por Azicuetano »