Problema con pic12f629

Ola!!! Estoy intentando hacer un programa para el pic12f629. El programa consiste en lo siguiente. Cuando pulso el interruptor me ponga a 1 el pin GPIO 0 y me encienda el motor haciendo intervalos entre encendido y apagado y asi sucesivamente hasta que lo suelte.

El problema es que cuando lo pulso no sucede nada y cuando lo suelto pasa lo mismo

Esquema:



Programa:

LIST P=12F629
#INCLUDE <P12F629.INC>
RADIX HEX


;VARIABLES//====================================================

CONTADOR1 EQU 0X0C

;PROGRAMA//====================================================

ORG 0
GOTO INICIO
ORG 5

TEMPO MOVWF CONTADOR1
BORRAR1 CLRF TMR0
REPETIR1 BTFSS TMR0,7
GOTO REPETIR1
DECFSZ CONTADOR1,1
GOTO BORRAR1
RETURN

INICIO MOVLW B'00000111'
MOVWF CMCON
BSF STATUS,RP0
BSF TRISIO,0
BCF TRISIO,2
MOVLW B'00000111'
MOVWF OPTION_REG
BCF STATUS,RP0

COMPROBAR BTFSC GPIO,0
GOTO CICLO
GOTO COMPROBAR


CICLO BSF GPIO,1
MOVLW .15
CALL TEMPO
BCF GPIO,0
MOVLW .8
CALL TEMPO
GOTO COMPROBAR
END
 
Última edición:
Hola

Yo de ensamblador de PICs nanai, así que no sé exactamente qué hace todo el código aunque hay cosas que intuyo, pero pregunto por si acaso: ¿has configurado el oscilador interno del PIC? Ya que, por lo que veo, no usas oscilador externo.

Mira también con el polímetro la tensión en la base del transistor, no sea que el problema esté en que no está conduciendo. Y ponle una resistencia en la base, no la conectes directamente al PIC :D

Un saludo
 
El programa en el que simulo es el proteus por eso no hace falta poner cristal ya que ya lo detecta el, la frecuencia que le puse fue 4mhz. Para programar en asm no hace falta poner que tipo de cristal vas a usar.
 
te faltan las etiquetas por ejemplo asi
##DEFINE GPIO PORTA,4 ; Pulsador conectado a RA4.
o tambien asi
##DEFINE PULSAdOR PORTA,4 ; Pulsador conectado a RA4.
tambien falta configurar el oscilador
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
 
Última edición:
estoy confundido
te mando este a modo de ejemplo es para 16f84 pero sirve para el tullo mejor guiate de ay
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

CBLOCK 0x0C
ENDC

#DEFINE Pulsador PORTA,4 ; Pulsador conectado a RA4.
#DEFINE LED PORTB,1 ; Linea donde se conecta el diodo LED.

; ZONA DE CODIGOS ********************************************************************

ORG 0 ; El programa comienza en la direccion 0.
Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
bsf Pulsador ; La linea RA4 se configura como entrada.
bcf LED ; Se configura como salida.
bcf STATUS,RP0 ; Acceso al Banco 0.
bcf LED ; En principio diodo LED apagado.
Principal
btfsc Pulsador ; ''Pulsador presionado?, (Pulsador)=0?
goto Fin ; No. Vuelve a leerlo.
call Retardo_20ms ; Espera que se estabilicen los niveles de tension.
btfsc Pulsador ; Comprueba si es un rebote.
goto Fin ; Era un rebote y sale fuera.
btfsc LED ; Testea el ultimo estado del LED.
goto EstabaEncendido
EstabaApagado
bsf LED ; Estaba apagado y lo enciende.
goto EsperaDejePulsar
EstabaEncendido
bcf LED ; Estaba encendido y lo apaga.
EsperaDejePulsar
btfss Pulsador ; Dej de pulsar?. (Pulsador)=1?
goto EsperaDejePulsar ; No. Espera que deje de pulsar.
Fin
goto Principal

INCLUDE <RETARDOS.INC>
END
 
Lo de definir con nombres los puertos da igual y lo de configurar el oscilador y... creo que tambien. Yo he hecho varios proyectos sin poner lo del oscilador... con el 16f84a y me funcionaban igual
 
Hola chimpin, aca encontre dentro de mi coleccion de asm jaja un programa que hace lo que creo haber entendido necesitabas hacer... aca te lo dejo :)... la verdad ami no me funcionó, supongo que por problemas con hardware pero... si te intereza fijate si puede serte de utilidad

mucha suerttee... saludos;

include p12f629.inc
__config 0x119C
;---------------------------------------------------------------
org 0x00
goto start
;-------------------------- Inicializacion ---------------------
start bcf STATUS,5
movlw 0x07
movwf CMCON
clrf GPIO

call 0x03f8

bsf STATUS,5
movwf OSCCAL

movlw b'111110'
movwf TRISIO
bcf STATUS,5
;---------------------------------------------------------------
main bcf GPIO,0
btfss GPIO,1
bsf GPIO,0
goto main
;---------------------------------------------------------------
org 0x03ff
retlw 0x28 ;el hex."28" es un ejemplo, hay que leer
;el pic y ver cual es el codigo de fabrica en la direccion de "org 0x03ff"

end
 
Buen día estimados colegas, tiempo sin entrar.

Me encontré con un detalle después de años sin usar pic

con un 12f629 intento hacer que una entrada lea un interruptor (este con anti rebote) y cuando lea este encienda una salida por 4 segundos

tengo 2 pic de esos uno con reloj calibrado a 1C y el otro con 6C, para esto quiero utilizar el reloj interno. El programa en simulación corre genial pero al quemar el pic no hace nada, intente directamente encender un led y nada.
¿Me podrían ayudar a encontrar el error? Por favor.

Dejo el programa, los programas.

A ambos he cargado ambos programas solo modificando la calibración, pero ninguno de los 2 hace nada.
Dejo una imagen adjunta de los FUSES como los programo.


Muchas gracias por su ayuda.

Programa con retardo.

Código:
list    P=12f629

#INCLUDE    <P12F629.INC>    



STATUS        EQU    0X03
GPIO        EQU    0X05
CMCON        EQU    0X19
tiempo1        EQU    0X20
tiempo2        EQU    0X21
tiempo3        EQU    0X22
tiempo4        EQU    0X23

TRISIO        EQU    0X85
ANSEL        EQU    0X9F
#DEFINE    CERO    STATUS, 2    ;Flag indicador de resultado cero


    org    0x0
    goto    MAIN
    ORG    0X5

MAIN    BCF    STATUS,5    ;Bank 0
    CLRF    GPIO        ;Init GPIO
    MOVLW    07h        ;Set GP<2:0> to
    MOVWF    CMCON        ;digital IO
    BSF    STATUS,5    ;Bank 1
    CALL    3FFH
    MOVWF    OSCCAL
    CLRF    ANSEL        ;Digital I/O
    MOVLW    07h        ;Set GP<5:4> as OUTputs
    MOVWF    TRISIO        ;and set GP<3:0>
                ;as inputs
    BCF    STATUS, 5

INICIO    BTFSC    GPIO, 1
    CALL    ENCEN
    GOTO    INICIO

ENCEN    BTFSC    0x05, 1
    GOTO    ENCEN        ;SECCION ANTIREBOTE
    BSF    GPIO, 4        ;ENCENDER RELAY
    MOVLW    D'4'        ;CARGA 1 A SEGUNDOS
    CALL    DEMO1S        ;LLAMADA A RUTINA DE RETARDO
    BCF    GPIO, 1        ;APAGA EL LED DESPUES DEL TIEMPO
    RETURN            ;REGRESOY ESPERA DE SIGUIENTE PULSO


;Rutina de Retardo para 4 MHz
DEMO1S    movwf    tiempo4
TOP3    movlw    d'4'
    movwf    tiempo3
TOP4    movlw    d'250'
    call    DEMO1mS
    decfsz    tiempo3
    GOTO    TOP4
    decfsz    tiempo4
    GOTO    TOP3
    movlw    d'5'
    call    DEMO1mS
    movlw    d'106'        
    movwf    tiempo1        
TOP5    nop            
    nop            
    nop
    nop            
    nop            
    nop            
    decfsz    tiempo1, 1    
    GOTO    TOP5
    nop            
    nop            
    nop            
    nop            
    nop            
    nop            
    return


DEMO1mS    movwf    tiempo2        ;Rutina de 1mS
TOP2    movlw    d'110'        
    movwf    tiempo1        
TOP1    nop            
    nop            
    nop            
    nop            
    nop            
    nop            
    decfsz    tiempo1, 1    
    goto    TOP1        
    decfsz    tiempo2, 1    
    goto    TOP2    
    nop
    nop
    nop
    nop
    nop    
    return        

ORG    0X3FF
RETLW    0X6C
    END
Programa de led directo

Código:
list    P=12f629

#INCLUDE    <P12F629.INC>    


STATUS        EQU    0X03
GPIO        EQU    0X05
CMCON        EQU    0X19
TRISIO        EQU    0X85
ANSEL        EQU    0X9F
#DEFINE    CERO    STATUS, 2    ;Flag indicador de resultado cero


    org    0x0
    goto    MAIN
    ORG    0X5

MAIN    BCF    STATUS,5    ;Bank 0
    CLRF    GPIO        ;Init GPIO
    MOVLW    07h        ;Set GP<2:0> to
    MOVWF    CMCON        ;digital IO
    CLRF    INTCON
    BSF    STATUS,5    ;Bank 1
    CALL    3FFH
    MOVWF    OSCCAL
    CLRF    ANSEL        ;Digital I/O
    MOVLW    01h        ;Set GP<5:4> as OUTputs
    MOVWF    TRISIO        ;and set GP<3:0>
                ;as inputs
    BCF    STATUS, 5

INICIO    BSF    GPIO, 1
    GOTO    INICIO


ORG    0X3FF
RETLW    0X1C
    END
 

Adjuntos

  • fuses.JPG
    fuses.JPG
    26.3 KB · Visitas: 15
Última edición por un moderador:
A ambos he cargado ambos programas solo modificando la calibración, pero ninguno de los 2 hace nada.
Dejo una imagen adjunta de los FUSES como los programo.
Mira los cambios que he realizado a tus programas:

Con retardo:
Código:
    list    P=12f629

    #INCLUDE    <P12F629.INC>
    
    __config    _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF



;STATUS        EQU    0X03
;GPIO        EQU    0X05
;CMCON        EQU    0X19
    cblock    0x20
    tiempo1        ; EQU    0X20
    tiempo2        ; EQU    0X21
    tiempo3        ; EQU    0X22
    endc
;tiempo4        EQU    0X23

;TRISIO        EQU    0X85
;ANSEL        EQU    0X9F
;#DEFINE    CERO    STATUS, 2    ;Flag indicador de resultado cero


    org    0x0
;    goto    MAIN
;    ORG    0X5

MAIN    BCF    STATUS,5    ;Bank 0
    CLRF    GPIO        ;Init GPIO
    MOVLW    07h        ;Set GP<2:0> to
    MOVWF    CMCON        ;digital IO
    BSF        STATUS,5    ;Bank 1
    CALL    3FFH
    MOVWF    OSCCAL
;    CLRF    ANSEL        ;Digital I/O
    MOVLW    07h        ;Set GP<5:4> as OUTputs
    MOVWF    TRISIO        ;and set GP<3:0> as inputs
    BCF        STATUS, 5

INICIO    BTFSC    GPIO, 1
    CALL    ENCEN
    GOTO    INICIO

ENCEN    BTFSC    GPIO, 1
    GOTO    ENCEN        ;SECCION ANTIREBOTE
    BSF        GPIO, 4        ;ENCENDER EL LED
;    MOVLW    D'4'        ;CARGA 1 A SEGUNDOS
    CALL    DEMO1S        ;LLAMADA A RUTINA DE RETARDO
    BCF        GPIO, 4        ;APAGA EL LED DESPUES DEL TIEMPO
    RETURN            ;REGRESOY ESPERA DE SIGUIENTE PULSO


;Rutina de Retardo para 4 MHz
DEMO1S
; 999990 ciclos
    movlw    0x07
    movwf    tiempo1
    movlw    0x2F
    movwf    tiempo2
    movlw    0x03
    movwf    tiempo3
DEMO1S_0
    decfsz    tiempo1,f
    goto    $+2
    decfsz    tiempo2,f
    goto    $+2
    decfsz    tiempo3,f
    goto    DEMO1S_0
; 6 ciclos
    goto    $+1
    goto    $+1
    goto    $+1
; 4 ciclos (incluyendo call)
    return      

;    ORG    0X3FF
;    RETLW    0X6C
    END
Directo:
Código:
    list    P=12f629

    #INCLUDE    <P12F629.INC>

    __config    _INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _WDTE_OFF & _PWRTE_ON & _BOREN_OFF


;STATUS        EQU    0X03
;GPIO        EQU    0X05
;CMCON        EQU    0X19
;TRISIO        EQU    0X85
;ANSEL        EQU    0X9F
;    #DEFINE    CERO    STATUS, 2    ;Flag indicador de resultado cero


    org    0x0
;    goto    MAIN
;    ORG    0X5

MAIN    BCF    STATUS,5    ;Bank 0
    CLRF    GPIO        ;Init GPIO
    MOVLW    07h        ;Set GP<2:0> to
    MOVWF    CMCON        ;digital IO
;    CLRF    INTCON
    BSF    STATUS,5    ;Bank 1
    CALL    3FFH
    MOVWF    OSCCAL
;    CLRF    ANSEL        ;Digital I/O
    MOVLW    01h        ;Set GP<5:4> as OUTputs
    MOVWF    TRISIO        ;and set GP<3:0> as inputs
    BCF    STATUS, 5

INICIO    BSF    GPIO, 1
    GOTO    INICIO


;    ORG    0X3FF
;    RETLW    0X1C
    END
Si te fijas, he comentado varias partes del código, muchas no son necesarias porque has incluido la librería del PIC12F629.
El PIC12F629 no tiene el registro ANSEL, para configurar los pines como digitales se usa el registro CMCON.

No tiene caso que le des el valor de calibración al PIC en el programa, a menos que lo desees establecer.
Si haces esto, el programa únicamente podrá servir para el PIC que tenga ese valor para OSCCAL.
Ese valor no se borra durante la programación del PIC a menos que ocurra algún error durante la programación.
La mayoría de los programas para grabar los PIC's verifican que el valor de OSCCAL no se sobre escriba y dan un aviso cuando eso sucede.
Por ese motivo se recomienda leer el valor de OSCCAL en este tipo de PIC cuando está nuevo y guardarlo.

Mira esta utilidad para recuperar el valor de OSCCAL cuando se ha perdido. OSCCAL Recovery Tool

También agregué la palabra de configuración y cambie la rutina de retardo de 1 segundo por una más simple.

En el programa con retardo tienes un error al actuar sobre el pin del pulsador.
Fíjate que estás poniendo el valor 0 sobre GPIO,1 cuando éste pin está configurado como entrada.
Me supongo que debe ser GPIO,4 así cómo modifique el programa. :cool:

Prueba los programas, ya te deben de funcionar con esos cambios.

Suerte.
 
Muchisimas gracias, me han sido de mucha ayuda y el programa a quedado genial

el principal detalle es que 1 pic se termino de dañar hoy que no me dejo ni leerlo ni programarlo, otro por mas que quise nada por los puertos asi que posiblemente aya tenido los puertos dañados y el tercero que programe ha quedado genial

Muchisimas gracias D@rkbytes eres una eminencia para la electronica... hablando de me recomiendan algun programa para programar pics.... lo mas parecido a lenguaje arduino.. que por eso creo que se me ha olvidado muchos detalles de programar en asm :$
 
Oye amigo, estoy comenzando a utilizar el lenguaje ensamblador, y no soy un experto, pero veo que en tu código no estableciste la calibracion interna de tu microcontrolador; pensar que este hilo es muy viejo... Bueno...

Yo hasta he simulado el parpadeo de un LED, en Proteus 8; porque se supone que estas usando el reloj interno del micro. Pero igual veo que usaste el CMCON, el cual, segun la hoja de datos del pic12f629, solo es usado con el pic12f675 (para configurar los analogos como digitales).
 
veo que en tu código no estableciste la calibración interna de tu microcontrolador.
En los programas sí están las instrucciones para la calibración del oscilador interno:
Pero igual veo que usaste el CMCON, el cual, según la hoja de datos del pic12f629, solo es usado con el pic12f675 (para configurar los análogos como digitales).
El registro OSCCON se usa en varios PIC, no es exclusivo del PIC12F675.
Y en el PIC12F675, el registro más directamente involucrado para hacer los pines digitales, es el registro ANSEL.
estoy comenzando a utilizar el lenguaje ensamblador, y no soy un experto
Ya veo. :rolleyes:
 
Última edición:
Atrás
Arriba