Dudas de programación en PICBasic Pro

Hola a todos, soy muy nuevo en esto de los pics, y estoy tratando de hacer un programa en el pic basic pro, pero tengo una duda:
Tengo que generar una pausa de 0,5ms, bien se que si pongo PAUSE 1 es una demora de 1ms, pero como hacer ese medio milisegundo me mato. Lo que hice para probar fue PAUSE 1/2, y para mi sorpresa lo compilo sin problemas y hasta en proteus me funciono, eso creo porque no se como medir tan poco tiempo con exactitud.
Esta bien lo que hice o no me va a funcionar en la realidad??Gracias.
 
Esta bien lo que hice o no me va a funcionar en la realidad??
no... hasta donde yo se no se manejan fracciones ha de estar tomando el 1
utiliza otros metodos para menores tiempos... como un I2C o simililar... o una rutina en ensamblador o un bucle.. o el pauseus o no se pero con el pause no creo que lo consigas...
 
Última edición:
Hola:
Te compila bien porque divide 1/2 con números enteros (el pbp no trabaja con decimales) y el resultado es 0.

Sobre hacer 500us = 0.5ms, creo que seria mejor usar código ASM para generar ese retardo o tal vez un Timer pero para esto necesitas saber la frecuencia del oscilador y calculas los tiempos.

Veremos, tal vez alguien sepa más... consulta en:
Curso programacion de pic en bsic pro

Saludos.
 
pero no se olviden que en la simulacion en proteus funciona, y mirando la señal en el osciloscopio de isis y comparandola con una de 1ms, pereceria que funciona.
Hay manera en el isis de medir el tiempo alto con exactitud?
 
Hay manera en el isis de medir el tiempo alto con exactitud?

Usa "Digital analysis" que lo encuentras en la barra de herramientas en el ícono "GraphMode", de la lista que aparece, escoges "DIGITAL", luego la dibujas.
Para graficar debes de usar la herramienta "Voltage Probe Mode", la cual conectas a la pata que quieres medir, luego lo arrastras al plot.

Para graficar, pulsa la tecla "Espaciador" y espera hasta que termine el análisis.
Esa ventana negra se puede maximizar y agregar cursores para que veas los tiempos entre pulsos o lo que quieras...

PD: Sigo dudando sobre lo que solo especulas... mejor ve a lo seguro y pregunta en el tema dedicado al PicBasic o usa Assembler...

Saludos
 

Adjuntos

  • 1.jpg
    1.jpg
    55.2 KB · Visitas: 41
PAUSEUS Period

Pause the program for Period microseconds. Period is 16-bits, so delays can be up to 65,535 microseconds. Unlike the other delay functions (NAP and SLEEP), PAUSEUS doesn't put the microcontroller into low power mode. Thus, PAUSEUS consumes more power but is also much more accurate. It has the same accuracy as the system clock. Because PAUSEUS takes a minimum number of cycles to operate, depending on the frequency of the oscillator, delays of less than a minimum number of microseconds are not possible using PAUSEUS. To obtain shorter delays, use an assembly language routine in an ASM..ENDASM construct.
 
Gracias a todos.
PAUSEUS funciona perfectamente.
Ahora tengo problemas con las rutinas.

Quiero hacer algo asi:

leer el puerto A 1
si es 1 ir a LED1
si es 0 ir a LED2

leer el puerto A 2
si es 1 ir a rutina1
si es 0 ir a rutina2

LED1:
rutina 1:
xxxx
xxxx
xxxx
rutina 2:
yyyy
yyyy
yyyy

LED2:

rutina 1:
xxxx
xxxx
xxxx
rutina 2:
yyyy
yyyy
yyyy

Y obvio que cuando compilo me sale que esta repetido las rutinas. Como puedo hacer para diferenciarlas pero que sean iguales??
 
si son iguales incluso en el nombre mejor llamas con gosub y regresas con return...

Free Sample
Código:
for i =1 to 3
Gosub lubeck
next i

Lubeck:
XXX
XXX
XXX
YYY
YYY
YYY
Return
 
Última edición:
Hola, soy novato en esto de los pic, estoy intentando hacer con 2 pulsadores 3 funciónes, la cual sería lo siguiente, con el primer pulsador encender y apagar el led, y pulsando ambos pulsadores encender otro led y apagarlo de la misma manera, pero encienden los 2 led al intentarlo con ambos pulsadores he estado probando de varias maneras no me funciona, siempre encienden ambos led. Gracias
Código:
  TrisA=%00000111
 TrisB=%00000000
 
@ DEVICE PIC16F628A                                                    
@ DEVICE PIC16F628A, WDT_OFF             
@ DEVICE PIC16F628A, PWRT_OFF            
@ DEVICE PIC16F628A, PROTECT_OFF        
@ DEVICE PIC16F628A, XT_OSC      
 
 BAN VAR BIT
 
SYMBOL LED_RED =  PORTB.7
syMBOL LED_GREEN = PORTB.6
SYMBOL LED_BLUE = PORTB.5

SYMBOL PULS1 = PORTA.0
SYMBOL PULS2 = PORTA.1
symbol PULS3 = PORTA.2
   
 


INICIO:

    IF PULS1 = 1 THEN  
     ban = 1
    iF BAN = 1 then TOGGLE LED_RED
    
    endif 
                         
    If PULS1 AND PULS2 THEN
    BAN = 0
    if baN = 0 THEN TOGGLE LED_BLUE 
    endif 
    
    IF PULS3 = 1 THEN TOGGLE LED_GREEN 
   
      pAUSE 10
     GOTO INICIO 
     
     END
...
 
Código:
Código:
TrisA=%00000111
TrisB=%00000000
 
@ DEVICE PIC16F628A                                                    
@ DEVICE PIC16F628A, WDT_OFF             
@ DEVICE PIC16F628A, PWRT_OFF            
@ DEVICE PIC16F628A, PROTECT_OFF        
@ DEVICE PIC16F628A, XT_OSC      
 
 BAN VAR BIT
 
SYMBOL LED_RED =  PORTB.7
syMBOL LED_GREEN = PORTB.6
SYMBOL LED_BLUE = PORTB.5

SYMBOL PULS1 = PORTA.0
SYMBOL PULS2 = PORTA.1
symbol PULS3 = PORTA.2
   
INICIO:
 if pulse1 then
  pause 50
  IF  puls2 THEN
   TOGGLE LED_BLUE
  else
   TOGGLE LED_RED 
  endif
 endif
 IF PULS3 THEN TOGGLE LED_GREEN 
GOTO INICIO 
END

no se entiende si lo que quieres es que se queden encendidos o no .... con ese codigo se enciende mientras estan encendidos. si quieres que se queden encendidos usa una banderas.
 
Atrás
Arriba