Curso de programación de PIC en PICBasic Pro

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.
 
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.
Claro que se puede.
Desde un PIC10F202 y con la más reciente versión de PICBasic Pro que es la 3.0.6
Se puede programar hasta un PIC18LF66K80

Suerte.
 
Última edición:
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.
 
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.
Saludos nuevamente christus.
Así es. En este tipo de PIC pequeños, cambian algunas cosas.
Por ejemplo, para la calibración del oscilador interno se usa esta definición en la cabecera del programa.
DEFINE OSCCAL_1K 1
El nombre del puerto cambia de PORTX a GPIO
Por ejemplo para poner un 1 en el bit 0 del puerto, sería...
GPIO.0 = 1 o HIGH GPIO.0
Como mencionaste anteriormente que necesitabas programar un 12F675,
quizás también requieras saber como hacer para que sus pines GP,0,1,2,4 trabajen de forma digital.
Ya qué en este PIC se pueden usar algunos pines como conversores ADC o en modo comparador.
Esto se consigue configurando el registro ANSEL en 0 y el registro CMCON en 7 por ejemplo...
ANSEL = 0
CMCON = 7
Y si requieres que un pin o más sean análogos ya tienes que ver la hoja de datos del PIC,
para seleccionar los pines y configurar correctamente los parámetros del ADC.

Nota: Al programar en PICBasic existe la posibilidad de ahorrarse algunas configuraciones.
Pero siempre es recomendable que conozcas bien como funcionan los registros de los PIC.

Espero que estos comentarios te sirvan de ayuda para programarlo en PICBasic.

Suerte.
 
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
 
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
El programa esta bien.
Lo que le hace falta es establecer que pines serán usados como entradas y salidas.
También es recomendable definir la palabra de configuración.
Cuando no se establece ninguna, el compilador utiliza la configuración del archivo 12F675.INC
12F675_Default_Compiler_Fuses_.gif
Y a veces no es la configuración que nuestro programa requiere. ;)
Por eso es importante declararla o establecerla con el programa que graba el PIC.

Adjunto tu programa con las configuraciones correspondientes.
Para que tengas una idea de como se hace esto para un PIC12F675.
Sigue :estudiando: el curso para que puedas comprender muchas cosas más.

Suerte.
 

Adjuntos

  • 12F675 LED.rar
    13.8 KB · Visitas: 130
buenas tardes amigos del foro me gusta bastante esta pagina ya que estoy aprendiendo mucho he encontrado un tutuorial sobre el manejo de temporizadores y contadores que el amigo mecatrodatos dejo en la pagina 21 es muy bueno y explicativo quisiera poder pedir alguien que me oriente yo soy nuevo en esto de los pic estoy programando en basic y uso el proteus que aca en el foro recomiendan con la version 7.7 con toda franqueza gracias a todo por el tiempo que le dedican en ayudar a quien piden auxilio mi duda es esta.
en el tutorial que nuestro amigo mecatrodatos explica es muy bueno deja entender de como se genera una interrupcion sin afectar lo que el pic este haciendo como tarea
este es el programa que el amigo mecatrodo puso como ejemplo donde habilita el prescaler a 64 con un cristal de 4 mhz lo que hace es contar y cada que llega a 61 habilita el led3 por un segundo y lo deshabilita x otro segundo y asi rutinariamente es muy bueno en el archivo rar que mando quise modificar un poco el programa pero no logro entender como podria hacer para incrementar el tiempo de 1 segundo.
le aumente a 2 segundo el tiempo del led3 y funciona osea se prende por 2 segundos y se apaga por otro 2 segundo y hasta 4 seg funciona modificando los valores que en el programa escribo y detallo pero si quiero aumentarle a 5 segundo nunca prende el led3 pero los otros led1 y led2 si oscilan el tiempo que se indica quise probar poniendole registros osea que la cuenta se almacene es una variable cuenta por decir y que cada 61 veces aumente y 1 en cuenta y asi hasta que llegue a un total de cuenta <10 then cuenta=0 y recien prende el led3 pero no me sale y quisiera saber si ustedes me podrian ayudar talvez diciendome como hacerlo o con otro tutorial buenazo como el del amigo mecatrodo gracias aquellas personas que puedan ayudarme

Código:
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



este es el codigo que trato de modificar pero no logro crear un registro que me permita almacenar un conteo para mas tiempo se podria cambiar los tiempo de encendido del led prendido como apagado o siempre el tiempo que prenda ese mismo tiempo apagara

Código:
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

estoy leyendo las paginas siguientes pero no logran hablar de este mismo tema creo que ustedes estan en un nivel super avanzado
 

Adjuntos

  • contador,temporizador.rar
    30.2 KB · Visitas: 98
Última edición por un moderador:
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
 
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

Hola cesarim, exactamente cual es tu duda, si sabes usar interrupciones y sabes calcular el prescaler, lo demás es mas sencillo, lo que quiere decir que no deberías tener ningún problema. Deberías de plantear un código nuevo echo a partir del ejemplo del amigo mecatrodatos y no escribir encima de el. Fíjate los ejemplos propuestos aquí yo particularmente los vería como ejemplo y para la practica, ya que solo para eso sirven, puede que alguno lo logres adaptar a tus necesidades, pero también creo que es mas difícil que hacer uno desde cero...Si es de tu interés podríamos empezar con un código bien sencillo y que debido a que lo vas hacer tu podrás adaptarlo o modificarlo a tu antojo y así no tener que deducir el código de otro, cada cabeza es un mundo y cada uno tiene su manera de generar su código en un orden o desorden especifico, aparte de aprender como funciona cada cosa... Avísame saludoss:apreton:
 
hola gracias por respnderme bueno con el tutorial que mencione de nuestro amigo mecatrodo me estoy iniciando es por ello que quisiera que me puedan orientar muy agradecido por haberme respondido pense que no obtendria respuestas
 
Bueno empieza organizando un poco las ideas, y para eso te recomiendo hacer un código de puras configuraciones, osea donde coloques las configuraciones de los fuses, el oscilador, el tmr0, etc... Menos el código en si, esto para ir corrigiendo por partes en caso de que haya algo mal en el código...Y unas vez que hayamos depurado esa parte entonces es que vamos a ver como hacer las temporizaciones mas largas y funcionales.:apreton:
 
@ 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

;este es el 1º paso del codigo que me pediste amigo te agradesco tu tiempo y ojala lo podamos trabajar.
 
Hola disculpa la demora, te recomiendo colocar los codigos entre los comandos [ CODE ][ /CODE ] , para que se puedan leer mejor y ocupen menos espacio. Quedaria algo asi:

Código:
@ 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

No se si trataste de compilarlo pero yo al hacerlo me arroja 3 errores, de los cuales uno tiene que ver con la configuracion de fuses, los otros dos con el puerto d.

Si te fijas en el porque de estos errores, puede que no sepas que el 16F628A, no posee un puerto d y tampoco WRT, por lo cual no puedes configurar algo que no existe para ese pic, eso no es necesario saberlo de memoria aunque muchos no los aprendemos, pero existen muchos pic, con diferentes puertos y fuses, por lo cual para nosotros es de mucha ayuda estos errores ya que nos indica donde nos estamos equivocando o que estamos haciendo mal, permitiéndonos corregir el error antes de programar el pic.

Ahora ya corrigiendo eso nos permite compilar, asi mismo continuo revisando el codigo y voy indicando a detalle que es lo que ocurre en cada linea.

Código:
'****************************************************************
'*  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

Bueno cualquier cosa me avisas saludoss:apreton:
 
Última edición:
amigo si tienes razon muy buena tu explicacion sobre el cmcon

Código:
@ 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
aca dejo este codigo
 
Última edición por un moderador:
que bueno, mira para que no te confundas tanto, en el icono de abajo de Más Opciones..., te da una barra de herramientas donde tienes un icono con el símbolo #, para poder usarlo seleccionas el texto que deseas que quede dentro del recuadro y luego de tener seleccionado el texto le das al icono # y listo el lo coloca, para poder ver como va a quedar le das a vista previa y eso te permite corregir antes de publicar tu comentario, trata de corregirlo para poder entender mejor tu código...saludosss
 
ok te agradesco es que recien empizo a usar las opciones del foro

Código:
@ 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

ahi quedo bien perdon tanta molestia espero podamos continuar
 
Como el prescaler es de 64 osea estamos dividiendo cada ciclo de maquina 64 veces lo que quiere decir que si el osc es de 4mhz y el tmr0 es de 256, T para 4mhz es de 0.25us x 4 = 1us lo que tarda cada ciclo de maquina entonces 256 que es tmr0 x 64 que es el prescaler x 1us ciclo de maquina tenemos un retardo de tiempo de 16384us lo que es igual a 16.384 milisegundos, ahora viene lo interesante existen varias maneras de optener mas tiempo la primera es variar el prescaler al maximo osea 256
con eso conseguimos mas tiempo de retardo quedaria a 256 x 256 x 1us = 65536us igual a 65.536 milisegundos aun es muy poco, claro se puede llegar a mas con un registro de proposito general puedes llegar a mas en la sub-rutina sumamos cuantas veces sea necesario ese registro para llegar al valor deseado ese registro va hacer una variable
la voy a llamar mas_tiempo a ella la voy a ir sumando en cada interrupcion del tmr0 osea cada 65.536us voy a sumarle 1 hasta llegar lo mas serca a 1 segundo y asi tener una base de tiempo mas manejable seria 65.536 milisegundos x 15 igual a 983.04 milisegundos osea casi 1 segundo, probando con el prescaler a 64 seria 16.684 x 61 igual a 999.424 milisegundos mucho mas serca, y puede despreciarcie un poco ese tiempo ya que la diferencia seria de 576us entonces mi codigo quedaria así:


Código:
@ 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

Te dejo una simulación con el código para que lo compiles y pruebes, lo que hace es que el led se prende 1 segundo y se apaga otro segundo.

Nota:Hay varios detalles que se me pasaron por alto, el primero es tratar de escribir todo en mayúsculas ya que según vi en un manual de PBP, algunas cosas si no las escribes en mayúsculas no las toma el PBP, otra todo debe llevar un orden primero fuses después definiciones de osc y después configuraciones y por ultimo el código.

Bueno cualquier por aquí estamos saludoss :apreton:
 

Adjuntos

  • CESARIM.rar
    6.3 KB · Visitas: 146
muchas gracias por ir orientandome ya poco a poco voy entendiendo logre aumentar el tiempo por 10 segundos puedo aumentar a 1 min aca dejo el codigo a 10 seg

Código:
@ 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

hola reyvilla mira pude aumentar el tiempo de encendido por 10 seg luego se apaga por 10 seg y se repite el bucle como podria hacer el codigo para que enciende led_2 x 10 seg y se apaga por 5 seg y asi se repita el bucle voy entendiendo muchas gracias espero puedas seguir ayudandome:unsure:



amigo mira probando y probando hago este codigo pero no se si estara bien creo que me estoy enredando cada vez mas y no quiero si practico y pruebo es para aprender pero quisiera saber en que fallo
este codigo lo que le indico es cuente x 10 seg cuando llegue a 10 seg prenda LED_2 por 5 seg luego se apague a los 15 seg osea:
0--10seg-->apagado led_2
10-15seg-->prendido led_2
15-25seg-->apagado led_2
25-30seg-->prendido led_2
pero no me hace eso, solo respeta los 10 seg al empezar el codigo, osea se prende LED_2 a los 10 seg luego se apaga a los 15 seg
0--10seg-->apagado led_2
10-15seg-->prendido led_2
15-20seg-->apagado led_2
20-25seg-->prendido led_2
como hacer para que me respete los 10 seg de apagado siempre
aca dejo el codigo que estoy haciendo en verdad agradesco su ayuda

Código:
@ 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
 
Última edición:
Atrás
Arriba