Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

PIC18f4520 display

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[1] PIC18f4520 display

Messaggioda Foto Utenteteo112 » 25 feb 2020, 23:25

Hi there,

sono abbastanza niubbo con i PIC e sopratutto con la programmazione in c. Ho letto un po in giro e volevo sapere come interfacciare il mio 18f4520 con un display hd44780 ma su PORTD.
ho trovato questo: https://youtu.be/u2VPLtELzZ4
seguito il tutto ma non va, o meglio su proteus va e in realtà non va! magari esistono dei modi meno complessi per poter cambiare porta...
Grazie per l'aiuto
Avatar utente
Foto Utenteteo112
15 3
 
Messaggi: 22
Iscritto il: 27 mar 2011, 19:15

0
voti

[2] Re: PIC18f4520 display

Messaggioda Foto UtenteWALTERmwp » 26 feb 2020, 1:37

Ciao @teo112.
Hai guardato il datasheet del 4520 ?
Non so cosa intendi con modi "meno complessi", sicuramente c'è quello corretto e per sapere se è tale quello da te scelto dovresti riportare il codice, altrimenti ...

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
23,1k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 6815
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

1
voti

[3] Re: PIC18f4520 display

Messaggioda Foto UtenteWALTERmwp » 26 feb 2020, 1:57

Dimenticavo, se può interessarti, per avere le idee più chiare(sulla gestione del display) intanto puoi guardare tra gli articoli di Foto UtentePaolino.
Anche Foto UtenteTardoFreak aveva inserito la gestione del display in diversi progetti, cerca tra i molti articoli che ci ha lasciato.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
23,1k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 6815
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[4] Re: PIC18f4520 display

Messaggioda Foto Utenteteo112 » 26 feb 2020, 22:25

Innanzitutto grazie per la risposta.

In allegato il rar con i file c h e lcd.h modificato per la configurazione su portD e non su B come di default.
Ho messo 2 led a lampeggiare per capire se è vivo o morto. Se solo inizializzo il display già qui si pianta. Non ho fatto debug perché da niubbo non sono gran che bravo, mi sto adoperando! :cool:

Non guardate le scritte o le righe commentate che sono frutto di vari tentativi... Fatto sta che non si avvia o meglio si blocca su init_xlcd

Grazie per l'aiuto.

P.s. sto guardando le i vari link nel forum da te indicati ma non ho ancora trovato qualcuno che si è cimentato nello spostare le connessioni dalla default
Allegati
lcd.rar
(3.82 KiB) Scaricato 106 volte
Avatar utente
Foto Utenteteo112
15 3
 
Messaggi: 22
Iscritto il: 27 mar 2011, 19:15

0
voti

[5] Re: PIC18f4520 display

Messaggioda Foto UtenteWALTERmwp » 26 feb 2020, 23:47

Prego @teo112, figurati.
Però, invece di un allegato, riporta il codice direttamente in un post, tra i tag Code.
Dubito che i file siano grandi, in ogni caso, per comodità, puoi inserire più blocchi(sempre utilizzando i tag).

Quindi, in che condizione stai operando ?
Compili, linki, trasferisci sul micro e lanci il programma ?
Puoi riportare una foto di quanto hai assemblato ?

Per i link: te li ho suggeriti perché tu ti potessi documentare sulla modalità di gestione del display, non perché da qualche parte verrebbe usata la Port D.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
23,1k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 6815
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[6] Re: PIC18f4520 display

Messaggioda Foto Utenteteo112 » 28 feb 2020, 22:58

Ok, ecco il codice:
Codice: Seleziona tutto
/*
* File:   display_18f.c
* Author: Teo
*
* Created on 17 February 2020, 10:44
*/
#include "display_18f.h"
#include <stdio.h>
#include <stdlib.h>
#include <delays.h>
#include <xlcd.h>
#include <xc.h>

#define LED1    LATCbits.LATC4
#define LED2    LATCbits.LATC5

void init_XLCD(void);              //Initialize LCD display
void DelayFor18TCY( void );        //18 cycles delay
void DelayPORXLCD (void);          // Delay of 15ms
void DelayXLCD (void);             // Delay of 5ms

void init_XLCD(void)                //Initialize LCD display
{
    OpenXLCD(FOUR_BIT&LINES_5X7);  //configure LCD in 4-bit Data Interface mode
                                     //and 5x7 characters, multiple line display
    while(BusyXLCD());             //Check if the LCD controller is not busy
                                     //before writing some commands?
    WriteCmdXLCD(DON);              //start lcd
    while(BusyXLCD());             //Check if the LCD controller is not busy
    WriteCmdXLCD(0x06);            // move cursor right, don?t shift display
    while(BusyXLCD());             //Check if the LCD controller is not busy
    WriteCmdXLCD(0x0C);            //turn display on without cursor

}



void DelayFor18TCY( void ) //18 cycles delay with 8MHz clock
{
Delay10TCYx(20);
}

void DelayPORXLCD(void)// 15ms delay
{
Delay1KTCYx(30);// 15ms delay with 8MHz Clock
}

void DelayXLCD(void) // 5ms delay
{
Delay1KTCYx(10); // 5ms delay with 8MHz Clock
}


void main(void)
{
//    init_XLCD();                    //Call the Initialize LCD display function

/*
//    PSPMODE=0;                      //parallel port (put in general purpose)
//    PSPIE=0;                        // parallel slave port disable
//    PSPIP=0;                        //dsable priority parallel slave
//    TRISD = 0;                      // set port d as output

    putrsXLCD("Hello World");          //Display "Hello World"
    SetDDRamAddr(0x40);            //shift cursor to beginning of second line
    putrsXLCD("LCD Display");      //Display "LCD display"
    for (int i = 1; i < 30; ++i)
    {
        __delay_ms (25);
    }
    WriteCmdXLCD(0x01);            //celar screen
    putrsXLCD("Holy poopy");
    SetDDRamAddr(0x40);            //shift cursor to beginning of second line
*/
    for (int i = 1; i < 30; ++i)
    {
        __delay_ms (25);
    }
    TRISC5 = 0;
    TRISC4 = 0;
    LED1 = 0;
    LED2 = 0;
    while(1)
    {
        LED1 = 1;
        LED2 = 0;
        for (int i = 1; i < 30; ++i)
        {
            __delay_ms (25);
        }
/*        WriteCmdXLCD(0x01);            //celar screen
        while(BusyXLCD());             //Check if the LCD controller is not busy
        putrsXLCD("Teo");
        while(BusyXLCD());             //Check if the LCD controller is not busy
*/
        LED1 = 0;
        LED2 = 1;
        for (int i = 1; i < 30; ++i)
        {
            __delay_ms (25);
        }
/*

        SetDDRamAddr(0x40);            //shift cursor to beginning of second line
        WriteCmdXLCD(0x01);            //celar screen
        putrsXLCD("I knew it");
        while(BusyXLCD());             //Check if the LCD controller is not busy
*/
      }
}



Questo è l'header, ma credo che qui non ci sia nulla di errato (illuso) #-o

Codice: Seleziona tutto
/*
* File:   display_18f.h
* Author: Teo
*
* Created on 17 February 2020, 10:45
*/

#ifndef DISPLAY_18F_H
#define   DISPLAY_18F_H

#ifdef   __cplusplus
extern "C" {
#endif



// PIC18F4520 Configuration Bit Settings

// 'C' source line config statements
#undef _XTAL_FREQ
#define _XTAL_FREQ 8000000
#include <xc.h>

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

// CONFIG1H
#pragma config OSC = HS
//#pragma config OSC = INTIO67    // Oscillator Selection bits (Internal oscillator block, port function on RA6 and RA7)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (Fail-Safe Clock Monitor disabled)
#pragma config IESO = OFF       // Internal/External Oscillator Switchover bit (Oscillator Switchover mode disabled)

// CONFIG2L
#pragma config PWRT = OFF       // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = SBORDIS  // Brown-out Reset Enable bits (Brown-out Reset enabled in hardware only (SBOREN is disabled))
#pragma config BORV = 3         // Brown Out Reset Voltage bits (Minimum setting)

// CONFIG2H
#pragma config WDT = OFF        // Watchdog Timer Enable bit (WDT disabled (control is placed on the SWDTEN bit))
#pragma config WDTPS = 32768    // Watchdog Timer Postscale Select bits (1:32768)

// CONFIG3H
#pragma config CCP2MX = PORTC   // CCP2 MUX bit (CCP2 input/output is multiplexed with RC1)
#pragma config PBADEN = OFF     // PORTB A/D Enable bit (PORTB<4:0> pins are configured as digital I/O on Reset)
#pragma config LPT1OSC = OFF    // Low-Power Timer1 Oscillator Enable bit (Timer1 configured for higher power operation)
#pragma config MCLRE = ON       // MCLR Pin Enable bit (MCLR pin enabled; RE3 input pin disabled)

// CONFIG4L
#pragma config STVREN = ON      // Stack Full/Underflow Reset Enable bit (Stack full/underflow will cause Reset)
#pragma config LVP = ON         // Single-Supply ICSP Enable bit (Single-Supply ICSP disabled)
#pragma config XINST = OFF      // Extended Instruction Set Enable bit (Instruction set extension and Indexed Addressing mode disabled (Legacy mode))

// CONFIG5L
#pragma config CP0 = OFF        // Code Protection bit (Block 0 (000800-001FFFh) not code-protected)
#pragma config CP1 = OFF        // Code Protection bit (Block 1 (002000-003FFFh) not code-protected)
#pragma config CP2 = OFF        // Code Protection bit (Block 2 (004000-005FFFh) not code-protected)
#pragma config CP3 = OFF        // Code Protection bit (Block 3 (006000-007FFFh) not code-protected)

// CONFIG5H
#pragma config CPB = OFF        // Boot Block Code Protection bit (Boot block (000000-0007FFh) not code-protected)
#pragma config CPD = OFF        // Data EEPROM Code Protection bit (Data EEPROM not code-protected)

// CONFIG6L
#pragma config WRT0 = OFF       // Write Protection bit (Block 0 (000800-001FFFh) not write-protected)
#pragma config WRT1 = OFF       // Write Protection bit (Block 1 (002000-003FFFh) not write-protected)
#pragma config WRT2 = OFF       // Write Protection bit (Block 2 (004000-005FFFh) not write-protected)
#pragma config WRT3 = OFF       // Write Protection bit (Block 3 (006000-007FFFh) not write-protected)

// CONFIG6H
#pragma config WRTC = OFF       // Configuration Register Write Protection bit (Configuration registers (300000-3000FFh) not write-protected)
#pragma config WRTB = OFF       // Boot Block Write Protection bit (Boot block (000000-0007FFh) not write-protected)
#pragma config WRTD = OFF       // Data EEPROM Write Protection bit (Data EEPROM not write-protected)

// CONFIG7L
#pragma config EBTR0 = OFF      // Table Read Protection bit (Block 0 (000800-001FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR1 = OFF      // Table Read Protection bit (Block 1 (002000-003FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR2 = OFF      // Table Read Protection bit (Block 2 (004000-005FFFh) not protected from table reads executed in other blocks)
#pragma config EBTR3 = OFF      // Table Read Protection bit (Block 3 (006000-007FFFh) not protected from table reads executed in other blocks)

// CONFIG7H
#pragma config EBTRB = OFF      // Boot Block Table Read Protection bit (Boot block (000000-0007FFh) not protected from table reads executed in other blocks)



#ifdef   __cplusplus
}
#endif

#endif   /* DISPLAY_18F_H */




In allegato il circuito in test su breadboard e la foto della scheda che dovrebbe pilotare il display ed altro già montata e realizzata. Ho rifatto tutto su bredboard perché il resto va ma con il display non ho mai giocato.

Come si vede, sotto il void main (void) ho commentato tante righe. Così i due led lampeggiano alla frequenza giusta. Quindi clock impostato corretto e port ok. Appena decommento la sola riga sotto il void main (void) che è init_xlcd, si pianta. Quindi do la colpa al modo di spostare le porte. Ho seguito pedissequamente quando descritto nel video youtube e nel manuale mplab c compiler libraries. Ma non va un tubo! quindi sbaglio, ma dove? :oops:

Ovviamente il display si alimenta, retro illuminazione ok, contrasto ok. Vedo la prima riga con tutti i quadrati più scuri e la seconda spenta.
Con l'oscilloscopio, su uno dei piedini da d4 a d7 non vedo "muoversi nulla" quindi il micro non sta facendo nulla.

thanks
Avatar utente
Foto Utenteteo112
15 3
 
Messaggi: 22
Iscritto il: 27 mar 2011, 19:15

0
voti

[7] Re: PIC18f4520 display

Messaggioda Foto Utenteteo112 » 3 mar 2020, 10:45

ops... forse non ho allegato le immagini...

Immagine
questa è la breadboard con collegamento a portD, clock 8mhz, le 2 resistenze su pgd pcg sono perché ogni tanto sbarella il pickit e perché forse l'alimentazione e la schermatura non sono perfette...

Immagine

nulla da dire sul display... credo...

Scusate ma mi sono accorto solo ora che mancava allegato. Forse l'antpeprima con google.photos non funziona e quindi allego lo zip anche...

Bye O_/

P.S. ieri sera ho riprovato ed ho scaricato il file dal video di youtube, ed in effetti funziona perfettamente su proteus. Su breadboard no!
Allegati
Photos (37).zip
(606.56 KiB) Scaricato 108 volte
Avatar utente
Foto Utenteteo112
15 3
 
Messaggi: 22
Iscritto il: 27 mar 2011, 19:15

0
voti

[8] Re: PIC18f4520 display

Messaggioda Foto UtenteWALTERmwp » 3 mar 2020, 15:21

Le immagini(foto), di adeguata dimensione, vanno caricate direttamente nel post: leggi qui, capitolo "Immagini".

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
23,1k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 6815
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[9] Re: PIC18f4520 display

Messaggioda Foto Utenteteo112 » 6 mar 2020, 11:19

Siccome non ne vengo fuori, ho cambiato modo... e c'è! :D

Codice: Seleziona tutto
#include "configuration.c"

/*********************Definition of Ports********************************/

#define RS LATD0                    //PIN 0 of PORTD is assigned for register select Pin of LCD
#define EN LATD1                    //PIN 1 of PORTD is assigned for enable Pin of LCD
#define ldata LATD                  //PORTD(D4-D7) is assigned for LCD Data Output
#define LCD_Port TRISD              //define macros for PORTD Direction Register

/*********************LCD Functions Declaration*****************************/

void LCD_Init();                    //Initialize LCD
void LCD_Command(unsigned char );   //Send command to LCD
void LCD_Char(unsigned char x);     //Send data to LCD
void LCD_String(const char *);      //Display data string on LCD
void LCD_String_xy(char, char , const char *);
void LCD_Clear();                   //Clear LCD Screen

/*********************Various Functions Declaration*****************************/

void delay10msTeo (int tenms);      //ten ms multiplier



int main(void)
{
    for (int i = 1; i < 30; ++i)
        {
           __delay_ms (25);
        }
    LCD_Init();                             //Initialize LCD to 5*8 matrix in 4-bit mode
    for (int i = 1; i < 30; ++i)
        {
           __delay_ms (25);
        }
    while (1)
    {
        LCD_String_xy(1,6,"Teo");           //Display string on 1st row, 5th location
        LCD_String_xy(2,6,"!!!works!!!");//Display string on 2nd row,1st location
        for (int i = 1; i < 30; ++i)
        {
            __delay_ms (25);
        }
        for (int i = 1; i < 3; ++i)
        {
            delay10msTeo (10);
            LCD_Command(0x1c);              //increment cursor (shift cursor to right)
        }
        for (int i = 1; i < 3; ++i)
        {
            delay10msTeo (10);
            LCD_Command(0x18);              //increment cursor (shift cursor to right)
        }
        delay10msTeo (15);
        LCD_Clear();
        LCD_String_xy(2,6,"Teo");           //Display string on 1st row, 5th location


    unsigned int duty_cycle; 
    TRISCbits.TRISC2=0;  /* Set CCP1 pin as output for PWM out */
    PR2=199;             /* load period value in PR2 register */
    CCPR1L=1;            /* load duty cycle */
    T2CON=0;             /* no pre-scalar,timer2 is off */
    CCP1CON=0x0C;        /* set PWM mode and no decimal value for PWM */
    TMR2=0;
    T2CONbits.TMR2ON=1;  /* Turn ON Timer2 */

        for(duty_cycle=1;duty_cycle<199;duty_cycle++)
        {
            CCPR1L = duty_cycle;   /* load duty cycle */
            __delay_ms(3);
        }
        for(duty_cycle=199;duty_cycle>1;duty_cycle--)
        {
            CCPR1L = duty_cycle;   /* load duty cycle */
            __delay_ms(3);
        }
        T2CONbits.TMR2ON=0;  /* Turn ON Timer2 */

    }
   
}

//****************************Functions********************************

void delay10msTeo(int tenms)
{
    for (int i=0; i<tenms; ++i)
        __delay_ms(10);
}

void LCD_Init()
{
    LCD_Port = 0;                   //PORT as Output Port
    __delay_ms(20);                 //15ms,16x2 LCD Power on delay
    LCD_Command(0x02);              //send for initialization of LCD for nibble (4-bit) mode
    LCD_Command(0x28);              //use 2 line and initialize 5*8 matrix in (4-bit mode)
    LCD_Command(0x01);              //clear display screen
    LCD_Command(0x0c);              //display on cursor off
    LCD_Command(0x06);              //increment cursor (shift cursor to right)
}

void LCD_Command(unsigned char cmd )
{
   ldata = (ldata & 0x0f) |(0xF0 & cmd);   //Send higher nibble of command first to PORT
   RS = 0;                                 //Command Register is selected i.e.RS=0
   EN = 1;                                 //High-to-low pulse on Enable pin to latch data
   NOP();
   EN = 0;
   __delay_ms(1);
    ldata = (ldata & 0x0f) | (cmd<<4);          //Send lower nibble of command to PORT
   EN = 1;
   NOP();
   EN = 0;
   __delay_ms(3);
}


void LCD_Char(unsigned char dat)
{
   ldata = (ldata & 0x0f) | (0xF0 & dat);   //Send higher nibble of data first to PORT
   RS = 1;                                  //Data Register is selected
   EN = 1;                                  //High-to-low pulse on Enable pin to latch data
   NOP();
   EN = 0;
   __delay_ms(1);
    ldata = (ldata & 0x0f) | (dat<<4);           //Send lower nibble of data to PORT
   EN = 1;                                  //High-to-low pulse on Enable pin to latch data
   NOP();
   EN = 0;
   __delay_ms(3);
}
void LCD_String(const char *messaggio)
{
   while((*messaggio)!=0)
   {      
     LCD_Char(*messaggio);
     messaggio++;   
    }
}

void LCD_String_xy(char row,char pos,const char *messaggio)
{
    char location=0;
    if(row<=1)
    {
        location=(0x80) | ((pos) & 0x0f);      //Print message on 1st row and desired location
        LCD_Command(location);
    }
    else
    {
        location=(0xC0) | ((pos) & 0x0f);      //Print message on 2nd row and desired location
        LCD_Command(location);   
    } 
   

    LCD_String(messaggio);

}
void LCD_Clear()
{
      LCD_Command(0x01);     //clear display screen
}


magari non è versatile come xlcd ma per quello che mi serve è più che ottimo.

A presto per nuove sfide, da niubbi O_/
Avatar utente
Foto Utenteteo112
15 3
 
Messaggi: 22
Iscritto il: 27 mar 2011, 19:15


Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 7 ospiti