Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
Saludos.Estimados Amigos;
Como están por favor quisiera saber si se puede programar en Pic Basic en un PIC12F675:
Gracias de antemano por su ayuda.
Saludos nuevamente christus.Gracias por la respuesta amigo d@rkbytes pero en el caso de este pic tengo entendido que hay que hacer una configuracion especial en el programa para que use su clock interno y en PBP mas o menos como seria y en el caso de los puertos normalmente trabajamos siempre asi digamos "PORTA.0 = variable" pero en este pic sus pines no estan nombrados asi.
Te agradezco nuevamente por tu ayuda.
El programa esta bien.hola D@rkbytes gracias nuevamente por tu apoyo, queria comentarte he hecho un programa de prueba y lo estoy simulando en proteus pero no hace nada, el programa es el siguiente :
DEFINE OSCCAL_1K 1
ANSEL = %00000000
CMCON = 7
Inicio:
GPIO.0 = 1
pause 500
GPIO.0 = 0
pause 500
goto inicio
end
No se si estoy cometiendo algún error, gracias por la atencion prestada
clear
define osc 4
OPTION_REG=%10000101
;BIT 7=1 DESHABILITA PULL-UPS DE P.B
;BIT 5=0 SELECCIONA EL MODO DE TEMPORIZADOR
;BIT 2=1}
;BIT 1=0} TIMER0 CONJUNTO PREESCALADOR PARA 64
;BIT 0=1}
INTCON=%10100000
;BIT 7=1 PERMITE TODAS LAS INTERRUPCIONES
;BIT 5=1 PERMITE LA INTERRUPCION POR TIMER0
;BIT 2=0 SE ESTABLECE SOBRE LA INTERRUPCION TOIF O ITCON2
Alpha var word ;variable en el codigo de pausa
Beta var byte ;esta vaiable contabiliza 61 en interrupcion
TrisD=%11110100
portD=%00000000
Led0 var Portd.0
Led1 var portd.1
Led3 var Portd.3
beta=0
on interrupt goto SaltoRutina
MainLoop:
if led1=0 then
led1=1
led0=0
else
led1=0
led0=1
endif
for alpha=1 to 300
pauseus 100
next alpha
goto mainloop
disable ;deshabilita y habilita el soporte de la rutina a interrumpir
;256*64=16384//16384/1SEG=16.384 ===61
;256*64=16384//16384/2SEG=8.192 ====122 3SEG===183 4SEG===244
saltorutina:
beta=beta+1
if beta < 61 then endinterrupt
beta=0
if led3=1 then
led3=0
else
led3=1
endif
endinterrupt:
INTCON.2=0
RESUME
ENABLE
END
clear
define osc 4
OPTION_REG=%10000101 ;----aca el prescaler es para 64----
;BIT 7=1 DESHABILITA PULL-UPS DE P.B
;BIT 5=0 SELECCIONA EL MODO DE TEMPORIZADOR
;BIT 2=1}
;BIT 1=0} TIMER0 CONJUNTO PREESCALADOR PARA 64-----
;BIT 0=1}
INTCON=%10100000
;BIT 7=1 PERMITE TODAS LAS INTERRUPCIONES
;BIT 5=1 PERMITE LA INTERRUPCION POR TIMER0
;BIT 2=0 SE ESTABLECE SOBRE LA INTERRUPCION TOIF O ITCON2
Alpha var word ;variable en el codigo de pausa
Beta var byte ;esta vaiable contabiliza 61 en interrupcion
Cuenta var word
TrisD=%11110100
portD=%00000000
Led0 var Portd.0
Led1 var portd.1
Led3 var Portd.3
beta=0
on interrupt goto SaltoRutina
MainLoop:
if led1=0 then
led1=1
led0=0
else
led1=0
led0=1
endif
for alpha=1 to 300
pauseus 100
next alpha
goto mainloop
disable ;deshabilita y habilita el soporte de la rutina a interrumpir
saltorutina:
beta=beta+1
if beta < 61 then ;endinterrupt
cuenta=0
beta=0
if beta=0 then
cuenta=cuenta+1
if cuenta <= 10 then endinterrupt
cuenta=0
if led3=1 then
led3=0
else
led3=1
endif
endif
endif
endinterrupt:
INTCON.2=0
RESUME
ENABLE
END
hola amigo mecatrodo me podrias dar un camino o alguien de ustedes brindar una idea con ejemplos de como empezar hacer este codigo me imagino que devo de crear registro para almacenar un conteo y si quisiera usar tiempo difernete en encendido y apagado deberia de usar dos registro pero desconozco de como hacerlo si ustedes me ayudaran les agradeceria coordilmente
@ DEVICE PIC16F628A
@ DEVICE Intrc_OSC
@ DEVICE WDT_OFF
@ DEVICE PWRT_OFF
@ DEVICE LVP_OFF
@ DEVICE WRT_OFF
@ DEVICE CPD_OFF
@ DEVICE PROTECT_OFF
cmcon=7 ;digitaliza el puertoA
define osc 4
OPTION_REG=%10000101 ;----aca el prescaler es para 64----
INTCON=%10100000
; aca defino de acuerdo al prescaler y el cristal ya sea interno o externo
; 1/fosc*4 ====> 1/4=0.25us*4=1us
; esta formula lo logro entender y haber si me ayudas y me corriges mi duda
;256* prescaler configurado=====>(256*64)=16384
;ahora 16384/1000 ===>este valor(1000)de donde vendria a salir del tiempo 1 seg
;que quedaria 16.384 y por ultimo dividiria 1us /16.384 ====61.035===>61
ConLed var word ;variable en el codigo de pausa
Incremento var byte ;esta variable seria las veces que contara? 61 antes de producirse la interrupcion
Registro1 var word ;aca guardaria el conteo de encendido
Registro2 var word ;aca guardaria el conteo de apagado
;====>la variable incremento cuenta las 61 veces y se genera o se p`roduce la interrupcion,cuando la interrupcion
;se haya generado se visualizara en el led0 y luego se va gusrandando en el
;registro1 ¿x veces? luego que llego al valor dado ¿x veces? enciende led1
;sigue ahora el conteo del registro1 donde va contando ¿n veces? lo que el led1 estara prendido
;almacenando ese tiempo ahora en el registro2 ¿l veces? cuando llego al tiempo dado se apaga el led1
TrisD=%11110100
portD=%00000000
Led0 var Portd.0
Led1 var portd.1
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 02/08/2012 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
@ DEVICE PIC16F628A ;Declaramos el pic a utilizar
@ DEVICE Intrc_OSC ;Declaramos el tipo de oscilador a usar, interno, externo XT, RC, ETC...
@ DEVICE WDT_OFF ;Declaramos si(ON) Ó no(OFF)se va usar el WDT(Watchdog Timer), temporizador perro guardian
@ DEVICE PWRT_OFF ;Declaramos si(ON) Ó no(OFF)se va usar el PWRT(Power-up Timer ), tiempo de encendido
@ DEVICE LVP_OFF ;Declaramos si(ON) Ó no(OFF)se va usar el LVP(LOW VOLTAGE PROGRAMMING), programacion de bajo voltaje
;@ DEVICE WRT_OFF ;Declaramos si(ON) Ó no(OFF)se va usar el WRT(FLASH Program Memory Write)
@ DEVICE CPD_OFF ;Declaramos si(ON) Ó no(OFF)se va usar el (Data EE Memory Code Protect)
@ DEVICE PROTECT_OFF ;Declaramos si(ON) Ó no(OFF)se va usar el (FLASH Program Memory Code Protection)
cmcon=7 ;Configuracion del modulo comparador (CMCON), de 7 Bit's se
;describen a continuacion.
;bit 7 C2OUT: Comparator 2 Output
;When C2INV = 0:
;1 = C2 VIN+ > C2 VIN-
;0 = C2 VIN+ < C2 VIN
;When C2INV = 1:
;1 = C2 VIN+ < C2 VIN-
;0 = C2 VIN+ > C2 VIN
;bit 6 C1OUT: Comparator 1 Output
;When C1INV = 0:
;1 = C1 VIN+ > C1 VIN-
;0 = C1 VIN+ < C1 VIN
;When C1INV = 1:
;1 = C1 VIN+ < C1 VIN-
;0 = C1 VIN+ > C1 VIN
;bit 5 C2INV: Comparator 2 Output Inversion
;1 = C2 Output inverted
;0 = C2 Output not inverted
;bit 4 C1INV: Comparator 1 Output Inversion
;1 = C1 Output inverted
;0 = C1 Output not inverted
;bit 3 CIS: Comparator Input Switch
;When CM2:CM0: = 001
;Then:
;1 = C1 VIN- connects to RA3
;0 = C1 VIN- connects to RA0
;When CM2:CM0 = 010
;Then:
;1 = C1 VIN- connects to RA3
; C2 VIN- connects to RA2
; = C1 VIN- connects to RA0
; C2 VIN- connects to RA1
;bit 2-0 CM2:CM0: Comparator Mode
;Figure 10-1 shows the Comparator modes and CM2:CM0 bit settings
;Ahora que significa cmcon = 7
;Significa que los primeros 3 bit's del cmon valen 1 y el resto vale 0
;Osea es igual que cmcon = %00000111
;Donde los bit's CM0, CM1 Y CM2 quedan en 1
;Si vemos la hoja de datos nos daremos cuentas y una mejor idea con la grafica.
;Comparators Off
;CM2:CM0 = 111
define osc 4 ;Definimos la frecuencia de oscilacion 4, 20, etc...
OPTION_REG=%10000101 ;Registro especial option
;se describe a continuacion.
;bit 7 RBPU: PORTB Pull-up Enable bit
;1 = PORTB pull-ups are disabled
;0 = PORTB pull-ups are enabled by individual port latch values
;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
;bit 5 T0CS: TMR0 Clock Source Select bit
;1 = Transition on RA4/T0CKI pin
;0 = Internal instruction cycle clock (CLKOUT)
;bit 4 T0SE: TMR0 Source Edge Select bit
;1 = Increment on high-to-low transition on RA4/T0CKI pin
;0 = Increment on low-to-high transition on RA4/T0CKI pin
;bit 3 PSA: Prescaler Assignment bit
;1 = Prescaler is assigned to the WDT
;0 = Prescaler is assigned to the Timer0 module
;bit 2-0 PS2:PS0: Prescaler Rate Select bits
'BIT.2 PS2
'BIT.1 PS1
'BIT.0 PS0
'Bit Value - TMR0 Rate - WDT Rate
'PS0,PS1,PS2 -
' 0 0 0 - 1 : 2 - 1 : 1
' 0 0 1 - 1 : 4 - 1 : 2
' 0 1 0 - 1 : 8 - 1 : 4
' 0 1 1 - 1 : 16 - 1 : 8
' 1 0 0 - 1 : 32 - 1 : 16
' 1 0 1 - 1 : 64 - 1 : 32
' 1 1 0 - 1 : 128 - 1 : 64
' 1 1 1 - 1 : 256 - 1 : 128
;Donde quedo asi: OPTION_REG=%10000101
;Prescaler a 64 y con pulls-up activas
INTCON=%10100000 ;Registro especial INTCON
;se describe a continuacion.
;bit 7 GIE: Global Interrupt Enable bit
;1 = Enables all un-masked interrupts
;0 = Disables all interrupts
;bit 6 PEIE: Peripheral Interrupt Enable bit
;1 = Enables all un-masked peripheral interrupts
;0 = Disables all peripheral interrupts
;bit 5 T0IE: TMR0 Overflow Interrupt Enable bit
;1 = Enables the TMR0 interrupt
;0 = Disables the TMR0 interrupt
;bit 4 INTE: RB0/INT External Interrupt Enable bit
;1 = Enables the RB0/INT external interrupt
;0 = Disables the RB0/INT external interrupt
;bit 3 RBIE: RB Port Change Interrupt Enable bit
;1 = Enables the RB port change interrupt
;0 = Disables the RB port change interrupt
;bit 2 T0IF: TMR0 Overflow Interrupt Flag bit
;1 = TMR0 register has overflowed (must be cleared in software)
;0 = TMR0 register did not overflow
;bit 1 INTF: RB0/INT External Interrupt Flag bit
;1 = The RB0/INT external interrupt occurred (must be cleared in software)
;0 = The RB0/INT external interrupt did not occur
;bit 0 RBIF: RB Port Change Interrupt Flag bit
;1 = When at least one of the RB7:RB4 pins changed state (must be cleared in software)
;0 = None of the RB7:RB4 pins have changed state
;Donde quedo asi: INTCON=%10100000
;Se activaron las interrupciones globales, y unicamente se uso la interrupcion
;por desbordamiento del TMR0
;Hasta aqui bastante bien...
;Aun faltan cosas antes de empezar a usar variables y son las declaraciones
;de los puertos y los pines de los puertos cuales con entradas y cuales
;son salidas, aparte de la instrupcion de interrupcion y la subrutina
;de salto en caso de interrupcion.
ConLed var word ;variable en el codigo de pausa
Incremento var byte ;esta variable seria las veces que contara? 61 antes de producirse la interrupcion
Registro1 var word ;aca guardaria el conteo de encendido
Registro2 var word ;aca guardaria el conteo de apagado
;TrisD=%11110100 N/A, osea, NO EXISTE ó NO APLICA
;portD=%00000000 N/A, osea, NO EXISTE ó NO APLICA
;Led0 var Portd.0 N/A, osea, NO EXISTE ó NO APLICA
;Led1 var portd.1 N/A, osea, NO EXISTE ó NO APLICA
@ DEVICE PIC16F628A
@ DEVICE Intrc_OSC
@ DEVICE WDT_OFF
@ DEVICE PWRT_OFF
@ DEVICE LVP_OFF
@ DEVICE CPD_OFF
@ DEVICE PROTECT_OFF
cmcon=7
define osc 4
OPTION_REG=%10000101
INTCON=%10100000
ConLed var word ;variable en el codigo de pausa
Incremento var byte ;esta variable seria las veces que contara? 61 antes al producirse la interrupcion salta a registro1
Registro1 var word ;guarda el conteo de encendido por 5 min luego salta al registro2
Registro2 var word ;guarda el conteo de apagado por 1 min luego vuelve a la misma rutina si no se creo ningun codigo mas
Led0 var PortB.0 ;avisó´que se produjo la interrupcion de echo me imagino que ni se vera pero en un osciloscopio me gustaria ver
Led1 var PortB.6 ;cuando registro1 se activo se prende por 5 min luego se apaga
Led2 var PortB.7 ;cuando registro2 se cativa se prende por 1 min espero;;;;;espero poder estar haciendo algo correcto
;de verdad gracias por corregirme si me equivoco
Push1 var PortA.6 ;si se quisiera trabajar con pulsador1
Push2 var PortA.7 ;o pulsador2
Trisb=%00111110 ;$3E
PortB=0
TrisA=%11000000 ;$C0
PortA=0
@ DEVICE PIC16F628A
@ DEVICE Intrc_OSC
@ DEVICE WDT_OFF
@ DEVICE PWRT_OFF
@ DEVICE LVP_OFF
@ DEVICE CPD_OFF
@ DEVICE PROTECT_OFF
cmcon=7
define osc 4
OPTION_REG=%10000101
INTCON=%10100000
ConLed var word ;variable en el codigo de pausa
Incremento var byte ;esta variable seria las veces que contara? 61 antes al producirse la interrupcion salta a registro1
Registro1 var word ;guarda el conteo de encendido por 5 min luego salta al registro2
Registro2 var word ;guarda el conteo de apagado por 1 min luego vuelve a la misma rutina si no se creo ningun codigo mas
Led0 var PortB.0 ;avisó´que se produjo la interrupcion de echo me imagino que ni se vera pero en un osciloscopio me gustaria ver
Led1 var PortB.6 ;cuando registro1 se activo se prende por 5 min luego se apaga
Led2 var PortB.7 ;cuando registro2 se cativa se prende por 1 min espero;;;;;espero poder estar haciendo algo correcto
;de verdad gracias por corregirme si me equivoco
Push1 var PortA.6 ;si se quisiera trabajar con pulsador1
Push2 var PortA.7 ;o pulsador2
Trisb=%00111110 ;$3E
PortB=0
TrisA=%11000000 ;$C0
PortA=0
@ DEVICE PIC16F628A ;Declaramos el pic a utilizar
@ DEVICE INTRC_OSC_CLKOUT ;Declaramos el tipo de oscilador a usar, interno, externo XT, RC, ETC...
@ DEVICE WDT_OFF ;Declaramos si(ON) Ó no(OFF)se va usar el WDT(Watchdog Timer), temporizador perro guardian
@ DEVICE PWRT_OFF ;Declaramos si(ON) Ó no(OFF)se va usar el PWRT(Power-up Timer ), tiempo de encendido
@ DEVICE LVP_OFF ;Declaramos si(ON) Ó no(OFF)se va usar el LVP(LOW VOLTAGE PROGRAMMING), programacion de bajo voltaje
@ DEVICE CPD_OFF ;Declaramos si(ON) Ó no(OFF)se va usar el (Data EE Memory Code Protect)
@ DEVICE PROTECT_OFF ;Declaramos si(ON) Ó no(OFF)se va usar el (FLASH Program Memory Code Protection)
DEFINE OSC 4 ;Definimos la frecuencia de oscilacion 4, 20, etc...
CMCON = 7 ;Configuracion del modulo comparador (CMCON), de 7 Bit's
OPTION_REG = %10000101 ;Registro especial option
MAS_TIEMPO VAR BYTE
SYMBOL LED_1 = PORTB.0
TRISB = %00111110 ;$3E
TRISA = %11000000 ;$C0
PORTA = %00000000
PORTB = %00000000
ON INTERRUPT GOTO MI_INTERRUPCION 'SETENCIA DE SALTO A SUB-RUTINA EN CASO DE INTERRUPCION
INTCON = %10100000
INICIO:
IF MAS_TIEMPO = 61 THEN
MAS_TIEMPO = 0
TOGGLE LED_1
ENDIF
GOTO INICIO
DISABLE ;DESHABILITAMOS LA INTERRUPCION
MI_INTERRUPCION:
MAS_TIEMPO = MAS_TIEMPO + 1
INTCON = %10100000 ;RESTABLECEMOS LA INTERRUPCION
Resume
Enable
@ DEVICE PIC16F628A
@ DEVICE INTRC_OSC_CLKOUT
@ DEVICE WDT_OFF
@ DEVICE PWRT_OFF
@ DEVICE LVP_OFF
@ DEVICE CPD_OFF
@ DEVICE PROTECT_OFF
DEFINE OSC 4
CMCON = 7
OPTION_REG = %10000101
MAS_SEGUNDO Var Byte ; Definir variable second
MAS_TIEMPO VAR BYTE
TIME1 VAR WORD
LED_1 var PORTB.0
LED_2 VAR PORTB.1
TRISB = %00111110
TRISA = %11000000
PORTA = %00000000
PORTB = %00000000
ON INTERRUPT GOTO MI_INTERRUPCION
INTCON = %10100000
DISABLE
MI_INTERRUPCION:
mas_tiempo=mas_tiempo+1
if mas_tiempo < 61 then endinterrupt
mas_tiempo=0
toggle led_1
MAS_SEGUNDO=MAS_SEGUNDO+1
IF MAS_SEGUNDO>=10 THEN
SEGUNDO=0
TOGGLE LED_2
ENDIF
@ DEVICE PIC16F628A
@ DEVICE INTRC_OSC_CLKOUT
@ DEVICE WDT_OFF
@ DEVICE PWRT_OFF
@ DEVICE LVP_OFF
@ DEVICE CPD_OFF
@ DEVICE PROTECT_OFF
DEFINE OSC 4
CMCON = 7
OPTION_REG = %10000101
Hour Var Byte
Minuto Var Byte
Segundo Var Byte
MAS_TIEMPO VAR BYTE
TIME1 VAR WORD
LED_1 var PORTB.0
LED_2 VAR PORTB.1
TRISB = %00111110
TRISA = %11000000
PORTA = %00000000
PORTB = %00000000
ON INTERRUPT GOTO MI_INTERRUPCION
INTCON = %10100000
INICIO:
IF led_2=1 THEN
for TIME1=1 to 1000
pause 5
next TIME1
low led_2
ENDIF
GOTO INICIO
DISABLE
MI_INTERRUPCION:
mas_tiempo=mas_tiempo+1
if mas_tiempo < 61 then endinterrupt
mas_tiempo=0
toggle led_1
SEgundo=Segundo+1
IF SEgundo>=10 THEN
SEgundo=0
high LED_2
ENDIF
endinterrupt:
INTCON.2=0
RESUME
ENABLE
END