Autor Tema: ¿Cómo hacer un FOR en ensamblador?  (Leído 9171 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
¿Cómo hacer un FOR en ensamblador?
« en: 03 de Noviembre de 2006, 04:30:57 »
Hola.

Una compañera de trabajo entró a un curso relámpago de PICs y me pidió ayuda..... ahora yo pido ayuda  :D

Se trata de hacer un programa que convierta un byte paralelo en forma serial.

Se mandará ese byte bit por bit con retardo de 30ms entre bit; contará con un bit de inicio y un último de paro. Nada de RS232, es una práctica que le dejaron.

La verdad sea dicha no recuerdo muy bien cómo programar en ensamblador y no le pude hacer lo que pidió pero, realicé un programa que hace lo que ella quiere pero de mala manera.

Me explico:
Antes que nada se pone en alto PORTA,0 por 30ms.
Lo que hace el programa es cargar el BYTE del PUERTB y pasarlo a PORTA y llama al retardo.
Se recorre el BYTE de PORTB y se pasa a PORTA, se llama a rutina.

Todo eso se repite ocho veces y por último se pone en alto PORTA,0 por 30ms.

Sé que no es lo mejor pero para efectos de demostración cumple con el cometido de convertir un BYTE de entrada y sacar ese BYTE por una terminal.

El código está de manera que se recorre 8 veces pero de ésta manera:
RRF   DATO,W      ;"Rotando" DATO hacia la derecha y guardándolo en W
MOVWF   DATO      ;Cargando nuevo valor de DATO ya desplazado.   
MOVWF   PORTA      ;Moviendo segundo Bit de DATO a Puerto A.
CALL   DEMORA      ;30ms


Y se repite ocho veces.

Quiero saber si alguien me puede ayudar a implementar un FOR.

Recuerdo que se usan los BTFSS o DECFSZ o algo así.

Anexo la información.

PD: Es un 16F84A.

PD#2: Eso de salirse de ensamblador para irse a BASIC no conviene mucho  :?
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado dhmejia

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 260
Re: ¿Cómo hacer un FOR en ensamblador?
« Respuesta #1 en: 03 de Noviembre de 2006, 09:53:58 »
Te pongo el código que hace precisamente lo que necesitas, espero sea de utilidad.

Cualquier cosa no dudes en preguntar.

saludos.

Agregar en el programa la definicio de los registros contador y Rotar, tambien definir el pin de salida para el bit Dts, por ejemplo


#define   Dts   PORTA,0

Ciclo   bcf      Dts   ;bit de inicio
     call        Retardo
          bsf        Dts
     movfw    PORTB   ;Leer puerto B -> dato paralelo
     call        Enviar   ;
     bsf       Dts   ;bit de parada
     call       Retardo
     goto      Ciclo

;con rlf se rota hacia la izquiera, por lo tanto se envia en serial primero el bit de más peso, para enviar primero el bit de menos peso solo es cambiar por rrf.

Enviar    movwf        Rotar      ;carga Rotar con el valor que tiene W, o sea con lo que hay en el puerto B
       movlw   8      ;Cantidad de bits a enviar, se cargan en contador
       movwf   Contador
Serial     rlf             Rotar,f      ;se rota el registro que se cargo con el valor del PB a través del carry
       btfsc     STATUS,C   ;exploro el bit que salió al carry al rotar el registro
          goto     Prende      ;
       bcf              Dts      ;si es cero, pongo en cero el bit de salida
       goto     Retar      ;si es uno, prendo el bit de salida
Prende   bsf          Dts
Retar    call            Retardo      ;aca se llama al retardo que debe ser de 30 ms
      decfsz    Contador,f   ;decremento el contador y salto si es cero
      goto             Serial
     return         ,cuando es cero es porque salieron los 8 bits
Pereira - Colombia

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: ¿Cómo hacer un FOR en ensamblador?
« Respuesta #2 en: 03 de Noviembre de 2006, 14:11:44 »
Gracias.

Eso es mejor de lo que se había planteado.

Se me cerró la mente y la idea de rotar a la derecha no es apropiado ya que estaba pensando no en RS232 sino en algo como LSB MSB cuando uno utiliza SHIFTIN o SHIFTOUT en algún compilador.

Es mejor mandar el bit de mayor peso primero para que lleve un orden. Bajo el supuesto que esa información se guardare en algún registro, es mejor que llegue de mayor a menor peso.

Algo recordaba sobre DECFSZ para implementar un FOR.

Ahora miro la hoja de datos (de un 18F452) y me doy cuenta que en el bit Carry se puede ver qué bit está pasando  :shock:

Deberé meterme más al ensamblador, lo he dejado muy olvidado  :(

Gracias y comentaré cómo le fue.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee


 

anything