TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Mario 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 :?
-
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
-
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.