Autor Tema: Bajar la intensidad del led con pic16f84a  (Leído 6095 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado jmik

  • PIC10
  • *
  • Mensajes: 5
Bajar la intensidad del led con pic16f84a
« en: 23 de Enero de 2005, 14:44:00 »
Hola amigos, quisiera saber como bajar la intensidad del led, para crear un efecto que la luz suba y baje...Gracias ChauFlash

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Bajar la intensidad del led con pic16f84a
« Respuesta #1 en: 23 de Enero de 2005, 15:07:00 »
Puedes ponerle un potenciómetro y darle vueltas con un destornillador.
Aunque tb lo que puedes hacer es generar pulsos de anchura variable,con lo que conseguirás variar la potencia,y por tanto la luminosidad.
En C podría ser una cosa así para 50 niveles de luminosidad:

Codigo:


void genera_pulso(int ancho) // ancho iría desde 0 hasta 50.
   {
    output_high(PIN_A0);
    delay_ms(ancho);
    output_low(PIN_A0);
    delay_ms(50);
   }





Desconectado jmik

  • PIC10
  • *
  • Mensajes: 5
RE: Bajar la intensidad del led con pic16f84a
« Respuesta #2 en: 24 de Enero de 2005, 10:12:00 »
Amigos muchas gracias por sus respuesta.. pero desearia un mini programita en asembler (ya que en c no se casi nada) para guiarme y conseguir un efecto luminico (no lo quiero con pote, preferiria que sea automatico) desde ya muchas gracias....

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Bajar la intensidad del led con pic16f84a
« Respuesta #3 en: 24 de Enero de 2005, 11:37:00 »
Bueno,no me doy mucho con assembler pero lo que tendrías que hacer es implementar una rutina de retardo de 50 ms por ejemplo,y otra rutina de retardo variable,que variaría en función del valor de una variable en memoria ó en función del valor del acumulador.Tanto si usases uno como el otro,le darías un valor de 0 a 50 antes de la llamada a la rutina de retardo variable,manteniendo el led encendido durante ese tiempo,depués lo apagas y llamas a la rutina de retardo fijo,lo vuelves a encender,modificas el valor de retardo y llamada a retardo variable...y así de forma cíclica.Si no sabes como implementar retardos,hay por ahí programas que te generan código asm para retardos de forma sencilla.
Un saludo

Desconectado jmik

  • PIC10
  • *
  • Mensajes: 5
RE: Bajar la intensidad del led con pic16f84a
« Respuesta #4 en: 26 de Enero de 2005, 11:08:00 »
IdeaIdeaIdeaIdeaSi esta bien, se como hacer retardos.. pero no como crear un retardo variable... Bueno amigos.... Ojala que me puedan ayudar.. Saludos desde Argentina.RollEyes. Aca les envio mi codigo para que vean como quiero hacer.

;-----------------------------------------
;Creado por José Imaz
;
; Formo la palabra JOSE IMAZ en el DISPLAY manejado por un PIC16F84A


ESTADO    equ   0x03   ;Defino la variable "Status" para poder cambiarme entre los bancos de Memoria
SALIDA1   equ   0x06   ;Con esta variable hago referencia al puerto B del micro
PDel0    equ    0x0c   ;Con esta variable me ocupo de ocupar un lugar en la ram para realizar el retardo que deseo (0x0c)
PDel1    equ    0x0d   ;Con esta variable me ocupo de ocupar un lugar en la ram para realizar el retardo que deseo
PDel2    equ    0x1e   ;Con esta variable me ocupo de ocupar un lugar en la ram para realizar el retardo que deseo

;-----------------------------------------------------------------------------------
   org   0   ;ME POSICIONO AL PRINCIPIO DE LA MEMORIA
   goto INICIO   ;VOY AL INICIO DEL PROGRAMA
   org   5   ;INDICIO DESDE DONDE EMPIEZO A USAR LA MEMORIA
;-----------------------------------------------------------------------------------
INICIO    bsf        ESTADO,5 ;COLOCO UN "1" A ESTADO, SELECCIONADO ASI EL BANCO-1 DE MEMORIA
   movlw      B"00000000" ; PONGO EN 0 LAS SALIDAS
          movwf     SALIDA1
          bcf   ESTADO,5 ;COLOCO UN "0" A ESTADO, SELECCIONADO BANCO-0 DE MEMORIA

;-----------------------------------------------------------------------------------   
ENTRO
   movlw   B"00000000"
         movwf   SALIDA1
;-----------------------------------------------------------------------------------
;
EFECT1   movlw   b"11111111"
        movwf   SALIDA1   ;COPIO EL DATO DE LA VARIABLE DE TRABAJO A LA SALIDA
         ;CONSIGUIENDO DE ESTA FORMA QUE SE ACTIVE LA PRIMER SALIDA PB0 (PIN-6)

;EN ESTA RUTINA FORMA LA LETRA "J"     PATAS; 8 9 10 11
;LETRA J

   movlw   B"00111100"                      
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6

   movlw   B"00000000"                      
        movwf   SALIDA1
   CALL    SEG6

   movlw   B"00111100"                      
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6

   movlw   B"00000000"                      
        movwf   SALIDA1
   CALL    SEG6

   movlw   B"00111100"                      
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6

;hago los mismo pero con la letra o

   movlw   B"01111110"                      
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6

   movlw   B"00000000"                      
        movwf   SALIDA1
   CALL    SEG6

   movlw   B"01111110"                      
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6

   movlw   B"00000000"                      
        movwf   SALIDA1
   CALL    SEG6

   movlw   B"01111110"                      
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6

;LETRA S

   movlw   B"11011010"                      
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6

   movlw   B"00000000"                      
        movwf   SALIDA1
   CALL    SEG6

   movlw   B"11011010"                      
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6

   movlw   B"00000000"                      
        movwf   SALIDA1
   CALL    SEG6

   movlw   B"11011010"                      
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6

;LETRA E


   movlw   B"11110010"                      
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6

   movlw   B"00000000"                      
        movwf   SALIDA1
   CALL    SEG6

   movlw   B"11110010"                      
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6

   movlw   B"00000000"                      
        movwf   SALIDA1
   CALL    SEG6

   movlw   B"11110010"                      
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6

;PRESENTACION DE TODAS LAS LETRAS

   movlw   B"00111100"   ;LETRA J          
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6


   movlw   B"01111110"   ;LETRA O   
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6


   movlw   B"11011010"   ;LETRA S
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6


   movlw   B"11110010"   ;LETRA E          
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6

;PRESENTACION DE TODAS LAS LETRAS pero con un segundo

   movlw   B"00111100"   ;LETRA J          
        movwf   SALIDA1
   CALL    SEG6

   movlw   B"01111110"   ;LETRA O   
        movwf   SALIDA1
   CALL    SEG6

   movlw   B"11011010"   ;LETRA S
        movwf   SALIDA1
   CALL    SEG6

   movlw   B"11110010"   ;LETRA E          
        movwf   SALIDA1
   CALL    SEG6

;NUMEROS!!!

   movlw   B"01111110"   ;NUMERO 0
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP

   movlw   B"00001100"   ;NUMERO 1
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP   

   movlw   B"10110110"   ;NUMERO 2
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP   

   movlw   B"10011110"   ;NUMERO 3
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP   

   movlw   B"11001100"   ;NUMERO 4
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP

   movlw   B"11011010"   ;NUMERO 5
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP

   movlw   B"11111010"   ;NUMERO 6
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP

   movlw   B"00001110"   ;NUMERO 7
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP

   movlw   B"11111110"   ;NUMERO 8
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP

   movlw   B"11001110"   ;NUMERO 9
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP

;AHORA LA SECUENCIA 0303456

   movlw   B"01111110"   ;NUMERO 0
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP

   movlw   B"10011110"   ;NUMERO 3
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP   

   movlw   B"01111110"   ;NUMERO 0
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP

   movlw   B"10011110"   ;NUMERO 3
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP   

   movlw   B"11001100"   ;NUMERO 4
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP

   movlw   B"11011010"   ;NUMERO 5
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP

   movlw   B"11111010"   ;NUMERO 6
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP

;ahora  9 8 7 6 5 4 3 2 1

   movlw   B"11001110"   ;NUMERO 9
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP

   movlw   B"00001110"   ;NUMERO 7
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP

   movlw   B"11011010"   ;NUMERO 5
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP

   movlw   B"10011110"   ;NUMERO 3
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP   

   movlw   B"00001100"   ;NUMERO 1
        movwf   SALIDA1
   CALL    SEG6
   CALL    SEG6
   NOP

;POR ULTIMO 123456789 SIN NOP Y SIN A 0.5 SEG

   movlw   B"10110110"   ;NUMERO 2
        movwf   SALIDA1
   CALL    SEG6
   NOP   

   movlw   B"10011110"   ;NUMERO 3
        movwf   SALIDA1
   CALL    SEG6
   NOP   

   movlw   B"11001100"   ;NUMERO 4
        movwf   SALIDA1
   CALL    SEG6
   NOP

   movlw   B"11011010"   ;NUMERO 5
        movwf   SALIDA1
   CALL    SEG6
   NOP

   movlw   B"11111010"   ;NUMERO 6
        movwf   SALIDA1
   CALL    SEG6
   NOP

   movlw   B"00001110"   ;NUMERO 7
        movwf   SALIDA1
   CALL    SEG6
   NOP

   movlw   B"11111110"   ;NUMERO 8
        movwf   SALIDA1
   CALL    SEG6
   NOP

   movlw   B"11001110"   ;NUMERO 9
        movwf   SALIDA1
   CALL    SEG6
   NOP

;Y POR ULTIMOOOO CHAUUUU

   movlw   B"01110010"   ;LETRA C
        movwf   SALIDA1
   CALL    SEG6
   NOP

   movlw   B"11101100"   ;LETRA H
        movwf   SALIDA1
   CALL    SEG6
   NOP

   movlw   B"11101110"   ;LETRA A
        movwf   SALIDA1
   CALL    SEG6
   NOP

   movlw   B"01111100"   ;LETRA U
        movwf   SALIDA1
   CALL    SEG6
   NOP
;-------------------------------------------------------------------------------
;--- EMPIEZO LA SECUENCIA NUEVAMENTE
   GOTO ENTRO

;----------------Le doy lugar a un nuevo retardo que permite el apagado por 0,5 seg. en un momento determinado---------------------------------------------
SEG6  movlw     .239      ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .232      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  goto PDelL3         ; 2 ciclos delay
PDelL3  clrwdt              ; 1 ciclo delay
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL4  goto PDelL5         ; 2 ciclos delay
PDelL5  goto PDelL6         ; 2 ciclos delay
PDelL6  goto PDelL7         ; 2 ciclos delay
PDelL7  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.

   END       ; DOY POR TERMINADO EL PROGRAMA.

Desconectado Anarkis

  • PIC10
  • *
  • Mensajes: 3
Re: Bajar la intensidad del led con pic16f84a
« Respuesta #5 en: 21 de Septiembre de 2008, 16:09:28 »
Bueno, rescato este mensaje ya que estoy interesado en bajar la intensidad de un led desde un dspic.
He probado lo que comentais arriba y no me funciona.

El efecto que quiero conseguir es que el led esté encendido desde una luz mínima hasta una máxima variando la intensidad en el tiempo.

Lo unico que hago es enlazar el pin de mi dspic (30F4011) con una toma de tierra en una protoboard.
Al activar el pin del dspic se activa el led y al desactivarlo se apaga, pero no se me ocurre ninguna forma de poder regular la intensidad (sin contar con el potenciometro, ya que me interesa que sea regulable por software)
He pensado en algún transistor... pero no se como sería.

¿Vosotros sabeis como hacerlo?
Os lo agradecería muchísimo.

Un saludo

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Bajar la intensidad del led con pic16f84a
« Respuesta #6 en: 21 de Septiembre de 2008, 16:27:34 »
Hola Anarkis!

Modulay dice a la perfección como se puede conseguir el efecto que deseas. Vamos a ver si con un ejemplo puedo intentar decir lo mismo.

Caso 1.
Led encendido                                   (se ve el led encendido al 100%)

Caso 2.
Led apagado                                     (se ve el led encendido al 0%, es decir, apagado)

Caso 3.
Led encendido 1ms y apagado 1ms     (se ve el led encendido al 50%)

Cualquier caso intermedio se puede deducir fácilmente.

Es eso lo que buscas?

Sólo se me ocurre que no te funcione bien porque no pongas bien los tiempos de encendido y apagado. Me explico, si estos tiempos son demasiado pequeños verás el led siempre apagado (se enciende y apaga tan rápidamente que no le da tiempo a brillar y te piensas que está apagado). También te puede pasar que esos tiempos sean demasiado largos y entonces varás el led parpadear.

Ya nos cuentas.


Un saludo desde Alicante.

Desconectado AKENAFAB

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3227
Re: Bajar la intensidad del led con pic16f84a
« Respuesta #7 en: 21 de Septiembre de 2008, 18:22:17 »

Hola saludos!

Puedes utilizar el pwm de tu uC.


Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: Bajar la intensidad del led con pic16f84a
« Respuesta #8 en: 22 de Septiembre de 2008, 13:42:20 »
Hola! primero q nada, me parece q te equivocaste de seccion... preguntas como estas tendrias q ponerlas en la seccion de assembler. En fin, ya pasara algun moderador.
Con respecto a tu duda, lo mas facil es utilizar el pwm como bien dicen arriba. Mira este video, seguro q es lo q queres lograr http://es.youtube.com/watch?v=yFKitXM1cow
Aca te dejo una pagina que calcula el pwm y genera el codigo en C... la verdad q con asm no me llevo muy bien, asiq no te puedo ayudar con eso.
http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator.html
saludos!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado Anarkis

  • PIC10
  • *
  • Mensajes: 3
Re: Bajar la intensidad del led con pic16f84a
« Respuesta #9 en: 24 de Septiembre de 2008, 08:35:25 »
Muchas gracias por las respuestas.

Yo para mi dspic trabajo con C30, he visto algo de teoría al respecto y con los videos me he aclarado un poco más.
En cuanto a la web que te genera el código es para pic, no sé si podría servir para mi dspic pero creo que si.

En las especificaciones he encontrado este par de formulas relativas al pwm en dspic:

Código: [Seleccionar]
PWM Period = [(PRy) + 1] • TCY • (TMRy Prescale Value)
PWM Frequency = 1/[PWM Period]

Corregirme si me equivoco:
Donde Pry es la frecuencia a la que trabaja mi micro (7.3728MHz)
El TCY es el tiempo de ciclo por instrucción pero no se donde sacarlo
y el TMRy Prescale Value estoy trabajando a 1:64 (no se que debería poner ya que el preescaler para el timer lo configuro con los registros TCKPS1 y TCKPS0).

Con el periodo de PWM saco La frecuencia del PWM con la segunda fórmula.

Y desde la página, con la frecuencia PWM y el duty cycle ya tendría la configuración necesaria.

Otro detalle, la función Delay_ms() no la tengo implementada, he buscado pero no la he encontrado para descargar sabéis de algún sitio?

Un saludo y muchísimas gracias


 

anything