Autor Tema: PIC18F2550 no se resetea correctamente  (Leído 6109 veces)

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

Desconectado zenonmb

  • PIC10
  • *
  • Mensajes: 4
PIC18F2550 no se resetea correctamente
« en: 03 de Marzo de 2010, 10:48:35 »
Hola,

Estoy conectando un PIC18F2550 a un display LCD y el problema que veo es que el PIC no siempre se resetea igual cuando aplico tension . Conecte un led a uno de los pines y resulta ser que no siempre prende. Debo conectar y desconectar varias veces para que se prenda.
Puse un cap de .1 ente + y tierra , pero sigue igual .
Lo unico que se me ocurre que puede ser,  los bits de configuracion, pero ya los revise y no veo error . El display se conecta al puerto B, RB4,5,6 y 7 y estoy usando un cristal de 8Mhz . Alguna sugerencia ? 

Por cierto, si pueden ver el codigo(compilador SDCC ) por que mas alla del problema del reset, aun el display no muestra nada......(inclusive cuando el led se prende)

#include <pic18f2550.h>
#include <delay.h>
// Configurations
code char at __CONFIG1L conf0 = _PLLDIV_DIVIDE_BY_2__8MHZ_INPUT__1L & _CPUDIV__OSC1_OSC2_SRC___1__96MHZ_PLL_SRC___2__1L;
code char at __CONFIG1H conf1 = _OSC_HS__HS_PLL__USB_HS_1H;
code char at __CONFIG2L conf2 = _PUT_ON_2L & _BODEN_OFF_2L ;      // enable POWER UP timer
code char at __CONFIG2H conf3 = _WDT_DISABLED_CONTROLLED_2H ;     // Disable WDT
code char at __CONFIG3H conf4 = _CCP2MUX_RC1_3H & _PBADEN_PORTB_4_0__CONFIGURED_AS_DIGITAL_I_O_ON_RESET_3H;// Enable pin MCLR
code char at __CONFIG4L conf5 = _LVP_OFF_4L;                      // Disable LVP

//Define your LCD's data PORT here:
#define LCD_PORT LATB
//Define your LCD's control pins here:
#define LCD_E  LATBbits.LATB0 //Enable
#define LCD_RS LATBbits.LATB2 //Register select

void strobe(void);                      //Strobes the enable pin of the LCD
void send_nibble(char b);               //Send high nibble of byte b to LCD
void send_byte(char b);                 //Send entire byte b to LCD via 4 bit interface
void send_cmd(char b);                  //Send command to LCD
void send_data(char b);                 //Send data to LCD
void set_cursor(char row, char col);    //Set cursor position at (row, col)
void cursor_on(void);                   //Turn on cursor
void cursor_off(void);                  //Turn off cursor
void cls(void);                         //Clear screen
void sc_r(void);                        //Scroll all lines one character right
void sc_l(void);                        //Scroll all lines one character left
void home(void);                        //Send cursor to top-left position
char b2hc(char info);                   //Convert lower nibble of byte data to an ascii character
void lcd_init(void);                    //Initialize LCD


void strobe() {
        LCD_E = 1;
        delay10tcy(2);           // 10*500nsec*2 = 10usec
        LCD_E = 0;
        delay10tcy(2);
//        PORTAbits.RA0=1;
}

void send_nibble(char b) {
        LCD_PORT = (LCD_PORT & 0x0F) | (b & 0xF0);     //output char on higher bits with out changing
        strobe();                                      // lower bits
}

void send_byte(char b) {
        send_nibble(b);      //Send high nibble
        send_nibble(b << 4); //Send low nibble
}

void send_cmd(char b) {
        LCD_RS = 0;          //Command mode
        send_byte(b);
        delay1ktcy(10);      // delay 5msec
}

void send_data(char b) {
        LCD_RS = 1;          //Data mode
        send_byte(b);
        delay1ktcy(20);      // equiv a 500us * 20 = 10mseg
}

void set_cursor(char row, char col) {
        char command = 0x80;
        switch(row) {
        case 1:
                command += col - 1;
                break;
        case 2:
                command += 0x40 + col - 1;
                break;
        case 3:
                command += 0x10 + col - 1;
                break;
        case 4:
                command += 0x50 + col - 1;
                break;
        default:
                command += col - 1;
                break;
        }
        send_cmd(command);
}

void cursor_on() {
        send_cmd(0x0E);
}

void cursor_off() {
        send_cmd(0x0C);
}

void cls() {
        send_cmd(0x01);
}

void sc_r() {
        send_cmd(0x1E);
}

void sc_l() {
        send_cmd(0x18);
}

void home() {
        send_cmd(0x02);
}

char b2hc(char info) {
        switch(info & 0x0F) {
        case 0:
                return '0';
        case 1:
                return '1';
        case 2:
                return '2';
        case 3:
                return '3';
        case 4:
                return '4';
        case 5:
                return '5';
        case 6:
                return '6';
        case 7:
                return '7';
        case 8:
                return '8';
        case 9:
                return '9';
        case 10:
                return 'A';
        case 11:
                return 'B';
        case 12:
                return 'C';
        case 13:
                return 'D';
        case 14:
                return 'E';
        case 15:
                return 'F';
        }
        return 0;
}


void lcd_init() {

        LCD_E = 0;
        LCD_RS = 0;
        delay10ktcy(6);
        //Start initializing the LCD
        send_nibble(0x30);
        delay1ktcy(10);    //
        send_nibble(0x30);
        delay1ktcy(10);    //  5 msec
        send_nibble(0x30);
        delay1ktcy(10);    // estaba en 100us
        send_nibble(0x20); //4 bit interface
        delay1ktcy(10);
        send_cmd(0x28);    // 0b00101000 Function set: 4 bit interface
        delay10tcy(3);     // delay = 10*500nsec*3 = 15usec
        send_cmd(0x0e);    // 0b00001110 Display on/off: display on, cursor on, blink off
        delay10tcy(3);
        send_cmd(0x06);    // 0b00000110 Entry mode: increment, no shift
        delay10tcy(3);
        send_cmd(0x02);    // 0b00000010 Cursor home
        delay10tcy(3);
        send_cmd(0x01);    // 0b00000001 Clear DDRAM/LCD
        delay1ktcy(30);    //     delay 15msec

}


/************
 * MAIN LOOP
 ************/
void    main()
{
        ADCON1 = 0x0f ;
        INTCON = 0;

        TRISA = 0 ;          // PORTA as outputs
        PORTA = 0 ;
        LATA = 0 ;

        TRISB = 0 ;          // PORTB as outputs
        PORTB = 0 ;
        LATB = 0 ;

        TRISC = 0;
        PORTC = 0;

        LATAbits.LATA0 =1;
        delay100ktcy(30);    // 1,5 secs
        LATAbits.LATA0=0;

        lcd_init() ;
        set_cursor(1,1);
        send_data('h');
        delay100ktcy(30);
       
        send_data('o');
        delay100ktcy(30);
       
        send_data('l');
        delay100ktcy(30);
       
        send_data('a');
        delay100ktcy(30);
}

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: PIC18F2550 no se resetea correctamente
« Respuesta #1 en: 03 de Marzo de 2010, 13:19:01 »
tienes un capacitor mayor a 10uF entre VCC y GND?, de ser asi, este capacitor permanece cargado mientras desconectas y conectas. Cuando desconectes dale un tiempo prudente de unos segundos, luego enciende nuevamente.

SALUDOS!

Desconectado zenonmb

  • PIC10
  • *
  • Mensajes: 4
Re: PIC18F2550 no se resetea correctamente
« Respuesta #2 en: 03 de Marzo de 2010, 15:12:25 »
tienes un capacitor mayor a 10uF entre VCC y GND?, de ser asi, este capacitor permanece cargado mientras desconectas y conectas. Cuando desconectes dale un tiempo prudente de unos segundos, luego enciende nuevamente.

SALUDOS!

Lo intente con un capacitor de 100uf pero nada cambia, de hecho ahora se lo he sacado .
Saludos,

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: PIC18F2550 no se resetea correctamente
« Respuesta #3 en: 03 de Marzo de 2010, 16:29:35 »
muestra el esquema de lo que estas conectando.

Desconectado zenonmb

  • PIC10
  • *
  • Mensajes: 4
Re: PIC18F2550 no se resetea correctamente
« Respuesta #4 en: 03 de Marzo de 2010, 16:55:08 »
muestra el esquema de lo que estas conectando.

No tengo ningun esquema pero te cuento :

Pin 28 = RB7 va al pin D7 del display
Pin 27 = RB6 va al pin D6 del display
Pin 26 = RB5 va al pin D5 del display
Pin 25 = RB4 va al pin D4 del display

Pin 21 = RB0 va al pin E del display
pin 23 = RB2 va al pin RS del display

Pin 1 tengo 6k8 al + y despues el cristal de 8Mhz con los caps de 22 pf . El cap de .1 entre + y gnd y no mucho mas....

Desconectado Olaf

  • PIC12
  • **
  • Mensajes: 52
Re: PIC18F2550 no se resetea correctamente
« Respuesta #5 en: 03 de Marzo de 2010, 19:19:45 »
tienes un capacitor mayor a 10uF entre VCC y GND?, de ser asi, este capacitor permanece cargado mientras desconectas y conectas. Cuando desconectes dale un tiempo prudente de unos segundos, luego enciende nuevamente.

SALUDOS!

Lo intente con un capacitor de 100uf pero nada cambia, de hecho ahora se lo he sacado .
Saludos,

Entre Vcc y GND creo que es mas recomendable usar 100nF de tantalo.  ;-)
Me encanta el olor a microcontrolador por la mañana! APOCALISPIC NOW

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: PIC18F2550 no se resetea correctamente
« Respuesta #6 en: 03 de Marzo de 2010, 23:08:33 »
Hola zenonmb, yo siempre utilizo una resistencia de 10k del MCLR a vcc y un condensador de 10 Uf del MCLR a gnd, de eta forma siempre se genera un pulso de reset automático cuando se polariza el PIC

saludos.

Desconectado Olaf

  • PIC12
  • **
  • Mensajes: 52
Re: PIC18F2550 no se resetea correctamente
« Respuesta #7 en: 04 de Marzo de 2010, 13:34:30 »
Entre Vcc y GND creo que es mas recomendable usar 100nF de tantalo.  ;-)

Olvida esto que he dicho, los 100nF son para ponerlo entre Vcc y GND, pegado al micro para evitar ruidos.
Haz caso a Diego E. :)
« Última modificación: 04 de Marzo de 2010, 13:37:52 por Ingeniero_Olaf »
Me encanta el olor a microcontrolador por la mañana! APOCALISPIC NOW

Desconectado zenonmb

  • PIC10
  • *
  • Mensajes: 4
Re: PIC18F2550 no se resetea correctamente
« Respuesta #8 en: 08 de Marzo de 2010, 10:14:58 »
Solucione el problema con la sugerencia de Diego .
Gracias igual a todos.
Saludos,

Zenon

Desconectado hprince

  • PIC10
  • *
  • Mensajes: 10
Re: PIC18F2550 no se resetea correctamente
« Respuesta #9 en: 19 de Abril de 2010, 17:26:40 »
Hola zenonmb, yo siempre utilizo una resistencia de 10k del MCLR a vcc y un condensador de 10 Uf del MCLR a gnd, de eta forma siempre se genera un pulso de reset automático cuando se polariza el PIC

saludos.

Hola! Tengo un 18f2550 y emite una señal infraroja de 38KHz, bueno esta señal es apagada por un touch sensor y necesita de un boton de reseteo para volver a prender el programa..me han aconsejado usar el MCLR pero es que acaso tambien tengo que programar el MCLR???

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: PIC18F2550 no se resetea correctamente
« Respuesta #10 en: 19 de Abril de 2010, 18:00:32 »
Hola hprince, el MCLR es un pin físico que no es controlado por programa, sólo debes adicionar un pulsador conectado del MCLR a tierra (el MCLR debe tener resistencia Pull-up) para generar un cero cuando desees reiniciar el PIC, ahora si lo que quieres es reiniciar el PIC por programa puedes utilizar reset_cpu()

saludos.

Desconectado hprince

  • PIC10
  • *
  • Mensajes: 10
Re: PIC18F2550 no se resetea correctamente
« Respuesta #11 en: 19 de Abril de 2010, 18:46:01 »
Hola hprince, el MCLR es un pin físico que no es controlado por programa, sólo debes adicionar un pulsador conectado del MCLR a tierra (el MCLR debe tener resistencia Pull-up) para generar un cero cuando desees reiniciar el PIC, ahora si lo que quieres es reiniciar el PIC por programa puedes utilizar reset_cpu()

saludos.

En varios ejemplos he visto que utilizan una resistancia de 10K tambien debo usarla? estoy programandola con hitech C

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: PIC18F2550 no se resetea correctamente
« Respuesta #12 en: 20 de Abril de 2010, 00:35:13 »
hprince, si debes usar una resistencia pull-up que puede ser de 10 K, debes tener en cuenta que en los fusibles debes configurar el MCLR externo.