Curso de programación de PIC en PICBasic Pro

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.
 
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.
 

Adjuntos

  • insoladora.rar
    38.2 KB · Visitas: 50
Última edición por un moderador:
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.
 

Adjuntos

  • Insoladora 2 caras.rar
    363.3 KB · Visitas: 56
Última edición:
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.
PHP:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2016 [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 I = 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 I = 0 then PORTB = Qb 
    if I = 0 then PORTC = Qc
    if I = 1 then PORTB = Tb
    if I = 1 then PORTC = Tc
    if I = 2 then PORTB = ob
    IF I = 2 then PORTC = Oc
    if I = 3 then PORTB = b
    IF I = 3 THEN PORTC = c
    if I = 4 then PORTB = Pb
    IF I = 4 THEN PORTC = Pc
    if I = 5 then PORTB = Eb
    IF I = 5 THEN PORTC = Ec
    if I = 6 then PORTB = Rb
    if I = 6 then PORTC = Rc 
    if I = 7 then PORTB = Ib
    IF I = 7 then PORTC = Ic
    if I = 8 then PORTB = tb
    IF I = 8 THEN PORTC = Tc
    if I = 9 then PORTB = Ob
    IF I = 9 THEN PORTC = Oc 
    if I = 10 then PORTB = b     
    IF I = 10 THEN PORTC = c
    
   
    
    return             ' Retorna a la etiqueta "call"
    
    
    end
 
Última edición por un moderador:
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.
 
Última edición por un moderador:
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.:apreton:
 

Adjuntos

  • sonido.rar
    14.7 KB · Visitas: 34
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.:apreton:

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.
 
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
 
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.
 

Adjuntos

  • sonidos y leds.rar
    19 KB · Visitas: 40
Última edición:
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.
 
Última edición:
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.
 

Adjuntos

  • 16F628A Sound & LED's.rar
    35.7 KB · Visitas: 48
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 .:confused:
Gracias.
 
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:
    [B][COLOR=Blue]If [/COLOR]PORTB.1 = 0 & PORTB.2 = 0 [COLOR=Blue]Then[/COLOR]
       [COLOR=Green]; Código a ejecutar[/COLOR]
      [COLOR=Blue] While[/COLOR] (PORTB.1 = 0 [COLOR=Blue]Or[/COLOR] PORTB.2 = 0): [COLOR=Blue]Wend[/COLOR]
    [COLOR=Blue]EndIf[/COLOR][/B]
Nota:
Para presionar dos pulsadores al mismo tiempo en Proteus, se usa la barra espaciadora del teclado.
 
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 .:confused:
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.
 
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 !!!
 
Última edición:
Saludos tengo el siguiente codigo con lo cual genero un pwm con una frecuancia fija de 1Khz
pero me gustaria variar el ciclo util de esta osea el duty, ya que haciendo un toggle en el pin
correspondiente consigo el 50% de este.
pero me gustaría realizar lo atraves de dos pus button.
agradeceria una ayuda oh comentario del mismo.

Código:
' Programa en Pic Basic Pro
'Int. Por TMR0 a 1 KHZ
@ DEVICE PIC12F683
@ DEVICE PIC12F683, FCMEN_OFF
@ DEVICE PIC12F683, IESO_OFF
@ DEVICE PIC12F683, WDT_ON
@ DEVICE PIC12F683, BOD_ON
@ DEVICE PIC12F683, PWRT_ON
@ DEVICE PIC12F683, PROTECT_OFF
@ DEVICE PIC12F683, MCLR_OFF
@ DEVICE PIC12F683, INTRC_OSC_NOCLKOUT
@ DEVICE PIC12F683, BOD_ON
Define Osc 4 ' Define el Oscilador para 4 Mhz.
I var Byte 
inc var byte
On Interrupt GoTo int_tmr0 '
Symbol TOIF = INTCON.2 ' 
Symbol INTF = INTCON.1 ' 
Symbol LED = GPIO.1 ' 
Pb_Inc	var	GPIO.0 ' 
Pb_Dec	var	GPIO.3 ' 
OSCCON=%01100001
ANSEL = 0
CMCON0 = 7
TRISIO = %11011101     
GPIO  = %00000000     
WPU = 0
OPTION_REG = %10000100 '
INTCON = %10100000 ' 

inc=0
Inicio:
if Pb_Inc = 0 then ' 
    inc=inc+1
ENDIF
IF Pb_Dec = 0 THEN
   inc=inc-1
ENDIF
GoTo Inicio ' 
End
'*********************************************************
Disable
int_tmr0:
If TOIF = 1 Then 
    TMR0 = 240
    toggle led
endif          
Reseteo:
TOIF = 0 
Resume
ENABLE
 
Atrás
Arriba