• Domingo 19 de Mayo de 2024, 17:52

Autor Tema:  Duda Básica Con Código  (Leído 2721 veces)

shakaran

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Duda Básica Con Código
« en: Jueves 13 de Abril de 2006, 22:56 »
0
Tengo el siguiente código para PIC16F84:

Código: Text
  1. movlw HIGH primo;
  2. movwf PCLATH;
  3. movlw 5;
  4. call primo;
  5.  
  6. primo:
  7. addwf PCL,F;
  8. retlw 1;
  9. retlw 2;
  10. retlw 3;
  11. retlw 5;
  12. retlw 7;
  13. retlw 11;
  14. retlw 13;
  15. retlw 17;
  16.  

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.

Kain589

  • Miembro activo
  • **
  • Mensajes: 53
    • Ver Perfil
Re: Duda Básica Con Código
« Respuesta #1 en: Viernes 14 de Abril de 2006, 01:08 »
0
No recuerdo bien, porque hace tiempoo que no toco el ensamblador creo que esta instruccion esta mal:
movlw HIGH primo;

oldkami

  • Miembro activo
  • **
  • Mensajes: 50
    • Ver Perfil
Re: Duda Básica Con Código
« Respuesta #2 en: Sábado 15 de Abril de 2006, 02:57 »
0
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

Orizabeño

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Duda Básica Con Código
« Respuesta #3 en: Viernes 9 de Junio de 2006, 08:19 »
0
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;

Orizabeño

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Duda Básica Con Código
« Respuesta #4 en: Viernes 9 de Junio de 2006, 08:48 »
0
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

Orizabeño

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Re: Duda Básica Con Código
« Respuesta #5 en: Viernes 9 de Junio de 2006, 10:25 »
0
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