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

#31
Programación C/C++ / Re: Ayuda con estructuras
5 Febrero 2011, 04:01 AM
¿No deberías poner case  '1' (con apóstrofes)?
#32
Bueno, aquí pongo otra forma de hacerlo. No sé si funcione para todas las clases de archivos, pero de igual forma lo dejo.

Private Function Existe(nombre As String) As Boolean
On Error Resume Next
    Open nombre For Input As #1
        If Err.Number Then Exit Function
    Close #1
    Existe = True
End Function


Saludos a todos.
#33
Estimado Meta:

Me encuentro en estos momentos desarrollando un proyecto para mi titulación y tiene que ver con lo que estás comentando.

Se trata de diseñar e implementar un sistema de control y monitoreo de un plantel mediante la PC.

El protocolo que decidí utilizar es el RS485 debido a su gran inmunidad a las interferencias, ya que funciona con señales diferenciales (las interferencias se cancelan).

El microcontrolador que estoy utilizando es el PIC16F877A, pero sin memoria externa. El sistema siempre estará activo, pero sólo se capturarán datos cuando la PC así lo requiera.

Por supuesto que estoy dispuesto a colaborar con tu propuesta. Espero que podamos aclarar muchas dudas y hacer algo muy educativo.

Hasta la próxima.
#34
¡Mil disculpas!:

Llámenme ignorante si quieren, pero entendí absolutamente nada sobre el reto. ¿Me lo pueden explicar con peras y manzanas, por favor?

         Gracias por su atención.

P.D: ¿Por qué se llama zig-zag?
#35
Saludos:

Aquí les dejo una mejora (creo) del código de raul338. La he llamado Ratok338InStr:

Private Function RaTok338InStr(ByVal Start As Long, ByVal s1 As String, ByVal s2 As String) As Long
Dim pos1 As Long, long1 As Long, long2 As Long, lim As Long, c As String

    If Start And &H80000000 Then Start = -Start
   
    long1 = Len(s1)
    long2 = Len(s2)
   
    If long1 = 0 Or long2 = 0 Or Start > long1 Or Start = 0 Or long2 > long1 Then
        RaTok338InStr = -1
        Exit Function
    End If
    lim = long1 - long2 + 1
    c = Mid(s2, 1, 1)
    For pos1 = Start To lim
        If Mid(s1, pos1, 1) = c Then
            If Mid(s1, pos1, long2) = s2 Then
                RaTok338InStr = pos1
                Exit Function
            End If
        End If
    Next
End Function


Hasta la próxima.
#36
Hola, gente:

Aquí dejo mi aporte:

Private Function strinstr(ByVal start As Long, ByVal s1 As String, ByVal s2 As String) As Long
Dim pos1 As Long, pos2 As Long, long1 As Long, long2 As Long

    long1 = Len(s1)
    long2 = Len(s2)
   
    pos2 = 1
    For pos1 = start To long1
        If Mid(s1, pos1, 1) = Mid(s2, pos2, 1) Then
            pos2 = pos2 + 1
            If pos2 > long2 Then
                strinstr = pos1 - long2 + 1
                Exit Function
            End If
        Else
            pos2 = 1
        End If
    Next
End Function


¡Feliz Año!
#37
vetealdemonio:

La verdad me da flojera revisar la librería del teclado de CCS. Mejor te pongo una que me elaboré para no tener problemas a la hora de modificar.

/***************** teclado.h ******************/
#byte    PORTA    =  getenv("sfr:PORTA")
#byte    TRISA    =  getenv("sfr:TRISA")

#byte    PORTB    =  getenv("sfr:PORTB")
#byte    TRISB    =  getenv("sfr:TRISB")

#byte    PORTC    =  getenv("sfr:PORTC")
#byte    TRISC    =  getenv("sfr:TRISC")

#byte    PORTD    =  getenv("sfr:PORTD")
#byte    TRISD    =  getenv("sfr:TRISD")

#byte    PORTE    =  getenv("sfr:PORTE")
#byte    TRISE    =  getenv("sfr:TRISE")

/***************************************/
#define  PORT_fila0     PORTC
#define  TRIS_fila0     TRISC
#define  fila0          0

#define  PORT_fila1     PORTC
#define  TRIS_fila1     TRISC
#define  fila1          1

#define  PORT_fila2     PORTC
#define  TRIS_fila2     TRISC
#define  fila2          2

#define  PORT_fila3     PORTC
#define  TRIS_fila3     TRISC
#define  fila3          3

#define  PORT_columna0  PORTC
#define  TRIS_columna0  TRISC
#define  columna0       4

#define  PORT_columna1  PORTC
#define  TRIS_columna1  TRISC
#define  columna1       5

#define  PORT_columna2  PORTC
#define  TRIS_columna2  TRISC
#define  columna2       6

#define  PORT_columna3  PORTC
#define  TRIS_columna3  TRISC
#define  columna3       7

/*************************************************/
#ifdef teclado_activoalto
  #define  es_activo(r,b)    bit_test(r,b)
  #define  activar(r,b)      bit_set(r,b)
  #define  desactivar(r,b)   bit_clear(r,b)
#else
#ifdef teclado_activobajo
  #define  es_activo(r,b)    !bit_test(r,b)
  #define  activar(r,b)      bit_clear(r,b)
  #define  desactivar(r,b)   bit_set(r,b)
#else
  #error "Debe declarar la lógica del teclado: activo alto o activo bajo"
#endif
#endif

/***************************************************/
void teclado_inicializa(void)
{
  // Inicializa los latches de salida para las filas.
  activar(PORT_fila0,fila0);
  activar(PORT_fila1,fila1);
  activar(PORT_fila2,fila2);
  activar(PORT_fila3,fila3);
 
  // Configura las filas como salidas.
  bit_clear(TRIS_fila0,fila0);
  bit_clear(TRIS_fila1,fila1);
  bit_clear(TRIS_fila2,fila2);
  bit_clear(TRIS_fila3,fila3);
 
  // Configura las columnas como entradas
  bit_set(TRIS_columna0,columna0);
  bit_set(TRIS_columna1,columna1);
  bit_set(TRIS_columna2,columna2);
  bit_set(TRIS_columna3,columna3);
}

void teclado_activafilas(void)
{
  activar(PORT_fila0,fila0);
  activar(PORT_fila1,fila1);
  activar(PORT_fila2,fila2);
  activar(PORT_fila3,fila3);
}

int8 teclado_examinacolumnas(void)
{
  if(es_activo(PORT_columna0,columna0)) return 0;
  if(es_activo(PORT_columna1,columna1)) return 1;
  if(es_activo(PORT_columna2,columna2)) return 2;
  if(es_activo(PORT_columna3,columna3)) return 3;
  return 4;
}

char teclado_lee(void)
{
  const char teclas[16]={'0', '1', '2', '3',
                         '4', '5', '6', '7',
                         '8', '9', 'A', 'B',
                         'C', 'D', 'E', 'F'};
  int8 i;
 
  teclado_activafilas();
  for(i=0; i<20; i++)
  {
     if(teclado_examinacolumnas()>3) return 0;
     delay_ms(1);
  }
 
  desactivar(PORT_fila3,fila3);
  desactivar(PORT_fila2,fila2);
  desactivar(PORT_fila1,fila1);
 
  if((i=teclado_examinacolumnas())<4) return(teclas[i]);
 
  desactivar(PORT_fila0,fila0);
  activar(PORT_fila1,fila1);
  if((i=teclado_examinacolumnas())<4) return(teclas[i+4]);
 
  desactivar(PORT_fila1,fila1);
  activar(PORT_fila2,fila2);
  if((i=teclado_examinacolumnas())<4) return(teclas[i+8]);
 
  desactivar(PORT_fila2,fila2);
  activar(PORT_fila3,fila3);
  if((i=teclado_examinacolumnas())<4) return(teclas[i+12]);
 
  desactivar(PORT_fila3,fila3);
  return 0;
}

void teclado_esperalibere(void)
{
  teclado_activafilas();
  while(teclado_examinacolumnas()<4);
}


Antes de incluir la librería debes declarar:

#use delay(clock=xxxx)

También debes declarar previamente la lógica del teclado, por ejemplo:

#define   teclado_activoalto

o el otro caso:

#define   teclado_activobajo

Si en las columnas colocas resistencias de pullup (hacia Vcc) la lógica debe ser activo bajo. Si en las columnas colocas resistencias de pulldown (hacia GND) la lógica debe ser activo alto.

Todas y cada una de las filas y columnas son colocables en cualquier terminal de cualquier puerto.

Así, si colocas la fila 0 del teclado en la terminal RA5, la declaración debe quedar así:

#define   PORT_fila0    PORTA
#define   TRIS_fila0   TRISA
#define   fila0      5


Para leer una tecla debes invocar a la función teclado_lee(). Esta función retornará un 0 binario (caracter nulo) si no hay tecla pulsada. En caso contrario retornará el código ASCII de la tecla pulsada.

Debes invocar la función teclado_esperalibere() para esperar que se libere la tecla y evitar leer varias veces la misma tecla.

Te dejo el siguiente programa de ejemplo:

#include "16f877a.h"
#use     delay(clock=20M)
#define  teclado_activobajo
#include "teclado.h"
#define  use_portb_lcd
#include "lcd.c"

int main(void)
{
   char tecla;
   
   teclado_inicializa();
   lcd_init();
   
   while(1)
   {
      if(tecla=teclado_lee())
      {
         lcd_putc(tecla);
         teclado_esperalibere();
      }
   }
}

Nos vemos...
#38
Una pregunta, mi amigo: ¿La librería lcd.c que incluyes es la que viene por defecto con el compilador?

Si es así, para cambiar los pines (enable, rs, rw, etc.) no debes usar #define. Lo que debes hacer es modificar la librería lcd.c.

Esta librería puede operar con el PORTB o con el PORTD. Por defecto es el PORTD. Si quieres utilizar el PORTB debes definir en tu programa principal, antes de incluir la librería, lo siguiente:

#define   use_portb_lcd

Si quieres cambiar la configuración de los pines debes alterar la librería. En ella se declara una estructura que define la posición de los pines de control y de datos del lcd dentro del puerto seleccionado.

struct lcd_pin_map {                 // This structure is overlayed
           BOOLEAN enable;           // on to an I/O port to gain
           BOOLEAN rs;               // access to the LCD pins.
           BOOLEAN rw;               // The bits are allocated from
           BOOLEAN unused;           // low order up.  ENABLE will
           int     data : 4;         // be pin B0.
        } lcd;


Lo anterior quiere decir que el pin enable ocupa el bit 0 del PORT seleccionado. El pin RS ocupa el bit 1; el pin RW, el bit 2; el bit 3 no se usa, y los bits 4, 5, 6 y 7 son los pines de datos.

Espero haberte ayudado. Hasta la próxima.
#39
Mis estimados compañeros del foro:

Agradezco las respuestas de cada uno de ustedes. Esta vez escribo para comunicarles que el problema está casi resuelto, aunque de una manera un poco extraña. Verán:

El programa del cual les comenté lo ejecuté en 3 computadoras que tienen SO Windows XP y en ninguna funcionó completamente, es como si el procesador se brincara las instrucciones, pero en fín. La verdadera cuestión es que el programa terminó ejecutándose correctamente en una laptop con SO Windows 7 de 64 bits. Me sorprendió mucho, ya que, según lo que yo sé, Visual Basic 6.0 fue hecho para SO de 32 bits (si estoy equivocado, corríjanme por favor). De hecho, al instalar Visual Basic 6 en la laptop me arrojaba un mensaje de incompatibilidad, pero aún así lo instalé y ¡Funcionó!

Entonces, si VB6 es compatible con Windows XP e incompatible con Windows 7 ¿Tiene esto alguna explicación?
#40
Buen día a todos:

Hoy los vengo a molestar con una super pregunta. Verán:

Estoy tratando de realizar una comunicación mediante el puerto serie COM.

El problema está en que al ejecutar el código se deben enviar caracteres por el puerto al dar click en determinados botones, pero no lo hace.

Al ejecutar el código instrucción por instrucción sí lo realiza correctamente. Pero al correrlo no lo hace. ¿Qué le pasa a mi visual basic?

Por su atención, muchas gracias.