TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Omar266 en 30 de Octubre de 2011, 14:27:07
-
Hola, espero me puedan ayudar muchas gracias de antemano. Mi proyecto es un carro manejado a control remoto, con módulos RF, el codificador HT12E, decodificador HT12D, L293D y PIC16F84A. Me está funcionado usando 5 pulsadores en la parte transmisora que son para Adelante, Atrás, Derecha, Izquierda y Parar. Ahora deseo agregarle 3 pulsadores que son Vel1 (30% alto-70% bajo), Vel2 (60% alto-40% bajo) y Vel3 (100% alto-0% bajo). La idea es usar PWM e Interrupción. La interrupción será activada por PORTB,0 que recibirá la señal del pin 17 VT del Ht12D. PORTA (0..3) configurados como entrada PORTB (0) como entrada y PORTB (1..7) como salidas. En el cuerpo principal del programa Periodos actúa el PWM y VEL1 hasta que se active una interrupción, en la interrupción se leerá El PUERTO A y de acuerdo con la lectura se ejecutara ADELANTE, ATRÁS, DERECHA, IZQUIERDA, PARA, VEL1, VEL2 o VEL3. Inicialmente el programa inicia el carro parado, cuando se inicia la velocidad será Vel3, por lo cual uso la bandera Activo, es para controlar que si se presiona uno de los pulsadores de Vel1-2-3- y el carro está parado no me afecte las variables Alto y Bajo.
Mis dudas 1) cuando valida una señal recibida el HT12D por el pin 17 es una señal alta o baja la que afectara al pin PORTB,0 del PIC16F84A. 2) Tengo que presionar muchas veces un pulsador para que funcione y no siempre lo hace.
Muchas gracias
-
Lo del pulsador puede tener que ver con que si no has corregido el rebote mecánico del pulsador, tienes un periodo de incertidumbre. Normalmente es un sistema de primer orden con un tiempo de establecimiento genérico de unos 25 ms, asique una posible solución es que introduzcas un retraso de unos 25 ms y luego recojas la pulsación, asi esa oscilación termina y recojes el valor correcto.
-
Bueno pero le estoy colocando un retraso de 20 ms (20000cyclos).
;---------------Encabezado-----------
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>
;-------Configuración de puertos-------
cblock 0x0c
PDel0
PDel1
ContadorD
Activo
Alto
Bajo
DIRECCION
endc
ORG 0x00
GOTO Inicio
ORG 0X04 ; Atiendo la interrupción
GOTO Pulsadores
Inicio
BSF STATUS,5 ; configurando puertos
MOVLW B'00011111'
MOVWF TRISA
MOVLW B'00000001'
MOVWF TRISB ; puerto B es salida
MOVLW B'11000000'
MOVWF OPTION_REG
BCF STATUS,5
MOVLW b'10010000' ;Interrupcion por PORTB,0
MOVWF INTCON
CLRF PORTB ; limpiamos PORTB
CLRF PORTA
BCF Activo,0
Cargar
MOVLW d'3'
MOVWF Alto
MOVLW d'7'
MOVWF Bajo
CLRF DIRECCION
BCF Activo,0 ;Verifica si el carro esta parado
Periodo
MOVF Activo,W ; sale de este loop cuando se active con
SUBLW D'1' ; Adelante, Atras; Izquierda, Derecha
BTFSS STATUS,Z
GOTO Periodo
MOVF Bajo,W
SUBLW D'10'
BTFSS STATUS,Z
CALL Periodo_Alto
MOVF Alto,W
SUBLW D'10'
BTFSS STATUS,Z
CALL Periodo_Bajo
Goto Periodo
Periodo_Alto
MOVF DIRECCION,W
MOVWF PORTB
MOVF Alto,W
MOVWF ContadorD
CALL DEMORA1000X?
RETURN
Periodo_Bajo
MOVLW B'00000000'
MOVWF PORTB
MOVF Bajo,W
MOVWF ContadorD
CALL DEMORA1000X?
RETURN
DEMORA1000X?
MOVLW .74
MOVWF PDel0
MOVLW .2
MOVWF PDel1
LOOP
DECFSZ PDel0,F
GOTO LOOP
DECFSZ PDel1,F
GOTO LOOP
decfsz ContadorD ; decrementa cantidad de veces
goto DEMORA1000X?
Return
CBLOCK
Guarda_W
Guarda_STATUS
Guarda_ContadorD
ENDC
Pulsadores
movwf Guarda_W ; Guarda W y STATUS.
swapf STATUS,W ; Ya que "movf STATUS,W" corrompe el bit Z.
movwf Guarda_STATUS
bcf STATUS,RP0 ; Para asegurarsede que trabaja con el Banco 0.
movf ContadorD,W ; Guarda los registros utilizados en esta
movwf Guarda_ContadorD ; subrutina y también en la principal.
SUBLW D'20'
MOVWF ContadorD
CALL DEMORA1000X?
MOVF PORTA,W
XORLW 0x05 ; b'00000101' d'05'
BTFSC STATUS,Z
GOTO ADELANTE
MOVF PORTA,W
XORLW 0x0A ; b'00001010' d'10'
BTFSC STATUS,Z
GOTO ATRAS
MOVF PORTA,W
XORLW 0x06 ; b'00000110' d'06'
BTFSC STATUS,Z
GOTO DERECHA
MOVF PORTA,W
XORLW 0x09 ; b'00001001' d'09'
BTFSC STATUS,Z
GOTO IZQUIERDA
MOVF PORTA,W
XORLW 0x03 ; b'00000011' d'03'
BTFSC STATUS,Z
GOTO PARAR
MOVF PORTA,W
XORLW 0x02 ; b'00000010' d'02'
BTFSC STATUS,Z
GOTO Vel_1
MOVF PORTA,W
XORLW 0x0E ; b'00001110' d'14'
BTFSC STATUS,Z
GOTO Vel_2
MOVF PORTA,W
XORLW 0x07 ; b'00000111' d'07'
BTFSC STATUS,Z
GOTO Vel_3
GOTO FinInterrupcion
ADELANTE
BSF Activo,0
MOVLW b'10101100'
MOVWF DIRECCION
GOTO FinInterrupcion
ATRAS
BSF Activo,0
MOVLW b'01011100'
MOVWF DIRECCION
GOTO FinInterrupcion
DERECHA
BSF Activo,0
MOVLW b'10011100'
MOVWF DIRECCION
GOTO FinInterrupcion
IZQUIERDA
BSF Activo,0
MOVLW b'01101100'
MOVWF DIRECCION
GOTO FinInterrupcion
PARAR
MOVLW d'3'
MOVWF Alto
MOVLW d'7'
BCF Activo,0
MOVLW b'00000000'
MOVWF DIRECCION
GOTO FinInterrupcion
Vel_1
MOVF Activo,W ; Si esta en movimiento puedo
SUBLW D'0' ; afectar la velocidad
BTFSC STATUS,Z
GOTO FinInterrupcion
MOVLW d'3'
MOVWF Alto
MOVLW d'7'
MOVWF Bajo
GOTO FinInterrupcion
Vel_2
MOVF Activo,W ; Si esta en movimiento puedo
SUBLW D'0' ; afectar la velocidad
BTFSC STATUS,Z
GOTO FinInterrupcion
MOVLW d'6'
MOVWF Alto
MOVLW d'4'
MOVWF Bajo
GOTO FinInterrupcion
Vel_3
MOVF Activo,W ; Si esta en movimiento puedo
SUBLW D'0' ; afectar la velocidad
BTFSC STATUS,Z
GOTO FinInterrupcion
MOVLW d'10'
MOVWF Alto
MOVLW d'0'
MOVWF Bajo
GOTO FinInterrupcion
FinInterrupcion
movf Guarda_ContadorD,W ; Restaura los registros utilizados en esta
movwf ContadorD ; subrutina y también en la principal.
swapf Guarda_STATUS,W ; Restaura el STATUS.
movwf STATUS
swapf Guarda_W,F ; Restaura W como estaba antes de producirse
swapf Guarda_W,W ; interrupción.
Bcf INTCON,INTF
retfie
;==========================================================================
END
;==========================================================================
-
Mis dudas 1) cuando valida una señal recibida el HT12D por el pin 17 es una señal alta o baja la que afectara al pin PORTB,0 del PIC16F84A
Es por flanco ascendente, cuando pasa de 0 a 1, lo tienes configurado tu asi.
MOVLW B'11000000'
MOVWF OPTION_REG
El bit 6 del OPTION_REG.
bit 6 INTEDG: Interrupt Edge Select bit
1 = Interrupt on rising edge of RB0/INT pin
0 = Interrupt on falling edge of RB0/INT pin
2) Tengo que presionar muchas veces un pulsador para que funcione y no siempre lo hace.
Es que solo lees los pulsadores cuando se produce una interrupcion en RB0, es decir, por mucho que pulses el resto de los pulsadores sino hay un flanco ascendente en RB0 no los lee.
Un consejo que te doy es que uses TMRO con interrupcion, si analizas tu programa veras que se pasa casi todo el tiempo haciendo bucles de DEMORA, mas del 90% del tiempo esta haciendo esto. Si esas cuentas las haces con el TMR0 tendras el procesador para ti, para hacer lo que quieras, puedes estar casi todo el tiempo leyendo los pulsadores o haciendo otras cosas importantes.
Todas las interrupciones son importantes pero si se usan bien los TIMERS, al procesador se le quita mucho trabajo (en tu programa casi todo y en la mayoria de los programas igual) y le sobra mucho tiempo para hacer las cosas importantes.
-
Muchas gracias por la ayuda, hice un curso intensivo de TMR0 con interrupción por Internet ya que es la primera vez con interrupciones, la cual voy a aplicar, por lo cual no usare interrupción externa a RB0, sino que la señal del pin 17 VT del Ht12D será recibida por RA4, la configuración de los puertos PORTA como entradas y PORTB como salidas. En el cuerpo principal van la lectura y manejo de los pulsadores, mantengo la bandera Activo y le agregue PORTA_T en la cual guardo PORTA y las comparo si es la misma se mantiene en el bucle de lo contrario continua, la bandera Interrupción la cual habilita o deshabilita la interrupción. En cuanto a los pulsadores el problema era la pila del control remoto aunque los pulsadores son de los más baratos. He probado el carro con el regulador de voltaje y me esta funcionado. Otra cosa es que se debe usar una fuente de 5V para el circuito y otras para los motores (PIN 8 del Puente H). Aquí dejo mi código. Cualquier sugerencia será bienvenida. Muchísimas gracias.
;---------------Encabezado-----------
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>
;-------Configuración de variables-------
cblock 0x0c
Activo
Alto
Bajo
PORTA_T
Interrupcion
Timer_Contador
endc
TMR0_Valor EQU d'252' ; Valor a cargar al TMR0
ORG 0x00
GOTO Inicio
ORG 0X04 ; Atiendo la interrupción
GOTO Velocidad
Inicio
BSF STATUS,5 ; configurando puertos
MOVLW B'00011111' ; puerto A son entradas
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB ; puerto B son salidas
movlw b'00000111' ; TMR0 con prescaler de 256.
movwf OPTION_REG
BCF STATUS,5
CLRF PORTB ; limpiamos PORTB
CLRF PORTA ; limpiamos PORTA
BCF Activo,0
Cargar
MOVLW d'3'
MOVWF Alto
MOVLW d'7'
MOVWF Bajo
CLRF PORTA_T
BCF Activo,0 ;Verifica si el carro esta parado
BCF Interrupcion,0
MOVLW d'1'
MOVWF Timer_Contador
Principal
MOVF PORTA,W ;Si PORTA es diferente a PORTA_T hay cambio
XORWF PORTA_T,W ;Si PORTA es igual a PORTA_T no hay cambio o
BTFSC STATUS,Z ;es `posible un rebote continua en el bucle
GOTO Principal
MOVF PORTA,W
XORLW 0x15 ; b'00010101' d'021'
BTFSC STATUS,Z
CALL ADELANTE
MOVF PORTA,W
XORLW 0x1A ; b'00011010' d'026'
BTFSC STATUS,Z
CALL ATRAS
MOVF PORTA,W
XORLW 0x16 ; b'00010110' d'022'
BTFSC STATUS,Z
CALL DERECHA
MOVF PORTA,W
XORLW 0x19 ; b'00011001' d'025'
BTFSC STATUS,Z
CALL IZQUIERDA
MOVF PORTA,W
XORLW 0x13 ; b'00010011' d'019'
BTFSC STATUS,Z
CALL PARAR
MOVF PORTA,W
XORLW 0x12 ; b'00010010' d'18'
BTFSC STATUS,Z
CALL Vel_1
MOVF PORTA,W
XORLW 0x1E ; b'00011110' d'30'
BTFSC STATUS,Z
CALL Vel_2
MOVF PORTA,W
XORLW 0x17 ; b'00010111' d'23'
BTFSC STATUS,Z
CALL Vel_3
MOVF PORTA,W
MOVWF PORTA_T
BTFSS Interrupcion,0
GOTO Deshabilita_interrupcion
GOTO Habilita_interrupcion
GOTO Principal
Habilita_interrupcion
MOVLW b'10100000'
MOVWF INTCON
GOTO Principal
Deshabilita_interrupcion
CLRF INTCON
GOTO Principal
ADELANTE
BSF Activo,0
BSF PORTB,7
BCF PORTB,6
BSF PORTB,5
BCF PORTB,4
BSF Interrupcion,0
RETURN
ATRAS
BSF Activo,0
BCF PORTB,7
BSF PORTB,6
BCF PORTB,5
BSF PORTB,4
BSF Interrupcion,0
RETURN
DERECHA
BSF Activo,0
BSF PORTB,7
BCF PORTB,6
BCF PORTB,5
BSF PORTB,4
BSF Interrupcion,0
RETURN
IZQUIERDA
BSF Activo,0
BCF PORTB,7
BSF PORTB,6
BSF PORTB,5
BCF PORTB,4
BSF Interrupcion,0
RETURN
PARAR
MOVLW d'3'
MOVWF Alto
MOVLW d'7'
BCF Activo,0
BCF Interrupcion,0
MOVLW b'00000000'
MOVWF PORTB
RETURN
Vel_1
BTFSS Activo,0 ; Si esta en movimiento se puede
RETURN ; afectar la velocidad
MOVLW d'3'
MOVWF Alto
MOVLW d'7'
MOVWF Bajo
BSF Interrupcion,0
RETURN
Vel_2
BTFSS Activo,0 ; Si esta en movimiento se puede
RETURN ; afectar la velocidad
MOVLW d'6'
MOVWF Alto
MOVLW d'4'
MOVWF Bajo
BSF Interrupcion,0
RETURN
Vel_3
BTFSS Activo,0 ; Si esta en movimiento se puede
RETURN ; afectar la velocidad
BSF PORTB,3
BSF PORTB,2
BCF Interrupcion,0
RETURN
CBLOCK
Guarda_W
Guarda_STATUS
ENDC
Velocidad
movwf Guarda_W ; Guarda W y STATUS.
swapf STATUS,W ; Ya que "movf STATUS,W" corrompe el bit Z.
movwf Guarda_STATUS
bcf STATUS,RP0 ; Para asegurarsede que trabaja con el Banco 0.
movlw TMR0_Valor
movwf TMR0
decfsz Timer_Contador,F ; Decrementa el contador.
goto FinInterrupcion
btfsc PORTB,3 ; Testea el anterior estado de la salida.
goto EstabaAlto
EstabaBajo
bsf PORTB,3 ; Estaba bajo y lo pasa a alto.
bsf PORTB,2
movf Alto,W ; Repone el contador nuevamente con el tiempo en
movwf Timer_Contador ; alto.
goto FinInterrupcion
EstabaAlto
bcf PORTB,3 ; Estaba alto y lo pasa a bajo.
bcf PORTB,2
movf Bajo,W ; Repone el contador nuevamente con el tiempo
movwf Timer_Contador ; en bajo.
FinInterrupcion
swapf Guarda_STATUS,W ; Restaura el STATUS.
movwf STATUS
swapf Guarda_W,F ; Restaura W como estaba antes de producirse
swapf Guarda_W,W ; interrupción.
Bcf INTCON,RBIF
Bcf INTCON,T0IF
retfie
;==========================================================================
END
;==========================================================================
-
Si ya te funciona pues muy bien.
En el L293D puedes poner los enables, pines 1 y 9 a VCC directamente y te ahorras los pines RB2 Y RB3 del PIC y simplicas el programa un poco.
Esto me despista un poco.
TMR0_Valor EQU d'252' ; Valor a cargar al TMR0
Pero bueno funciona, lo logico es guardarlo en RAM y leerlo, porque despues haces.
movlw TMR0_Valor
movwf TMR0
Y te carga el TIMER con el valor 252, nunca habia visto hacerlo asi, pero bueno si funciona.
El TMR0 para temporizar 1ms puedes usar un preescaler mas pequeño 1/4 en vez de 1/256 asi consigues el tiempo con mas exactitud.
El cblock deberias de ponerlo todo junto y no unos arriba y otros en medio del programa, porque tu lo sabes pero si lo mira otra persona se vuelve loca.
-
Hola Tapia8, me sugiere poner los enables, pines 1 y 9 a VCC directamente y ahorrarme los pines RB2 Y RB3 del PIC, mi duda es que por ellos estoy enviando los pulsos del pwm, la verdad no entiendo.
Me podría decir como guardar el valor del TMRO en RAM. Muchas gracias
-
Hola Tapia8, me sugiere poner los enables, pines 1 y 9 a VCC directamente y ahorrarme los pines RB2 Y RB3 del PIC, mi duda es que por ellos estoy enviando los pulsos del pwm, la verdad no entiendo.
Pues si los enables estan siempre habilitados, haces PWM por RB4, MT2 girara en un sentido y si lo haces por RB5 MT2 en sentido contrario y para MT1 igual con RB6 y RB7, en pag. 10 de este data viene un esquema. Es una sugerencia si asi te funciona.......
javascript:openreq('http://www.datasheetcatalog.org/datasheet/texasinstruments/l293d.pdf')
Me podría decir como guardar el valor del TMRO en RAM. Muchas gracias
Tal y como esta en tu programa no vale la pena guardarlo en RAM porque la temporizacion es siempre la misma, pero no necasitas definirlo
TMR0_Valor EQU d'252' ; Valor a cargar al TMR0
Con hacer aqui.
movlw d'252'
movwf TMR0
Es la manera normal de hacerlo. Me sorprendio como lo hiciste tu, porque nunca lo habia visto.
Quieres temporizar 1ms y con el preescaler en 1/256 como tu lo tienes te desborda a los 1024us mas algunos us que consumes en activar o desactivar el L293, y algunos en cargar de nuevo el timer, si el preescaler lo pones en 1/4 puedes temporizar con mas exactitud 1ms e incluso rebajar 4 o 8us para que el tiempo total sea 1ms exacto.
No se si has visto este hilo, ahi te explica todo muy bien:
http://www.todopic.com.ar/foros/index.php?topic=24720.0
-
Gracias por su colaboración, he hecho los cambios necesarios al momento me está trabajando bien, aplique el preescaler 1/4 cargando TMR0 con 6. Me gustaría hacer otra pregunta que tan fácil o difícil es hacer operaciones matemáticas en assembler. O que otro lenguaje seria.
-
Mirate este hilo, en concreto en la respuesta 13 tienes varias rutinas de operaciones aritmeticas.
http://www.todopic.com.ar/foros/index.php?topic=23812.0
En assembler son complicadas de hacer, seguramente C sea el mejor.
-
Hola Tapia8, he decidido migrar al 16F628A y en el fututo al 16F876A. He hecho un programa más sencillo consta de cuatro leds conectados a RB4…RB7, se prenden de acuerdo con el pulsador enviado por la parte transmisora, y un quinto led que va a RB0 el cual prende tan pronto se inicia el PIC. Lo probé con el 16F84A y funciono, mientras con el 16F628A no, tan solo prende el quinto led (RB0), parece que no lee el puerto A. Hice los siguientes cambios: Fuses, reloj interno y deshabilitar los comparadores del puertoA.
;Este programa se utiliza para recibir la señal de un control remoto via RF
;para mover un carro => ADELANTE => ATRAS => DERECHA => IZQUIERDA Y PARAR
;**********************************************************
;** CONFIGURACION DEL DISPOSITIVO ***
;*********************************************************
LIST P=16F628A
INCLUDE <P16F628A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON
;**********************************************************
;** ASIGNAMOS LAS VARIABLES DE LOS REGISTROS DE RAM ***
;**********************************************************
cblock 0x21
PORTA_T
endc
;**********************************************************
;** ESCRITURA DEL PROGRAMA DEL PIC ***
;**********************************************************
Org 0x0000
GOTO INICIO
;**********************************************************
;** CONFIGURAMOS PUERTOS DEL PIC ***
;**********************************************************
INICIO
CLRF PORTA
MOVLW 0x7 ; Configuro Comparador Analogico
MOVWF CMCON ; V1in-=GND, V1in+=GND, C1out=Off| V2in-=GND, V2in+=GND, C2out=Off
BCF STATUS,RP1
BSF STATUS,RP0 ;SELECCIONAMOS EL BANCO 1
CLRF TRISB ;PORTB como salida
MOVLW B'00111111'
MOVWF TRISA ;PORTA como entrada
BCF STATUS,RP0 ;SELECCIONAMOS EL BANCO 0
CLRF PORTA ;PuertoA a cero
CLRF PORTB ;PuertoB a cero
CLRF PORTA_T
MOVLW b'00000001'
MOVWF PORTB
;**********************************************************
;** EMPEZAMOS CON EL PROGRAMA ***
;**********************************************************
LEER_RF
MOVF PORTA,W ;Si PORTA es diferente a PORTA_T hay cambio
XORWF PORTA_T,W ;Si PORTA es igual a PORTA_T no hay cambio
BTFSC STATUS,Z ;o es `posible un rebote
GOTO LEER_RF
MOVF PORTA,W
XORLW 0x15 ; b'00010101' d'021' ADELANTE
BTFSC STATUS,Z
CALL ADELANTE
MOVF PORTA,W
XORLW 0x1A ; b'00011010' d'026' ATRAS
BTFSC STATUS,Z
CALL ATRAS
MOVF PORTA,W
XORLW 0x19 ; b'00011001' d'025' IZQUIERDA
BTFSC STATUS,Z
CALL IZQUIERDA
MOVF PORTA,W
XORLW 0x16 ; b'00010110' d'022' DERECHA
BTFSC STATUS,Z
CALL DERECHA
MOVF PORTA,W
XORLW 0x13 ; b'00010011' d'019' PARAR
BTFSC STATUS,Z
CALL PARAR
GOTO LEER_RF
ADELANTE
MOVF PORTA,W
MOVWF PORTA_T
CALL RESSET
MOVLW b'10100000'
XORWF PORTB
RETURN
ATRAS
MOVF PORTA,W
MOVWF PORTA_T
CALL RESSET
MOVLW b'01010000'
XORWF PORTB
RETURN
DERECHA
MOVF PORTA,W
MOVWF PORTA_T
CALL RESSET
MOVLW b'01100000'
XORWF PORTB
RETURN
IZQUIERDA
MOVF PORTA,W
MOVWF PORTA_T
CALL RESSET
MOVLW b'10010000'
XORWF PORTB
RETURN
PARAR
MOVF PORTA,W
MOVWF PORTA_T
CALL RESSET
MOVLW b'00000000'
XORWF PORTB
RETURN
RESSET
CLRF PORTA ;Puerto A a cero
CLRF PORTB ;Puerto B a cero
RETURN
END
-
A mi en principio me tiras errores en la configuracion:
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON
Dice que esto esta mal.
]_DATA_CP_OFF [/
Se lo quite y en vez de compilar, me tira dos errores en vez de uno. Le quite toda la confguracion de FUSES y lo configure desde el propio MPLAB y compilo, le meti en PORTA 0x19 y fue a esa secuencia me puso en PORTB 10010000, es decir apago RBO y encendio RB4 y RB7, no probe todas las secuencias pero por lo que veo tambien deben funcionar, si no hay cambios en PORTA si que se queda al principio, que creo que es lo que tiene que hacer, es que ya no recuerdo bien de que iba la cosa.
-
Hola, a decir verdad me está pasando lo mismo con las versiones de MPLAB 8.83 y 8.84 bajadas directamente de Microchip. Tengo también versión 8.43 con esta hice la compilación. Estuve revisando los archivos 16F628A.INC de las versiones 8.43, 8.83 y 8.84 de MPLAB. En la 8.43 figura _DATA_CP_OFF y _DATA_CP_ON pero en las versiones 8.83 y 8.84 figuran DATA_CP_OFF y DATA_CP_OFF, creo que es por eso.
En cuanto a lo otro tengo el circuito en la protoboard. Con el PIC16F84A, el pin RA5 RESET conecte una resistencia de 10K a VDD (5v), como tiene que ser y trabajo muy bien. Luego cambie al PIC16F628A conecte la resistencia a VDD y no funciona por lo que la cambie a Ground y me está funcionando. Esto es normal, pues se supone que se debe conectar a VDD.
Quiero aprovechar la ocasión, con todas estas dudas hice un programa de secuencia de luces para el PIC16F84A y otro para el PIC 16F628A cambiando los fuses y configurando PORTA habilitando los pines como I/O en CMCON. Lo tengo en la protoboard. Probando el circuito con 16F84A tengo que conectar una resistencia (10K) del RA5 a VDD como tiene que ser. Si algo reset con el pulsador conectado Vcc se reinicia el programa lo cual está bien. El problema es con el 16F628A no conecto ninguna resistencia, conecto la resistencia a VDD o la conecto a VCC el programa funciona, y si hago el reset con el pulsador no funciona. Es esto normal. La verdad estoy muy desconcertado, tengo tres integrados uno de esto los compre hoy pensando que pudiese ser el integrado pero nada. Muchas gracias.
LIST P=16F628A
INCLUDE <P16F628A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _INTOSC_OSC_NOCLKOUT & _DATA_CP_OFF & _LVP_OFF & _MCLRE_ON
;**********************************************************
;** ASIGNAMOS LAS VARIABLES DE LOS REGISTROS DE RAM ***
;**********************************************************
cblock 0x21
R_ContA ; Contadores para los retardos.
R_ContB
endc
#DEFINE LED0 PORTB,0
#DEFINE LED1 PORTB,1
#DEFINE LED2 PORTB,2
#DEFINE LED3 PORTB,3
#DEFINE LED4 PORTB,4
#DEFINE LED5 PORTB,5
#DEFINE LED6 PORTB,6
#DEFINE LED7 PORTB,7
;**********************************************************
;** ESCRITURA DEL PROGRAMA DEL PIC ***
;**********************************************************
Org 0x0000
GOTO INICIO
;**********************************************************
;** CONFIGURAMOS PUERTOS DEL PIC ***
;**********************************************************
INICIO
CLRF PORTA ;Initialize PORTA by setting output data latches
MOVLW 0x7 ; Configuro Comparador Analogico
MOVWF CMCON ; V1in-=GND, V1in+=GND, C1out=Off| V2in-=GND, V2in+=GND, C2out=Off
BCF STATUS,RP1
BSF STATUS,RP0 ;SELECCIONAMOS EL BANCO 1
CLRF TRISB ;PORTB como salida
MOVLW B'01111011' ; b'00011111' d'031'
MOVWF TRISA ;PORTA como entrada
BCF STATUS,RP0 ;SELECCIONAMOS EL BANCO 0
CLRF PORTA ;PuertoA a cero
CLRF PORTB ;PuertoB a cero
BSF PORTA,2
;**********************************************************
;** EMPEZAMOS CON EL PROGRAMA ***
;**********************************************************
Principal
bsf LED0 ; Enciende el LED
call Retardo_200ms ; durante la suma de este tiempo.
bcf LED0 ; Lo apaga durante la suma de los siguientes
bsf LED1 ; Enciende el LED
call Retardo_200ms ; durante la suma de este tiempo.
bcf LED1 ; Lo apaga durante la suma de los siguientes
bsf LED2 ; Enciende el LED
call Retardo_200ms ; durante la suma de este tiempo.
bcf LED2 ; Lo apaga durante la suma de los siguientes
bsf LED3 ; Enciende el LED
call Retardo_200ms ; durante la suma de este tiempo.
bcf LED3 ; Lo apaga durante la suma de los siguientes
bsf LED4 ; Enciende el LED
call Retardo_200ms ; durante la suma de este tiempo.
bcf LED4 ; Lo apaga durante la suma de los siguientes
bsf LED5 ; Enciende el LED
call Retardo_200ms ; durante la suma de este tiempo.
bcf LED5 ; Lo apaga durante la suma de los siguientes
bsf LED6 ; Enciende el LED
call Retardo_200ms ; durante la suma de este tiempo.
bcf LED6 ; Lo apaga durante la suma de los siguientes
bsf LED7 ; Enciende el LED
call Retardo_200ms ; durante la suma de este tiempo.
bcf LED7 ; Lo apaga durante la suma de los siguientes
call Retardo_200ms
goto Principal
; Subrutinas "Retardo_200ms" y "Retardo_100ms"-------------------------------------------
Retardo_200ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'200' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_100ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'100' ; Aporta 1 ciclo máquina. Este es el valor de "M".
goto Retardos_ms ; Aporta 2 ciclos máquina.
Retardo_1ms ; La llamada "call" aporta 2 ciclos máquina.
movlw d'1' ; Aporta 1 ciclo máquina. Este es el valor de "M".
;
; El próximo bloque "Retardos_ms" tarda:
; 1 + M + M + KxM + (K-1)xM + Mx2 + (K-1)Mx2 + (M-1) + 2 + (M-1)x2 + 2 =
; = (2 + 4M + 4KM) ciclos máquina. Para K=249 y M=1 supone 1002 ciclos máquina
; que a 4 MHz son 1002 µs = 1 ms.
;
Retardos_ms
movwf R_ContB ; Aporta 1 ciclo máquina.
R1ms_BucleExterno
movlw d'249' ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
movwf R_ContA ; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
nop ; Aporta KxMx1 ciclos máquina.
decfsz R_ContA,F ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
goto R1ms_BucleInterno ; Aporta (K-1)xMx2 ciclos máquina.
decfsz R_ContB,F ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto R1ms_BucleExterno ; Aporta (M-1)x2 ciclos máquina.
return ; El salto de retorno aporta 2 ciclos máquina.
;
;En total estas subrutinas tardan:
; - Retardo_200ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 200007 cm = 200 ms. (M=200 y K=249).
; - Retardo_100ms: 2 + 1 + 2 + (2 + 4M + 4KM) = 100007 cm = 100 ms. (M=100 y K=249).
; - Retardo_1ms : 2 + 1 + (2 + 4M + 4KM) = 1005 cm = 1 ms. (M= 1 y K=249).
END
-
Quiero agradecer muchisisimo por su ayuda, el problema era en la grabación, pues estaba deshabilitado los fuses, ya que al hacer mi grabadora y al configurar la IC-Prog por primera vez, en la instrucciones dadas por alguien para el 16F84A dice .... “debemos dejar sin activar las opciones PWRT y CP, para evitar quemar los bits de seguridad de no lectura, probablemente no permita volver a programar el chip si se trata de un reprogramable.” , y pensé que se aplicaba para todos. Gracias..