Título: ayuda con programa asm Publicado por: luxerymc en 12 Octubre 2012, 00:08 am hola soy nueva en esto de la programación y quisiera un poco de orientación
tengo que resolver la siguiente problemática tengo que detectar el movimiento de una polea para saber cuando una bomba esta encendida, lo haré por medio de un sensor réflex cuando este encendida estará conmutando y así me indicara que esta encendida y cuando se detenga aun que quede en la banda que refleja el haz de luz quiero que me indique que esta apagada si después de cierto tiempo no hay una conmutación. quiero saber si por medio de comparación de registro puedo hacerlo el problema es que no se como hacer esa parte y creo que estoy total mente perdida tengo el pic 16f877a no tengo ni la mitad del programa pero no se si asi voy bien quisiera un poco de asesoria tengo una sola señal de entrada y esa me indicara si esta encendida o apagado como comparo si cambio o no despues de cierto tiempo. __CONFIG _CP_ON & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC List P=16f877A include <P16F877A.INC> CBLOCK 0X20 registro_1 registro_2 ENDC #DEFINE PORTA,4 trasmisor #DEFINE PORTB,4 rele ORG 0X00 inicio bsf STATUS,RP0 bcf STATUS,RP1 clrf TRISB movlw b'00000110' movwf ADCON1 movlw b'00010000' movwf TRISA bcf STATUS,RP0 principal movlw movwf registro_1 ;mueve w ael registro 1 movwf registro_2 ;mueve w al registro 2 (no se si tnego que cargar la señal dos veces o solo una y luego volverla a cambiar) movf registro_1,w ; w = registro 1 subwf registro_2,w ; w = registro 2- w btfss STATUS, C ; (aqui no se si tengo que comparar el C o el Z o bit que corresponda del puerto) Título: Re: ayuda con programa asm Publicado por: Firos en 31 Octubre 2012, 15:54 pm Buenas.
De primeras te recomiendo que para programar te crees una biblioteca propia de subrutinas para, por ejemplo, cambiarte de banco sin tener que mirar el datasheet y ver si era de una forma o de otra. A parte de que te simplificaría mucho el codigo a la hora de mirarlo. No es lo mismo poner: Código: bsf STATUS,RP0 Que: Código: Banco1 Verdad? Bueno, yo el único que he usado ha sido el pic16F876 pero seran muy similares. CREO que lo que quieres hacer es: 1. Sensor en polea. 2. Señal de entrada al PIC para detectar movimiento ya sea por 1 o por 0. 3. Señal de salida del PIC a un led para indicar que se mueve la polea o no. La verdad es que no me he enterado de nada de tu mensaje, esto lo acabo de deducir. Repite el enunciado paso por paso y mejor. Lo que tendrías que hacer es meter esa señal en el PIC por una de sus patillas y actuar en consecuencia para, por ejemplo, encender un LED. Para comprobar la variación vas bien encaminada, puedes hacerlo con unos bucles con BTFSS y BTFSC. ¿para que quieres echar mano de los FLAGS? ¿Sabes lo que hacen esas dos instrucciones?
Por lo tanto, si tienes un receptor en la patilla RB0, mismamente, lee directamente el puerto con el comando. Código: bucle: btfsc PORTB,0 ; Si es cero salta a Bucle, si es 1 va a ACTIVAR Después de eso tendrías que irte a otro bucle que detectara cuándo para la maquina para apagar el LED o transmisor, que sería con el mismo metodo. Ese es el método que estabas utilizando peeeeeeeero, que siempre hay peros, de ese modo el PIC consume mucha mas energía que usando INTERRUPCIONES y poniéndolo en modo SLEEP. De todas maneras eso ya es meterse en otro "fregao". No es difícil pero habría que explicar unas pocas cosas. Si con eso te vale, adelante. Otra cosa que deberías ponerle es un verificador de REBOTES. En el caso de los interruptores y periféricos siempre puede haber riesgo de ruidos, me explico. En un conmutador o interruptor al conexionarlo siempre hay un pequeño rebote de milisegundos que oscila entre 0 y 1 varias veces por lo que podria apagarse y encenderse el led repetidamente, parpadear y no saber muy bien que hacer. Por ello te recomiendo que lo compruebes. Carga en W un 01 y hazle la funcion OR con PORTB (iorlw PORTB). Creo que era asi, con ello, uno de los FLAGS te alertara de que son iguales y le preguntas al flag con BTFSS si esta a uno. Haces un retardo de 20 milisegundos y vuelves a preguntar. Despues de eso ya puedes encender o apagar el led que te indique encendido o apagado. Te hago un indice: 1- Configura puertos 2- Leer entrada de señal. 3- Comprobar 2 veces que esta a 1 con un retardo de 20MS entre medias. 4- Actuar para activar. 3- Leer entrada de señal. 5- Comprobar 2 veces que esta a 1 con un retardo de 20MS entre medias. 6- Actuar para desactivar. 7- Goto al punto 2. Un saludo. |