home | area personale         schemi | tutorial | robotica | pic micro | recensioni         forum | chat irc         faq | contatti         store | Ordina PCB
username
password
cerca

 
FORUM: Pic Micro
Tutto quanto riguarda questi microprocessori... progetti, suggerimenti, aiuti, discussioni...ecc


Pilotare LCD con compilatore XC8
     
Autore Messaggio opzioni
e.ferriani





postato il:
12.11.2017, alle ore 17:20
Questo è l'errore se tolgo i commenti:

 make -f nbproject/Makefile-default.mk SUBPROJECTS= .build-conf
make[1]: Entering directory 'D:/Lavori/Firmware/LCD 2x16.X'
make  -f nbproject/Makefile-default.mk dist/default/production/LCD_2x16.X.production.hex
make[2]: Entering directory 'D:/Lavori/Firmware/LCD 2x16.X'
"C:\Program Files (x86)\Microchip\xc8\v1.44\bin\xc8.exe" --pass1  --chip=16F873A -Q -G  --double=24 --float=24 --opt=+asm,+asmfile,-speed,+space,-debug,-local --addrqual=ignore --mode=free -P -N255 --warn=-3 --asmlist -DXPRJ_default=default  --summary=default,-psect,-class,+mem,-hex,-file --output=default,-inhx032 --runtime=default,+clear,+init,-keep,-no_startup,-osccal,-resetbits,-download,-stackcall,+clib   --output=-mcof,+elf:multilocs --stack=compiled:auto:auto "--errformat=%f:%l: error: (%n) %s" "--warnformat=%f:%l: warning: (%n) %s" "--msgformat=%f:%l: advisory: (%n) %s"    -obuild/default/production/_ext/1268365763/prova_display_16x2.p1  "D:/Lavori/Firmware/LCD 2x16.X/prova_display_16x2.c" 
D:/Lavori/Firmware/LCD 2x16.X/prova_display_16x2.c:87: warning: (361) function declared implicit int
D:/Lavori/Firmware/LCD 2x16.X/prova_display_16x2.c:89: warning: (361) function declared implicit int
D:/Lavori/Firmware/LCD 2x16.X/prova_display_16x2.c:95: warning: (361) function declared implicit int
D:/Lavori/Firmware/LCD 2x16.X/prova_display_16x2.c:95: error: (192) undefined identifier "LCD_line1"
D:/Lavori/Firmware/LCD 2x16.X/prova_display_16x2.c:96: warning: (361) function declared implicit int
(908) exit status = 1
nbproject/Makefile-default.mk:122: recipe for target 'build/default/production/_ext/1268365763/prova_display_16x2.p1' failed
make[2]: Leaving directory 'D:/Lavori/Firmware/LCD 2x16.X'
make[2]: *** [build/default/production/_ext/1268365763/prova_display_16x2.p1] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2
nbproject/Makefile-default.mk:90: recipe for target '.build-conf' failed
make[1]: Leaving directory 'D:/Lavori/Firmware/LCD 2x16.X'
nbproject/Makefile-impl.mk:39: recipe for target '.build-impl' failed

BUILD FAILED (exit value 2, total time: 915ms)
 



Enea Ferriani
e.ferriani@alice.it
e.ferriani





postato il:
12.11.2017, alle ore 17:22
Non l'ho specificato, ma le connessione pic-display sono:

 
#define LCD_D4 RB0 // LCD data 4
#define LCD_D5 RB1 // LCD data 5
#define LCD_D6 RB2 // LCD data 6
#define LCD_D7 RB3 // LCD data 7
#define LCD_RS RB4 // Register select
#define LCD_EN RB5 // Enable 



Enea Ferriani
e.ferriani@alice.it
e.ferriani





postato il:
12.11.2017, alle ore 17:25
Qualche giorno fa feci una prova, senza comunque vedere scritte sul display ma solo la prima riga tutta accesa, cioè di mettere tutto il codice di LCD.c dentro al programma principale, prima del main, e quantomeno la compilazione non dava errori.


Enea Ferriani
e.ferriani@alice.it
picmicro675




una ogni 10 livelli


postato il:
12.11.2017, alle ore 22:30
Consiglierei che metti i files su file hosting e ci pubblichi il link dove scaricarli. Almeno li vedremo "al naturale", siccome grix.it ha delle problematiche con l' impaginazione e salta fuori qualche modifica.
Poi se il display si presenta a quadrettoni, forse ti manca di collegare a massa il piedino 4, se mi ricordo bene.
E non farebbe male vedere come hai collegato il circuito.
Poi dovresti provare il listato di Primok, senza variare nulla, vedendo già dalla compilazione se si presentano degli errori. Allora ci potrebbe anche stare che ci sonodegli errori a livello del compilatore.
Io consiglierei di usare mikroC (ancor meglio SDCC), ma ovviamente se non superi il limite della versione libera. Il perché sta nel fatto che ho notato delle stranezze nel compilatore XC/ HTC/ PICC, ovvero poco ottimizzato ed un continuo rilancio di routine e blocchi di dati da passare da una parte del programma ad un' altra.
primok




una ogni 100 livelli
una ogni 10 livelli


postato il:
14.11.2017, alle ore 09:32
In quello che hai pubblicato c'è un miscuglio di compilatori e routine.

Di seguito ciò che hai bisogno per visualizzare nel display a 2 righe.

Compilatore XC8 (v1.44) Michrochip

Mplab X IDE (v4.01) Microchip

Quarzo 20 MHz

Porta usata per il display: PORTA C


#define LCD_PORT     PORTC
#define LCD_D4 RC0 // LCD data 4 
#define LCD_D5 RC1 // LCD data 5 
#define LCD_D6 RC2 // LCD data 6 
#define LCD_D7 RC3 // LCD data 7 

#define LCD_RS RC4 // Register select 
#define LCD_EN RC5 // Enable  
#define LCD_RW RC6 //RW
#define LCD_PWR RC7 


L'uscita RC6 va al piedino R\W del diplay
L'uscita RC7 puoi anche non usarla perchè serve per accendere il display nel caso
tu lo voglia fare.

main

 /*
 * File:   main.c
 * Author: Primok
 *
 * Created on 14 novembre 2017, 8.29
 */

// CONFIG
#pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = ON        // Watchdog Timer Enable bit (WDT enabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = ON         // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
#pragma config CPD = OFF        // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)


#include <xc.h>
#include "Lcd.h"
#define OUT_RB0 PORTBbits.RB0

void main(void) {
  
  TRISA = 0b11111111;   // all PORTA bits are input
  TRISB = 0b00000000;   // all PORTB bits are output
  TRISC = 0b00000000;
  PORTB = 0b00000000; // clear PORTB
  PORTC = 0b00000000; // clear PORTC 
  
  INTCON = 0b00000000;


LCD_Initialize();
 __delay_ms(250); // little bit more delay
LCDGoto(5,0);//va alla riga 1 a partire dalla posizione 5
LCDPutChar('V');
LCDGoto(0,1);//va alla riga 2 a partire dalla posizione 0
LCDPutStr("primok");
  
    while(1){
       
        OUT_RB0^=1;
       __delay_ms(1000);
       
    }
    return;
}
 


Lcd.h

 #define _XTAL_FREQ  20000000UL
#include <xc.h> // include processor files - each processor file is guarded.  


// Command set for Hitachi 44780U LCD display controller
#define LCD_CLEAR           0x01
#define LCD_HOME            0x02
#define LCD_CURSOR_BACK     0x10
#define LCD_CURSOR_FWD      0x14
#define LCD_PAN_LEFT        0x18
#define LCD_PAN_RIGHT       0x1C
#define LCD_CURSOR_OFF      0x0C
#define LCD_CURSOR_ON       0x0E
#define LCD_CURSOR_BLINK    0x0F
#define LCD_CURSOR_LINE2    0xC0
//******************************************************************
#define LCD_PORT     PORTC
#define LCD_D4 RC0 // LCD data 4 
#define LCD_D5 RC1 // LCD data 5 
#define LCD_D6 RC2 // LCD data 6 
#define LCD_D7 RC3 // LCD data 7 

#define LCD_RS RC4 // Register select 
#define LCD_EN RC5 // Enable  
#define LCD_RW RC6 //RW
#define LCD_PWR RC7
//********************************************************************
#define LCD_delay           50     // ~5mS
#define LCD_Startup         15    // ~15mS 

#define NB_LINES    2      // Number of display lines
#define NB_COL      16     // Number of characters per line
//********************************************************************
// display controller setup commands from page 46 of Hitachi datasheet
#define FUNCTION_SET        0x28    // 4 bit interface, 2 lines, 5x8 font
#define ENTRY_MODE          0x06    // increment mode
#define DISPLAY_SETUP       0x0C   // display on, cursor off, blink offd

#define LCDLine1()          LCDPutCmd(LCD_HOME)          // legacy support
#define LCDLine2()          LCDPutCmd(LCD_CURSOR_LINE2)  // legacy support
#define shift_cursor()      LCDPutCmd(LCD_CURSOR_FWD)    // legacy support
#define cursor_on()         LCDPutCmd(LCD_CURSOR_ON)     // legacy support
#define DisplayClr()        LCDPutCmd(LCD_CLEAR)         // Legacy support
//************************************************************************
// single bit for selecting command register or data register
#define instr        0
#define data         1 
//************************************************************************
// Function prototypes 
void LCD_Initialize(void); 
void LCDPutChar(unsigned char ch); 
void LCDPutCmd(unsigned char ch); 
void LCDPutStr( const char *);  
void LCDWriteNibble(unsigned char  ch,unsigned char  rs); 
void LCDGoto(unsigned char pos, unsigned char ln); 
 


Lcd.c

 #include <xc.h> 
#include "Lcd.h"
#include <stdint.h> 
void LCD_Initialize()
{
    // clear latches before enabling TRIS bits
    LCD_PORT = 0;

    TRISC = 0x00;

    // power up the LCD
    LCD_PWR = 1;

    // required by display controller to allow power to stabilize
    __delay_ms(LCD_Startup);

    // required by display initialization
    LCDPutCmd(0x32);

    // set interface size, # of lines and font
    LCDPutCmd(FUNCTION_SET);

    // turn on display and sets up cursor
    LCDPutCmd(DISPLAY_SETUP);
    
    DisplayClr();

    // set cursor movement direction
    LCDPutCmd(ENTRY_MODE);

}
void LCDWriteNibble(unsigned char ch,unsigned char rs)
{
    // always send the upper nibble
    ch = (unsigned char) (ch >> 4);

    // mask off the nibble to be transmitted
    ch =(unsigned char)  (ch & 0x0F);

    // clear the lower half of LCD_PORT
    LCD_PORT = (unsigned char) (LCD_PORT & 0xF0);

    // move the nibble onto LCD_PORT
    LCD_PORT =(unsigned char)   (LCD_PORT | ch);

    // set data/instr bit to 0 = insructions; 1 = data
    LCD_RS = rs;

    // RW - set write mode
    LCD_RW = 0;

    // set up enable before writing nibble
    LCD_EN = 1;

    // turn off enable after write of nibble
    LCD_EN = 0;
}

void LCDPutChar(unsigned char ch)
{
    __delay_ms(LCD_delay);

    //Send higher nibble first
    LCDWriteNibble(ch,data);

    //get the lower nibble
    ch = (unsigned char)(ch << 4);

    // Now send the low nibble
    LCDWriteNibble(ch,data);
}

    
void LCDPutCmd(unsigned char ch)
{
    __delay_ms(LCD_delay);

    //Send the higher nibble
    LCDWriteNibble(ch,instr);

    //get the lower nibble
    ch =(unsigned char)(ch << 4);
   
    __delay_ms(1);

    //Now send the lower nibble
    LCDWriteNibble(ch,instr);
}


void LCDPutStr( const char *str)
{

    uint8_t i=0;
    
    // While string has not been fully traveresed
    while (str[i])
    {
        // Go display current char
        LCDPutChar(str[i++]);
    }
}    


void LCDGoto(unsigned char pos,unsigned char ln)
{
    // if incorrect line or column
    if ((ln > (NB_LINES-1)) || (pos > (NB_COL-1)))
    {
        // Just do nothing
        return;
    }

    // LCD_Goto command
    LCDPutCmd((unsigned char) ((ln == 1) ? (0xC0 |pos) : (0x80 | pos)));

    // Wait for the LCD to finish
    __delay_ms(LCD_delay);

 








Oh creature sciocche quanta ignoranza è quella che v'offende.

Dante
e.ferriani





postato il:
14.11.2017, alle ore 13:03
Grazie mille PrimoK.

Vedo che tu usi sia Enable sia R/W. Io sono abbastanza sicuro di aver sempre usato la configurazione a 6 fili, quindi i 4 dati, RS ed Enable, dato che li collegavo alla porta B del 16F877A, che per questo progetto è sovradimensionato.
A questo punto mi fai venire il dubbio che avendo cambiato display, era un Windstar, l'articolo ora non lo ricordo, mentre questo è un Cristal Clear C216x01. La concomitanza tra nuovo display, compilatore non ancora del tutto chiaro, routine che non girano più con quest'ultimo.... mi hanno messo in confusione. Appena riesco verifico il circuito base, che era quello già usato in precedenza e vedo chi ho messo a massa, se Enable o se R/W e a chi corrisponde in questo display. Se volessi utilizzare solo 6 pin come prima? Chi metto a massa e chi includo nel programma?

Grazie ancora. Ti faccio sapere.



Enea Ferriani
e.ferriani@alice.it
primok




una ogni 100 livelli
una ogni 10 livelli


postato il:
14.11.2017, alle ore 14:05
A massa va sempre R\W (pin 5) sia del winstar che del C216x01 avendo i piedini equivalenti a parte quelli della retroilluminazione che potrebbereo differire.
Primok



Oh creature sciocche quanta ignoranza è quella che v'offende.

Dante
e.ferriani





postato il:
14.11.2017, alle ore 19:16
primok:
A massa va sempre RW (pin 5) sia del winstar che del C216x01 avendo i piedini equivalenti a parte quelli della retroilluminazione che potrebbereo differire.
Primok


Vedo ora che nel codice l'hai solo dichiarato poi mezzo a zero, quindi a massa va bene.
Confermo che nella mia scheda è a massa.

Provo il programma.



Enea Ferriani
e.ferriani@alice.it
e.ferriani





postato il:
14.11.2017, alle ore 20:11
Funziona, ma non sempre. Mi spiego.
Al primo avvio consecutivo alla programmazione ha scritto V e primoK, poi la seconda riga si e cancellata subito.
Da lì in poi sembra non sia più programmabile... A spot si riesce. Forse c'è qualcosa nei tempi.



Enea Ferriani
e.ferriani@alice.it
primok




una ogni 100 livelli
una ogni 10 livelli


postato il:
14.11.2017, alle ore 21:05
e.ferriani:
Funziona, ma non sempre. Mi spiego.
Al primo avvio consecutivo alla programmazione ha scritto V e primoK, poi la seconda riga si e cancellata subito.
Da lì in poi sembra non sia più programmabile... A spot si riesce. Forse c'è qualcosa nei tempi.


Certo, perchè è abilitato il watch dog

correggi in config mettendo l'istruzione
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT enabled)

al posto di

#pragma config WDTE = ON // Watchdog Timer Enable bit (WDT enabled)

Primok_V



Oh creature sciocche quanta ignoranza è quella che v'offende.

Dante
segui questo thread con grixFC, per questa funzione devi aver installato il software grixFC

torna su
     

Come utente anonimo puoi leggere il contenuto di questo forum ma per aprire una discussione
o per partecipare ad una discussione esistente devi essere registrato ed accedere al sito




 

 
 
indietro | homepage | torna su copyright © 2004/2017 GRIX.IT - La community dell'elettronica Amatoriale