desktop

Curso de programación de PIC en PICBasic Pro

buenas; soy un aficionado a la electrónica y les pido ayuda con un contador de monedas de una sola denominación, específicamente lo que quiero hacer es que cuando el pic 16f876a por el puerto A4 deje de recibir los pulso de una barrera infrarroja detenga el motor de la tolva luego de haber trascurrido unos 5 segundos de la interrupción del tren de pulsos.
La programación lo hice con pic basic pro, intente utilizar Pulsin y count, pero el conteo de pulsos no inicia, el conteo lo realizo por interrupción y tmr0.
PD1: adjunto simulación en proteus y programación.
PD2: el foro esta excelente me ayudo mucho a aprender, utilice varios ejemplos de este foro para la programación de este proyecto gracias.
 

Adjuntos

  • Contadora de moneda lcd1.rar
    49.7 KB · Visitas: 70
roberttorres saludos, falta el circuito de proteus

Saludos Willyfv, si he adjuntado la simulación de proteus, lo he hecho en proteus 8.3 sp2, el cual genera un archivo con la extencion contador2.pdsprj.
pd1: creo que a partir de proteus 8 ya no genera el archivo DSN y si estoy equivocado por favor corrijanme.
PD2. adjunto imagen de circuito en proteus.

Edito:
Tenias Razon, no esta la simulacion en proteus, vuelvo a subir la programacion y la simulacion
 

Adjuntos

  • contador de monedas.jpg
    contador de monedas.jpg
    113 KB · Visitas: 55
  • Contadora de moneda lcd1.rar
    30.1 KB · Visitas: 34
Última edición:
Saludos @Willyfv, como soy nuevo en el foro y tengo pocos mensajes no puedo responder por el privado, entonces aquí te dejo la simulacion hecho en proteus 7.9
 

Adjuntos

  • Contadora de moneda lcd1.rar
    24.4 KB · Visitas: 41
roberttorres

¿Podrías explicar un poco el funcionamiento de cada pulsador y cómo debería trabajar?

Lo otro, es que al iniciar el circuito, el debería de contar de una vez.
 
Última edición por un moderador:
roberttorres

¿Podrías explicar un poco el funcionamiento de cada pulsador y cómo debería trabajar?

Lo otro, es que al iniciar el circuito, el debería de contar de una vez.

Ok, empiezo por el funcionamiento del circuito:
Los pulsadores de unidad, decena y centena sirve para contar una cantidad especifica de monedas, por ejemplo quiero 1 moneda entonces pulso una vez el botón unidad, si quiero 10 pulso decena y si quiero 100 monedas pulso centena y esa cantidad aparece en la pantalla lcd (obs.:al pulsar unidad, decena o centena el conteo de manera automática lo hace de manera descendente). al tener la cantidad de monedas que quiero pulso Start el conteo inicia de forma descendente hasta llegar a cero donde avisa de forma sonora y con un mensaje en pantalla que el conteo ha terminado, luego vuelve a cargar en pantalla la ultima cantidad de monedas a contar pudiendo realizar nuevamente el conteo. Para borrar la pantalla y el ultimo conteo se utiliza el boton clear .
La otra función del circuito es que al presionar start empieza el conteo de monedas de manera ascendente, este conteo lo realiza hasta contar todas las monedas que se encuentren en la tolva o hooper pudiendo detener el conteo con el boton stop.

Es en la segunda función del circuito que necesito ayuda, que al acabar las monedas en el hooper y no reciba los pulsos apague el motor del hooper o tolva.
he utilizado el comando pulsin y ha funcionado a medias, el circuito hace cosas raras

Pd: utilizo un hooper chino de tragamonedas que un amigo me regalo, el cual tiene una barrera infrarroja donde salen las monedas.
 
Cordial saludo alguien tiene información relevante en manejo de motores y comunicación usb.

Cordial saludo alguien tiene información relevante en manejo de motores y comunicación usb.

HTML:
este es un código que tengo para manejo de motor con encoder

'****************************************************************
'*  Name    : control motor con encoder                                      *
'*  Author  : open source                   *
'*  Notice  : Copyright (c) 2015 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 26/12/2015                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************


DEFINE OSC 20   

include "modedefs.bas"


  Lcounter     var   portB.4
  DC2          var   CCPR2L

  TLoop	     var   word  '

  ErrorC     var   word  ' 
  PGain	     var   word  '

  x	     var   word
  y	     var   word    ' 
  z	     var   word  

' 
' 
'

  LCurSpeed     var   word



  LeftReq	      var   word

  ' 

  dirLft	      var   word



    DC2=128	' 


 

    PR2 = $FF         
    T2CON = %00000100  
    CCP2CON = %1100   



    TRISB = %11111101 
    TRISC = %11111101  

   

    LeftReq=20  

    portb.1=1	

    dirLft=1	

'


    x=Lcounter     
    LCurSpeed=0

    TLoop=200      

   


    PGain=10       
   

loop:

  

for z=1 to TLoop
     pause 1			 
     if Lcounter = x then skip3  
     LCurSpeed=LCurSpeed+1	 
     x=Lcounter			

skip3:

next


    gosub adjLeft      
    LCurSpeed=0	
    x=Lcounter		

goto loop		




adjLeft:

  

    ErrorC=LeftReq-LCurSpeed   

     



    ErrorC=ErrorC*PGain
     
     if (abs(ErrorC) = ErrorC) then
          ErrorC=ErrorC/10         '
     else
          ErrorC=0-(abs(ErrorC)/10)
     endif
   

 

     if (dirLft) then	
	if (abs(DC2+ErrorC) <> (DC2+ErrorC)) then 
         	DC2=255
		return
	endif

	if(DC2+ErrorC) > 255 then
		DC2=255
		return
	endif

 	if (DC2+ErrorC) < 128 then	
		DC2=128
		return
	endif

	DC2=DC2+ErrorC

     endif

     if (dirLft=0) then	
	if (abs(DC2-ErrorC) <> (DC2-ErrorC)) then '
		DC2=0
		return
	endif

 	if (DC2-ErrorC) > 128 then	
		DC2=128
		return
	endif

	DC2=DC2-ErrorC			
     endif      
          
    return
    End

Cordial saludo alguien tiene información relevante en manejo de motores y comunicación usb.
 
Última edición:
Hola amigos, tanto tiempo sin aparecer por aqui... :D Les cuento que he comprado un modulo bluetooth HC05 y quiero controlar un pic desde una notebook con bluetooth usando un programa hecho en visual basic 6. les queria preguntar si conocen de alguna libreria disponible para visual basic que permita utilizar el modulo bluetooth que tiene integrado la notebook, ya que yo pense que con solo poner el numero de puerto que utiliza el bluetooth de la notebook se podria compilar el programa, pero no es asi jeje... les dejo un gran saludo a todos y les deseo un muy feliz año nuevo para todos... ;)(y)
 
Les cuento que he comprado un modulo bluetooth HC05 y quiero controlar un pic desde una notebook con bluetooth usando un programa hecho en visual basic 6.
Yo lo he hecho con un módulo Bluetooth Dongle que se conecta a un puerto USB.
De hecho es el mismo que uso para sincronizar B4A con el móvil para depurar programas en Android.
El módulo BlueTooth Radio crea un puerto COM y se puede usar como otro puerto serial, pero por Bluetooth.
Les Les quería preguntar si conocen de alguna librería disponible para Visual Basic que permita utilizar el modulo bluetooth que tiene integrado la notebook, ya que yo pensé que con sólo poner el número de puerto que utiliza el bluetooth de la notebook se podría compilar el programa, pero no es así.
Si existen librerías que sirven para controlar directamente el periférico Bluetooth, pero son de pago y no las he usado.
Una de ellas, es : WCL Developer.
 
Última edición:
Muy buena tarde, compañeros programadores.
Tengo una duda con mi proyecto de Pic Basic, puesto que debo de hacer lo siguiente:

1) Secuenciador de luces con rebote en el centro y orillas.
No obstante, no sé cómo hacer dicho rebote, sólo hago la secuencia. Ayuda por favor. :cry:

Es con el PIC16F887

Si necesitan el archivo, lo subo.
PHP:
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2016 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 20/01/2016                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Define OSC 4 'Define el oscilador para un Cristal de 4MHZ.

TRISA = %11000000    'Configuración el Puerto A
TRISB = %00000000    'Configuración el Puerto B 
TRISC = %11000000    'Configuración el Puerto C 

PORTA = 0         'Inicializa el puerto "A" es decir, se ponen todos los pines en cero.
PORTB = 0         'Inicializa el puerto "B" 
PORTC = 0         'Inicializa el puerto "C"    

Inicio:           'Etiqueta de inicio del programa
      
 
PORTA = %00000001  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 0, RA4 = 0, RA5 = 0, RA6 = 0, RA7 = 1
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00000000  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 0, RA4 = 0, RA5 = 0, RA6 = 0, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00000010  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 0, RA4 = 0, RA5 = 0, RA6 = 1, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00000000  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 0, RA4 = 0, RA5 = 0, RA6 = 0, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00000100  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 0, RA4 = 0, RA5 = 1, RA6 = 0, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00000000  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 0, RA4 = 0, RA5 = 0, RA6 = 0, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00001000  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 0, RA4 = 1, RA5 = 0, RA6 = 0, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00000000  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 0, RA4 = 0, RA5 = 0, RA6 = 0, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00010000  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 1, RA4 = 0, RA5 = 0, RA6 = 0, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00000000  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 0, RA4 = 0, RA5 = 0, RA6 = 0, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00100000  'RA0 = 0, RA1 = 0, RA2 = 1, RA3 = 0, RA4 = 0, RA5 = 0, RA6 = 0, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTA = %00000000  'RA0 = 0, RA1 = 0, RA2 = 0, RA3 = 0, RA4 = 0, RA5 = 0, RA6 = 0, RA7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo
 
PORTB = %00000001  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 1
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00000000  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00000010  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 1, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00000000  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00000100  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 1, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00000000  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00001000  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 1, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00000000  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00010000  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 1, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00000000  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00100000  'RB0 = 0, RB1 = 0, RB2 = 1, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00000000  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %01000000  'RB0 = 0, RB1 = 1, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00000000  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %10000000  'RB0 = 1, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTB = %00000000  'RB0 = 0, RB1 = 0, RB2 = 0, RB3 = 0, RB4 = 0, RB5 = 0, RB6 = 0, RB7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00000001  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 0, RC4 = 0, RC5 = 0, RC6 = 0, RC7 = 1
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00000000  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 0, RC4 = 0, RC5 = 0, RC6 = 0, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo
      
PORTC = %00000010  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 0, RC4 = 0, RC5 = 0, RC6 = 1, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00000000  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 0, RC4 = 0, RC5 = 0, RC6 = 0, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00000100  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 0, RC4 = 0, RC5 = 1, RC6 = 0, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00000000  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 0, RC4 = 0, RC5 = 0, RC6 = 0, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00001000  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 0, RC4 = 1, RC5 = 0, RC6 = 0, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00000000  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 0, RC4 = 0, RC5 = 0, RC6 = 0, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00010000  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 1, RC4 = 0, RC5 = 0, RC6 = 0, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00000000  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 0, RC4 = 0, RC5 = 0, RC6 = 0, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00100000  'RC0 = 0, RC1 = 0, RC2 = 1, RC3 = 0, RC4 = 0, RC5 = 0, RC6 = 0, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

PORTC = %00000000  'RC0 = 0, RC1 = 0, RC2 = 0, RC3 = 0, RC4 = 0, RC5 = 0, RC6 = 0, RC7 = 0
Pause 500          'Realiza una pausa de 500 milisegundos = 1/2 segundo

GOTO Inicio       'Salta a la etiqueta "Inicio" y se repite el proceso.

END
 
Última edición por un moderador:
Muy buena tarde, compañeros programadores.
Tengo una duda con mi proyecto de Pic Basic, puesto que debo de hacer lo siguiente:

1) Secuenciador de luces con rebote en el centro y orillas.
No obstante, no sé cómo hacer dicho rebote, sólo hago la secuencia. Ayuda por favor. :cry:
No sé exactamente a qué te refieres con "rebote", me supongo que es retornar la secuencia.
Si te refieres a eso, se puede hacer con desplazamiento de bits.

Compila y ejecuta/simula el siguiente código para que veas lo que hace sobre los puertos A, B y C.
PHP:
@ 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.   

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 7     ; Bucle de 7 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 7
        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 = $80        ; 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 = $80
    Pause 200
    
    For B0 = 1 To 7
        LEDS_B = LEDs_B >> 1
        Pause 200
    Next B0
    
    LEDs_B = 0
    LEDs_A = $80
    Pause 200
    
    For B0 = 1 To 7
        LEDs_A = LEDs_A >> 1
        Pause 200
    Next B0
    
    GoTo Programa       ; Salta a la etiqueta "Programa" y se repite el proceso.

    End
 
D@kbytes, muchas gracias. Veré como logro seguir.
Como decía anteriormente, no sé mucho de programación, pero gracias.
 
Última edición por un moderador:
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
 
Última edición por un moderador:
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: 57
Ú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:
Atrás
Arriba