TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: ceneca en 24 de Octubre de 2010, 11:18:31
-
hola a todos , debido a mi nula experiencia (cero) , es que recurro al foro para ver si me dan una mano.
Primero les cuento el proyecto, el proyecto original es este:
con un 555 y 4017 y triac a la salida (http://www.todopic.com.ar/foros/index.php?topic=32460.0)
o sea la idea es mediante un pote comandar el tiempo de la secuencia mas o menos de 1 a 10 seg, con el siguiente efecto : al encender , prende la primera lampara a máximo brillo , luego esta comienza a apagarse lentamente mientras comienza a encenderse la segunda aumentando su brillo hasta el máximo mientras que la primera decrece hasta apagarse , o sea mientras uno enciende el otro se apaga en forma desvanecente( en el medio se cruzan a la misma intensidad ), con el cto adjunto logro ese efecto en continua pero no lo logro en alterna, como bien me explico el amigo martincnc, entendí el porque y finalmente me he replanteado el proyecto de la siguiente manera:
utilizar un 12f675 o un 12 f629, dos triac BT137 para la salida y obviamente el código necesario, y ahí esta mi problema no se como arrancar , he estado leyendo ,pero como es cero mi conocimiento no logro arrancar , encontré aquí en el foro este hilo
dimmer (http://www.todopic.com.ar/foros/index.php?topic=18718.0)
que mas o menos es lo que yo quiero , pero no igual. LIST P=16f628
INCLUDE "P16f628.inc"
ERRORLEVEL -302
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _XT_OSC
CBLOCK 0x20
VAR01 ;equ 0x20 variable a modificar para poder variar el brillo de las lamparas
VAR02 ;equ 0x21
VAR03 ;equ 0x22
VAR04 ;equ 0x23
VAR05 ;equ 0x24 Bandera que indica al codigo que se a producido el zero cross
VAR06 ;equ 0x25
ENDC
org 0x00 ;inicio de programa y direccion de interrupcion
goto Inicio
org 0x04
goto Inter
org 0x05
Inter
bcf PORTA,0 ;desactivamos el triac PORTA,1
movlw b'00010000'
movwf INTCON
bsf VAR05,0 ;Se levanta la bandera zero cross
retfie
Inicio
org 0x20
bsf STATUS,RP0 ;Banco 01
bsf OPTION_REG,INTEDG ;Configurar la INT. flanco de bajada de la INT
movlw b'11111111'
movwf TRISB ;El Puerto B como entrada
clrf TRISA ;El Puerto A como salida
bcf STATUS,RP0 ;Banco 00
clrf PORTA ;Limpiamos el Puerto
bsf INTCON,INTE ;Activamos la interrupcon INT externa
programa
nop
bcf INTCON,INTF ;bajamos la bandera señalizadora de INT_EXT
program
btfss INTCON,INTF ;para sincronizar con el pic al iniciar el programa
goto program
bcf INTCON,INTF ;bandera señalizadora de INT_EXT
progra1
call Ret_ZC
disparo
bsf INTCON,GIE ;permiso global de interrupciones
bsf PORTA,0 ;Disparo del triac, hasta que se produsca un cruce por zero
Zero_cross btfss VAR05,0 ;Espera la bandera de zero cross
goto Zero_cross
bcf VAR05,0 ;bajamos la bandera señalisadora de zero cross
goto progra1
;-----------------------------------------------
;la interrupcion lo tomo como flancos de subida INTE.
;El tiempo de la interrupcion del cruze por cero es de 8.31ms
;de disparo del triac varie desde el 0% hasta el 100%..idealmente pero nunca llegara al 100% ya que tenemos un retrazo de
;1ms porque el ancho de pulso del cruce por cero es de 0.9ms, y como ahora si estamos usando la interupcion..es necesario
;-----------------------------------------------
Ret_ZC ; retardo de aproximadamente 1ms, periodo del ancho de pulso del cruce por cero
movlw 0x0B
movwf VAR01
salt
call usg25
decfsz VAR01,F
goto salt
goto Ang_Disp
usg25
movlw 0x96 ;retardo de 91.4 us
movwf VAR02
sal4
decfsz VAR02,F
goto sal4
return
Ang_Disp
movf PORTB,W
movwf VAR06
rrf VAR06,F ;corrige la falta del pin RB0
bcf STATUS,Z ;ponemos en cero bit "Z"
movf VAR06,W ;comprueba si RB1 a RB7 = 0x00
xorlw 0x00
btfsc STATUS,Z
return ;si es = 0x00 retorna al disparo del triac, este es el mayor punto de iluminacion de la bonbilla
movf VAR06,W
movwf VAR03
salte
call usg72
decfsz VAR03,F
goto salte
return
usg72
movlw 0x78 ;retardo de 72.2 us
movwf VAR04
sal5
decfsz VAR04,F
goto sal5
return
END
Como para mi pic y códigos es chino básico, recurro al foro a ver si me tiran una soga, ya que no se por donde empezar.
como mi intención es aprender estoy leyendo un curso de pic y mirando el foro, así que en eso estoy, pero el problema es que no se por donde comenzar.
si me pueden ayudar se los agradeceré.
saludos
-
Hola ceneca. Disculpa mi ausencia, recién termino de rendir un parcial en la facu :? , pero a partir de ahora tengo algunos días libres.
Con respecto al programa, voy a tratar de tener novedades para esta noche.
Saludos!
-
hOLA!!!!, de nuevo acá quiero mostrarles hasta donde estamos con esto.
Por ahí alguien puede ayudar, como explique arriba, el efecto es el siguiente, el circuito debe encender dos lamparas de 220 volt, de manera intermitente o sea primero una y luego la otra pero con el siguiente efecto, una de las dos se ira encendiendo primero de manera paulatina (como si se subiera la intensidad con un dimmer, alcanzar el máximo brillo mantenerse encendida 15 segundos a máximo brillo y comenzar a apagarse, mientras se va encendiendo la segunda, hasta su máximo brillo , mantenerse 15 segundos y repetir el efecto,
los 15 segundos son fijos pero el tiempo de la secuencia se debe poder regular con un pot o sea que desde cero luz a máximo brillo se regule de 5 seg a 1 min, por ejemplo.
AHORA quiero decir que he contado con la ayuda de un compañero del foro, MARTIN CNC, quien me ha dado una gran mano, con un empeño que me ha dejado sin palabras, como dije soy un total inexperto en pic, y quisiera compartir lo que hasta aquí tengo, la causa de este circuito es personal y no comercial , y funcionado estara a disposicion de todos .
agradecería toda ayuda posible pidiendo disculpas a todos ya que nunca he pedido que me resuelvan nada, pero aquí necesito de su ayuda ya que no tengo los conocimientos como para resolverlo , toda ayuda, sugerencia, links, paginas o lo que me puedan aportar se los voy a agradecer.
Este es el código que tengo, es una primera versión en donde con el pote debería ir seleccionando una u otra lampara y esta debería realizar el efecto, Hasta aquí no he conseguido nada ni que parpadee, este es
********************************************************************************************
; Generador de angulo de disparo de triacs con PIC12F675 - MARTINCNC
;********************************************************************************************
list p=12f675
#include "p12f675.inc"
radix hex
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
bandera equ 0x20 ;registro de interrupciones
contador equ 0x21 ;contador de interrupciones de TMR0
periodo equ 0x22 ;contador de interrupciones de TMR0
estado equ 0x23 ;registro division de periodo
posicion_1 equ 0x28 ;registro de posicion de salida 1
posicion_2 equ 0x29 ;registro de posicion de salida 2
adc_temp equ 0x2C ;registro de byte alto de adc
auxiliar_temp equ 0x2E ;registro de proposito general
w_temp equ 0x2F ;copia de respaldo de W
status_temp equ 0x30 ;copia de respaldo de STATUS
;********************************************************************************************
org 0x00
goto _inicio
org 0x04
goto _interrupcion
;********************************************************************************************
_tabla
addwf PCL, 1
retlw 0x01 ;d'1'
retlw 0x02 ;d'2'
retlw 0x03 ;d'3'
retlw 0x04 ;d'4'
retlw 0x05 ;d'5'
retlw 0x06 ;d'6'
retlw 0x07 ;d'7'
retlw 0x08 ;d'8'
retlw 0x09 ;d'9'
retlw 0x0A ;d'10'
retlw 0x0B ;d'11'
retlw 0x0C ;d'12'
retlw 0x0D ;d'13'
retlw 0x0E ;d'14'
retlw 0x0F ;d'15'
retlw 0x10 ;d'16'
retlw 0x11 ;d'17'
retlw 0x12 ;d'18'
retlw 0x13 ;d'19'
retlw 0x14 ;d'20'
retlw 0x15 ;d'21'
retlw 0x16 ;d'22'
retlw 0x17 ;d'23'
retlw 0x18 ;d'24'
retlw 0x19 ;d'25'
retlw 0x1A ;d'26'
retlw 0x1B ;d'27'
retlw 0x1C ;d'28'
retlw 0x1D ;d'29'
retlw 0x1E ;d'30'
retlw 0x1F ;d'31'
retlw 0x20 ;d'32'
;********************************************************************************************
_interrupcion ;vector de interrupciones
movwf w_temp
movf STATUS, 0
movwf status_temp ;respaldo de W y registro STATUS
movlw 0xFF
movwf TMR0
btfsc INTCON, T0IF
call _tmr0int
btfsc PIR1, CMIF
call _changeint
; btfsc PIR1, ADIF
; call _adcint
movf status_temp, 0
movwf STATUS
movf w_temp, 0
retfie
_tmr0int
bcf INTCON, T0IF
incfsz contador, 1
nop ;seguridad contra desbordamiento de contador (FREC < 30Hz)
return
_changeint
clrf GPIO
bcf INTCON, GPIF
bsf bandera, GPIF
return
;_adcint
; bcf PIR1, ADIF
; bsf bandera, ADIF
; return
;********************************************************************************************
_inicio ;inicio del programa
bcf STATUS,RP0 ;banco 0
clrf GPIO ;inicializacion de puerto GPIO
clrf INTCON ;inicializacion de configuracion de interrupciones
clrf PIR1 ;inicializacion de banderas deinterrupciones perifericas
clrf T1CON ;desactivo interrupciones por TMR1
clrf ADCON0 ;desactivo conversiones adc; entrada AN0 <3:2>; VREF=VDD <6>
movlw b'00000111'
movwf CMCON ;desactivo comparadores analogicos, entradas digitales
bsf STATUS, RP0 ;banco 1
movlw b'00100001' ;FOSC=1/32 (1,6 us @ 20 MHz) <6:4>; GP0 entrada adc ANSEL<0>
movwf ANSEL
movlw b'00001000' ;activo la interrupcion por cambio de estado en GP3, IOC<3>
movwf IOC
movlw b'00001001'
movwf TRISIO ;configuracion de puerto GP; GP0 entrada ADC; GP3 entrada GPIE
movlw b'01000000'
movwf PIE1 ;activo interrupcion de conversor adc ADIE<6>
movlw b'10000111'
movwf OPTION_REG ;pull-ups desactivadas; pre-escalador para TMR0 en 1:256 (PS2:PS0 = 111)
bcf STATUS, RP0 ;banco 0
clrf bandera ;inicializacion de bandera
clrf contador ;inicializacion de contador
bsf INTCON, GPIE ;activo interrupciones de cambio de estado en GP3 <3>
bsf INTCON, GIE ;activo interrupciones globales <7>
_cruce_inicial
btfss bandera, GPIF
goto _cruce_inicial
bcf bandera, GPIF
bsf INTCON, T0IE ;activo interrupciones por TMR0
_cruce_siguiente
btfss bandera, GPIF
goto _cruce_siguiente
bcf bandera, GPIF
movf contador, 0
clrf contador
movwf periodo
movwf auxiliar_temp
bsf ADCON0, 0 ;activo conversiones adc <0>
bsf ADCON0, 1 ;comienzo conversion adc <1>
_conversion ;conversion adc; 1,6us @ 20MHz (11 instrucciones)
btfsc ADCON0, 1 ;ADCON0 GO/!DONE
goto _conversion
bcf ADCON0, 0 ;desactivo conversiones adc <0>
movf ADRESH, 0
clrf ADRESH
_division
sublw 0x08
btfss STATUS, C
goto _niveles
incf estado, 1
goto _division
_niveles
movf estado, 0
pagesel _tabla
call _tabla
movwf posicion_1
movf estado, 0
sublw 0x20
pagesel _tabla
call _tabla
movwf posicion_2
clrf estado
_salida
btfsc bandera, GPIF
goto _cruce_siguiente
nop
nop
nop
decfsz auxiliar_temp, 1 ;retardo de aux_temp * 8 instrucciones
goto _salida
movf periodo, 0
sublw 0x0E ;compensacion de retardo 14 * (8 * 32) instruccioness (_gpio_1 a _gpio_6 + isr_tmr0)
movwf auxiliar_temp
;********************************************************************************************
_gpio_1
btfsc GPIO, 1
goto _gpio_2
decf posicion_1, 1
btfsc STATUS, C
bsf GPIO, 1
_gpio_2
btfsc GPIO, 2
goto _gpio_salida
decf posicion_2, 1
btfsc STATUS, C
bsf GPIO, 2
_gpio_salida
movf GPIO, 0
xorlw b'00000110'
btfss STATUS, Z
goto _salida
goto _cruce_siguiente
end
les adjunto circuito y codigo en asm y .hex
GRACIAS MARTIN CNC POR TU GRAN AYUDA!!!!
Y gracias a todo el foro
un saludo!!