Problema con interrupciones en PIC
| #11 |
| #12 |
|
maunix
Colaborador
|
TeEstoyMirando escribió: Entiendo lo que me quieres decir, pero si postee aqui es porque busque mire y observe durante mucho tiempo y no consiguia la solucion. No entendita porque si le decia ponme un cero no me lo ponia jeje. Si, supuse que eras nuevo en el mundo de los pics pero eso no quita que leas y leas antes de postear. Como te dije antes, no me molesta responder cuando demuestran esfuerzo, pero te lo dije a modo de consejo porque preguntar todo el tiempo no es la forma de aprender, a veces es mejor leer en el manual y de paso creas la costumbre. Cuando estas solo , no tengas a nadie o quieras hacer algo y no tengas internet podras hacerlo Saludos |
|||||||||||
|
|
||||||||||||
| #13 Interrupciones que hacer... |
|
xugua
|
En este momento me incorporo al foro y lo que he leido de este episodio de problemas se parece al mio. Posteo el codigo que estoy manejando para controlar un teclado y 5 displays. Lo que pretendo es controlar temperatura - tal vez sea algo muy sencillo pero no salgo del problema. Con el teclado programo una referencia y en los 2 displays menos significativos quiero mostrar ese dato. Para que en tres displays (mas significativos) muestre el datos obtenido por el convertidor y por lazo cerrado controlar una termoresistencia, aun no esta desarrollada la parte del convertidor. La razon es que pareciera que se muere el PIC y no entiendo que estoy haciendo mal.
Con los datos que acabo de leer hare los ajustes y mando respuestas. Sin embargo, si me gustaria que revisaren el codigo que he desarrollado pienso que aprenderè mucho de sus sugerencias. title 'Servo control de temperatura' ;////////Objetivo controlar los cuatro dig0s en un conteo descendente/////////////// LIST P = 16F877 ;Indicamos el modelo de PIC a utilizar include <p16f877.inc> ; Definición de registros ;¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ Definición de constantes w EQU 0 ; Destino de operación = w f EQU 1 ; Destino de operación = registro RBPU EQU 7 TMROcharge64us EQU -d'64' up EQU d'1' ;¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡ Definición de variables contador EQU 0X22 ; Contador dig0 EQU 0X23 ; Para almacenar el dígito R1 EQU 0X24 R2 EQU 0X25 dig1 EQU 0X26 dig2 EQU 0X27 dig3 EQU 0X28 dig4 EQU 0X33 ;gradoC EQU 0X29 w2 EQU 0X2A ;flagUpDown EQU 0X15 ;bandera de subida y bajada. dataRef EQU 0X2B ;Variable de referencia lmax EQU 0X2C lmin EQU 0X2F temp EQU 0X30 temp2 EQU 0X31 temp3 EQU 0X32 mdig0 EQU 0X34 ; Para almacenar el dígito mdig1 EQU 0X35 mdig2 EQU 0X36 mdig3 EQU 0X37 mdig4 EQU 0X38 conta EQU 0x39 tecla EQU 0X3A cont1 EQU 0X3B cont2 EQU 0X3C cont3 EQU 0X3D guardaW EQU 0X3E guardaSTATUS EQU 0X3F registroA EQU 0X40 guardaRegistroA EQU 0X41 registroB EQU 0X42 guardaRegistroB EQU 0X43 ; Comienzo del programa. ORG 0X00 ; Cubrimos el vector de reset GOTO inicio ; Saltamos a la primera dirección tras el vector de interrupción ; ************************ Inicialización de variables ************************* ORG 0X04 GOTO servicioInterrupcion inicio BCF STATUS,RP1 ;BANCO UNO BSF STATUS,RP0 ; Cambiamos a la segunda página de memoria CLRF TRISC CLRF TRISD ; Programa la puerta B como de todo salidas MOVLW 0xF0 ; Las patillas RB0-RB3 representan las filas del MOVWF TRISB ; teclado, y son salidas BCF OPTION_REG,RBPU ; Las patillas RB4-RB7 representan las columnas, ; y son entradas BCF STATUS,RP0 ; Volvemos a la página 0. MOVLW b'10101000' ;Autoriza interrupcion TOI, RBIE Y GIE. MOVWF INTCON MOVLW TMROcharge64us MOVWF TMR0 CLRF PORTC ;LIMPIA LOS PUERTOS CLRF PORTD ; Apaga el display, por si había residuos CLRF contador ; Borra el contador (dirección 0x0C) CLRF w2 CLRF dig0 CLRF dig1 CLRF dig2 CLRF dig3 CLRF mdig0 CLRF mdig1 CLRF mdig2 CLRF mdig3 CLRF mdig4 CLRF dataRef CLRF lmax CLRF lmin CLRF temp CLRW ; Borramos el registro W ;********************************Carga de variables MOVLW d'4' MOVWF w2 CALL converto7seg CALL refreshAct main ;CARGA DE LIMITES........... CALL converto7seg CALL refreshRef MOVF tecla,W BCF STATUS,Z XORLW up ; Chekea si el dígito sobrepasa el valor 9 BTFSC STATUS,Z GOTO main INCF contador,f MOVF contador,W MOVWF w2 GOTO main ;############# SERVICIO DE INTERRUPCION ############################## servicioInterrupcion ;Guarda registros que pueden ser modificados MOVWF guardaW SWAPF STATUS,W MOVWF guardaSTATUS BCF STATUS,RP0 ;Para asegurarse que trabaja dentro del Banco 0 BCF STATUS,RP1 MOVLW TMROcharge64us ;Recarga TMR0 MOVWF TMR0 ;Verficar la causa de la interrupcion BTFSC INTCON,RBIF CALL InterrupcionRBI BTFSC INTCON,T0IF CALL InterrupcionTOI ;Aqui se efectua el servicio de interrupcion SWAPF guardaSTATUS,W MOVWF STATUS SWAPF guardaW,F SWAPF guardaW,W BCF INTCON,T0IF BCF INTCON,RBIF RETFIE ;+++++++++++++++++++++++++Surutinas InterrupcionRBI ;lectura de las teclas CALL borrar cuerpo CLRF tecla ; Tecla actual=0 MOVLW 0x0E MOVWF PORTB ; Saca 0 a la fila 1, para testearla chkcol BTFSS PORTB,4 ; Chequea la columna 0 en busca de un '0' GOTO numtecla ; si encuentra un 0 muestra el número ; de tecla pulsada INCF tecla,1 ; si no encuentra el 0, incrementa el número de tecla (el numero 1 indica como y donde se ejecuta la instrucción.) BTFSS PORTB,5 ; Chequea la columna 1 en busca de un '0' GOTO numtecla ; si encuentra un 0 muestra el número ;de tecla pulsada INCF tecla,1 ; si no encuentra el 0, incrementa el número de tecla BTFSS PORTB,6 ; Chequea la columna 2 en busca de un '0' GOTO numtecla ; si encuentra un 0 muestra el número de tecla pulsada INCF tecla,1 ; si no encuentra el 0, incrementa el número de tecla BTFSS PORTB,7 ; Chequea la columna 3 en busca de un '0' GOTO numtecla ; si encuentra un 0 muestra el número de tecla pulsada INCF tecla,1 ; si no encuentra el 0, incrementa el número de tecla UltTec? MOVLW 0x10 ; Carga W con el número de tecla +1 BCF STATUS,Z ;Antes de probar si hubo tecla+1, borramos el indicador para asegurar SUBWF tecla,w ; y lo compara con el valor actual de tecla BTFSC STATUS,Z ; Si hemos llegado a Tecla+1 acabamos ; el ciclo de filas GOTO cuerpo ; y no se habrá pulsado ninguna tecla BSF STATUS,C ; Y ponemos a 1 el bit C para... RLF PORTB,1 ; que la fila 1 pase a ser un 1 ; y el 0 se desplace GOTO chkcol numtecla MOVF tecla,W ;0 ;MOVF tecla,W ;MOVWF w2 RETURN ;Fin de lectura de teclas InterrupcionTOI CALL DISP0 ;control del display correspondiente MOVF mdig0,W ; Coloca el siguiente dígito a evaluar en W CALL Tablac MOVWF PORTD ;mostramos el resultado en el display CALL DELAY ;retardo para apreciar la visualización. CALL DISP1 ;control de display MOVF mdig1,W CALL Tablac MOVWF PORTD CALL DELAY CALL DISP2 MOVF mdig2,W CALL Tablac MOVWF PORTD CALL DELAY CALL DISP3 MOVF mdig3,W CALL Tablac MOVWF PORTD CALL DELAY CALL DISP4 MOVF mdig4,W CALL Tablac MOVWF PORTD CALL DELAY RETURN borrar CLRF cont1 ; Borra el contador CLRF cont2 ; Borra el contador MOVLW 0x08 MOVWF cont3 ; Carga el retardo de 0.5 segundos RETURN pausa DECFSZ cont1,1 ; Bucle anidado de 3 niveles GOTO pausa ; que retarda aprox. 0.5 segundos DECFSZ cont2,1 GOTO pausa DECFSZ cont3,1 GOTO pausa RETURN ;cargar datos transformados para marcar dato inicial en el display ;el dato a convertir se carga en w2 converto7seg CLRF temp CLRF dig0 CLRF dig1 CLRF dig2 CLRF dig3 asigna CALL UNIDADES_ASC INCF temp,f MOVF temp,W BCF STATUS,Z SUBWF w2,W BTFSS STATUS,Z ;2; XORLW 0xFA ;BTFSC STATUS,Z GOTO asigna return refreshRef MOVF dig0,W MOVWF mdig0 MOVF dig1,W MOVWF mdig1 RETURN refreshAct MOVF dig0,W MOVWF mdig2 MOVF dig1,W MOVWF mdig3 MOVF dig2,W MOVWF mdig4 RETURN UNIDADES_ASC ;Tranform to seven segment display (ONLY COUNT ASCENDENT) INCF dig0,f MOVF dig0,W ; Pone el valor del dígito en W BCF STATUS,Z XORLW 0x0A ; Chekea si el dígito sobrepasa el valor 9 BTFSC STATUS,Z ; Comprobando con un xor si W vale 0 (Z=1) CALL DECENAS_ASC ; Si Z=1 resetea el dígito y comienza de nuevo la cuenta RETURN ; con el siguiente dígito DECENAS_ASC Reset1 CLRF dig0 ; Comienza a contar por el 0 INCF dig1,f ; Incrementa el valor del dígito al siguiente MOVF dig1,W ; Pone el valor del dígito en W BCF STATUS,Z XORLW 0x0A ; Chekea si el dígito sobrepasa el valor 9 BTFSC STATUS,Z ; Comprobando con un xor si W vale 0 (Z=1) CALL CENTENAS_ASC ; Si Z=1 resetea el dígito y comienza de nuevo la cuenta return CENTENAS_ASC Reset2 CLRF dig1 ; Comienza a contar por el 0 INCF dig2,f ; Incrementa el valor del dígito al siguiente MOVF dig2,W ; Pone el valor del dígito en W BCF STATUS,Z XORLW 0x0A ; Chekea si el dígito sobrepasa el valor 9 BTFSC STATUS,Z ; Comprobando con un xor si W vale 0 (Z=1) CALL MILLARES_ASC ; Si Z=1 resetea el dígito y comienza de nuevo la cuenta return MILLARES_ASC Reset3 CLRF dig2 ; Comienza a contar por el 0 INCF dig3,f ; Incrementa el valor del dígito al siguiente MOVF dig3,W ; Pone el valor del dígito en W BCF STATUS,Z XORLW 0x0A ; Chekea si el dígito sobrepasa el valor 9 BTFSC STATUS,Z ; Comprobando con un xor si W vale 0 (Z=1) CLRF dig3 return Tablac ADDWF PCL,f ; Suma al ffset, es decir, ; el valor del dígito. Así se genera un PC distinto según su valor, ; asegurando que vaya a la línea correcta de la tabla RETLW 0x3F ; 0 en código 7 segmentos RETLW 0x06 ; 1 en código 7 segmentos RETLW 0x5B ; 2 en código 7 segmentos RETLW 0x4F ; 3 en código 7 segmentos RETLW 0x66 ; 4 en código 7 segmentos RETLW 0x6D ; 5 en código 7 segmentos RETLW 0x7D ; 6 en código 7 segmentos RETLW 0x07 ; 7 en código 7 segmentos RETLW 0x7F ; 8 en código 7 segmentos RETLW 0x6F ; 9 en código 7 segmentos DELAY MOVF 0X04,W MOVWF R2 CICLO1 DECFSZ R1,1 GOTO CICLO1 CICLO2 DECFSZ R2,1 GOTO CICLO1 RETURN DISP0 BCF PORTC,4 BCF PORTC,3 ;Habilita ) BCF PORTC,2 BCF PORTC,1 BSF PORTC,0 RETURN DISP1 BCF PORTC,4 BCF PORTC,3 ;Habilita display ) BCF PORTC,2 BCF PORTC,0 BSF PORTC,1 RETURN DISP2 BCF PORTC,4 BCF PORTC,3 ;Habilita display) BCF PORTC,1 BCF PORTC,0 BSF PORTC,2 RETURN DISP3 ;Habilita display ) BCF PORTC,4 BCF PORTC,2 BCF PORTC,1 BCF PORTC,0 BSF PORTC,3 RETURN DISP4 ;Habilita display) BCF PORTC,3 BCF PORTC,2 BCF PORTC,1 BCF PORTC,0 BSF PORTC,4 RETURN END He probado teclado y displays en el 16f84 pero aqui se me ha complicado y mas con las interrupciones. Estoy preparando material para un nuevo curso en mi trabajo y estoy aprendiendo a dominar esta tecnologìa, ya que en su momento no hubo esa oportunidad. Es una maravilla estos foros. Espero su respuesta gracias. |
|||||||||||
|
|
||||||||||||
|
| Otros temas de interés | |
|---|---|
| Convertir de Puerto Paralelo a USB | |
| Como adquiero la señal de 20 sensores por un mismo puerto? | |
| Interface IrDA para el puerto serial | |
| Puerto infrarrojo IrDA para PC | |
| Activar registro del puerto paralelo | |
| Foros de Electronica |
| ||
Cuestiones Elementales de Electrónica ||
Fuentes de alimentacion ||
Circuitos de radio ||
Diseño de circuitos en general || || Sistemas de Audio: Preamplificadores, Ecualizadores || Amplificadores || Reparación || Discusión || || Microcontroladores y sistemas embebidos || Circuitos logicos combinacionales y secuenciales || Interfaces y Programacion || Dudas en general || Sistemas de Video || PC Hardware || Telematica y comunicaciones || Tecnologias moviles || Software Electronico || Robotica, Domotica y Mecatronica || Autotrónica || Automatizacion, Electronica industrial y de Potencia || Documentacion, circuitos y esquemas || Donde Las Ideas Convergen... || Tutoriales y Manuales || Proyectos Prácticos || |
Site Map
© Foros de Electrónica
Comunidad Internacional de Electrónicos
Powered by phpBB © 2001, 2005 phpBB Group
Acerca de || Política de privacidad
© Foros de Electrónica
Comunidad Internacional de Electrónicos
Powered by phpBB © 2001, 2005 phpBB Group
Acerca de || Política de privacidad

