Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Tokes

#41
Muchísimas gracias por sus respuestas.

Trataré de corregir mi código y luego les comento como quedó.

De verdad muchas gracias y ¡Feliz navidad!
#42
Hola a todos:

Escribo para plantear una pequeña duda que me tiene preocupado: ¿Hay forma de reiniciar un timer en vb6?

Estoy tratando de recibir datos por el puerto COM en formato RS232. La PC debe recibir un bloque de 30 caracteres para procesarlo, pero tengo la propiedad rthreshold a 1 para que se produzca un evento OnComm cada vez que se reciba un caracter.

El objetivo es que cada vez que llegue un caracter se reinicie un timer para evitar que éste último produzca un evento Timer(). Si se produce el evento Timer() quiere decir que el caracter ha tardado en llegar y suponer entonces que ha ocurrido un problema con la comunicación.

Así, por ejemplo, si después del cuarto caracter el quinto no llega en un determinado tiempo, el sistema reiniciará su lógica de recepción y el siguiente caracter que llegue será considerado el primero de una nueva cadena.

De manera burda, lo tengo así:

Dim contacaracter as integer
Dim s as string

private sub Comm1_OnComm()
    if comm1.commevent=comevreceive then 'Si se ha recibido un caracter.
         if contacaracter = 0 then     ' y si es el primero en recibirse
              timer1.enabled = true    ' se habilita el timer.
         else
              timer1.enabled = false   ' Aquí trato de reiniciar el timer apagándolo
              timer1.enabled = true    ' y luego encendiéndolo, pero al parecer no
                                                 ' funciona.
         endif

        s = s & comm1.input
        'Aquí proceso el caracter recibido.
        ' Cuando se reciban tdos los caracteres se inhabilita el timer.
    endif
end sub

private sub timer1_Timer()
    contacaracter=0     ' El siguiente caracter que llegue será considerado el primero.
    s=""   ' Vacía la cadena de recepción.
   timer1.enabled=false   
end sub


Cuando apago el timer (timer1.enabled=false) al parecer sólo lo detengo, pero no lo hago regresar a su valor inicial de conteo.

Si alguien pudiera ayudarme, muchísimas gracias.
#43
Electrónica / Re: LM35 y DS18S20
11 Diciembre 2010, 06:26 AM
Bueno, todo depende de las circunstancias:

Si se dispone de un microcontrolador con ADC integrado, el LM35 es muy adecuado, ya que manejar el convertidor AD de un microccontrolador es muy sencillo.

La desventaja del LM35 es que su salida es analógica, por lo cual es muy susceptible a las interferencias y a la distorsión por la distancia de los cables cuando se requiere realizar lecturas remotas. En este caso, es mejor utilizar un sensor con interfaz serial, ya que es más difícil distorsionar una señal digital que una analógica.

Desventajas del sensor con interfaz i2c: el protocolo i2c es muy complejo y la programación se volvería muy tediosa, sobre todo si se utilizan interrupciones.
#44
Hola a todos:

Se me presentó un proyecto en el cual debo controlar los minisplit de un pequeño edificio mediante la computadora.

A pesar de que ya existen sistemas de minisplits controlados por computadora, el proyecto consiste en que sea yo el diseñador del software y el hardware del sistema de control.

Por lo tanto, como no puedo interferir en la tarjeta de control de los minisplits, he decidido diseñar mi propia tarjeta de control para cada minisplit.

Al principio yo pensé que bastaba con un simple sensor de temperatura para leer la temperatura de la habitación, de manera que se encendería el compresor hasta lograr la temperatura deseada, después permanecería apagado hasta que la temperatura vuelva a subir. Pero acabo de enterarme que los minisplit tienen 2 sensores de temperatura. ¿Alguno de ustedes puede decirme, por favor, con qué objetivo es esto?

         Gracias por su atención.
#45
Hola, Meta:

Me parece que los mensajes todavía los tienes en la programación ocupando espacio. Debes quitarlos, ya que no los ocupas puesto que ahora están en la 24LC256.

Si ya los quitaste, entonces la directiva IF FinTabla > 0xFF... debes ponerla después de los goto's, más o menos así:

Código (asm) [Seleccionar]

  movf   PORTC,W
  andlw  b'00111111'
  addwf  PCL,F
  goto    Configuracion0
  goto    Configuracion1
  goto    Configuracion2
          .
          .
          .
  goto    ConfiguracionX
FinTabla

  IF (FinTabla > 0xFF)
   ERROR "CUIDADO!: La tabla ha superado el tamaño de la página de los"
  MESSG "primeros 256 bytes de memoria ROM. NO funcionará correctamente."
  ENDIF

Configuracion0
   ; Código de la configuracion 0.

Configuracion1
  ; Código de la configuracion 1.

        .
        .
        .
 


Con respecto a lo de usar lenguaje C, pues te vendría mejor, ya que el compilador gestiona la memoria tanto de datos como de programa y no hay que seleccionar bancos ni páginas de programa como en ensamblador.

Si aún haciendo lo que te dije sigue marcando error, entonces sí debes usar el "truquito" para poner la tabla.

            Saludos.
#46
Mi buen Meta:

Te faltaron algunas intrucciones:

Código (asm) [Seleccionar]

    movf   PORTC,W
    andlw  b'00111111'
    addwf  PCL,F
    goto    Configuracion0   ; Te faltaron estas instrucciones.
    goto    Configuracion1
    goto    Configuracion2
            .
            .
            .


Pero ya está corregido. Te lo envié por si las dudas.

             Saludos.
#47
Electrónica / Re: Duda con lector de banda magnetika
10 Septiembre 2010, 20:22 PM
Oye, hijocker:

¿No crees que podría ser problema del micro (hay la posibilidad)?

Sinceramente, no encuentro información relevante en internet sobre este lector.

             Saludos.
#48
Hola, Meta:

Bien, para arreglar tus problemas con el LCD vamos a hacer lo siguiente:

CitarRecuerda que cada entrade del LCD puede haber mensajes a la vez en diferentes líneas, no que se borre toda la pantalla y que se vea sola una línea por cada actualización. Esto de la EEPROM y asm es un poco infierno.

Para solucionar eso debes quitar de la subruitna "M24LC256_Mensaje_a_LCD" la instrucción que borra la pantalla (call   LCD_borra).

Bueno, hasta ahí se soluciona el problema de que se borre un mensaje al poner otro.

Ahora, debes tomar en cuenta otro aspecto importantísimo: para visualizar un mensaje en una línea determinada debes:

1. Colocar el cursor al principio de la línea correspondiente.
2. Visualizar espacios en blanco hasta que se llene la línea (es decir, borrar la línea).
3. Regresar el cursor al principio de esa línea.

Aquí te dejo las funciones que hacen eso para cada una de las líneas del LCD.

Código (asm) [Seleccionar]

LCD_Linea1EnBlanco
call LCD_Linea1   ; Sitúa el cursor al principio de la línea 1.
call LCD_LineaEnBlanco  ; Borra la línea.
call LCD_Linea1   ; Regresa el cursor al principio de la línea.
return

LCD_Linea2EnBlanco    ; Similar que la anterior.
call LCD_Linea2
call LCD_LineaEnBlanco
call LCD_Linea2
return

LCD_Linea3EnBlanco   ; Similar que la anterior.
call LCD_Linea3
call LCD_LineaEnBlanco
call LCD_Linea3
return

LCD_Linea4EnBlanco   ; Similar que la anterior.
call LCD_Linea4
call LCD_LineaEnBlanco
call LCD_Linea4
return


Esas rutinas pégalas en tu archivo "LCD_4BIT.INC".

Siempre que quieras visualizar un mensaje en una línea determinada deberás llamar esas rutinas. Por ejemplo, en el caso de la Configuración0, sería algo más o menos así:

Código (asm) [Seleccionar]

Configuracion0
    call LCD_Linea1EnBlanco ; Borra la línea 1 y se sitúa al principio de dicha línea.
movlw PAGINA_00   ; Lee a partir de la dirección 00 de esta página
call M24LC256_Mensaje_a_LCD ; de la memoria.
call Retardo_2s
goto ActivaSalida


Hazlo así y te debería funcionar. Espero tus comentarios.

                ¡¡¡Buen día!!!
#49
Programación Visual Basic / Re: [Ayuda] CheckBox
10 Septiembre 2010, 01:54 AM
Es muy sencillo:

Option Explicit

Private Sub Check1_Click()
    If Check1.Value = vbChecked Then
        MsgBox "Activado"
    Else
        MsgBox "Desactivado"
    End If
End Sub
#50
Hola, Meta:

En verdad que esta vez sí tenías muchos errores. Te mencionaré unos pocos:

1. La rutina para enviar mensaje al LCD nunca borraba la pantalla. Por eso el mensaje ocupaba todo el LCD.

Aquí te pongo la subrutina corregida. Nota que la única diferencia es que esta vez sí se borra la pantalla.

Código (asm) [Seleccionar]
M24LC256_Mensaje_a_LCD
movwf M24LC256_AddressHigh ; Apunta al inicio de la página correspondiente.
clrf M24LC256_AddressLow
call M24LC256_InicializaLectura
call LCD_Borra    ; Borra la pantalla.
M24LC256_LeeOtroByte
call I2C_LeeByte ; Lee la memoria 24LC256.
movwf M24LC256_ValorCaracter ; Guarda el valor de carácter.
movf M24LC256_ValorCaracter,F ; Lo único que hace es posicionar flag Z. En caso
btfsc STATUS,Z ; que sea "0x00", que es código indicador final
goto M24LC256_FinMensaje ; del mensaje, sale de la subrutina.
movf M24LC256_ValorCaracter,W ; Recupera el valor leído.
call LCD_Caracter ; Lo visualiza en la pantalla del LCD.
incf M24LC256_AddressLow,F ; Apunta a la siguiente posición.
goto M24LC256_LeeOtroByte
M24LC256_FinMensaje
call M24LC256_FinalizaLectura
return


2. En tu programa principal tienes un bucle infinito:

Código (asm) [Seleccionar]
Principal
movlw PAGINA_00
call M24LC256_Mensaje_a_LCD
call Retardo_2s
goto Principal


Si no lo quitas jamás vas a llegar a la zona de configuraciones (mejor, porque en la zona donde están las configuraciones tienes el error más grande).

3. En tu código tienes esto:

Código (asm) [Seleccionar]
movf   PORTC,W
  andlw   b'00111111'
  addwf   PCL,F
  call      Configuracion


Eso está bastante mal, porque la instrucción addwf   PCL,F es el encabezado de las configuraciones. Esa instrucción debería estar dentro de la subrutina Configuracion.

Código (asm) [Seleccionar]
movf   PORTC,W
  andlw   b'00111111'
  call      Configuracion


Y dentro de la rutina Configuracion:

Código (asm) [Seleccionar]
Configuracion
addwf PCL,F   ; Aquí debe estar la instrucción addwf PCL,F.
goto Configuracion0 ; 0 0 0 0 0 0
goto Configuracion1 ; 0 0 0 0 0 1
goto Configuracion2 ; 0 0 0 0 1 0
                         .
                         .
                         .


4. Tu rutina Configuración nunca retorna (nunca ejecuta la instrucción return).

Lo que sucede es que en tu rutina Configuración pones instrucciones de brinco:

   goto   Configuracion0
   goto   Configuracíon1
         .
         .

y en las respectivas zonas de códigos ejecutas un goto al programa principal.

Código (asm) [Seleccionar]
Configuracion1
               goto ActivaSalida
                      .
                      .
                      .
         ActivaSalida
               goto        Principal


Nunca ejecutas Return.

5. Por estética, es mejor que todos los elementos de una rutina estén todos en un mismo archivo. ¿Qué es lo que sucede con tu código?

La rutina Configuracion hace brincos (goto) hacia instrucciones que se encuentran en tu programa principal. Lo mejor es que esas instrucciones se encuentren también dentro del archivo de la subrutina de Cofiguracion.

En fín, te mandé al correo el programa corregido. Este sí debes revisarlo muy bien, porque le corregí muchas cosas.

Sigue echándole muchas ganas. Yo también empecé así. Me ocurrió casi de todo. He cometido casi todos los errores que se pueden cometer en ensamblador y es por eso que he podido resolver los tuyos.

               Saludos.