SoloCodigo
Programación Específica => Microcontroladores => Mensaje iniciado por: shakaran en Jueves 13 de Abril de 2006, 22:56
-
Tengo el siguiente código para PIC16F84:
movlw HIGH primo;
movwf PCLATH;
movlw 5;
call primo;
primo:
addwf PCL,F;
retlw 1;
retlw 2;
retlw 3;
retlw 5;
retlw 7;
retlw 11;
retlw 13;
retlw 17;
Mi duda esta en:
¿Qué función tienen las instrucciones movlw HIGH primo y movwf PCLATH? ¿Funcionaría correctamente el programa sin estas instrucciones?¿Bajo que condiciones?
Gracias, espero sus respuestas.
-
No recuerdo bien, porque hace tiempoo que no toco el ensamblador creo que esta instruccion esta mal:
movlw HIGH primo;
-
le recomiendo leer cuidadosamente el manual de ensamblador.
la etiqueta primo puede ubicarse en cualquier posicion de memoria, y por lo que veo es una implementación de una tabla sencilla, el pic 16F84 trabaja con registros de ram de 8 bits, pero recuerde que la memoria (ROM) trabaja con registros de 14bits. para efectos de utilizacion podemos suponer que cada registro de memoria ROM o mejor la memoria de programa (ej. la etiqueta primo) se compone de dos partes, la parte baja (LOW) que representan 8 bits (lsbyte) partiendo desde el menos significativo. la parte alta (HIGH) son los bits restantes (msbyte).
por tanto la palabra clave LOW o HIGH le indica al compilador que tome el byte correspondiente. en :
movlw HIGH primo
solo la parte alta (los 6 bits msb del registro de 14 bits) de la etiqueta que representa una posisicon de memoria (primo) se moveran al acumulador.
es decir si primo se encuentra en
0x0060
con la instruccion de arriba se movera un 0x00 a W.
si fuera
movlw LOW primo
entonces W= 0x60
suerte
-
OJO MIRA....
me supongo que sabes como funciona una tabla, una tabla funciona direccionando el control del programa por medio del contador de programa.
EL CONTADOR DE PROGRAMA COMPLETO EN ESTE PIC CONSTA DE 14 BITS, la parte baja es PCL con la cual puedes direccionar los primeros 8 bits de dicho CONTADOR DE PROGRAMA, de tal manera que si tu tabla se localiza dentro de los primeras 255 lineas de codigo es totalmente valido que borres el direccionamiento de la parte alta que estan en las instrucciones:
movlw HIGH primo y movwf PCLATH
perooo si la tabla se encuentra ubicada mas alla de las primeras 255 lineas entonces el diseñador se ve obligado a cargar la parte alta del CONTADOR DE PROGRAMA PCLATH.
MIRA que sucederia si no lo hacemos, mira suponiendo que la direccion de la instruccion en la MEMORIA DE PROGRAMA se encuentra en el lado derecho de la lista.
DIRECCION CODIGO
; borramos las lineas de direccionamiento
; de PCLATH que es la parte alta del PC
0X202 movlw 5 ;W=5
0X203 call primo ;
0X204 primo: ;
0X204 addwf PCL,F; ;PCL=W+F suponiendo que F=0
0X205 retlw 1;
0X206 retlw 2;
0X207 retlw 3;
0X208 retlw 5;
0X209 retlw 7;
0X210 retlw 11; ;el programa DEBERIA BRINCAR AQUI
0X211 retlw 13; ;pero no lo hace por que solo cargamos
0X212 retlw 17; ;PCL y no se direcciono PCLATH de tal
DIRECCION CODIGO
0X200 movlw HIGH primo;
0X201 movwf PCLATH
0X202 movlw 5;
0X203 call primo;
0X204 primo:
0X205 addwf PCL,F;
0X206 retlw 1;
0X207 retlw 2;
0X208 retlw 3;
0X209 retlw 5;
0X210 retlw 7;
0X211 retlw 11;
0X1FF retlw 13;
0X1FF retlw 17;
-
JAJA NO SE QUE PASO NO TERMINABA DE REDACTAR MI EXPLICACION SIN QUERER PRESIONE UN TECLA Y SE SUBIO MI RESPUESTA SIN ESTAR TERMINADA AQUI AHORA SI LA DEJO TERMINADA
OJO MIRA....
me supongo que sabes como funciona una tabla, una tabla funciona direccionando el control del programa por medio del contador de programa.
EL CONTADOR DE PROGRAMA COMPLETO EN ESTE PIC CONSTA DE 14 BITS, la parte baja es PCL con la cual puedes direccionar los primeros 8 bits de dicho CONTADOR DE PROGRAMA, de tal manera que si tu tabla se localiza dentro de los primeras 255 lineas de codigo es totalmente valido que borres el direccionamiento de la parte alta que estan en las instrucciones DE TU CODIGO:
movlw HIGH primo y movwf PCLATH
perooo si la tabla se encuentra ubicada mas alla de las primeras 255 lineas entonces el diseñador se ve obligado a cargar la parte alta del CONTADOR DE PROGRAMA PCLATH.
MIRA que sucederia si no lo hacemos, mira suponiendo que la direccion de la instruccion en la MEMORIA DE PROGRAMA se encuentra en el lado derecho de la lista.
DIRECCION CODIGO
PROGRAMA ; borramos las lineas de direccionamiento
; de PCLATH que es la parte alta del PC
0X202 movlw 5 ;W=5
0X203 call primo ;
0X204 primo: ;
0X204 addwf PCL,F; ;PCL=W+F suponiendo que F=0
0X205 retlw 1;
0X206 retlw 2;
0X207 retlw 3;
0X208 retlw 5;
0X209 retlw 7;
0X210 retlw 11; ;el programa DEBERIA BRINCAR AQUI
0X211 retlw 13; ;pero no lo hace por que solo cargamos
0X212 retlw 17; ;PCL y no se direcciono PCLATH de tal
;manera que el codigo en vez de
;direccionar la instruccion 0x210 brincara
;a lo que halla en la direccion por ejemplo
;la 0x010 o la 0x110 dependiendo el ultimo
;valor cargado en PCLATH es por
;eso que hay que ponerle ese 2 en la parte
;alta del PC
DIRECCION CODIGO
0X200 movlw HIGH primo ;A diferencia del codigo anterior
0X201 movwf PCLATH ;este si usa PCLATH y lo hace
0X202 movlw 5; ;pasando la parte alta de primo.
0X203 call primo; ;si vemos, primo esta en la 0x204
;y le estamos metiendo ese 2
; a PCLATH tal y como lo necesita.
0X204 primo: ;movlw carga W con una literal K
0X205 addwf PCL,F; ;(un valor directo),al ser una
0X206 retlw 1; ;etiqueta, entonces se cargara
0X207 retlw 2; ;su direccion directamente pero
0X208 retlw 3; ;con HIGH solo cargamos la
0X209 retlw 5; ;parte alta que es el 2.
0X210 retlw 7;
0X211 retlw 11; ;en este caso el codigo si brincara
0X1FF retlw 13; ;correctamente a esta posicion
0X1FF retlw 17;
espero halla quedado claro, yo en lo personal te recomiendo que siempre carges PCLATH aunque no superes las 255 localidades de memoria, no importa por que simplemente lo cargarias con CERO en dado caso, y de esta forma te olvidas se especulaciones de que si la tabla esta mas alla de 255 o mas para aca.
ALGO BIEN INTERESANTE Y UNA DUDA QUE LES DEJO POR AKI ES ¿QUE SUCEDERIA SI A LA MITAD DE LA TABLA EXISTE UNA TRANSICION DE LA PARTE ALTA DEL PC POR EJEMPLO UN 0x2FF Y EN EL VALOR SIGUIENTE DE LA TABLA TE ENCUENTRES QUE LA INSTRUCCION OCUPA EL 0x300 COMO DIRECCIONO LOS DOS PCLATH EN LA MISMA TABLA?
BUENO ME DESPIDO SALUDOS DESDE ORIZABA Y OJALA TE HALLA SERVIDO MI AYUDA, SI TE SIRVIO NO ME ENOJO SI ME RESPONDES CON SOLO DAR LAS GRACIAS..
ATTE: ALEJANDRO
SALUDOS DESDE ORIZABA, VERACRUZ. MEXICO
-
COMETI UN ERROR......
MOVLW 5 ; W=5
ADDWF PCL,F ; REALMENTE TRADUCE PCL=PCL+W--->PCL=PCL+5 Y NO
; COMO LO HABIA PUESTO DE PCL=W+F. UN POCO DE SUEÑO
; ME HIZO EQUIVOCAR JEJE.
DE TODOS MODOS EL BRINCO SE DA A LA MISMA ZONA AL QUINTO ELEMENTO
DE LA TABLA Y TODA LA EXPLICACION ES TOTALMENTE VALIDA.
SOLO COMO OBSERVACION: SE ME HACE ILOGICO EL CODIGO, NO ENTIENDO POR QUE USAR UNA TABLA QUE SIEMPRE BRINCARA AL QUINTO ELEMENTO DE LA TABLA, ENTONCES ¿¿PARA QUE EXISTE LA TABLA??
ME SUPONGO QUE LO QUE QUIERES HACER ES ESPECIFICAR QUE W=PORTA QUE ES LA DIRECCION 5 DEL BANCO 0.
SI ESE ES EL CASO LA LINEAS CORRECTAS ES:
MOVF 5,0 ;W=PUERTO A