Autor Tema: Array  (Leído 2200 veces)

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

Desconectado Eigen

  • PIC10
  • *
  • Mensajes: 19
Array
« en: 13 de Junio de 2006, 14:28:57 »
Hola amigos, estoy aprendiendo con ayuda del foro a programar PICs, ya he manejado displays de 7 segmentos, teclados matriciales y LCD, pero ahora me he topado con dos problemas para un programa que estoy diseñando y yo creo que es debido a que todavía no domino el manejo de los arreglos. Bueno se trata de lo siguiente:
quiero que por medio de un teclado matricial se programe el tiempo en que se quiere que se enciendan 8 leds (cada uno con tiempos iguales o diferentes) con resolución de décimas de segundo y aquí se origina el primer problema, si sólo se presiona una tecla y después enter (otra tecla definida para ello), ésto representa 0-9 décimas, pero si se presionan dos teclas antes del enter, representa 10-99 décimas, para tres 100-999, etc. para ésto necesitaría multiplicar y sumar las teclas cuando son más de una, lo que no sé es cómo hacer que el programa diferencíe cuando debe multiplicar el primer dato por 1, 10, 100, etc.
El segundo problema se da cuando ya quiero encender el led, porque necesito ordenar las salidas desde la de menor tiempo hasta la de mayor (puede encenderse primero el led de PB.3, después el de PB0, o con cualquier combinación, e incluso pueden encenderse dos leds al mismo tiempo o incluso algunos no encenderse)..
También necesito que los datos programados puedan quedar grabados si se corta el suministro de energía. Para ésto pienso asignar variables a direcciones de la EPROM, si estoy en lo correcto, no creo tener gran problema.
Por favor si alguien puede orientarme se los agradecería bastante, estoy leyendo el manual en castellano, pero hasta ahora no lo he podido resolver. :-)

Desconectado LordLafebre

  • Moderador Global
  • DsPIC30
  • *****
  • Mensajes: 3529
    • Micros & micros
Re: Array
« Respuesta #1 en: 13 de Junio de 2006, 15:18:34 »
Hola:

Postea el codigo que tienes para ver en que se te puede ayudar, en el poco tiempo que tengo ahora...  :(

Desconectado Eigen

  • PIC10
  • *
  • Mensajes: 19
Re: Array
« Respuesta #2 en: 13 de Junio de 2006, 15:46:41 »
Gracias por responder a mi mensaje, ésto es lo que llevo del código, utilizo el PIC16F877A, aún no defino las salidas porque no se cómo organizarlas, pero pienso hacerlo por el puerto C

DEFINE OSC 4

A VAR PORTD.0               ;nombres para los pines de las filas
B VAR PORTD.1
C VAR PORTD.2
D VAR PORTD.3

UNO     VAR PORTD.4         ;nombres para los pines de las columnas
DOS     VAR PORTD.5
TRES    VAR PORTD.6
CUATRO  VAR PORTD.7

PAUSE 500                                   ;pantalla de bienvenida
LCDOUT $FE,1,       "SECUENCIADOR    "
LCDOUT $FE,$C0,     "     PROGRAMABLE"
LCDOUT $FE,$D0,     "DESARROLLADO POR"
PAUSE 2000
LCDOUT $FE,1,       "URIEL F. PONCE  "
PAUSE 2000
LCDOUT $FE,1,       "                "
LCDOUT $FE,$90,     "                "
LCDOUT $FE,1,       " SECUENCIADOR "
PAUSE 500
LCDOUT $FE,$D0,     "                "
LCDOUT $FE,$90,     "                "
LCDOUT $FE,$C0,     "                "
PAUSE 200
LCDOUT $FE,$90,     "INGRESE DATOS   "
PAUSE 200

inicio:                                       ;espera datos
LCDOUT $FE,$9D,     "."
PAUSE 500
LCDOUT $FE,$9D,     ".."
PAUSE 500
LCDOUT $FE,$9D,     "..."
PAUSE 500
LCDOUT $FE,$9D,     "   "
pause 500

        LOW C                                 
IF TRES   = 0 THEN
    gosub salidas                             ;opción de programación
else

IF cuatro   = 0 THEN
    gosub memoria                             ;opción datos grabados
else
pause 10
    goto inicio
    endif
endif

salidas:
LCDOUT $FE,$C0,     "  # DE SALIDA?  "        ;espera número de entrada
        LOW A                       
    IF DOS    = 0 THEN lcdout $FE,$90,"        1       "   
    IF TRES   = 0 THEN lcdout $FE,$90,"        2       "
    IF CUATRO = 0 THEN lcdout $FE,$90,"        3       "
        HIGH A                     
        LOW B                       
    IF UNO    = 0 THEN lcdout $FE,$90,"        4       "   
    IF DOS    = 0 THEN lcdout $FE,$90,"        5       "
    IF TRES   = 0 THEN lcdout $FE,$90,"        6       "
    IF CUATRO = 0 THEN lcdout $FE,$90,"        7       "
        HIGH B                     
        LOW C                     
    IF UNO    = 0 THEN lcdout $FE,$90,"        8       "
        HIGH C                     
    pause 10
    GOTO SALIDAS                       
END

memoria:
LCDOUT $FE,$C0,     "LISTO         "
end

cuando va a la etiqueta de salidas, es donde se tomarán y guardarán los datos, por ahora sólo he puesto la salida a LCD. He visto en algunos ejemplos del foro, que los datos se pueden ordenar en un vector (nombre[dato]), lo que no se es cómo ordenarlos.

Desconectado Eigen

  • PIC10
  • *
  • Mensajes: 19
Re: Array
« Respuesta #3 en: 13 de Junio de 2006, 18:37:55 »
Aquí posteo las modificaciones que he hecho a partir de la etiqueta salidas, y es aquí donde necesito la ayuda, el valor ingresado en el teclado quiero guardarlo en la dirección "salida" de la eeprom, para poder leerla después y ejecutarla. Una pregunta más, al compilar el código me aparece un warning que dice: code crosses boundary @800h, que problema me puede representar ésto. Agradezco de antemano la ayuda. :shock:

salidas:
LCDOUT $FE,$C0,     "  # DE SALIDA?  "        ;espera número de salida
        LOW A                       
    IF DOS    = 0 THEN lcdout $FE,$90,"        1       ":salida=1:PAUSE 500:gosub tiempo   
    IF TRES   = 0 THEN lcdout $FE,$90,"        2       ":salida=2:PAUSE 500:gosub tiempo     
    IF CUATRO = 0 THEN lcdout $FE,$90,"        3       ":salida=3:PAUSE 500:gosub tiempo   
        HIGH A                     
        LOW B                       
    IF UNO    = 0 THEN lcdout $FE,$90,"        4       ":salida=4:PAUSE 500:gosub tiempo   
    IF DOS    = 0 THEN lcdout $FE,$90,"        5       ":salida=5:PAUSE 500:gosub tiempo   
    IF TRES   = 0 THEN lcdout $FE,$90,"        6       ":salida=6:PAUSE 500:gosub tiempo   
    IF CUATRO = 0 THEN lcdout $FE,$90,"        7       ":salida=7:PAUSE 500:gosub tiempo   
        HIGH B                     
        LOW C                     
    IF UNO    = 0 THEN lcdout $FE,$90,"        8       ":salida=8:PAUSE 500:gosub tiempo   
        HIGH C                     
    pause 10
    GOTO SALIDAS                       
END

tiempo:
LCDOUT $FE,$C0,     "SALIDA:",#SALIDA,"        "
LCDOUT $FE,$90,     "INGRESE TIEMPO: "              ;espera ingreso de tiempo
        LOW A                       
    IF UNO    = 0 THEN lcdout $FE,$D0,"        0       "   
    IF DOS    = 0 THEN lcdout $FE,$D0,"        1       "   
    IF TRES   = 0 THEN lcdout $FE,$D0,"        2       "
    IF CUATRO = 0 THEN lcdout $FE,$D0,"        3       "
        HIGH A                     
        LOW B                       
    IF UNO    = 0 THEN lcdout $FE,$D0,"        4       "   
    IF DOS    = 0 THEN lcdout $FE,$D0,"        5       "
    IF TRES   = 0 THEN lcdout $FE,$D0,"        6       "
    IF CUATRO = 0 THEN lcdout $FE,$D0,"        7       "
        HIGH B                     
        LOW C                     
    IF UNO    = 0 THEN lcdout $FE,$D0,"        8       "
    IF DOS    = 0 THEN lcdout $FE,$D0,"        9       "
    IF TRES   = 0 THEN lcdout $FE,$D0,"        A       "
    IF CUATRO = 0 THEN lcdout $FE,$D0,"        B       "
        HIGH C                     
        LOW D                     
    IF UNO    = 0 THEN lcdout $FE,$D0,"        C       "
    IF DOS    = 0 THEN lcdout $FE,$D0,"        D       " 
    IF TRES   = 0 THEN lcdout $FE,$D0,"        E       "
    IF CUATRO = 0 THEN lcdout $FE,$D0,"        F       "
        HIGH D                       
    pause 10                       
    GOTO tiempo   
end

memoria:
LCDOUT $FE,$C0,     "                "
LCDOUT $FE,$90,     "TEST O DISPARO? "        ;espera opción test o disparo
end

Desconectado derinium

  • PIC10
  • *
  • Mensajes: 35
Re: Array
« Respuesta #4 en: 13 de Junio de 2006, 19:26:35 »
IF DOS    = 0 THEN lcdout $FE,$90,"        1       ":salida=1:PAUSE 500:gosub tiempo   
    IF TRES   = 0 THEN lcdout $FE,$90,"        2       ":salida=2:PAUSE 500:gosub tiempo     
    IF CUATRO = 0 THEN lcdout $FE,$90,"        3       ":salida=3:PAUSE 500:gosub tiempo   
        HIGH A                     
        LOW B                       
    IF UNO    = 0 THEN lcdout $FE,$90,"        4       ":salida=4:PAUSE 500:gosub tiempo   
    IF DOS    = 0 THEN lcdout $FE,$90,"        5       ":salida=5:PAUSE 500:gosub tiempo   
    IF TRES   = 0 THEN lcdout $FE,$90,"        6       ":salida=6:PAUSE 500:gosub tiempo   
    IF CUATRO = 0 THEN lcdout $FE,$90,"        7       ":salida=7:PAUSE 500:gosub tiempo   

Creo que eso no es correcto...
No sería así ?

IF DOS    = 0 THEN
lcdout $FE,$90,"        1       "
salida=1:PAUSE 500:gosub tiempo
ENDIF   
    IF TRES   = 0 THEN
lcdout $FE,$90,"        2       "
salida=2:PAUSE 500:gosub tiempo     
ENDIF
    IF CUATRO = 0 THEN
lcdout $FE,$90,"        3       "
salida=3:PAUSE 500:gosub tiempo   

        HIGH A                     
        LOW B
ENDIF
   

Y así con todos los if ???

En lo siguiente :

tiempo:
LCDOUT $FE,$C0,     "SALIDA:",#SALIDA,"        "
LCDOUT $FE,$90,     "INGRESE TIEMPO: "              ;espera ingreso de tiempo
        LOW A                       
    IF UNO    = 0 THEN lcdout $FE,$D0,"        0       "   
    IF DOS    = 0 THEN lcdout $FE,$D0,"        1       "   
    IF TRES   = 0 THEN lcdout $FE,$D0,"        2       "
    IF CUATRO = 0 THEN lcdout $FE,$D0,"        3       "
        HIGH A                     
        LOW B                       
    IF UNO    = 0 THEN lcdout $FE,$D0,"        4       "   
    IF DOS    = 0 THEN lcdout $FE,$D0,"        5       "
    IF TRES   = 0 THEN lcdout $FE,$D0,"        6       "
    IF CUATRO = 0 THEN lcdout $FE,$D0,"        7       "
        HIGH B                     
        LOW C                     
    IF UNO    = 0 THEN lcdout $FE,$D0,"        8       "
    IF DOS    = 0 THEN lcdout $FE,$D0,"        9       "
    IF TRES   = 0 THEN lcdout $FE,$D0,"        A       "
    IF CUATRO = 0 THEN lcdout $FE,$D0,"        B       "
        HIGH C                     
        LOW D                     
    IF UNO    = 0 THEN lcdout $FE,$D0,"        C       "
    IF DOS    = 0 THEN lcdout $FE,$D0,"        D       " 
    IF TRES   = 0 THEN lcdout $FE,$D0,"        E       "
    IF CUATRO = 0 THEN lcdout $FE,$D0,"        F       "
        HIGH D                       
    pause 10                       
    GOTO tiempo   
end

Los LOW y los HIGH se ejecutan continuamente.
Delimitalos por ejemplo así :

IF CUATRO = 0 THEN
lcdout $FE,$D0,"        B       "
        HIGH C                     
        LOW D
ENDIF



Un saludo
« Última modificación: 13 de Junio de 2006, 19:28:12 por derinium »

Desconectado Eigen

  • PIC10
  • *
  • Mensajes: 19
Re: Array
« Respuesta #5 en: 13 de Junio de 2006, 21:22:34 »
gracias Derinium, el programa corre bién sin los ENDIF y con ellos me marca errores, creo que son necesarios cuando usas la estructura IF... ELSE... ENDIF, y yo no estoy utilizando ELSE, aunque no estoy muy seguro.

Desconectado derinium

  • PIC10
  • *
  • Mensajes: 35
Re: Array
« Respuesta #6 en: 14 de Junio de 2006, 04:14:09 »
No es obligatorio usar ELSE entre IF-ENDIF. IF-ENDIF se suele usar cuando hay que ejecutar más de una instrucción.
Esto :
---------------------------------------------------------------------------------------------------
IF DOS    = 0 THEN lcdout $FE,$90,"        1       ":salida=1:PAUSE 500:gosub tiempo 

salida será igual a 1, se hará la pausa y saltara a tiempo, siempre. TANTO si DOS =0 o no lo es.
-------------------------------------------------------
IF DOS    = 0 THEN
lcdout $FE,$90,"        1       "
salida=1:PAUSE 500:gosub tiempo 
ENDIF

Ahora salida sera igual a 1, hará la pausa y saltará a tiempo, SOLO cuando DOS sea igual a cero.
-------------------------------------------------------------------------------------------------------------------------

Sigo diciendo que los LOW y los HIGH se ejecutan continuamente si no se introducen entre los correspondientes IF-ENDIF. Quizás no te funcione, pero, primero hay que rectificar la estructura y despues hay que analizar donde falla. Me pasa como a Lord, que no tengo tiempo. En cuanto tenga un rato analizo todo tu código, o a ver si algun forero lo puede hacer, que seguro que si.

Un saludo.
« Última modificación: 14 de Junio de 2006, 14:33:04 por derinium »

Desconectado Eigen

  • PIC10
  • *
  • Mensajes: 19
Re: Array
« Respuesta #7 en: 15 de Junio de 2006, 02:08:41 »
Gracias Derinium, también trataré de ver por qué falla y si encuentro el error te lo haré saber.


 

anything