problema con programa simple proton basic (juego de luces)

#1
saludos a todos

he estado probando un programa que hice para proton basic el cual trata de iluminar leds secuencialmente ordenados en forma circular, cuando la secuencia completa 5 vueltas cambia de sentido de giro, el programa es simple:

PHP:
Device = 18F4550                   'Dispositivo a utilizar
Declare Xtal = 4                   'Cristal a utilizar
TRISB = 0
TRISD = 0

Inicio:

Dim LEDS As Word
Dim LEDSbajo As LEDS.LowByte
Dim LEDSalto As LEDS.HighByte
Dim vueltas As Byte                'Variable que cuenta nuemro de vueltas
Dim ciclo As Byte                  'Variable que cuenta 16 pasos para una vuelta
Dim sentido As Bit                 'Variable que indica la direccion

sentido = %0                       'Definiendo el sentido de giro 0=derecha, 1=izquierda
LEDS = 1
PORTB = LEDSbajo
PORTD = LEDSalto

Iteracion:

sentido = sentido + %1
For vueltas = 0 To 4 Step 1        'Contando las vueltas que dio la ruleta
    For ciclo = 0 To 15 Step 1     'Contando 16 pasos para completar una vuelta
        If sentido = %1 Then       '¿En que sentido esta acualmente?
           LEDS = LEDS << 1        'Desplazando hacia la izquierda
           PORTB = LEDSbajo
           PORTD = LEDSalto
           DelayMS 200   
        Else
           LEDS = LEDS >> 1        'Desplazando hacia la derecha
           PORTB = LEDSbajo
           PORTD = LEDSalto
           DelayMS 200   
        EndIf 
    Next   
Next 
GoTo Iteracion
End
el problema es que en proteus no quiere simular, simplemente no ilumina absolutamente naada, no se muestran los estados en los pines del microcontrolador, pero sin embargo si reviso los registros, los registros LATB y LATD (o PORTB y PORTD) si se modifican o_O

Ver el archivo adjunto Ruleta.BMP

Captura.PNG

no entiendo cual podria ser el error, me dan una mano?

EDIT: ya entendi por que pasa eso, me di cuenta que los puertos se quedan configurados como entradas... lo que no entiendo es por que pasa eso? acaso cuando uno hace esta operacion

PORTB = 01010101

directamente el compilador no lo convertiria a salida mostrando el valor ?

tenia una duda mas , ¿por que no puedo hacer " LEDS << 1 " ?? me sale error al compilar y tengo que ponerlo directamente asi "LEDS = LEDS << 1 "...... y al desplazar el bit hasta el final desaparece, no vuelve al comienzo, ¿hay otro tipo de desplazamiento que vuelva el bit al comienzo?
 
Última edición:
#2
Pone unas resistencias de 200 Ohms y usa un Interactive LED para que se enciendan, creo que es por eso
 
#3
no es ni por el primero ni por lo segundo que dijiste, es lo que mencione en el post... al parecer si o si hay que declarar esos puertos como salidas al principio, pense que al darle un valor directamente los mostraba por el puerto

pero tuve otro problema, el cual pensaba el al hacer LEDS = LEDS << 1 iba a desplazar un bit, y cuando llega al final desaparece, yo pensaba que volvia al principio, preguntaba si tal vez hay alguna otra instruccion que cumpla esa funcion
 
Última edición:
#4
Para simular con LED's u otros dispositivos, muchas veces no hace falta colocar resistencias.
Y si se colocan en los LED, éstas deben definirse como digitales para no sobrecargar al simulador y que enciendan con mejor brillo.

El problema de ese programa es que en ningún momento se han declarado los puertos como salidas.
Falta establecer:
TRISB = 0
TRISD = 0

--Editado--

Pero tuve otro problema, el cual pensaba el al hacer LEDS = LEDS << 1 iba a desplazar un bit, y cuando llega al final desaparece, yo pensaba que volvía al principio, preguntaba si tal vez hay alguna otra instrucción que cumpla esa función
Si al final de la secuencia no recargas la variable, se seguirán desplazando los bits y es por eso que no empezará desde el principio.
 
Última edición:
#5
Para simular con LED's u otros dispositivos, muchas veces no hace falta colocar resistencias.
Y si se colocan en los LED, éstas deben definirse como digitales para no sobrecargar al simulador y que enciendan con mejor brillo.

El problema de ese programa es que en ningún momento se han declarado los puertos como salidas.
Falta establecer:
TRISB = 0
TRISD = 0
hola D@rkbytes, si ese problema ya lo solucione, ya habia hecho lo que dijiste, el problema es lo de desplazamiento que mencione, y no sabia eso de que se podia cambiar a digital los led, gracias por la informacion
 
#7
hay alguna funcion o comando para hacer rotacion de bits? y no desplazamiento? es decir para que no desaparezca el bit al final, o tendria que hacerlo manualmente?
 
#8
En Basic y otros lenguajes, se usan los operadores Shift Left "<<" y Shift Right ">>"

Ejemplo de Proton:
Código:
    Dim Value1 as Word 
    Dim Loop as Byte   
    Value1 = %1111111111111111 

    For Loop = 1 to 16        ' Repeat with Loop = 1 to 16. 
        Print Bin Value1 << Loop    ' Shift Value1 left Loop places. 
    Next
O sea, tal como lo mencionaste anteriormente.
 
Última edición:
#10
No se pierde, obviamente cuando la variable supere el valor 65535, se desbordará y se iniciará nuevamente en 0.
Ese ejemplo tiene un bucle definido del 1 al 16, por lo tanto siempre que se ejecute, sólo habrá un desplazamiento de bits del 1 al 16.
Pero en el bucle del programa que expones, la variable LEDS, sólo es inicializada al principio del programa.
Por ese motivo se seguirán desplazando los bits hasta que se desborde, ya que no se vuelve a inicializar.
 
Última edición:
#11
¿que hace exactamente el Print Bin ? y como podria desplazar los bits de la variable si su valor es Value1 = %1111111111111111 ? me tiene un poco confundido eso
 
#12
El valor %1111111111111111 que está en binario, equivale a 65535 en decimal. (16 Bits.)
Que es el valor máximo permitido para una variable del tipo Word.
Y lo que hace ese ejemplo, es desplazar los bits de ese número hacia la izquierda.

Entonces, como se usa "Bin" (Mostrar en Binario), se debe realizar lo siguiente:
1111111111111111
1111111111111110
1111111111111100
1111111111111000
1111111111110000
1111111111100000
1111111111000000
1111111110000000
1111111100000000
Y así hasta el bit 16 (MSB) porque se está desplazando hacia la izquierda.
 

Temas similares


Arriba