Curso de programación de PIC en PICBasic Pro

...por cierto como es eso de triac activo :confused:
El triac tiene una arquitectura interna por la cual se lo puede diferenciar en dos tipos; Se lo llama activo a todo aquel que tenga internamente el detector por cruce por cero, y pasivo, al que estas implementando justo en este momento... Date una vuelta por el buscador del foro, hay un par de temas que explican detalladamente como es el funcionamiento del triac, y como controlarlo tambien (y)
Te doy un consejo? cuidado por que estas jugando con tensiones peligrosas para tu salud... no valla a seer cosa que por no leer primero, mañana no me puedas responder este mensaje :D

PD: Si no desacoplas bien el triac del pic, vas a seguir presentando problemas de reinicio o peor aun... quizas te qeudes sin pic :unsure:...
 
Torres.electronico

Tendrias alguna Datasheet de ejemplo de esos triac's activos, así no quedan dudas para nadie. Por que puede suceder que no los consigamos comercialmente!.

Por que en definitiva son todas variantes del Triac como por ejemplo los que son SnubberLess (según ST) y los Alternistores (según Littelfuse) que son exactamente iguales.



Saludos, JuanKa.-

P.D.: Creo/noto que de esta manera estamos confundiendo más a quienes no tienen los conocimientos que nosotros llegamos a adquirir con estudio o experiencia.
 
:LOL: ok aunque llego tarde el consejo porque ya me dio una sacudida y casi quedo pegado :apreton:jaja... pero podrias mencionar algun tipo de triac activo para buscarlo?
jajaja, tene cuidado que esto no perdona... a ver... vamos nuevamente... tenemos dos tipos de triacs... uno es el que requiere el disparo para conducir, y el otro, tansolo requiere de una señal presente para que funcione... Al primero se los denomina pasivos y al segundo activo... aca te dejo un archivo del foro donde ejemplifican como elaborar un relay de estado solido... basicamente, es lo que tenes que implementar vos en tu circuito para no tener que jugar en tu programa del pic, la deteccion del pasaje por cero...

Ver el archivo adjunto 30346

...P.D.: Creo/noto que de esta manera estamos confundiendo más a quienes no tienen los conocimientos que nosotros llegamos a adquirir con estudio o experiencia.
:enfadado: No, yo creo o noto que estas tratando de confundir vos a las personas... :enfadado:
Por que no implementas google o simplemente, buscas libros sobre semiconductores? Yo realmente no tengo ganas de dar catedra ni de salirme de tema para que despues sean borrado los comentarios...
Yo hasta ahora, no te vi aportar nada en el topico referente al tema, solo note un grado de interes en generar mas offtopic, que otra cosa... Quizas sea mejor que te remitas a leer, aprender y no se... poner quizas la pava en el fuego asi tomamos unos mates? No se, hablamos por el msn, por MP, o por telefono si queres, pero tatemos de no irnos del tema original...
Saludos
 
Última edición:
:aplauso:excelente el rele de estado solido pero me gustaria disminuir la cantidad de componentes, :D , ¿como podria detectar con el pic el cruce por cero para que no siga conduciendo la carga(y)?
 
Alguien tiene algún ejemplo de como enviar datos de VB a PIC por USB? Es extraño que en Internet no hay ni un ejemplo que le diga a uno como iniciar así sea encendiendo un solo LED, ya tengo todos los programas listo y me compilan y todo, pero no entiendo nada que hacer con esto:

Código:
INCLUDE "USBDEMOdesc.bas"
DEFINE OSC 20          
DEFINE LOADER_USED 1

USBBufferSizeMax   con 8  ' maximum buffer size
USBBufferSizeTX    con 8  ' input 
USBBufferSizeRX    con 8  ' output

' the USB buffer...
USBBuffer        Var Byte[USBBufferSizeMax] 
USBBufferCount   Var Byte 

' ************************************************************
' * main program loop - remember, you must keep the USB      *
' * connection alive with a call to USBService every couple  *
' * of milliseconds or so...                                 *
' ************************************************************
usbinit ' initialise USB...
ProgramStart: 
   GOSUB DoUSBIn
   gosub DoUSBOut
   goto ProgramStart  

' ************************************************************
' * receive data from the USB bus                            *
' ************************************************************
DoUSBIn:
   USBBufferCount = USBBufferSizeRX              ' RX buffer size
   USBService                                    ' keep connection alive
   USBIn 1, USBBuffer, USBBufferCount, DoUSBIn   ' read data, if available
   return
   
' ************************************************************
' * wait for USB interface to attach                         *
' ************************************************************
DoUSBOut:
   USBBufferCount = USBBufferSizeTX              ' TX buffer size
   USBService                                    ' keep connection alive
   USBOut 1, USBBuffer, USBBufferCount, DoUSBOut ' if bus available, transmit data
   return


Por lo menos donde le digo que si recibe un dato "x" desde VB el PIC lo verifique en un bloque IF, THEN, ENDIF ?

Y como autorizo desde VB por ejemplo cree un TextBox y le diga que al ser Tetx1.Text = "x" envie el dato por el USB?

Solo con eso me seria una gran ayuda.
 
Última edición por un moderador:
Hola que tal, ando usando el convertidos analogico digital del pic, ya elabore un programita, lo que quiero es leer el estado de un potenciometro haciendo un divisor de voltaje con el mismo, y mi resultado visualizarlo a tráves de todo el puerto b con leds. por cierto el pic es el 16f877A


Este es mi programa

Define ADC_BITS 8 ;Numero bits del resultado=10
Define ADC_CLOCK 3 ;fuente del Reloj 3 (3=rc)
Define ADC_SAMPLEUS 50 ;tiempo de muestreo del ADC en useg
Resultado var word ;Historia de la conversion
TRISA = %11111111 ; PORTA configurado como entradas
ADCON1 = %10000010 ; PORTA analog y justificacion del resultado

;Programa Principal
inicio:
ADCIN 0, Resultado ;lee Ra0 y guarda en resultado
Portb=Resultado
goto inicio
end


Pero tengo el gran problema de que no me funciona, alguna sugerencia???
Algun tutorial?? aun no entiendo al 100% como funciona este comando.
salu2
 
Hola que tal, ando usando el convertidos analogico digital del pic, ya elabore un programita, lo que quiero es leer el estado de un potenciometro haciendo un divisor de voltaje con el mismo, y mi resultado visualizarlo a tráves de todo el puerto b con leds. por cierto el pic es el 16f877A


Este es mi programa

Define ADC_BITS 8 ;Numero bits del resultado=10
Define ADC_CLOCK 3 ;fuente del Reloj 3 (3=rc)
Define ADC_SAMPLEUS 50 ;tiempo de muestreo del ADC en useg
Resultado var word ;Historia de la conversion
TRISA = %11111111 ; PORTA configurado como entradas
ADCON1 = %10000010 ; PORTA analog y justificacion del resultado

;Programa Principal
inicio:
ADCIN 0, Resultado ;lee Ra0 y guarda en resultado
Portb=Resultado
goto inicio
end


Pero tengo el gran problema de que no me funciona, alguna sugerencia???
Algun tutorial?? aun no entiendo al 100% como funciona este comando.
salu2

Una sugerencia :unsure:, si, puedes sube una diagrama para simularlo y ver porque no funciona, de momento todo lo veo bien, ahora, lo unico seria declarar los fuses, y definir la variable como byte, pero asi como esta deberia de funcionar, pero como te digo si tienes una simulacion mucho mejor...:apreton:
 
Hola que tal gracias por responder, lo tengo simulado en proteus, solo que este es una versión muy vieja :oops: muy muy vieja.
bueno dejo adjunto el archivo de proteus y mi archivo en Microcode asi como el Hex.
 

Adjuntos

  • ADC.rar
    13.5 KB · Visitas: 93
Hola que tal gracias por responder, lo tengo simulado en proteus, solo que este es una versión muy vieja :oops: muy muy vieja.
bueno dejo adjunto el archivo de proteus y mi archivo en Microcode asi como el Hex.

Mira la cosa esta en el adc del pic, la resolución es de 10bit para el 16f877A, por lo cual no podras trabajarlo a 8bits directamente, tendrías que leer los 10bits y luego llevarlo a ocho pero no tendria mucho sentido, en fin, por otro lado te recomiendo leer sobre configuraciones de fuses y tener en cuenta que debe declararse todos los puertos así no se utilicen, esto para garantizar que todo esta bien configurado, aparte igual ocurre para el oscilador debe indicarse a que frecuencia se va a trabajar, eso aplica tanto para el código como para la simulación. entonces si no configurar como salida el puerto b por ejemplo no te va a funcionar de manera correcta, acá te dejo el código arreglado...:apreton:

Código:
@ DEVICE PIC16F877A   ;Seleccion del Microcontrolador PIC16F877A
@ DEVICE XT_OSC       ;Seleccion del Tipo de oscilador XT de Cristal
@ DEVICE WDT_Off      ;Seleccion del Watchdog Timer Apagado
@ DEVICE PWRT_OFF     ;Seleccion del Power-on Reset Apagado
@ DEVICE BOD_Off      ;Seleccion del Brown-out Reset Apagado
@ DEVICE LVP_OFF      ;Seleccion del Low-Voltage Programming Apagado
@ DEVICE WRT_OFF      ;Seleccion del Flash Program Memory Write Apagado
@ DEVICE DEBUG_OFF    ;Seleccion del In-Circuit Debugger Apagado
@ DEVICE CPD_OFF      ;Seleccion del Data EEPROM Memory Code Protection Apagado
@ DEVICE PROTECT_Off  ;Seleccion del Flash Program Memory Code Protection Apagado

Define OSC 4  'Definicion de oscilador a 4MHZ



CMCON=0  'Desabilita los comparadores

Define ADC_BITS 10                 ;Numero bits del resultado=10
Define ADC_CLOCK 3             ;fuente  del Reloj 3 (3=rc)
Define ADC_SAMPLEUS 50    ;tiempo de muestreo del ADC en useg
Resultado var byte                  ;Historia de la conversion
'******************************DECLARACIONES DE I/O*****************************
TRISA = %11111111


ADCON1 = %10000010         ; PORTA analog y justificacion del resultado

;Programa Principal
inicio: 
ADCIN 0, Resultado            ;lee Ra0 y guarda en  resultado
Portb=Resultado
goto inicio 
end
 
acá te dejo el código arreglado...:apreton:
Código:
@ DEVICE PIC16F877A   ;Seleccion del Microcontrolador PIC16F877A
@ DEVICE XT_OSC       ;Seleccion del Tipo de oscilador XT de Cristal
@ DEVICE WDT_Off      ;Seleccion del Watchdog Timer Apagado
@ DEVICE PWRT_OFF     ;Seleccion del Power-on Reset Apagado
@ DEVICE BOD_Off      ;Seleccion del Brown-out Reset Apagado
@ DEVICE LVP_OFF      ;Seleccion del Low-Voltage Programming Apagado
@ DEVICE WRT_OFF      ;Seleccion del Flash Program Memory Write Apagado
@ DEVICE DEBUG_OFF    ;Seleccion del In-Circuit Debugger Apagado
@ DEVICE CPD_OFF      ;Seleccion del Data EEPROM Memory Code Protection Apagado
@ DEVICE PROTECT_Off  ;Seleccion del Flash Program Memory Code Protection Apagado

Define OSC 4  'Definicion de oscilador a 4MHZ

CMCON=0  'Desabilita los comparadores [COLOR=Red]<--- Omitir[/COLOR]

Define ADC_BITS 10                 ;Numero bits del resultado=10
Define ADC_CLOCK 3             ;fuente  del Reloj 3 (3=rc)
Define ADC_SAMPLEUS 50    ;tiempo de muestreo del ADC en useg
Resultado var byte                  ;Historia de la conversion
'******************************
Saludos reyvilla.
La instrucción CMCON = 0 en este caso debería ser CMCON = 7 ; CM2,CM1,CM0 = b'111'
Pero no es necesario ponerla, ya que por default en el PIC16F877A los comparadores se inician en OFF

Suerte. :apreton:
 
Saludos reyvilla.
La instrucción CMCON = 0 en este caso debería ser CMCON = 7 ; CM2,CM1,CM0 = b'111'
Pero no es necesario ponerla, ya que por default en el PIC16F877A los comparadores se inician en OFF

Suerte. :apreton:

Cierto amigo, muchas gracias por la observacion, se me paso ya que fue un copi pega de otro codigo que tenia guardado y son esos pequeños detalles que pueden causar dolor de cabeza si no se toman en cuenta...(y) :apreton:
 
:LOL: ok aunque llego tarde el consejo porque ya me dio una sacudida y casi quedo pegado :apreton:jaja... pero podrias mencionar algun tipo de triac activo para buscarlo?

hola, te cuento la mejor forma de manejar un triac con un pic es usando un optotriac usa esta configuración y veras
 

Adjuntos

  • optotriac.pdf
    98.9 KB · Visitas: 107
Última edición:
yo opino igual de echo llegue a realizar un secuenciador de luces de 100W con un pic12F675, 5 bombillos, y con red snubber, para los bombillos ahorradores o blancos sin la red snubber ya que tiende a titilar, parpadear, ahora, creo que dependiendo del optotriac puedes dimmear o no los bombillos.
 
Hola a todos les cuento que ando tratando de hacer un temporizador pero no logro hacer cuenta regresiva en el reloj alguien sabe como hacer esto?
este es el código que tengo pero no funciona como debería:

Código:
'@ DEVICE pic16F84A, WDT_ON 
@ device xt_osc 
define osc 4 
Define LCD_DREG PORTB
Define LCD_DBIT 0
Define LCD_RSREG PORTB
Define LCD_RSBIT 4
Define LCD_EREG PORTB
Define LCD_EBIT 5
Symbol Horas = PORTA.0 ; AJUSTE HORA
Symbol Minutos = PORTA.1 ; AJUSTE MINUTOS
Symbol Segundos = PORTA.2 ; AJUSTE SEGUNDOS
symbol Out = PORTB.7 ; SALIDA CONTROL 
Pulsos VAR byte 
Hrs VAR byte 
Mts VAR byte 
Sds VAR byte 
Disp VAR byte 
Delay VAR byte 
 
TRISB = %00000000 
TRISA = %00001111 
PAUSE 500 
 
Hrs = 0
Mts = 0
Sds = 0
pulsos = 0
OPTION_REG = %00000101 ; prescaler = 64
ON INTERRUPT GOTO ISR ; IR A RUTINA ISR 
INTCON = %10100000 
LCDOUT $FE, 1 ;LIMPIA LCD
;INCIO DEL PROGRAMA 
LOOP:
;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON HORAS CUANDO ES ACCIONADO
IF Horas = 0 THEN
hrs = hrs + 1
IF hrs = 24 THEN hrs = 0
Gosub Debounce
ENDIF
;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON MINUTOS CUANDO ES ACCIONADO
IF Minutos = 0 THEN
Mts = Mts +1
IF Mts = 60 THEN Mts = 0
Gosub Debounce
ENDIF
;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON SEGUNDOS CUANDO ES ACCIONADO
if Sds = 0 then
Sds = Sds + 1
endif
IF Sds = 60 then Sds = 0
Gosub Debounce
'ENDIF
;RUTINA PARA DETECCIÓN DE CERO
IF hrs = 0 AND Mts = 0 AND Sds = 0 THEN
out = 1
else 
out = 0
endif
;RUTINA PARA MOSTRAR VLORES EN EL lcd DE H:M:S
IF Disp = 1 THEN
LCDOUT $FE, 2
Lcdout " Tiempo espera " 
LCDOUT $FE,$C4, DEC2 hrs, ":",DEC2 Mts, ":",DEC2 Sds
Disp = 0
ENDIF
GOTO LOOP
; RUTINA DE RETARDO PARA LEER BOTONES 
Debounce:
FOR Delay = 1 To 200
Pause 1 
NEXT Delay 
Disp = 1 
RETURN
; RUTINA PARA EJECUCION DE UN SEGUNDO
DISABLE
ISR:
pulsos = pulsos + 1
IF pulsos < 61 THEN NoUpdate
;RUTINA DE TIEMPO 
Retro:
pulsos = 0
Sds = Sds - 1 
IF Sds = 60 THEN
Sds = 0
Mts = Mts - 1 
IF Mts = 60 THEN
Mts = 0
hrs = hrs - 1 
IF hrs = 24 THEN
hrs = 0
ENDIF
ENDIF
ENDIF
Disp = 1 
return
; RUTINA DE LA CULMINACION DEL TIEMPO DE ACTIVACION
NoUpdate:
INTCON.2 = 0 
Resume
ENABLE 
END
END

y aqui pongo la simulación a ver sí alguno me puede ayudar
les agradezco de antemano
 

Adjuntos

  • temporizador 16f84a.rar
    27.5 KB · Visitas: 89
Última edición por un moderador:
Se que para muchos moderadores, este mensaje lo pueden llegar a interpretar como off-topic, pero no queria dejar pasar la oportunidad para madarle todas mis fuerzas a una de las tantas personas grosas que aporto mucho en este topic y que justamente no esta pasando por buenos momentos...
Reimy, vamos viejo...aca desde Argentina, tenes un amigo que te apoya en lo que pueda; un abrazo y fuerza para seguir adelante... La vida, continua

Vamos amigos, mandemos un me gusta para acompañar al amigo que no esta pasando por un buen momento
 

Adjuntos

  • sos_grosoREIMY.jpg
    sos_grosoREIMY.jpg
    43.4 KB · Visitas: 11
Muchas gracias amigo torres.:rolleyes:

Hola ferdy575, te recomiendo empezar de cero el código ya que a mi parecer te estas complicando mucho al utilizar la interrupción de esa manera, me explico, para que utilizar interrupción para descrementar 3 variables en el loop de interrupción si puedes con una sola hacer lo mismo en el loop principal, por otro lado debes tener en cuenta que de 0 a 59 hay 60 números por lo cual no se toma en cuenta el valor 60 si no a partir de 59, si estas decrementando y estas en 0 el siguiente numero es 59. Si estas incrementando y llegas a 59 el siguiente numero es 0. Ahora para que puedas programar una base de tiempo debes darle un algoritmo de tal manera que empiece a decrementar solo y solo si por lo menos existe 1 segundo en el reloj. De lo contrario para que vas a decrementar si todo es 00:00:00, no tiene sentido. Ademas debes colocar o te recomiendo una entrada que sea como un start por lo mismo de la programación, solo si necesitas que sea preciso, ya que ir programando el tiempo mientras este se va decremnetando tampoco le veo mucha lógica. Aca tu codigo con unas pequeñas modificaciones.

Código:
@ DEVICE pic16F84A  
@ device xt_osc  
define osc 4 

Define	LCD_DREG	PORTB
Define	LCD_DBIT	0
Define	LCD_RSREG	PORTB
Define	LCD_RSBIT	4
Define	LCD_EREG	PORTB
Define	LCD_EBIT	5

Symbol Horas = PORTA.0      ; AJUSTE  HORA
Symbol Minutos = PORTA.1    ; AJUSTE MINUTOS
Symbol Segundos = PORTA.2   ; AJUSTE SEGUNDOS
symbol Out = PORTB.7        ; SALIDA CONTROL 

Pulsos VAR byte 
Hrs VAR byte 
Mts VAR byte 
Sds VAR byte 
Disp VAR byte 
Delay VAR byte 
CLEAR
 
TRISB = %00000000 
TRISA = %00001111 

PAUSE 500 


Hrs = 0
Mts = 0
Sds = 0
pulsos = 0


OPTION_REG = %00000101 ; prescaler = 64
ON INTERRUPT GOTO ISR ; IR A RUTINA ISR 
INTCON = %10100000 
LCDOUT $FE, 1 ;LIMPIA LCD

;INCIO DEL PROGRAMA 

LOOP:

;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON HORAS CUANDO ES ACCIONADO

IF Horas = 0 THEN
hrs = hrs + 1
ENDIF
IF hrs = 24 THEN 
hrs = 0
Gosub Debounce
ENDIF

;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON MINUTOS CUANDO ES ACCIONADO
IF Minutos = 0 THEN
Mts = Mts + 1
ENDIF
IF Mts = 59 THEN 
Mts = 0
Gosub Debounce
ENDIF

;RUTINA PARA CHEQUEAR EL INCREMENTO DEL BOTON SEGUNDOS CUANDO ES ACCIONADO
if Segundos = 0 then
Sds = Sds + 1
endif
IF Sds = 59 then 
Sds = 0
Gosub Debounce
ENDIF

;RUTINA PARA DETECCIÓN DE CERO
IF hrs = 0 AND Mts = 0 AND Sds = 0 THEN
out = 1
else 
out = 0
endif

;RUTINA PARA MOSTRAR VLORES EN EL lcd DE H:M:S

IF Disp = 1 THEN
LCDOUT $FE, 2
Lcdout "Tiempo de espera "  
LCDOUT $FE,$C4, DEC2 hrs, ":",DEC2 Mts, ":",DEC2 Sds
Disp = 0
ENDIF
GOTO LOOP

; RUTINA DE RETARDO PARA LEER BOTONES 

Debounce:
FOR Delay = 1 To 200
Pause 1 
NEXT Delay 
Disp = 1 
RETURN
; RUTINA PARA EJECUCION DE UN SEGUNDO

DISABLE
ISR:
;RUTINA PARA DETECCIÓN DE CERO
IF hrs > 0 OR Mts > 0 OR Sds > 0 THEN
pulsos = pulsos + 1
IF pulsos < 59 THEN NoUpdate

;RUTINA DE TIEMPO 

Retro:
pulsos = 0
Sds = Sds - 1
IF Sds = 0 AND Mts => 0 then
Sds = 59
Mts = Mts - 1
endif 
IF Mts = 0 AND hRS > 0 THEN
Mts = 59
hrs = hrs - 1 
ENDIF
ENDIF

Disp = 1 
return

; RUTINA DE LA CULMINACION DEL TIEMPO DE ACTIVACION

NoUpdate:
INTCON.2 = 0 
Resume
ENABLE 
END
END
 
Atrás
Arriba