TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: fr4n en 28 de Abril de 2011, 15:45:11
-
Hola a todos, tengo que meter un buclecillo en asm en mi codigo ccs, se trata de un bucle for, es para enviar una variable tipo byte a un pin concreto de mi pic, bit a bit.
yo usaba este bucle:
for(i=0;i<8;i++)
output_bit(PIN_X, shift_left(&VAR,1,0));
¿Cual seria su equivalencia en asm?
PD: He estado viendo el tutorial de asm desde cero y esto que pregunto no me queda muy claro.
En el bucle asm añadiria una serie de "NOP" para controlar el tiempo entre bit y bit (bitrate), entiendo que cada instrucción dura 4 ciclos de reloj para incremetar el CP y pasar a la siguiente instrucción, no?
-
no has dicho que pic vas a utilizar.no todos los pic tienen las mismas instrucciones.
-
Mira el siguiente ejemplo:
http://www.todopic.com.ar/foros/index.php?topic=24720.msg201414#msg201414
Saludos!
-
no has dicho que pic vas a utilizar.no todos los pic tienen las mismas instrucciones.
El 18F4550 con cristal de 20MHz y funcionando a 48Mhz
Gracias!
-
ok.pues aqui te dejo tambien un trozo de codigo de un programa que realize para un 16f84.creo que no hay ningun problema para ese pic.en todo caso igual puedes optimizar algo mas el codigo.
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<SUBPROGRAMA DE ENVIO DE DATOS>>>>>>>>>>>>>>>>>
ENVIO bsf PORTB,1 ;establecer la salida a 1(evitar errores primer caracter)
ENVIO2 clrf CONTADOR ;borra el registro CONTADOR de bits
bcf PORTB,1 ;bit START
call RETARDO
ENV_1 btfsc DATO,0 ;comprueva bit 0 del registro DATO(comprovacion de bits a enviar)
call UNOS ;salta a UNOS si el bit leido es 1
btfss DATO,0 ;comprueva bit 0 del registro DATO(comprovacion de bits a enviar)
call CEROS ;salta a CEROS si el bit leido es 0
ENV_2 rrf DATO,F ;rota a la derecha el registro DATO
incf CONTADOR,F ;incrementa CONTADOR (registro contador de bits)
movlw 0x08 ;valor de bits a leer
xorwf CONTADOR,W ;comprueva si son 8
btfss STATUS,Z ;si no es 8 repite la comprovacion del siguiente bit
goto ENV_1 ;comprueva de nuevo
bsf PORTB,1 ;establecer a 1 la salida
return ;retorna
UNOS bsf PORTB,1 ;saca valor 1 por pin 1 de PORTB
call RETARDO ;tiempo de un bit
return ;retorna
CEROS bcf PORTB,1 ;saca valor 0 por pin 1 de PORTB
call RETARDO ;tiempo de un bit
return ;retorna
-
Muchisimas gracias a los 2! :)
El problema que yo veo es que lo que necesito enviar es una variable que tengo en mi programa de C, que no se en que posición de la memoria se encuentra para acceder a ella desde asm. Disculpad si no me explico bien ya que en asm estoy muy verde, por eso mi programa es en C :oops: Solo se trataba de meter ese "pequeño" bucle en asm dentro de mi programa en CCS, entonces todas las variables y todas las cosas las tengo declaradas en C en mi programa.
-
yo de C no se mucho.pero como en cualquer programa,las variables supongo que estaran definidas en algun sitio.lo que hace falta seria saber en que posicion de la memoria esta esa variable.y luego con un acceso indirecto leer ese valor.
-
En CCS presiona F12 y se abre la ventana de ayuda, allí coloca #asm y revisa el ejemplo ;-)
Saludos!
-
En CCS presiona F12 y se abre la ventana de ayuda, allí coloca #asm y revisa el ejemplo ;-)
Saludos!
En el ejemplo usa las variable declarada en C, normalmente.
Pero anteriormente al ejemplo dice:
"Be aware that any C code after the #ENDASM and before the end of the function may corrupt the value."
Tampoco entiendo porque pone # delante de un número en hexadecimal.
Saludos!