Foros de Electrónica

Comunidad de discusión sobre Automatización, Electrónica industrial, Microcontroladores y electrónica digital, Robótica, Domótica, Telemática, Tecnologías móviles, y muchos temas más.




Problema con interrupciones en PIC


       



#11  
TeEstoyMirando
Registrado: 30 Ene 2006
Mensajes: 6
citar
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.
Tampoco soy un experto sobre el tema, mas bien todo lo contrario. Y si empiezas a programar en un nuevo lenguaje cuando encuentras trabas enseguida te siente desbordado y desistes.

Gracias por tu post y aqui estare intentando ordenar en mi cabeza este mundo algo complejo de los PICS.

Un saludo.

#12  
maunix
Colaborador
Ubicación: Cordoba, Argentina
Registrado: 22 Oct 2005
Mensajes: 649
citar
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.
Tampoco soy un experto sobre el tema, mas bien todo lo contrario. Y si empiezas a programar en un nuevo lenguaje cuando encuentras trabas enseguida te siente desbordado y desistes.

Gracias por tu post y aqui estare intentando ordenar en mi cabeza este mundo algo complejo de los PICS.

Un saludo.


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 Smile

Saludos

#13  Interrupciones que hacer...
xugua
Ubicación: Mèxico
Registrado: 22 May 2006
Mensajes: 1
citar
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.

 Responder





 Otros temas de interés 
No hay mensajes nuevos Convertir de Puerto Paralelo a USB
No hay mensajes nuevos Como adquiero la señal de 20 sensores por un mismo puerto?
No hay mensajes nuevos Interface IrDA para el puerto serial
No hay mensajes nuevos Puerto infrarrojo IrDA para PC
No hay mensajes nuevos 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 ||