uControl
Julio 24, 2014, 05:00:59 *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?

Ingresar con nombre de usuario, contraseña y duración de la sesión
 
   Inicio   Ayuda Buscar Ingresar Registrarse  

La gente de Niple nos ofrece un descuento especial para usuarios de uControl.
Entérate de como puedes aprovechar esta oferta haciendo click aqui.

Súmate, y ayuda a uControl con tu participación en esta interesante oportunidad que nos oferece Niple.

Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: PIC's Y MATRIZ DE LEDS + PROTEUS + CCS  (Leído 11821 veces)
0 Usuarios y 1 Visitante están viendo este tema.
edbaci
PIC10F
*
Desconectado Desconectado

Mensajes: 2


« : Noviembre 12, 2008, 10:36:10 »

Hola, estimados, mi intencion de escribirlos es que tengo un trabajo en microcontroladores ke me dejaron en la universidad y no he podido implementarlo, pues escribo a uds. para recibir su ayuda en solucionar mi problema, mi trabajo consiste:
Usar un microcontrolador PICF628A o cualquier PIC  de la familia de 16Fxxx y un matriz de leds de 7*32 o podría ser más (8*64 algo así), aqui debe  mostrar un mensaje de "BIENVENIDO A MOLINA UNION S.A" y dezplazarlo a la  izquierda  o a la derecha y luego mostrar la "hora,minuto y segundo" de la hora actual ("ejemplo de la hora: 20:26:51") y nuevamente volver a mostrar lo anterior, y pues no sé si tendrás por ahi un trabajo parecido simulado en proteus y CCS.
Un abrazo. espero sus ayudas.
En línea
Leon Pic
Moderador
dsPIC
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 5306


Cumulonimbus


WWW
« Respuesta #1 : Noviembre 13, 2008, 08:57:20 »

Hola edbaci.

¿Tienes algo ya echo por dónde continuar?

¿Poro qué has echo una encuesta? (EDITADO POR ARIEL: Ya la he borrado)
« Última modificación: Noviembre 13, 2008, 02:06:32 por Ariel » En línea

Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.
Waldillo
Moderador
PIC16F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 847


Casado con PIC infiel con ARM


WWW
« Respuesta #2 : Noviembre 13, 2008, 09:52:14 »

En el link de ucontrol puedes leer sobre el tema. Nose donde he leido yo que tantas columnas afectan al resultado final, ya que insertar el codigo de unos y ceros en los registros de desplazamiento consume un tiempo que afecta al resultado,presentandose un leve parpadeo. Para hacer estose debe adoptar otra técnica.No se mucho de electrónica, igual una opción puede resultar utilizar registros de desplazamiento CMOS (Que creo que son mas rápidos, pero no si si existen). También he oido algo sobre circuitos integrados I2C que actuan como drivers de matrices de puntos, pero desconozco su funcionamiento.Creo que son pordigito y habría que hacer alguna chapucilla para que el mensaje sea corrido. No tengo ni idea que integrados son pero bueno el oraculo google te lo puede decir. Postea los resultados que nos interesan mucho.
En línea

Waldillo
Moderador
PIC16F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 847


Casado con PIC infiel con ARM


WWW
« Respuesta #3 : Noviembre 13, 2008, 10:05:15 »

He estado buscando y he encontrado esto.
http://datasheets.maxim-ic.com/en/ds/MAX6952.pdf
No es exactamente lo que igual necesitas pero que te sirva de inicio.Es un integrado manejado por SPI (mas rapido que I2C) y que maneja 4 digitos.Lo que no se si se puede hacer alguna trampa para conseguir el efecto de desplazamiento. Es cuestión de intentarlo y ver que pasa
En línea

ronny22
PIC12F
**
Desconectado Desconectado

Sexo: Masculino
Mensajes: 283



WWW
« Respuesta #4 : Noviembre 13, 2008, 10:21:58 »

Necesariamente tu proyecto tiene que ser con una matrix de leds???, no podria ser con una pantalla lcd,porq yo tengo el circuito pero con una pantalla LCD y el programa en CCS el cual muestra una palabra por la lcd y la rota,tal y como tu la quieres,cualquier cosas me avisas y te subo los archivos a un servidor de almacenamiento para que los descargues.
En línea
edbaci
PIC10F
*
Desconectado Desconectado

Mensajes: 2


« Respuesta #5 : Noviembre 16, 2008, 01:06:11 »

Hola ronny22, no hay problema, puedes subir el archivo, de todas maneras me sirve pz no soy tan especialista en los manejos de leds ni de PICS, me servirá de ayuda, pero al fin... podré plantearlo a mi profesor con esas características. te agradeceré ronny22.
 Un abrazo. Gracias.
En línea
ronny22
PIC12F
**
Desconectado Desconectado

Sexo: Masculino
Mensajes: 283



WWW
« Respuesta #6 : Noviembre 17, 2008, 01:24:09 »

hola q tal amigo,te dejo el programa aqui y el circuito montado en proteus (lo dejo en una imagen).
para que compiles el programa utiliza el ccs c compiler.

nota: este programa lo saque de un foro, y el creador es "VsZener".Te lo modifique para que mostrara la palabra que tu quieres que muestre,aunq no quedo perfecto seria bueno que modifiques a tu antojo.suerte en tu proyecto.

en este link posteo algo parecido a lo que tu quieres,se muestra por la pantalla lcd la hora/min/seg, pero tambien lo consegui en un foro y no lo e logrado poner a funcionar,le falta alguito,revisalo de todas maneras.>>>>>>>>      http://www.ucontrol.com.ar/forosmf/index.php?topic=199.0


///////////////////////////////////////////////////////////////////////////////////////////////////////////////
// VsZeNeR'05
// 29/Agosto/05
//
// Programa: VsZeNeR'05 mov pantalla
// Version: 0.0
//
// Dispositivo: PIC 16F648A Compilador: CCS vs3.227
// Entorno IDE: MPLAB IDE v7.21 Simulador: Proteus 6.7sp3
//
// Notas: Se muestra por pantalla de lcd(LM016L) como la palabra VsZeNeR'05
// se va moviendo por pantalla, empieza en la 1ºfila y termina en la 2ºfila.
// Se utiliza variables locales:
// ·x -> indice filas, es de tipo char signed porque necesitamos nº negativos
// para que en la 2ºfila del lcd aparezca primero el final del mensaje.
// ·y -> indice de columnas: y=1 -> 1ºcolumna
// y=2 -> 2ºcolumna
// La 'x' se comprende en pantalla desde 1 hasta 16 y la 'y' desde 1 hasta 2.
// Tener en cuenta que hay que poner la directiva NOLVP para que el pin B4 sea de
// salida.
//
// Conexiones: B0 -> E
// B1 -> RS
// B2 -> RW
// B4 -> D4
// B5 -> D5
// B6 -> D6
// B7 -> D7
////////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <16f877a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#define use_portb_lcd TRUE //definir portb lcd
#include<lcd.c> //libreria manejo lcd

///PROGRAMA
void main(void)
{
char y=1; //indice columnas
signed char x=1; //indice filas

lcd_init(); //inicializa lcd

while(TRUE){ //bucle...
lcd_gotoxy(x,y) ; //cursor para escribir mensaje
lcd_putc("BIENVENIDO A MOLINA UNION S.A" ) ; //muestra por pantalla el mensaje
delay_ms(150);
x++; //incremento indice de filas
if(x>16){ //¿ya se ha mostrado mensaje entero por 1ºfila?
x=-8; //SI -> indice fila x=-8
y++; //incremento indice columnas
if(y>2) //¿ya se ha mostrado mensaje por 2º columna?
y=1; //SI -> restauro indice columna
}
lcd_putc("\f" ) ; //borra pantalla
} //...infinito
}


* circuito en proteus....jpg (97.4 KB - descargado 579 veces.)
En línea
Waldillo
Moderador
PIC16F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 847


Casado con PIC infiel con ARM


WWW
« Respuesta #7 : Noviembre 28, 2008, 04:54:02 »

Os cuento mi problema. Yo utilizo el ICD2 de microchip y se utilizan los pines b7 y b6 del puerto B. La libreria en CCS utiliza estos pines. ¿Como se cambiaría LCD.C para por ejemplo insertarla en el puerto D de un 18f2520 ? Soy nulo con ccs ya que programo en c18. Lo sé, lo sé debo aprender, pero es k tengo un limite  Grin

Agradecería que alguien me lo hiciese, y que me hiciese el diseño en proteus, por que no he podido utilizar un LCD 4x20 que tengo. Y me estoy frustrando
En línea

Ariel
Global Moderator
dsPIC
****
Desconectado Desconectado

Sexo: Masculino
Mensajes: 10607



WWW
« Respuesta #8 : Noviembre 28, 2008, 05:27:26 »

Hola!
La respuesta esta en uControl :)

http://www.ucontrol.com.ar/wiki/index.php/CCS_-_LCD

Te copio y pego un pedazo del articulo, aunque deberias verlo entero para entender bien el asunto:

Modificando LCD.C
Por supuesto, en la mayoría de los casos la conexión entre el microcontrolador y el display LCD no coincidirá con la especificada en el archivo LCD.C provisto por CCS. Pero eso no quiere decir que debamos rediseñar nuestro proyecto, ni que sea imposible modificar la configuracion de LCD.C. como puede verse, dentro del codigo de LCD.C se define una estructura de datos que es la encargada de contener la distribución de los pines a utilizar, junto a la función que desempeñará. Es el siguiente trozo de código:

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;

Supongamos que tenemos un display conectado de la siguiente manera:

    * PORT.B2 -> enable
    * PORT.B3 -> rs
    * PORT.B4 -> D4
    * PORT.B5 -> D5
    * PORT.B6 -> D6
    * PORT.B7 -> D7

Notar que no estámos usando el pin RW del display, que estará permanentemente conectado a GND. La estructura deberia quedar asi:

struct lcd_pin_map {
  BOOLEAN unused1; // RB0
  BOOLEAN unused2; // RB1
  BOOLEAN enable;  // RB2
  BOOLEAN rs;      // RB3
  int data : 4;    // RB4-RB7
} lcd;

Por supuesto, habrás notado que en lugar del puerto D estamos usando el puerto B, asi que hay que quitar el comentario a la linea

// #define use_portb_lcd TRUE

para que quede así:

#define use_portb_lcd TRUE  //LCD conectado al puerto b.

Y como no estamos usando la línea RW del LCD, debemos quitar las dos tres lineas de código en la que se hace referencia a ella. El listado siguente corresponde al archivo LCD.C con todas las modificaciones mencionadas, más algunas modificaciones en los #INCLUDE del principio, que no tienen sentido mantener ya que al personalizar el archivo nunca se van a dar algunas de las condiciones contempladas alli. También hemos quitado el código de la función lcd_getc( x, y) ya que al estar RW conectado de forma permanente a GND, será imposible leer caracteres del display.

Código:
///////////////////////////////////////////////////////////////////////////
// LCD.C modificada por uControl.com.ar                                   
///////////////////////////////////////////////////////////////////////////
//     B0 
//     B1 
//     B2  E
//     B3  RS
//     B4  D4
//     B5  D5
//     B6  D6
//     B7  D7
//   (Sin 'RW')
//
// Funciones soportadas:
//                         lcd_init()
//                         lcd_gotoxy( BYTE col, BYTE fila)
//                         lcd_putc( char c)
//                              \f  Clear display                             
//                              \n  Go to start of second line               
//                              \b  Move back one position
//
///////////////////////////////////////////////////////////////////////////
#define use_portb_lcd TRUE  //LCD conectado al puerto b.
//
struct lcd_pin_map {
   BOOLEAN unused1; // RB0
   BOOLEAN unused2; // RB1
   BOOLEAN enable;  // RB2
   BOOLEAN rs;      // RB3
   int data : 4;    // RB4-RB7
} lcd;
//
#byte lcd = 0xF81  // Direccion de la estructura "lcd".
#byte lcd = 6      // Direccion del puerto B.
#define set_tris_lcd(x) set_tris_b(x)
#define lcd_type 2           // Tipo de LCD: 0=5x7, 1=5x10, 2=2 lineas
#define lcd_line_two 0x40    // Dirección de la LCD RAM para la 2da. linea
//
//Defino la cadena de inicializacion del LCD.
BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
//
//Configuro el estado de cada pin para lectura y escritura:
struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // Escribir.
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // Leer.
//
//Funciones:
BYTE lcd_read_byte() {
      BYTE low,high;
      set_tris_lcd(LCD_READ);
      delay_cycles(1);
      lcd.enable = 1;
      delay_cycles(1);
      high = lcd.data;
      lcd.enable = 0;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(1);
      low = lcd.data;
      lcd.enable = 0;
      set_tris_lcd(LCD_WRITE);
      return( (high<<4) | low);
}
//
void lcd_send_nibble( BYTE n ) {
      lcd.data = n;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(2);
      lcd.enable = 0;
}
//
void lcd_send_byte( BYTE address, BYTE n ) {
      lcd.rs = 0;
      while ( bit_test(lcd_read_byte(),7) ) ;
      lcd.rs = address;
      delay_cycles(1);
      delay_cycles(1);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}
//
void lcd_init() {
    BYTE i;
    set_tris_lcd(LCD_WRITE);
    lcd.rs = 0;
    lcd.enable = 0;
    delay_ms(15);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(5);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
       lcd_send_byte(0,LCD_INIT_STRING[i]);
}
//
void lcd_gotoxy( BYTE x, BYTE y) {
   BYTE address;
   if(y!=1)
     address=lcd_line_two;
   else
     address=0;
     address+=x-1;
     lcd_send_byte(0,0x80|address);
}
//
void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_send_byte(0,1);
                   delay_ms(2);
                                           break;
     case '\n'   : lcd_gotoxy(1,2);        break;
     case '\b'   : lcd_send_byte(0,0x10);  break;
     default     : lcd_send_byte(1,c);     break;
   }
}
En línea

Si cualquier habilidad que aprende un niño será obsoleta antes de que la use, entonces, ¿qué es lo que tiene que aprender? La respuesta es obvia:
La única habilidad competitiva a largo plazo es la habilidad para aprender
“. Seymour Papert
Waldillo
Moderador
PIC16F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 847


Casado con PIC infiel con ARM


WWW
« Respuesta #9 : Noviembre 28, 2008, 06:25:23 »

El problema es que necesito la parte alta del puerto B para el ICD2. Yo kiero separar las conexiones.Una vez probé y no podia por que debido a mi ignorancia en este compilador no podia hacer otra cosa que elegir un puerto entero. Yo lo que quiero es elegir cada pin del LCD en pines dispersos en el PIC. Ya le daré vueltas y miraré el link pero me fue imposible debido a mi poca experiencia en CCS
En línea

geronimox
Moderador
PIC18F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 1175



WWW
« Respuesta #10 : Noviembre 28, 2008, 08:16:47 »

Hola waldillo, hace tiempo tuve la necesidad de definir que pines usaba para mi LCD.
Y encontre este driver, que es bastante aclamado.  :o
Te permite configurar el LCD a tu gusto, si queres podes usar un pin de cada puerto  Tongue
Pero no todo lo que brilla es oro jeje.
Tiene una serie de desventajas:
* El driver requiere el modo "standard i/o"
* Usa un 50% mas ROM que el driver original de CCS.

El porque de esto y mas info podes encontrarla en la web de abajo.
http://www.ccsinfo.com/forum/viewtopic.php?t=24661&postdays=0&postorder=asc&start=0

Espero que te sirva. Saludos!

Código:
// flex_lcd.c

// These pins are for the Microchip PicDem2-Plus board,
// which is what I used to test the driver.  Change these
// pins to fit your own board.

#define LCD_DB4   PIN_D0
#define LCD_DB5   PIN_D1
#define LCD_DB6   PIN_D2
#define LCD_DB7   PIN_D3

#define LCD_E     PIN_A1
#define LCD_RS    PIN_A3
#define LCD_RW    PIN_A2

// If you only want a 6-pin interface to your LCD, then
// connect the R/W pin on the LCD to ground, and comment
// out the following line.

#define USE_LCD_RW   1     

//========================================

#define lcd_type 2        // 0=5x7, 1=5x10, 2=2 lines
#define lcd_line_two 0x40 // LCD RAM address for the 2nd line


int8 const LCD_INIT_STRING[4] =
{
 0x20 | (lcd_type << 2), // Func set: 4-bit, 2 lines, 5x8 dots
 0xc,                    // Display on
 1,                      // Clear display
 6                       // Increment cursor
 };
                             

//-------------------------------------
void lcd_send_nibble(int8 nibble)
{
// Note:  !! converts an integer expression
// to a boolean (1 or 0).
 output_bit(LCD_DB4, !!(nibble & 1));
 output_bit(LCD_DB5, !!(nibble & 2));
 output_bit(LCD_DB6, !!(nibble & 4));   
 output_bit(LCD_DB7, !!(nibble & 8));   

 delay_cycles(1);
 output_high(LCD_E);
 delay_us(2);
 output_low(LCD_E);
}

//-----------------------------------
// This sub-routine is only called by lcd_read_byte().
// It's not a stand-alone routine.  For example, the
// R/W signal is set high by lcd_read_byte() before
// this routine is called.     

#ifdef USE_LCD_RW
int8 lcd_read_nibble(void)
{
int8 retval;
// Create bit variables so that we can easily set
// individual bits in the retval variable.
#bit retval_0 = retval.0
#bit retval_1 = retval.1
#bit retval_2 = retval.2
#bit retval_3 = retval.3

retval = 0;
   
output_high(LCD_E);
delay_cycles(1);

retval_0 = input(LCD_DB4);
retval_1 = input(LCD_DB5);
retval_2 = input(LCD_DB6);
retval_3 = input(LCD_DB7);
 
output_low(LCD_E);
   
return(retval);   
}   
#endif

//---------------------------------------
// Read a byte from the LCD and return it.

#ifdef USE_LCD_RW
int8 lcd_read_byte(void)
{
int8 low;
int8 high;

output_high(LCD_RW);
delay_cycles(1);

high = lcd_read_nibble();

low = lcd_read_nibble();

return( (high<<4) | low);
}
#endif

//----------------------------------------
// Send a byte to the LCD.
void lcd_send_byte(int8 address, int8 n)
{
output_low(LCD_RS);

#ifdef USE_LCD_RW
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(60);
#endif

if(address)
   output_high(LCD_RS);
else
   output_low(LCD_RS);
     
 delay_cycles(1);

#ifdef USE_LCD_RW
output_low(LCD_RW);
delay_cycles(1);
#endif

output_low(LCD_E);

lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}

//----------------------------
void lcd_init(void)
{
int8 i;

output_low(LCD_RS);

#ifdef USE_LCD_RW
output_low(LCD_RW);
#endif

output_low(LCD_E);

delay_ms(15);

for(i=0 ;i < 3; i++)
   {
    lcd_send_nibble(0x03);
    delay_ms(5);
   }

lcd_send_nibble(0x02);

for(i=0; i < sizeof(LCD_INIT_STRING); i++)
   {
    lcd_send_byte(0, LCD_INIT_STRING[i]);
   
    // If the R/W signal is not used, then
    // the busy bit can't be polled.  One of
    // the init commands takes longer than
    // the hard-coded delay of 60 us, so in
    // that case, lets just do a 5 ms delay
    // after all four of them.
    #ifndef USE_LCD_RW
    delay_ms(5);
    #endif
   }

}

//----------------------------

void lcd_gotoxy(int8 x, int8 y)
{
int8 address;

if(y != 1)
   address = lcd_line_two;
else
   address=0;

address += x-1;
lcd_send_byte(0, 0x80 | address);
}

//-----------------------------
void lcd_putc(char c)
{
 switch(c)
   {
    case '\f':
      lcd_send_byte(0,1);
      delay_ms(2);
      break;
   
    case '\n':
       lcd_gotoxy(1,2);
       break;
   
    case '\b':
       lcd_send_byte(0,0x10);
       break;
   
    default:
       lcd_send_byte(1,c);
       break;
   }
}

//------------------------------
#ifdef USE_LCD_RW
char lcd_getc(int8 x, int8 y)
{
char value;

lcd_gotoxy(x,y);

// Wait until busy flag is low.
while(bit_test(lcd_read_byte(),7));

output_high(LCD_RS);
value = lcd_read_byte();
output_low(lcd_RS);

return(value);
}
#endif
En línea

Gero. Divide & Conquer.>----.
^-------------------------------|
-'-------------------------------'
Waldillo
Moderador
PIC16F
******
Desconectado Desconectado

Sexo: Masculino
Mensajes: 847


Casado con PIC infiel con ARM


WWW
« Respuesta #11 : Noviembre 28, 2008, 08:47:54 »

Estupendo geronimox he leido el link y parece que no se podia hacer lo que quería yo. Es un alivio, creia que era un zoquete jeje.
En línea

Páginas: [1]   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.19 | SMF © 2011, Simple Machines
SMFAds for Free Forums
XHTML 1.0 válido! CSS válido!
Página creada en 0.118 segundos con 29 consultas. (Pretty URLs adds 0.01s, 3q)
loggkey