Autor Tema: Connexión básica PIC, problema.  (Leído 1897 veces)

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

Desconectado skamarla

  • PIC10
  • *
  • Mensajes: 3
Connexión básica PIC, problema.
« en: 26 de Noviembre de 2007, 14:13:42 »
Hola! Primeramente, quisiera felicitar a toda la comunidad TodoPIC por el magnífico portal creado la gran utilidad que tiene. Es mi primer mensaje aunque ya desde hace algún tiempo vengo entrando en el foro a leer y aprender ;). Hay muchos y muy buenos artistas del mundo de la electrònica aquí a dentro.

Y ahora a por lo que iba, estoy haciendo una aplicación con un PIC (és la primera vez que uso un PIC como micro, y de hecho, hasta ahora practicamente no habia tocado micros), compilada en C. Utilizo un PIC18F2550 ya que si me animo quizás incluya una aplicación USB. También utilizo una Eeprom I2C 24LC512 en la que almaceno variables, un RTC DS1302 para coger la hora, 4 pulsadores para moverme por diversos menús, y un LCD de 4x20 para las visualizaciones.

Compilé el código generado sin ningún problema, y después simulé con el Proteus 7.1, y no he tenido tampoco ningún problema en la simulación del código. Claro que en Proteus no hace falta hacer todas las connexiones pertinentes.

Intenté hacer funcionar el circuito en la protoboard y nada de nada. Después modifiqué (añadí un bucle infinito) el código de manera que sólo se tenga que encender un led en el pin_B7, y así intentar ver que fallava. Para mi sorpresa, tampoco encendía el led... Así que supongo que el problema está en el conexionado.

Pues bien, monté las connexiones en la protoboard, de la manera que indiva el JPEG que hay adjunto.

Unicamente varia:

*Es un pic18f2550 en lugar del 2520 del dibujo del proteus.

*Entre OSC1 y OSC2, hay un Cristal de 20Mhz, con un condensador de 22pF a cada patilla del cristal, y después conectados a masa.

*El Reset está con una resistencia de 10K, y a masa.

*He quitado los pulsadores, lcd, etc. ya que no hacía falta al tratarse sólo de un led a encender.

*Una resistencia de 2k2 y un led en el pin b7 y después a massa (correctamente polarizado).

*Los 2 Vss a tierra (pines 8 i 19)

* Vdd a 5 voltios.

*El led mal connectado del dibujo no está.

Os pego también la primera parte de código:

#include <18F2550.h>

#fuses NOWDT, WDT128, XT, NOPROTECT, BROWNOUT, NOPUT, NOCPD
#fuses NOSTVREN, NODEBUG, NOLVP, NOWRT, NOWRTD, NOIESO, NOFCMEN, NOPBADEN
#fuses NOWRTC, NOWRTB, NOEBTR, NOCPB, NOLPT1OSC, MCLR, NOXINST

#use delay(clock=4000000)

#define EEPROM_SDA  PIN_A4
#define EEPROM_SCL  PIN_A3
#define USB_HID_DEVICE     FALSE             //disabled HID
#define USB_EP1_TX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for IN bulk/interrupt transfers
#define USB_EP1_RX_ENABLE  USB_ENABLE_BULK   //turn on EP1(EndPoint1) for OUT bulk/interrupt transfers
#define USB_EP1_TX_SIZE    32                //size to allocate for the tx endpoint 1 buffer
#define USB_EP1_RX_SIZE    32                //size to allocate for the rx endpoint 1 buffer

#define DESCARREGA recepcio[0]

#byte pb    =0xF81
#byte pa     =0xF80 
#bit ok     =pb.0
#bit up     =pb.1
#bit down   =pb.2
#bit ret    =pb.3
#bit flagRF  =pa.5
#bit FlagAvis=pa.6

static unsigned int8 segPP[140], minPP[140];
static unsigned int8 segEST,CPISEST, minEST, anio, hora, minuto, dia, mes,tempsmigsegEST, memoriaant, poshora;
static unsigned int8 tempsmigmin, tempsmigseg, tmpSEST, tmpMEST, metres;
static unsigned int8 pmrSEST, pmrMEST, pmlSEST, pmlMEST, LPUS, decim, userok;
static unsigned int8 MAUS, CPIS, adjust, NPUS,TEMPUS,posmenu, picA,posconf,VelmigEST;
static unsigned int8 posreg, pospar, user, posvis,usuari, memoria, copymemoria;
static unsigned int8 mint, seg, minP, segP, memo, DES, des1, CPOC, colocar1;

int8 datos_esp[20],recepcio[1],datos_gen[15];

static int1 fi1, fi2, fi3, fi4, fi31, fi32, fiborrar, fihora, fintransfer;
static int1 finalregistre, final, figrabar, fivisual, fimemoria, fiusb;
static int1 fisesio, finedar, escnedar, ficonfig, fiadjust;

int16 punt_segPP[140], punt_minPP[140];
int16 punt_segEST,punt_minEST,punt_CPISEST;
int16 punt_TEMPUS,punt_MAUS,punt_VelmigEST, punt_dia,punt_minuto,punt_anio,punt_hora,punt_mes;
int16 punt_pmlSEST, punt_pmrMEST, punt_pmrSEST, punt_tmpSEST, punt_tmpMEST;
int16 punt_pmlMEST, punt_CPIS, punt_LPUS, colocar, punt_NPUS, punt_memtope;

int hour,min,sec,day,mth,year,dow;

#include <lcd420.h>
#include <ds1302.c>
#include <24512.c>
#include <funcions.h>
#include <funcions1.h>
#include <punters1.h>
#include <pic18_usb.h>     //Microchip PIC18Fxx5x Hardware layer for CCS's PIC USB driver
#include <PicWinUSB.h>     //Descriptors and USB configuration
#include <usb.c>           //handles usb setup tokens and get descriptor reports

void main()
{
   port_b_pullups(true);
   setup_adc_ports(NO_ANALOGS);
   disable_interrupts(GLOBAL);
   init_ext_eeprom();
   lcd_init();

   inicialización_variables();
   
   while(1)
   {
   
        while (1)
        {
             output_high(PIN_B7);
        }

......

Que creeis que puede ser el fallo?
 - Grabación del PIC? He utilizado WinPIC800
 - Connexión de los elementos citados para funcionamiento basico del PIC.
 - Código.
 - Error componentes (PIC, Cond, Rest, Cristal etc.)

Muchas gracias por adelantado :).

Edito: Por torpe ;)
« Última modificación: 26 de Noviembre de 2007, 14:33:14 por skamarla »

Desconectado skamarla

  • PIC10
  • *
  • Mensajes: 3
Re: Connexión básica PIC, problema.
« Respuesta #1 en: 27 de Noviembre de 2007, 05:29:49 »
Gracias JCC40.

Acabo de canviar mi connexión del MCLR a valor +5V directamente (sin resistencia).

Pero sigue sin funcionar-me...

Conectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5494
    • Picmania by Redraven
Re: Connexión básica PIC, problema.
« Respuesta #2 en: 27 de Noviembre de 2007, 05:37:08 »
Mira por aquí a ver si encuentras algo que te sirva.

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado skamarla

  • PIC10
  • *
  • Mensajes: 3
Re: Connexión básica PIC, problema.
« Respuesta #3 en: 27 de Noviembre de 2007, 13:56:46 »
Muchas gracias a ambos, ya he conseguido que me funcionase con el programa del led. El error (uno, el otro era el MCLR) és que curiosamente el cristal de 20MHz no oscilaba. Lo cambié por uno de 6MHz y ahora me funciona. No lo pude encontrar antes ya que no disponía de un oscil·loscopio..

Ahora, sigo teniendo problemas...

...Ahora (que seguro que el PIC está 100% bien connectado), he intentado connexionar un LCD 4x20 e interactuar con él. Extrañamente, y tras varias comprobaciones cambiando de lugar el código de encendido/apagado de led, compruebo que el programa se me detiene cuando llego a "lcd_init", es decir, el error está en el tema LCD. Sólo me aparecen quadrados negros en la línea 1 y 3 del LCD, la 2 y la 4 no contienen nada.

Os pongo las connexiones, así cómo la librería <lcd420.h> utilizada (modificada) y el programa del led. Por más que reviso no encuentro el error :$. Tambén dejo el datasheet del LCD (puede tener problemas de imcompatibilidad con el pic???).
----------------
PROGRAMA
----------------
#include <18F2550.h>
#use delay(clock=6000000)
#fuses xt,nowdt,noput,noprotect
#include <lcd420.h>

void main()
{
   disable_interrupts(global);
   delay_ms(150);
   lcd_init();

   while(1)
   {
   output_high(PIN_B7);
   delay_ms(500);
   lcd_putc("\fHola mundo");
   output_low(PIN_B7);
   delay_ms(500);
   }
   
}
--------------------
CONEXIONES
--------------------
Vss --> Massa
Vdd --> +5V
Vo --> Massa
R/S --> PIN C1 micro
R/W --> PIN C2 micro
E --> PIN C0 micro
DB7 -->PIN C7 micro
DB6 -->PIN C6 micro
DB5 -->PIN C5 micro
DB4 --> PIN C4 micro

----------------------
LCD.H UTILIZADO
----------------------

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;

#byte lcd = 0xF82                        // This puts the entire structure
                                     // on to port C (at address 0xF82)

#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 lines


BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
                             // These bytes need to be sent to the LCD
                             // to start it up.


                             // The following are used for setting
                             // the I/O port direction register.

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in

BYTE lcdline;

BYTE lcd_read_byte() {
      BYTE low,high;

      set_tris_c(LCD_READ);
      lcd.rw = 1;
      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_c(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);
      lcd.rw = 0;
      delay_cycles(1);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}


void lcd_init() {
    BYTE i;

    set_tris_c(LCD_WRITE);
    lcd.rs = 0;
    lcd.rw = 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);
}


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

   switch(y) {
     case 1 : address=0x80;break;
     case 2 : address=0xc0;break;
     case 3 : address=0x94;break;
     case 4 : address=0xd4;break;
   }
   address+=x-1;
   lcd_send_byte(0,address);
}

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

char lcd_getc( BYTE x, BYTE y) {
   char value;

    lcd_gotoxy(x,y);
    lcd.rs=1;
    value = lcd_read_byte();
    lcd.rs=0;
    return(value);
}
La resta está en el aire.


Y aquí teneis el datasheet:

Datasheet LCD 4x20