Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?
24/01/2016 #2981


D@kbytes, muchas gracias. Veré como logro seguir.
Como decía anteriormente, no sé mucho de programación, pero gracias.
25/01/2016 #2982


He intentado de arreglarlo Darkbytes, pero no lo he logrado.
He pasado lo hexadecimal a binario y a las salidas A lo configuré para que sólo emita pulsos por salidas: RA0-RA5
No obstante, no he logrado mi objetivo, puesto que debo de hacer que las primeras 10 salidas inicien la secuencia al mismo tiempo y que las últimas salidas inicien el conteo al lado opuesto para que cuando lleguen al centro retornen la secuencia y en cada extremo retorne de igual forma, pero no sé cómo poner dos secuencias simultaneas en el mismo programa.
Código:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2016 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 25/01/2016                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Define OSC 4 ' Define el oscilador para una frecuencia de 4 MHz.   

Inicio:
    ANSEL = 0           ; Configura el Puerto A como digital I/O (AN0<>AN7) "Incluye el Puerto E"
    ANSELH = 0          ; Configura el Puerto B como digital I/O (AN8<>AN13)
    
    TRISA = 0           ' Configuración el Puerto A
    TRISB = 0           ' Configuración el Puerto B 
    TRISC = 0           ' Configuración el Puerto C 
    
    Symbol  LEDs_A = PORTA
    Symbol  LEDs_B = PORTB
    Symbol  LEDs_C = PORTC
    
    LEDs_B = 0          ' Inicializa el puerto B 
    LEDs_C = 0          ' Inicializa el puerto C
    LEDs_A = 1          ' Inicializa el puerto A
    Pause 200
    
    B0 Var Byte
    
Programa:
    LEDs_A = 1          ' Inicializa el puerto A
    For B0 = 1 To 5     ; Bucle de 5 ciclos.
        LEDs_A = LEDs_A << 1    ; Rotar un bit hacia la izquierda.
        Pause 200
    Next B0
    
    LEDs_A = 0
    LEDs_B = 1
    Pause 200
    
    For B0 = 1 To 5
        LEDs_B = LEDs_B << 1
        Pause 200
    Next B0
    
   
    LEDs_B = 0
    LEDs_C = 1
    Pause 200
    
    For B0 = 1 To 7
        LEDs_C = LEDs_C << 1
        Pause 200
    Next B0
    LEDs_C = 0

    LEDs_C = %10000000        ; Inicia el retorno. "Rebote"
    
    For B0 = 1 To 7
        LEDs_C = LEDs_C >> 1    ; Rotar un bit hacia la derecha.
        Pause 200
    Next B0
    
    LEDs_C = 0
    LEDs_B = %10000000
    Pause 200
    
    For B0 = 1 To 7
        LEDS_B = LEDs_B >> 1
        Pause 200
    Next B0
    
    LEDs_B = 0
    LEDs_A = %00100000
    Pause 200
    
    For B0 = 1 To 5
        LEDs_A = LEDs_A >> 1
        Pause 200
    Next B0
       GoTo Programa  ; Salta a la etiqueta "Programa" y se repite el proceso.
        End
25/01/2016 #2983
Moderador

Avatar de D@rkbytes

OK. No es complicado realizar secuencias.

Mira esta otra forma de hacerlo:
Código:
@ Device PIC16F887    ; Microcontrolador utilizado
; Palabra de configuración:
@ Device INTRC_OSC_NOCLKOUT,WDT_OFF,PWRT_ON,LVP_OFF,FCMEN_OFF,IESO_OFF
Define OSC 4 ' Define el oscilador para una frecuencia de 4 MHz.   

; Declaración de variables:
B0      Var Byte            ; Variable de 8 bits para propósito general.
Leds1   Var Byte[8]         ; Definir un arreglo de 8 campos
Leds2   Var Byte[8]         ; Definir un arreglo de 8 campos

Inicio:
    TRISA = 0               ; Puerto A como salidas
    TRISB = 0               ; Puerto B como salidas
    PORTA = 0               ; Puerto A en 0
    PORTB = 0               ; Puerto B en 0

    Leds1[1] = %10000000    ; Establecer un valor binario a los arreglos.
    Leds1[2] = %01000000
    Leds1[3] = %00100000
    Leds1[4] = %00010000
    Leds1[5] = %00001000
    Leds1[6] = %00000100
    Leds1[7] = %00000010
    Leds1[8] = %00000001

    Leds2[1] = %00000001
    Leds2[2] = %00000010
    Leds2[3] = %00000100
    Leds2[4] = %00001000
    Leds2[5] = %00010000
    Leds2[6] = %00100000
    Leds2[7] = %01000000
    Leds2[8] = %10000000


    Leds1 = 1
    Leds2 = 1

Programa:
    For B0 = 8 To 1 Step -1 ; Bucle de 8 ciclos (Descendente)
        PORTA = Leds1[B0]   ; Realizar el desplazamiento de bits del puerto A
        PORTB = Leds2[B0]   ; Realizar el desplazamiento de bits del puerto B
        Pause 100
    Next B0
    
    For B0 = 1 To 8         ; Bucle de 8 ciclos (Ascendente)
        PORTA = Leds1[B0]   ; Realizar el desplazamiento de bits del puerto A
        PORTB = Leds2[B0]   ; Realizar el desplazamiento de bits del puerto B
        Pause 100
    Next B0
    
    GoTo Programa           ; Repetir el proceso.
    
    End
Compila y ve qué sucede.
31/01/2016 #2984


Hola amigos de Foros de Electrónica. He construido una insoladora con fluorescentes UV y sus reactores.
El detalle es que temporiza dos tiempos distintos, es decir: tiempo lado a y tiempo lado b, y
los tiempos están grabados previamente en la memoria EEPROMdel PIC, que pueden ser configurados también a través de un menú a criterio del usuario.

Adjunto esquema en proteus isis y código fuente en PIC Basic Pro.

El código fuente quisiera que me lo revisen, porque está muy grande y parece que he dado muchas vueltas.

La verdad me funciona, pero no tan bien, porque a veces el tiempo se me cuelga.

Les agradezco de antemano.

Después de todo, puede ser un aporte al foro, pero antes que nada quisiera que me lo revisaran,

Muchas gracias.
Archivos Adjuntos
Tipo de Archivo: rar insoladora.rar (38,2 KB (Kilobytes), 26 visitas)
31/01/2016 #2985


Te dejo mi esquema de insoladora a 1 o 2 caras segun se desee con su hex, con ajuste de contraste del LCD desde el propio LCD sin tener que usar una resistencia variable, pruebalo a ver si te gusta mas, el pic es un 16f887 a 4mhz, en el primer encendido, el setup no detecta config y obliga a configurar contraste del LCD desde el propio menu del programa, despues pasa al menu de retardo, por defecto esta en 61us para que el tiempo de la insoladora sea lo mas parecido al tiempo real y 3o ajusta la velocidad del texto que se desplaza para paliar los efectos de la velocidad del refresco del LCD, todo eso se guarda en la eeprom del PIC y en el proximo inicio detecta que esta configurado y no vuelve a entrar al setup si no se pulsa a la vez intro y pausa y recuerda el tiempo de insolacion que se uso por ultima vez.
Lo unico que no te dejo en el esquema es como se configura el contraste del LCD en proteus desde el propio menu del LCD porque es algo que por ahora quiero mantener solo para mi insoladora.
Un saludo.
C52 ha de estar lo mas cerca posible de las patillas 31 y 32 del PIC.
Y la entrada desde la red electrica con esa fuente capacitiva esta calculada para tener 100ma a 220vAC a 50hz
Para tener 100ma con 120vac y 60hz se ha sustituir el condensador C2 de 1.5uf por uno de 2,2uf.
o añadir en paralelo al condensador de 1.5uf otro de 680nf.

Sobre lo que te sucede que a veces el tiempo se para o se cuelga es por culpa del oscilador y ese condensador que yo añado a las patillas 31 y 32, en tu caso no se añadiria ese condensador.
El proyecto debes hacerlo con un cristal externo de 4mhz con 2 condensadores de 22pf separados del PIC tanto el cristal como los condensadores y veras como no se para el tiempo solo o se cuelga.
Eso no te sucederia con un 16f887 o un 16f877a, pero el 628a tiene esos pequeños inconvenientes.
Archivos Adjuntos
Tipo de Archivo: rar Insoladora 2 caras.rar (363,3 KB (Kilobytes), 30 visitas)
01/02/2016 #2986


Display 16 segmentos y PIC16F887
Muy buen día.
Les cuento que estoy programando un display de 16 segmentos con el PIC16F887 mediante Microcode Studio.
Mi meta es llegar a hacer que despliegue la frase 6TO PERITO (lo cual ya logré)
El problema es que necesito programar para que cuando presione un botón en el pin RA0, cambiará su frase a ELECTRONICA y he intentado pero no sé cómo.

¿Me pueden ayudar?
He asignado nombres de las variables pero no sé cómo proseguir para realizar ese cambio.
Código PHP:
'****************************************************************
'
*  Name    UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'
*  Notice  Copyright (c2016 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'
*  Date    31/01/2016                                        *
'*  Version : 1.0                                               *
'
*  Notes   :                                                   *
'*          :                                                   *
'
****************************************************************
define osc 4    ' Define la oscilacion 

    I var Byte  ' 
Declaracion de la variable I tipo byte
    
                
' Constantes para definir cada signo decimal.
 
                
    
            '
87654321
            
'////////
    Qb CON  %10111011
    Tb con  %00000011
    Ob con  %11111111
     b con  %00000000
    Pb con  %11000111
    Eb con  %11110011
    Rb CON  %11000111
    Ib con  %00110011
    Lb con  %11110000
    Cb con  %11110011
    Nb con  %11001100
    Ab con  %11001111
    
  
    
    Qc CON  %10001000
    Tc con  %00100010
    Oc con  %00000000
     c con  %00000000
    Pc con  %10001000
    Ec con  %10001000
    Rc CON  %10011000
    Ic con  %00100010
    Lc con  %00000000
    Cc con  %00000000
    Nc con  %00010001
    Ac con  %10001000
  
    
    '
Configuracion del puerto de salida
   
    
TRISB = %00000000  'Configura el puerto "C" como salida
    TRISC = %00000000  '
Configura el puerto "D" como salida  
    
Inicio
:     

    for 
0 to 10    ' lazo de repeticion
    
        Call Digito    ' 
salto con retorno a la etiqueta "digito"
        
        
Pause 200      ' Una pausa de 200milisegundos
    
    next I
    
    goto Inicio        ' 
Repite el proceso hacia la etiqueta "inicio"
    
Digito:

    if 
0 then PORTB Qb 
    
if 0 then PORTC Qc
    
if 1 then PORTB Tb
    
if 1 then PORTC Tc
    
if 2 then PORTB ob
    
IF 2 then PORTC Oc
    
if 3 then PORTB b
    
IF 3 THEN PORTC c
    
if 4 then PORTB Pb
    
IF 4 THEN PORTC Pc
    
if 5 then PORTB Eb
    
IF 5 THEN PORTC Ec
    
if 6 then PORTB Rb
    
if 6 then PORTC Rc 
    
if 7 then PORTB Ib
    
IF 7 then PORTC Ic
    
if 8 then PORTB tb
    
IF 8 THEN PORTC Tc
    
if 9 then PORTB Ob
    
IF 9 THEN PORTC Oc 
    
if 10 then PORTB b     
    
IF 10 THEN PORTC c
    
   
    
    
return             ' Retorna a la etiqueta "call"
    
    
    end 
01/02/2016 #2987


Antes de return crea un if que te lleve fuera de digito: que se llame por ejemplo, cambiar: en caso de que el puerto porta.0=1
Creas la rutina dentro de cambiar: para que el display muestre lo que quieres y al final antes del return vuelves a añadir un if, que en caso de que porta.0=0 vaya a digito:

Así:
Código:
digito:
' Lo que muestra el display sin presionar
if porta.0=1 then
pausa 100 
goto cambiar
end if
return
cambiar:
' Lo que muestra el display cuando se presiona a0
if porta.0=1 then
pausa 100
goto cambiar
else
goto digito
end if
return
El segundo return condicionará la salida de cambiar.
Dependiendo de si quieres que vuelva a digito si no se presiona el pulsador o que se quede en cambiar hasta que se presione de nuevo.

Hay que cambiar:
Código:
if porta.0=1 then
pausa 100
goto cambiar
else
goto digito
end if
Por:
Código:
if porta.0=1 then
pausa 100
goto digito
else
goto cambiar
end if
Y se añade un goto cambiar antes del último return para asegurar el bucle.
Creo que habría que depurarlo algo más pero casi seguro que con esto consigues lo que buscas.

Y recuerda añadir siempre pausas después de los if o dentro de los if que añades en caso de que sean para salir de un bucle mediante pulsadores o producirás un efecto rebote que no te permitirá ejecutar las operaciones correctamente.
01/02/2016 #2988


Muchas gracias mikeekim verificaré todo esto con mi código ��������������
15/02/2016 #2989

Avatar de willrey28

melodias y leds en pic
Hola a todos. Por favor me podrían ayudar a crear un pic que genere melodias y al mismo tiempo enciendan leds al ritmo de esa melodia ?,he creado por ejemplo la melodia de happy birthday y feliz navidad en el pic, pero no tengo idea como hacer para que por otro puerto enciendan algunos leds ,si yo quiero que enciendan los leds el programa primero ejecuta la melodia y luego recien enciende dichos leds y yo deseo que haga las dos cosas al mismo tiempo.Gracias.
Adjunto el archivo necesario en pic basic.
Archivos Adjuntos
Tipo de Archivo: rar sonido.rar (14,7 KB (Kilobytes), 17 visitas)
15/02/2016 #2990


willrey28 dijo: Ver Mensaje
Hola a todos. Por favor me podrían ayudar a crear un pic que genere melodias y al mismo tiempo enciendan leds al ritmo de esa melodia ?,he creado por ejemplo la melodia de happy birthday y feliz navidad en el pic, pero no tengo idea como hacer para que por otro puerto enciendan algunos leds ,si yo quiero que enciendan los leds el programa primero ejecuta la melodia y luego recien enciende dichos leds y yo deseo que haga las dos cosas al mismo tiempo.Gracias.
Adjunto el archivo necesario en pic basic.
Hola...Una de las formas que se me ocurre ahora es que por cada nota llames a continuacion el cambio de nivel en donde esta los led. Ej:

Código:
....

music:

DelayMS 500 
Toggle PORTB.1
Sound PORTB.0,[90,50]
Toggle PORTB.1
Toggle PORTB.7
Sound PORTB.0,[94,50]
Toggle PORTB.1
Sound PORTB.0,[94,50]
Toggle PORTB.7
Sound PORTB.0,[90,50]
Toggle PORTB.1
Sound PORTB.0,[99,50]
......
O el orden de encendido apagado que quieras realizar.
Saludos.

Ric.
15/02/2016 #2991

Avatar de willrey28

Gracias por responder,y si funciona lo que escribiste ,no se me había ocurrido usar "toggle".
No lo hace precisamente al ritmo de la música pero es una buena solución.
Gracias.
Lo que deseo es realizar una cajita musical como esas cajitas musicales de navidad que se colocan en los arbolitos de navidad y que tienen luces y que varían según las melodías que producen.
He visto en youtube que lo han realizado con un pic pero obviamente el codigo hex ni el diagrama te quieren dar.
Gracias
15/02/2016 #2992


En mikrobasic tienes un ejemplo bastante explicito de como hacerlo, solo tienes que asignar un puerto de salida a cada tono, meter cada tono y cada puerto asignado a cada tono en un subproceso y activar el pueto antes de que suene el tono y que se desactive al finalizar el tono y finalizas el subproceso.
No te has de preocupar por los tiempos de encendido y apagado de los leds porque el tiempo de duracion del sound es el tiempo que estara activado cada puerto.
Asi que si un sonido dura 3 segundos y otro 500ms un led estara activado 3 segundos y el siguiente led 500ms.
Te dejo un ejemplo de como se hace.
Este es el programa original
Código:
' Cabecera******************************************************
program example_13 ' Nombre de programa

sub procedure Tone1()
  Sound_Play(659, 250) ' Frecuencia = 659Hz, duración = 250ms

end sub

sub procedure Tone2()
  Sound_Play(698, 250) ' Frecuencia = 698Hz, duración = 250ms
end sub

sub procedure Tone3()
  Sound_Play(784, 250) ' Frecuencia = 784Hz, duración = 250ms
end sub

sub procedure Melody() ' Tocar una melodía divertida 1
  Tone1() Tone2() Tone3() Tone3()
  Tone1() Tone2() Tone3() Tone3()
  Tone1() Tone2() Tone3()
  Tone1() Tone2() Tone3() Tone3()
  Tone1() Tone2() Tone3()
  Tone3() Tone3() Tone2() Tone2() Tone1()
end sub

sub procedure ToneA() ' Tonos utilizados en la función Melody2
  Sound_Play( 880, 50)
end sub

sub procedure ToneC()
  Sound_Play(1046, 50)
end sub

sub procedure ToneE()
  Sound_Play(1318, 50)
end sub

sub procedure Melody2() ' Tocar Melody2
  dim counter as byte
  for counter = 9 to 1 step -1
    ToneA()
    ToneC()
    ToneE()
  next counter
end sub

main: ' Inicio de programa

ANSEL = 0    ' Configurar pines analógicos como digitales de E/S
ANSELH = 0

C1ON_bit = 0 ' Deshabilitar los comparadores
C2ON_bit = 0

TRISB = 0xF0 ' Configurar los pines RB7..RB4 como entradas y RB3 como salida

Sound_Init(PORTD, 3)
Sound_Play(880, 5000)

while TRUE   ' Bucle infinito
  if (Button(PORTB,7,1,1)) then ' Si se presiona PORTB.7 tocar Tone1
      Tone1()
    while (RB7_bit <> 0)
      nop ' Esperar que se suelte el botón
    wend
  end if

  if (Button(PORTB,6,1,1)) then ' Si se presiona PORTB.6 tocar Tone1
      Tone2()
    while (RB6_bit <> 0)
      nop ' Esperar que se suelte el botón
    wend
  end if

  if (Button(PORTB,5,1,1)) then ' Si se presiona PORTB.5 tocar Tone1
    Melody2()
    while (RB5_bit <> 0)
      nop ' Esperar que se suelte el botón 
    wend
  end if

  if (Button(PORTB,4,1,1)) then ' Si se presiona PORTB.4 tocar Tone1

    Melody()
    while (RB4_bit <> 0)
      nop ' Esperar que se suelte el botón
    wend
  end if
wend

end. ' Final de programa
Estos son los tonos
Código:
sub procedure Tone1()
  Sound_Play(659, 250) ' Frecuencia = 659Hz, duración = 250ms

end sub

sub procedure Tone2()
  Sound_Play(698, 250) ' Frecuencia = 698Hz, duración = 250ms
end sub

sub procedure Tone3()
  Sound_Play(784, 250) ' Frecuencia = 784Hz, duración = 250ms
end sub
Pues yo lo que he hecho para que lo comprendas, es esto:
Código:
' Cabecera******************************************************
program example_13 ' Nombre de programa

sub procedure Tone1() ' g
PORTA.0=1
  Sound_Play(196, 700) ' Frecuencia = 659Hz, duración = 250ms
PORTA.0=0
end sub

sub procedure Tone2() ' d
 PORTA.6=1
  Sound_Play(293, 1200) ' Frecuencia = 698Hz, duración = 250ms
 PORTA.6=0
end sub

sub procedure Tone3() ' c
PORTA.5=1
  Sound_Play(261, 450) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.5=0
end sub

sub procedure Tone4() ' b
PORTA.4=1
  Sound_Play(246, 450) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.4=0
end sub

sub procedure Tone5() ' a
PORTA.3=1
  Sound_Play(220, 450) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.3=0
end sub

sub procedure Tone6()   'g
PORTA.7=1
  Sound_Play(392, 1200) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.7=0
end sub

sub procedure Tone7()   'd
PORTA.6=1
  Sound_Play(293, 1200) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.6=0
end sub

sub procedure Tone8()   'd
PORTA.3=1
  Sound_Play(220, 1200) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.3=0
end sub


sub procedure Melody() ' Tocar una melodía divertida 1
  Tone1() Tone2()  Tone3()  Tone4() Tone5() Tone6() Tone7() Tone3()
  Tone4() Tone5() Tone6() Tone7() Tone3() Tone4() Tone3() Tone8()
end sub

sub procedure ToneA() ' Tonos utilizados en la función Melody2
  Sound_Play( 880, 50)
end sub

sub procedure ToneC()
  Sound_Play(1046, 50)
end sub

sub procedure ToneE()
  Sound_Play(1318, 50)
end sub

sub procedure Melody2() ' Tocar Melody2
  dim counter as byte
  for counter = 9 to 1 step -1
    ToneA()
    ToneC()
    ToneE()
  next counter
end sub

main: ' Inicio de programa

ANSEL = 0    ' Configurar pines analógicos como digitales de E/S
ANSELH = 0
TRISB = 0xF0 ' Configurar los pines RB7..RB4 como entradas y RB3 como salida
TRISA =0x00
porta = 0x00
C1ON_bit = 0 ' Deshabilitar los comparadores
C2ON_bit = 0


Sound_Init(PORTD, 3)
'Sound_Play(880, 5000)

while TRUE   ' Bucle infinito
  if (Button(PORTB,7,1,1)) then ' Si se presiona PORTB.7 tocar Tone1
      Tone1()
    while (RB7_bit <> 0)
      nop ' Esperar que se suelte el botón
    wend
  end if

  if (Button(PORTB,6,1,1)) then ' Si se presiona PORTB.6 tocar Tone1
      Tone2()
    while (RB6_bit <> 0)
      nop ' Esperar que se suelte el botón
    wend
  end if

  if (Button(PORTB,5,1,1)) then ' Si se presiona PORTB.5 tocar Tone1
    Melody2()
    while (RB5_bit <> 0)
      nop ' Esperar que se suelte el botón
    wend
  end if

  if (Button(PORTB,4,1,1)) then ' Si se presiona PORTB.4 tocar Tone1

    Melody()
    while (RB4_bit <> 0)
      nop ' Esperar que se suelte el botón
    wend
  end if
wend

end. ' Final de programa
Y antes de cada sound y despues, activas y desactivas el puerto que le hayas asignado a ese tono, asi:
Código:
sub procedure Tone1() ' g
PORTA.0=1
  Sound_Play(196, 700) ' Frecuencia = 659Hz, duración = 250ms
PORTA.0=0
end sub

sub procedure Tone2() ' d
 PORTA.6=1
  Sound_Play(293, 1200) ' Frecuencia = 698Hz, duración = 250ms
 PORTA.6=0
end sub

sub procedure Tone3() ' c
PORTA.5=1
  Sound_Play(261, 450) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.5=0
end sub

sub procedure Tone4() ' b
PORTA.4=1
  Sound_Play(246, 450) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.4=0
end sub

sub procedure Tone5() ' a
PORTA.3=1
  Sound_Play(220, 450) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.3=0
end sub

sub procedure Tone6()   'g
PORTA.7=1
  Sound_Play(392, 1200) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.7=0
end sub

sub procedure Tone7()   'd
PORTA.6=1
  Sound_Play(293, 1200) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.6=0
end sub

sub procedure Tone8()   'd
PORTA.3=1
  Sound_Play(220, 1200) ' Frecuencia = 784Hz, duración = 250ms
  PORTA.3=0
end sub
Te dejo la simulacion en proteus para que lo veas en funcionamiento.
Los comentarios de cada linea, solo son validos los del ejemjplo original.
No te guies por los demas comentarios ok?
Un saludo.
Archivos Adjuntos
Tipo de Archivo: rar sonidos y leds.rar (19,0 KB (Kilobytes), 19 visitas)
16/02/2016 #2993


willrey28 dijo: Ver Mensaje
Gracias por responder,y si funciona lo que escribiste ,no se me había ocurrido usar "toggle".
No lo hace precisamente al ritmo de la música pero es una buena solución.
Gracias.
Lo que deseo es realizar una cajita musical como esas cajitas musicales de navidad que se colocan en los arbolitos de navidad y que tienen luces y que varían según las melodías que producen.
He visto en youtube que lo han realizado con un pic pero obviamente el codigo hex ni el diagrama te quieren dar.
Gracias
La duración del encendido apagado así como cual led prendes dura lo que dura la nota ya que cambias el estado una vez que entras o sales al generador de cada una de ellas por lo que de ti depende cuando y que prendes(seguir el ritmo). En ves de la instrucción Toggle puedes activar el bit del puerto individualmente que quieras así como pagarlo con
Código:
 PORTx.x = %01110001(led que quieras prender o apagar)
SOUND.....
......
 PORTx.x = %........
Si no quieres escribir tanto, le asignas una variable el numero correspondiente y luego solo la invocas.
Alternativas hay muchas.

Ric.
16/02/2016 #2994
Moderador

Avatar de D@rkbytes

Se me ocurrió una manera más fácil usando interrupciones. (RB0)
Pero se necesita que las notas tengan espacios. (Notas sin sonido de la instrucción "Sound")

Adjunto el ejemplo probado físicamente con dos LED's.
Con dos 4017 y usando las salidas para los LED's, se puede incrementar el número de LED´s.

Saludos.
Archivos Adjuntos
Tipo de Archivo: rar 16F628A Sound & LED's.rar (35,7 KB (Kilobytes), 22 visitas)
16/02/2016 #2995


Control de tres servos para brazo robot
Adjunto Circuito y programa Probados.
Archivos Adjuntos
Tipo de Archivo: rar Programa.rar (3,1 KB (Kilobytes), 28 visitas)
Tipo de Archivo: rar Control de tres servos.rar (56,1 KB (Kilobytes), 29 visitas)
16/02/2016 #2996

Avatar de willrey28

if then ..pulsadores
Hola .Gracias por ayudarme en mi proyecto de cajita musical....Tengo una pregunta, al usar la instrucción "if..then" en mis proyectos para activar o desactivar algo con pulsadores ,yo uso por ejemplo "if porta.0 and porta.1 then (activo algo) ",es decir al apretar dos pulsadores al mismo tiempo me da un resultado ,pero en la simulacion y en la realidad es dificil que realice
ese resultado ,yo programe por ejemplo que al apretar porta.0 me active el led1 ,al apretar porta.1 me active el led 2 y al apretar al mismo tiempo porta.0 y porta.1 me active el led 3,
pero como dije es muy difícil que me realice esa acción,es decir hay que ser muy preciso al apretar los dos pulsadores para que funcione.Hay alguna solución .
Gracias.
16/02/2016 #2997
Moderador

Avatar de D@rkbytes

Si tiene que funcionar la operación AND sobre los bits seleccionados.
A menos de que estén sucios los pulsadores, no funcionaría correctamente.
Colocar un capacitor de 100 nF. en cada pulsador, puede ayudar a evitar rebotes.

No olvides decirle al compilador los estados a comparar.
La estructura del código es la siguiente:
Código:
 If PORTB.1 = 0 & PORTB.2 = 0 Then
       ; Código a ejecutar
       While (PORTB.1 = 0 Or PORTB.2 = 0): Wend
    EndIf
Nota:
Para presionar dos pulsadores al mismo tiempo en Proteus, se usa la barra espaciadora del teclado.
17/02/2016 #2998


willrey28 dijo: Ver Mensaje
Hola .Gracias por ayudarme en mi proyecto de cajita musical....Tengo una pregunta, al usar la instrucción "if..then" en mis proyectos para activar o desactivar algo con pulsadores ,yo uso por ejemplo "if porta.0 and porta.1 then (activo algo) ",es decir al apretar dos pulsadores al mismo tiempo me da un resultado ,pero en la simulacion y en la realidad es dificil que realice
ese resultado ,yo programe por ejemplo que al apretar porta.0 me active el led1 ,al apretar porta.1 me active el led 2 y al apretar al mismo tiempo porta.0 y porta.1 me active el led 3,
pero como dije es muy difícil que me realice esa acción,es decir hay que ser muy preciso al apretar los dos pulsadores para que funcione.Hay alguna solución .
Gracias.
Sospecho que lo tuyo es problema que, como estas tomado decisiones con el estado del pulsador individualmente, si no esperas un tiempo y realizas la verificación del estado de nuevo, y recién allí actuás en consecuencia, tendrás resultados aleatorios dependiendo de que pulsador presiones primero.

Ric.
17/02/2016 #2999

Avatar de willrey28

Hola .Gracias ,voy a probar con "while.. wend",no lo habia hecho.
Es cierto ricbevi ,me produce resultados aleatorios.A veces le acierto.
05/03/2016 #3000


Estimado TORRES: es posible usar algo de este código para hacer un contador o frecuencimetro o tacómetro, con caracteres grandes, que ocupen 2 lineas de un LCD ??? Algo dice al respecto el comentario Nro. 2963 sobre caracteres gigantes...CURSO DE PROGRAMACION EN PICBASIC.
Aclaro que empecé hace unos pocos días con este lenguaje, y casi no conozco su potencial...Por otro lado, hace años que estoy alejado de la vida estudiantil, más de 30 para ser preciso, ni se conocían las computadores personales por aquellos años, asi que estoy algo oxidado y desactualizado, pero conservo la capacidad de interpretación a pesar de mis años y tengo voluntad para aprender...Si conoce de información para mirar, se lo agradeceré enormemente.

Parece que el sitio no me deja pegar link, ni hacer citas, ni hacerle preguntas por privado, creo que hay que tener un mínimo de mensajes en el foro para ganarse ese derecho.

Saludos !!!
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.