Autor Tema: numeros mayores columnas y filas de una matrix5x10 en mplab  (Leído 3007 veces)

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

Desconectado hlipes

  • PIC10
  • *
  • Mensajes: 2
numeros mayores columnas y filas de una matrix5x10 en mplab
« en: 12 de Septiembre de 2018, 14:06:56 »
necesito ayuda para programar en mplab, necesito hallar los números mayores de las  columna y las filas de la matriz, esto es lo que llevo pero no se como seguir.



LIST P=16F877a
#INCLUDE <P16F877a.INC>

;__CONFIG_CP_OFF &_WDT_OFF &_BODEN_OFF &_PWRITE_ON &_XT_OSC &_WRT_OFF &_LVP_OFF &_CPD_OFF
   CBLOCK 0X20
      F0  EQU D'9'
      F1  EQU D'8'
      F2 EQU D'7'
      F3 EQU D'6'
      F4 EQU D'5'
        F5 EQU D'4'
      F6 EQU D'3'
      F7 EQU D'2'
      F8 EQU D'1'
      F9 EQU D'0'
          F10 EQU D'1'
      F11 EQU D'1'
      F12 EQU D'1'
      F13 EQU D'1'
      F14 EQU D'1'
        F15 EQU D'1'
      F16 EQU D'1'
      F17 EQU D'1'
      F18 EQU D'1'
      F19 EQU D'1'
         F20 EQU D'0'
      F21 EQU D'0'
      F22 EQU D'0'
      F23 EQU D'0'
      F24 EQU D'0'
        F25 EQU D'0'
      F26 EQU D'0'
      F27 EQU D'0'
      F28 EQU D'0'
      F29 EQU D'0'
          F30 EQU D'1'
      F31 EQU D'2'
      F32 EQU D'3'
      F33 EQU D'4'
      F34 EQU D'5'
        F35 EQU D'6'
      F36 EQU D'7'
      F37 EQU D'8'
      F38 EQU D'9'
      F39 EQU D'6'
          F40 EQU D'6'
      F41 EQU D'6'
      F42 EQU D'6'
      F43 EQU D'6'
      F44 EQU D'6'
        F45 EQU D'6'
      F46 EQU D'6'
      F47 EQU D'6'
      F48 EQU D'6'
      F49 EQU D'6'
        FSR EQU X20; RECORRER LA MEMORIA
      N
      NMAX
      V1      
      ENDC
      
BANCO0    MACRO #COPIAR Y PEGAR TEXTO
      BCF      STATUS,RP0
      BCF      STATUS,RP1
      ENDM
BANCO1   MACRO
      BSF      STATUS,RP0
      BCF      STATUS,RP1
      ENDM
      
      ORG      0
      GOTO   INICIO
      ORG      5
Tabla
addwf PCL,F       ; PCL <- PCL + w
retlw B'11000000' ; regresa con 0 en 7 seg
retlw B'11111001' ; regresa con 1 en 7 seg
retlw B'10100100' ; regresa con 2 en 7 seg
retlw B'10110000' ; regresa con 3 en 7 seg
retlw B'10011001' ; regresa con 4 en 7 seg
retlw B'10010010' ; regresa con 5 en 7 seg
retlw B'10000010' ; regresa con 6 en 7 seg
retlw B'11111000' ; regresa con 7 en 7 seg
retlw B'10000000' ; regresa con 8 en 7 seg
retlw B'10010000' ; regresa con 9 en 7 seg


INICIO   
       BANCO1 ; BANCO DE CONFIGURACIONES
        MOVLW B'00000001'; W=000000001
        MOVWF TRISB; TRISB=W
      CLRF   F0
      CLRF   F1
      CLRF   F2
      CLRF   F3
      CLRF   F4
      CLRF   F5
      CLRF   F6
      CLRF   F7
      CLRF   F8
      CLRF   F9
        CLRF    F10
      CLRF    F11
        CLRF    F12
      CLRF   F13
      CLRF   F14
         CLRF    F15
      CLRF   F16
      CLRF   F17
      CLRF   F18
      CLRF   F19
         CLRF    F20
      CLRF   F21
      CLRF    F22
      CLRF   F23
      CLRF    F24
        CLRF    F25
      CLRF   F26
      CLRF   F27
      CLRF   F28
       CLRF   F29
          CLRF   F30
      CLRF   F31
      CLRF   F32
      CLRF   F33
      CLRF   F34
        CLRF    F35
      CLRF   F36
       CLRF   F37
      CLRF   F38
      CLRF   F39
          CLRF   F40
      CLRF   F41
      CLRF   F42
      CLRF   F43
      CLRF   F44
         CLRF    F45
      CLRF   F46
       CLRF    F47
      CLRF   F48
      CLRF   F49
      CLRF    N

      ;INCF    N
      ;MOVLW   d'30'
      ;MOVWF   NMAX
      ;MOVLW    0X1F
      ;MOVWF   FSR

   
BANCO0
      
FOR1      
      MOVF   N,W
      SUBWF   NMAX,W
      BTFSS   STATUS,C


      GOTO   END1

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re:numeros mayores columnas y filas de una matrix5x10 en mplab
« Respuesta #1 en: 12 de Septiembre de 2018, 14:39:31 »
Hola Hlipes. Bienvenido al foro.

MPLAB, no es un lenguaje de programación, es un entorno. Tu estás programando en ASM; y utilizando algunas funciones que permite el entorno.

No entiendo porqué le das valores predeterminado a diferentes posiciones de memoria, para luego borrarlo al iniciar el programa.
Es evidente que no sabes como funciona una tabla en ASM.

El funcionamiento es sencillo. Se arma una tabla como lo hiciste, y desde otro punto de programa llamas a la tabla por un CALL. Antes de llamar a la tabla (o ir a ella, mejor dicho), tenes que cargar en W un valor que deberás calcularlo o ponerlo fijo según necesites.
Por ejemplo, el resultado de una suma, es 50 y quieres mostrarlo en un display de 7 segmento. Creaste una tabla con los valores predeterminados de como se enciende los segmentos.
Para ello descompones el valor 50 en decena y unidad y obtenes 5 y 0 respectivamente. Entonces, cargas con 5 a W y llamas a la tabla con CALL, cuando llegue a la tabla, el PCL saltará 5 posiciones de memoria y regresará con el valor que hace encender el número 5 en el display de 7 segmentos.

Aquí, no entiendo que quieres hacer. No entiendo porqué quieres saber cual es el valor más alto de una tabla, si es algo fijo (es una constante). Ya sabes, desde el momento de programar, cual es el más alto.
Tienes que explayarte mejor.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:numeros mayores columnas y filas de una matrix5x10 en mplab
« Respuesta #2 en: 12 de Septiembre de 2018, 19:41:29 »
Hay muchos mas problemas tambien.

Si usas CBLOCK no uses EQU. El mismo CBLOCK le asigna un valor, por ejemplo:

Código: [Seleccionar]
   CBLOCK 0X20
      F0
      F1
      F2
      F3
      F4
      ENDC

Hace que F0 valga 0x20, F1 vale 0x21 y asi consecutivamente, es lo mismo que hacer:

Código: [Seleccionar]
      F0  EQU 0x20
      F1  EQU 0x21
      F2 EQU 0x22
      F3 EQU 0x23
      F4 EQU 0x24

Tambien, si tu idea era darle un valor a esa posicion de memoria, entonces tu codigo es erroneo.

Ahora veamos tu problema:

Citar
Necesito hallar los números mayores de las  columna y las filas de la matriz,

¿De que matriz hablamos?
Esta ubicada en la RAM? Donde se encuentra ubicada ?

Desconectado hlipes

  • PIC10
  • *
  • Mensajes: 2
Re:numeros mayores columnas y filas de una matrix5x10 en mplab
« Respuesta #3 en: 13 de Septiembre de 2018, 01:32:23 »
pero al quitarle el EQU D'#', me asigna valores a las posiciones de la matriz mayores a 20, y yo necesito que le asigne valores mayores que cero y menores que nueve, para utilizar solo un 7 seg. mi pregunta es, ¿le puedo quitar el CBLOCK y dejarle las asignaciones con el EQU?.
Hablo de una matriz numérica por ejemplo;
A=[ 2  2 3 4 4 5 6 7 8 9
      2  1 0 6 4 5 6 7 8 0
      1 1 1 1 1 1 1  1 1  1
      3 4  4 5 6 7 5 8 8 9
      2 5 6 7 8 9 0  2 3 5]
Y lo que necesito es hallar el número mayor de cada fila y columna, posteriormente mostrarla en un 7 seg.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:numeros mayores columnas y filas de una matrix5x10 en mplab
« Respuesta #4 en: 13 de Septiembre de 2018, 10:34:35 »
Te explico donde es que estas equivocado. Y despues te digo como es que lo deberias hacer de alli vas a tener que buscar informacion sobre com acceder a las tablas.

Citar
pero al quitarle el EQU D'#', me asigna valores a las posiciones de la matriz mayores a 20

CBLOCK/ENDC y EQU hacen lo mismo, "asignan" un numero a la palabra, pero... no es lo que vos te imaginas como asignar. En el micro vos tenes la memoria RAM, la cual tiene ciertas direcciones que podes usar, apartir de la direccion 0x20 del banco 0, podes guardar tus "variables", lo que suelen hacer y explican al enseñarte ASM es que usas CBLOCK o EQU para darle un nombre a esa direccion de la RAM. entonces suponete que tenes:

Código: ASM
  1. F0 EQU 0x20
o que es lo mismo que :
Código: ASM
  1. CBLOCK 0x20
  2. F0
  3. ENDC
(Cblock me ahorra el tener escribir uno por uno los valores)

Esto me va a permitir usar F0 como nombre para guardar sobre la memoria RAM, al hacer:

Código: ASM
  1. CLRF F0

por ejemplo, el compilador al momento de compilar reemplaza el F0 por 0x20, quedando:

Código: ASM
  1. CLRF 0x20

El resultado es poner a 0, el lugar de la RAM en la direccion 0x20. Ahora que ocurre si F0 es 9 como vos queres y haces eso, vas a terminar poniendo a 0 el contenido de la direccion 0x9 o 9 decimal que es lo mismo, y es un registro que afecta al funcionamiento del PIC. Y seguramente esto NO es lo que queres. Vos lo que queres es esto:

Código: ASM
  1. F0 EQU 0x20
  2.  
  3.   MOVLW  D'9'
  4.   MOVWF F0

Ahora si,, mi F0 esta ubicado en la direccion 0x20 (lugar de la RAM para mis datos) y le estoy poniendo el valor 9 decimal dentro.
Espero que notes la diferencia. Que para poner un numero DENTRO de una posicion de la RAM, el micro debe realizarlo.

Pero cargar la RAM con TODOS los valores va a ser absurdo... Ya que estos valores no van a cambiar con el tiempo.
Entonces por que ponerlos en la RAM?, por que no ponerlos en la FLASH, si total no van a cambiar ( a no ser que le programes otros numeros. Y aca es donde usamos una tabla:

Código: ASM
  1. INFO_MATRIZ:          ; Numero de Filas y numero de columnas
  2. DT  5,D'10'    
  3. DATA_MATRIZ:                       ; La matriz
  4. DT   2,2,3,4,4,5,6,7,8,9
  5. DT   2,1,0,6,4,5,6,7,8,0
  6. DT   1,1,1,1,1,1,1,1,1,1
  7. DT   3,4,4,5,6,7,5,8,8,9
  8. DT   2,5,6,7,8,9,0,2,3,5


Esto va a hacer que esos datos se guarden en la FLASH como si fueran instrucciones RETLW, ejemplo si ves la FLASH en la direccion de INFO_MATRIZ verias algo asi:

Código: ASM
  1. RETLW 0x5
  2. RETLW 0xA  ; 10 decimal

Para tomar los datos, vas a tener que usar un CALL y sumarle a tu contador de programa la diferencia, por ejemplo si quisiera entrar a la primer fila, primer columna, deberia hacer el CALL a DATA_MATRIZ y alli sumarle al PCL (ADDWF vas a ver) un valor de 0, si quisiera la segunda columna y la primera fila, le debo sumar 1 al PCL. En fin, busca informacion sobre tablas, esto te va a permitir hacer un loop, en el cual puedas revisar fila a fila. Y podrias tambien usar la RAM para ir almacenando las columnas.

Si observas tambien inclui el numero de filas y de columnas en OTRA tabla, esto es porque te va a servir tambien para hacer los loops para determinar cual es el mas grande de cada fila y columna.

Resumiendotelo:

- Aprende como acceder a una tabla
- Crea un loop inicialmente que pase por la primer fila nomas. (Te va a ser util el numero de columnas)
- Luego creas un loop mas grande que pase por cada fila, (Aca te va a ser util el numero de filas)
- Mostras el resultado en tu display. El tema es que numero vas a mostrar acá, ya que vas a tener un mayor en las columnas y un mayor en las filas.
« Última modificación: 13 de Septiembre de 2018, 12:19:54 por KILLERJC »

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:numeros mayores columnas y filas de una matrix5x10 en mplab
« Respuesta #5 en: 13 de Septiembre de 2018, 12:15:07 »
Me has ganado el "parpadeo" KILLERJC y más clara la explicación no puede ser. Ya le has resuelto la vida al usuario hlipes al 90%, el otro 10% es trabajo de él.

Como siempre increíble KILLERJC.

¡Animo hlipes! Lo más difícil ya lo hizo KILLERJC. A seguir estudiando y practicando (haciendo ejemplos, haciendo simulaciones, etc)

elreypic.


 

anything