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

Temas similares

14/10/2015 #1

Avatar de Gustavo.gmb

problema con programa simple proton basic (juego de luces)
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:

Código 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=derecha1=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





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?
14/10/2015 #2

Avatar de albertoxx

Pone unas resistencias de 200 Ohms y usa un Interactive LED para que se enciendan, creo que es por eso
15/10/2015 #3

Avatar de Gustavo.gmb

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
15/10/2015 #4
Moderador

Avatar de D@rkbytes

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

Gustavo.gmb dijo: Ver Mensaje
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.
15/10/2015 #5

Avatar de Gustavo.gmb

D@rkbytes dijo: Ver Mensaje
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
15/10/2015 #6
Moderador

Avatar de D@rkbytes

Los LED's no los configures como digitales, las resistencias sí.
La duda con lo del desplazamiento, la comenté en el post #4.
15/10/2015 #7

Avatar de Gustavo.gmb

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?
15/10/2015 #8
Moderador

Avatar de D@rkbytes

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.
15/10/2015 #9

Avatar de Gustavo.gmb

mmm no entiendo la logica de este codigo, como este codigo evita que el bit desplazado se pierda al llegar al final?
15/10/2015 #10
Moderador

Avatar de D@rkbytes

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.
15/10/2015 #11

Avatar de Gustavo.gmb

¿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
15/10/2015 #12
Moderador

Avatar de D@rkbytes

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.
Respuesta
¿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 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.