No me anda GPIO.0 en pic 12f629 con pbp

•Estoy tratando de migrar de picaxe a PBP asi me resulta mas facil conseguir los pic y mas baratos, ahora tratando de hacer lo mas simple delm undo se me complico, les muestro el programa.

GPIO = %00000000 ;Pongo todo como salida
loop:
Pause 100 ' espera 100ms
toggle gpio.0 'Cambia de estado la salida GPIO.0 (pata 7 del 12f629)
Goto loop ' Repite lo mismo
End


•Bueno ese programa no anda, osea prende el led en gpio.0 pero no se apaga nunca, lo raro es que si uso cualquier otra salida si anda por ejemplo cn GPIO.2 asi...


GPIO = %00000000 ;Pongo todo como salida
loop:
Pause 100 ' espera 100ms
toggle gpio.2 'Cambia de estado la salida GPIO.2 (pata 7 del 12f629)
Goto loop ' Repite lo mismo
End

Pero necesito poder manejar la salida de la pata 7 porque es para un circuito que ya tengo armado.




•Descubri que si uso 2 salidas osea gpio.0 y gpio.1 ahi si andan las 2 pero si quiero usar solo gpio.0 no anda :S, dejo el ejemplo con las 2 salidas

GPIO = %00000000 ;Pongo todo como salida
loop:
Pause 100 ' espera 100ms
toggle gpio.0 'Cambia de estado la salida GPIO.0 (pata 7 del 12f629)
toggle gpio.1 'Cambia de estado la salida GPIO.1 (pata 6 del 12f629)
Goto loop ' Repite lo mismo
End
_______________________________________________________________________________
*****************RESUELTO********************

Muchachos gracias por nada ya lo resolvi jaja pasa que de fabrica viene activado un comparador entre gpio.0 y gpio.1, se desactiva poniendo esto CMCON7, dejo el codigo andando por si a alguien le ayuda

CMCON = 7
GPIO = %00000000 ;Pongo todo como salida
loop:
Pause 100 ' espera 100ms
toggle gpio.0 'Cambia de estado la salida GPIO.0 (pata 7 del 12f629)
Goto loop ' Repite lo mismo
End
 
salu2... amigo te tengo un dato si te interesa... recuerda q el (pic12f629) o (pic12f675) solo cuentan con 5 pines que se pueden definir como I/O usando CMCON=7, por ello, declarar GPIO=%00000000 te podría generar en alguna parte de la compilacion un error... de igual forma el pin correspondiente a "GPIO.3" solo se puede usar como entrada desahabilitando "MCLR" por ende te recomiendo la siguiente declaracion: "trisio=%001000" esa declaracion es mas que especifica y eleimina la posibilidad de generar errores al momento de poner en funsion el pic, dado que declaras 8 bit, cuando el pic solo tiene 6 para operar.

aca te dejo codigo para que deshabilites "MCLR" y trabajes con Oscilador interno:

@ DEVICE PIC12F629, MCLR_OFF 'Master Clear Externo desconectado
@ DEVICE PIC12F629, INTRC_OSC_NOCLKOUT 'setea pic para usar Osc Interno
CMCON = 7'estable todos pines del pic como I/O
DEFINE OSC 4' Define Oscilador Interno a 4Mhz
 
hola; digo no seria mejor poner todo como salida con trisio

TRISIO= %00000000 ; recuerda de gpio3 es solo entrada
¿¿¿¿¿¿¿¿¿¿GPIO = %00000000 ;Pongo todo como salida
loop:
Pause 100 ' espera 100ms
toggle gpio.2 'Cambia de estado la salida GPIO.2 (pata 7 del 12f629)
Goto loop ' Repite lo mismo
End
 
saludos gente del foro consulto alguien me puede ayudar con un ejemplo para el pic 12f629 con pbp
por ejemplo prender led ..... gracias
 
saludos gente del foro consulto alguien me puede ayudar con un ejemplo para el pic 12f629 con pbp
por ejemplo prender led ..... gracias
Arriba ya pusieron el ejemplo.
Acá te lo pongo más completo.
Código:
; Prender y apagar un LED con la instrucción BUTTON
;*******************************************************************************
@ DEVICE PIC12F629    ; Microcontrolador utilizado
; Palabra de configuración
@ DEVICE INTRC_OSC_NOCLKOUT,PROTECT_OFF,CPD_OFF,WDT_OFF,MCLR_OFF,PWRT_ON,BOD_OFF
; Oscilador interno
; Sin protección en zona de código
; Sin protección en zona de datos (EEPROM)
; Sin habilitar el reseteo por inactividad
; Sin habilitar el pin de reset (MCLR)
; Con reset al iniciar
; Sin reset por bajo voltaje de alimentación
;*******************************************************************************
DEFINE OSC 4                ; Definir que se trabajará con 4MHz.

CMCON = 7                    ; Comparadores analógicos OFF
TRISIO = %1111101           ; Solo GP1 como salida

SYMBOL BTN = GPIO.0         ; Establecer que GP0 (Pin 7) será el Push-Button
SYMBOL LED = GPIO.1         ; Establecer que GP1 (Pin 6) será el control del LED

B0  VAR BYTE                ; Variable de conteo usada por BUTTON
GPIO.1 = 0                  ; Inicializar GP1 en 0

MainLoop:
    BUTTON BTN,0,255,255,B0,0,MainLoop ; Verificar el estado del pin GP0
    ; El funcionamiento de la instrucción BUTTON está en la ayuda de MCS
    ; Presionar la tecla F1 sobre la instrucción, para obtener información.
    TOGGLE LED              ; Invierte el estado del pin GP1
    GOTO MainLoop           ; Hacer un bucle infinito.
    END
Suerte.
 
Última edición:
muchas pero muchas gracias D@rkbytes por tu ayuda esta bien explicado, que es como yo quería para aprender a entender este micro. un poco...mas..
ya que he programado y me he acostumbrado con el 16f84 por mucho tiempo, ahora conseguí 12f629 y el 16f628 :) gracias estare atento por si me explican un poco mas de este pequeño pic de fácil manejo físico..
 
muchas pero muchas gracias D@rkbytes por tu ayuda esta bien explicado, que es como yo quería para aprender a entender este micro. un poco...mas..
ya que he programado y me he acostumbrado con el 16f84 por mucho tiempo, ahora conseguí 12f629 y el 16f628 :) gracias estare atento por si me explican un poco mas de este pequeño pic de fácil manejo físico..
De nada... (y)
Algunos datos más acerca de este pequeñin.
Código:
CORE=14
MAXVAR=64
MAXMEM=1024
PAGES=1
BANKS=1
PORTS=1
ADC=0
ADRES=0
EEPROM=128
BANK0_START=0x0020
BANK0_END=0x005F
BANK1_START=0
BANK1_END=0
BANK2_START=0
BANK2_END=0
BANK3_START=0
BANK3_END=0
RAM_BANKS=1
UART=0
USB=0
FLASH_WRITE=0
MSSP=0
EEPROM_START=2100
OSCCALADDR=0X03FF
CONFIG_ADDR=0X2007

** HARDWARE REGISTERS **
INDF=0x0000
TMR0=0x0001
PCL=0x0002
STATUS=0x0003
FSR=0x0004
GPIO=0x0005
PORTB=0x0005
PCLATH=0x000A
INTCON=0x000B
PIR1=0x000C
PCLATH=0x000A
INTCON=0x000B
PIR1=0x000C
TMR1L=0x000E
TMR1H=0x000F
TMR1LH=0x000F
T1CON=0x0010
CMCON=0x0019
OPTION_REG=0x0081
TRISIO=0x0085
TRISB=0x0085
PIE1=0x008C
PCON=0x008E
OSCCAL=0x0090
WPU=0x0095
IOC=0x0096
IOCB=0x0096
VRCON=0x0099
EEDATA=0x009A
EEDAT=0x009A
EEADR=0x009B
EECON1=0x009C
EECON2=0x009D
OSCCAL=0x008F
ADCON1=0x009F
CPD_ON=0x3EFF
CPD_OFF=0x3FFF
CP_ON=0x3F7F
CP_OFF=0x3FFF
BODEN_ON=0x3FFF
BODEN_OFF=0x3FBF
MCLRE_ON=0x3FFF
MCLRE_OFF=0x3FDF
PWRTE_OFF=0x3FFF
PWRTE_ON=0x3FEF
WDT_ON=0x3FFF
WDT_OFF=0x3FF7
LP_OSC=0x3FF8
xT_OSC=0x3FF9
HS_OSC=0x3FFA
EC_OSC=0x3FFB
INTRC_OSC_NOCLKOUT=0x3FFC
INTRC_OSC_CLKOUT=0x3FFD
ExTRC_OSC_NOCLKOUT=0x3FFE
ExTRC_OSC_CLKOUT=0x3FFF
Y unos programas de ejemplo, acerca de la calibración del oscilador interno.
Es importante tener nota de su valor.
Ya que si se escribe en la posición 0x3FF, no podrá funcionar bien cuando se requiera precisión.
Para esto, debemos leer el PIC nuevo, y apuntar el valor que se encuentra en la última dirección.
Ese valor HEX, es nuestro valor de calibración de fábrica para el PIC.
Lo mismo ocurre con el 12F675, pero cambia la forma en que se lee el valor.

Suerte.
 

Adjuntos

  • 12F629_OSCCAL.rar
    8.4 KB · Visitas: 313
  • 12F629_ASIGNAR_OSCCAL.rar
    8.5 KB · Visitas: 98
Última edición:
mil gracias D@rkbytes!! si tome el valor del oscilador interno, ya que todos no son iguales estoy estudiando esa parte (osccal) se llama creo? para no perderle
bueno yo estoy mas familiarizado con pbp, uso microcode estudio plus para crear el .HEX y el picpgm, para leer y grabar este ultimo detecta las características de los picxxxxx al momento de abrir el software,
D@rkbytes me gustaría crear una rutina como encender y apagar un led usando el comando pause, en fin usar lo que mas se pueda de sus pines de este pequeño......... saludos
 
mil gracias D@rkbytes!! si tome el valor del oscilador interno, ya que todos no son iguales estoy estudiando esa parte (osccal) se llama creo? para no perderle
bueno yo estoy mas familiarizado con pbp, uso microcode estudio plus para crear el .HEX y el picpgm, para leer y grabar este ultimo detecta las características de los picxxxxx al momento de abrir el software,
D@rkbytes me gustaría crear una rutina como encender y apagar un led usando el comando pause, en fin usar lo que mas se pueda de sus pines de este pequeño......... saludos
De nada...
Ejemplos puede haber muchos. Lo importante es tener creatividad. ;)
Encender y apagar un LED usando la instrucción PAUSE, fue el programa básico de los dos que subí.
Puedes usar otras instrucciones interesantes que los lenguajes de alto nivel como PBP tienen.
Recordemos que Alto Nivel en programación no significa que es mejor.
Significa que nos acerca más al lenguaje que una persona conoce.
Si tomamos como base primordial el lenguaje ensamblador, tendríamos que para encender un LED
Se haría esto.
Código:
MainLoop
    bsf        GPIO,0        ; pone en 1 GP0
    call    retardo        ; llama a una rutina de retardo
    bcf        GPIO,0        ; pone en 0 GP0
    call    retardo        ; llama a una rutina de retardo.
    goto    MainLoop    ; Bucle infinito
    end
Y tras, y delante de este código aún debe haber más para que funcione.

En PBP el programa se simplifica drásticamente.
Código:
MainLoop
    HIGH GPIO.0
    PAUSE 500
    LOW GPIO.0
    PAUSE 500
    GOTO MainLoop
    END
No es mala idea que empieces a darle una leída al ensamblador.
¿Por qué? Por qué es la base. Una vez aprendido el ensamblador, comprenderás muchas cosas.
Si no mal recuerdo, para el 12F629 al igual que para el 16F84 y otros de media escala, son 35 instrucciones.
De las cuales hay veces que en un programa no se usan todas.

Todos los IDE de alto nivel, crean un *.asm y después lo compilan.
Programando en ensamblador, se compila directamente el archivo *.asm

PBP y otros IDE de alto nivel, tienen la particularidad de poder mezclar ambos lenguajes.
Como lo hice en los ejemplos que subí.
Y eso es útil cuando no encontramos la forma de hacer lo que queremos,
con el set de instrucciones que el IDE posee.
 
hola D@rkbytes gracias por la explicación quiero entender en este micro lo que he practicado en otros como el f84
empezare con esto ;:unsure:


MainLoop
HIGH GPIO.0
PAUSE 500
LOW GPIO.0
PAUSE 500
GOTO MainLoop
END
te cuento que sale!!! la idea futura es sacar un tono audible por uno de los pines del 12f629:)
SALUDOS
 
Darkbytes hago mi consulta en este hilo, entonces no entiendo tengo que leer el pic y examinar la ultima posición de memoria con el programador y anotar el valor? o tengo que agregar la rutina en ASM que tienen estos archivos que tu publicas aquí. Muchas gracias.
 
Cuando el PIC está nuevo se debe leer el valor de OSCCAL que se encuentra en la última posición: 0x3FF
Ésto es por si se llega a borrar al sobreescribir esa posición.
Te recomiendo que conviertas ese número a binario y lo apuntes bit por bit en cada pin del PIC.

Por ejemplo: Pin1 = El MSB hasta el Pin 8 = El LSB de los 8 bits del valor de OSCCAL.
Si el valor es, 0x3432, obtienes únicamente el 32 porque el 34 es un RETLW.
O sea que el 32 (Hexadecimal) es el valor de fábrica de OSCCAL.
Entonces, 0x32 en binario = 00110010
Pin 1 = 0, Pin2 = 0, Pin 3 = 1, Pin 4 = 1, Pin 5 = 0, Pin 6 = 0, Pin 7 = 1, Pin 8 = 0

La rutina en ensamblador sólo fue un ejemplo.
En PIC Basic Pro con tan sólo escribir en la cabecera del programa: Define OSCCAL_1K 1, basta.
Pero ésta instrucción no recupera el valor de OSCCAL, únicamente coloca en el registro el valor encontrado en la dirección 0x3FF.
Ésta instrucción es importante escribirla para que el PIC funcione bien cuando se usa el oscilador interno.
También es importante guardar el valor de OSCCAL para poder recuperarlo si se llega a borrar.

En caso de que se llegue a perder el valor de OSCCAL, puedes usar el programa de éste post:
Consulta de OSCCAL en PIC12F629
 
He encontrado un valor en esa dirección de mi 675 el valor es "3448"

Otra consulta es posible tomar 2 pines del puerto GPIO y mandar ambos a la base de un transistor, (asi tendrias mas corriente Ib en el transistor) he encontrado en el datasheet del 628 o 877 estos datos, pero no fue asi en el datasheet de estos 12f. Un saludo y agradecimiento por ayudarnos.
 
Última edición:
He encontrado un valor en esa dirección de mi 675 el valor es "3448"
OK. El valor de OSCCAL es 0x48 (72 en decimal)
Ese es el valor de calibración de fábrica que debes conservar.

Otra consulta. ¿Es posible tomar 2 pines del puerto GPIO y mandar ambos a la base de un transistor? (Así tendrías mas corriente Ib en el transistor)
Eso que mencionas, aparte de complicado, resulta totalmente innecesario.
Con los 25 mA. que puede entregar un pin del PIC, tienes corriente de sobra para saturar un transistor.
Mira este tema: Calcular la resistencia para un transistor accionado por un microcontrolador
 
Estimado en el caso de que se haga una produccion de 100 unidades , que recomienda? ya que leer y guardar el valor no es viable, he encontrado la an250 pero tampoco me parece viable. Que ´piensa usted? no necesito precision, saludos

pd: programo en asm

o solo con agregar estas lineas en el programa lo hara automaticamente?

BSF STATUS, RP0 ;Bank 1
CALL 3FFh ;Get the cal value
MOVWF OSCCAL ;Calibrate
BCF STATUS, RP0 ;Bank 0

obviamente agregando al final del programa:
org 0x3ff
retlw 0x20


todos oscilaran a la misma frecuencia? es una duda que tengo.
 
Última edición:
Saludos.
Una cosa es recuperar el valor de OSCCAL y otra cosa es establecerlo.
Si dices que vas a hacer una producción de 100 unidades, debe suponerse que son chips nuevos.
Entonces establecer el valor de la dirección 0x3FF al registro OSCCAL, sería todo.
Código:
    bcf STATUS,RP0
    call 0x3FF
    bsf STATUS,RP0
    movlw OSCCAL
Con eso lees el valor de la dirección 0x3FF y lo asignas al registro OSCCAL.
Porque en esa dirección debe haber un RETLW XX, o sea, 34XX

Por lógica todos deberán oscilar a 4 MHz aproximadamente, siempre y cuando el valor de OSCCAL sea correcto.
 
Atrás
Arriba