Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

PIC E DISPLAY LCD

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[81] Re: PIC E DISPLAY LCD

Messaggioda Foto UtenteInColdBlood » 10 mar 2009, 2:52

Beh quello che vorrei fare è si controllare un display, ma essendo una centralina, dovrei controllare delle stazione...ti spiego...

c'è la centralina master e varie slave.

La master avrà il display dove dovrà apparire quello che sto controllando come ad esempio lo slave 1-2-3 ecc...ed eventualmente poter gestire dei timing.

ogni slave avrà 10 o 20 uscite, una volta usate hanno finito il loro lavoro...

Secondo te di cosa ho bisogno?
Avatar utente
Foto UtenteInColdBlood
0 2
New entry
New entry
 
Messaggi: 68
Iscritto il: 9 feb 2009, 15:42

0
voti

[82] Re: PIC E DISPLAY LCD

Messaggioda Foto UtentePaolino » 10 mar 2009, 18:19

Mmh, le specifiche sono un po' povere. Ecco alcune domande (in ordine sparso):

1. gli slave ce li hai già? O al più: hai già il progetto degli slave?
2. con quale interfaccia devono comunicare master e slave? RS485 potrebbe andar bene?
3. il master deve disporre anche lui di I/O?
4. 10 o 20 uscite, dici; non è banale passare da 10 a 20...! Puoi quantificare in modo più preciso?
5. uscite tutte digitali? No PWM?
6. di ingressi non ne hai bisogno?!?!? Se sì, quanti? E a chi si connettono: master o slave o tutti?
7. gli eventuali ingressi devono essere solo digitali o anche analogici?
8. gli slave sono tutti uguali come struttura?

Ti consiglio di aprire un thread specifico, lasciando questo per le discussioni sul tema originale.

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,6k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4226
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[83] Re: PIC E DISPLAY LCD

Messaggioda Foto UtenteInColdBlood » 11 mar 2009, 10:33

Wow...scusa ma sei un mostro :D nel senso geniale...mi hai fatto tutte le domande più specifiche in assoluto e nel migliore dei modi a cui posso dare risposte...anche non capendone nulla :D

1. gli slave ce li hai già? O al più: hai già il progetto degli slave?

No, Gli slave li vorrei construire in base alla master, ma ho diciamo il necessario

2. con quale interfaccia devono comunicare master e slave? RS485 potrebbe andar bene?

485?Magari, credo sarebbe perfetta...

3. il master deve disporre anche lui di I/O?

Cosa vuol dire? :(

4. 10 o 20 uscite, dici; non è banale passare da 10 a 20...! Puoi quantificare in modo più preciso?

20 uscite per ogni slave.

5. uscite tutte digitali? No PWM?

Non sono un cima se non è così difficile e puoi spiegarmi qualcosina...
6. di ingressi non ne hai bisogno?!?!? Se sì, quanti? E a chi si connettono: master o slave o tutti?

BEh effettivamente si, se voglio effettuare qualche nuova programmazione un ingresso anche due sia su master che su uno slave non sarebbe male, su tutti è esagerato...

7. gli eventuali ingressi devono essere solo digitali o anche analogici?

che differenza c'è?
8. gli slave sono tutti uguali come struttura?

si, fondamentalmente sono tutti uguali.

Eventualmente posso passarti qualche immagine di una fatta completamente manuale, vorrei rimanere sullo stesso stile diciamo...
Avatar utente
Foto UtenteInColdBlood
0 2
New entry
New entry
 
Messaggi: 68
Iscritto il: 9 feb 2009, 15:42

0
voti

[84] Re: PIC E DISPLAY LCD

Messaggioda Foto UtenteInColdBlood » 13 mar 2009, 17:41

Paolo, ho aperto una nuova discussione...ma penso che per facilitare le cose cambierò una parte del progetto...sarà molto più semplice la cosa...
Avatar utente
Foto UtenteInColdBlood
0 2
New entry
New entry
 
Messaggi: 68
Iscritto il: 9 feb 2009, 15:42

0
voti

[85] Re: PIC E DISPLAY LCD

Messaggioda Foto UtenteInColdBlood » 17 mar 2009, 12:38

Sto pensando di poter programmare solo gli slave singolarmente invece che creare una master per programmare tutto...vorrei passarti un link per farti vedere cosa vorrei fare...
Avatar utente
Foto UtenteInColdBlood
0 2
New entry
New entry
 
Messaggi: 68
Iscritto il: 9 feb 2009, 15:42

0
voti

[86] Re: PIC E DISPLAY LCD

Messaggioda Foto Utentechristianpalazzolo » 7 apr 2009, 21:45

Ciao, potreste consigliarmi dei buoni libri per imparare a driverare LDC in linguaggio C?
Vi ringrazio.
Avatar utente
Foto Utentechristianpalazzolo
0 1
 
Messaggi: 3
Iscritto il: 7 apr 2009, 21:38

0
voti

[87] Re: PIC E DISPLAY LCD

Messaggioda Foto Utenteaduri » 8 apr 2009, 8:48

Intanto prova a dare un'occhiata qui:

http://www.fisertek.it/index_000010.html

Ciao
Antonio
Avatar utente
Foto Utenteaduri
435 1 5 11
Expert
Expert
 
Messaggi: 937
Iscritto il: 29 giu 2005, 23:13
Località: Genova

0
voti

[88] Re: PIC E DISPLAY LCD

Messaggioda Foto Utentechristianpalazzolo » 8 apr 2009, 21:19

grazie Antonio,ciao
:)
Avatar utente
Foto Utentechristianpalazzolo
0 1
 
Messaggi: 3
Iscritto il: 7 apr 2009, 21:38

0
voti

[89] Re: PIC E DISPLAY LCD

Messaggioda Foto UtenteNRG Power » 9 set 2009, 18:49

Salve ragazzi, sto iniziando a studiare la gestione dell'LCD via PIC ed ho deciso di scrivere una semplice routine di gestione di un display LCD 2 righe 16 colonne, modalità 8 bit (quindi base base). Il firmware è scritto in C e compilato in ambiente PICC.
Impiego un PIC 16F876A con quarzo a 4MHz ed un LCD della Displaytech con retroilluminazione guasta (....colpa mia...colpa mia #-o :^o ](*,)) (datasheet).
In sintesi utilizzo la PORTB com bus dati DB0÷DB7, mentre due uscite RC4-RC5 rispettivamente per RS-EN dell'LCD.
Ho provato a testare la semplice scrittura di un stringa, ma all'accensione compare un'eloquente riga di quadratini neri (solo la riga superiore e portando al massimo il contrasto), ed da li non si muove. Da quanto ho potuto appurare da Internet, questo è un tipico sintomo di errata inizializzazione. Ho provveduto a controllare più volte i collegamenti ma, per ora, non ne vengo a capo della questione. Nella scrittura della routine LCD_start, che si occupa appunto della inizializzazione mi sono basato su quanto, riportato nel datasheet a pag 6 aumentando qualche ritardo. Nella programmazione ho disabilitato Watch Dog Timer, Power Up Timer, Brown Out Detect, Low Voltage Program, mentre nel cirucito l'MCLR è connesso con un resistore da 1kOhm a Vdd e vicino all'alimentazione ho derivato un condensatore in poliestere.

Di seguito riporto il modulo principale e quello di gestione dell'LCD, ancora da ultimare in alcune cose.
Main.c
Codice: Seleziona tutto
#include "init.h"   // included by C-Wiz
#include <htc.h>
#include <stdio.h>
#include <delay.c>
#include <math.h>
#include <LCD_2x16_8bit.c>

void
main(void)
{
   init();   // Function call inserted by C-Wiz
   TRISB=0; // PORTB impostati come output
   TRISC=0; // PORTC impostati come output
   LCD_start();
   LCD_writestring("Temperature",1,1);
   LCD_writestring("Battery 12.5V",2,3);
}


LCD_2x16_8bit.c
Codice: Seleziona tutto
/*
>>>> LCD_2x16_8bit.c <<<<
Trasmissione dati ad un display LCD 2x16, modalità 8bit

---[Funzioni]
   LCD_send() - Abilitazione acquisizione dati LCD
   LCD_cls() - Cancellazione schermo LCD
   LCD_start() - Inizializzazione display LCD
   LCD_stop() - Spegnimento display LCD
   LCD_gotoxy(row,col) - Posizionamento cursore alle coordinate
   LCD_writechar(character,row,col) - Scrittura carattere su LCD alla row-esima riga, col-esima colonna
   LCD_writestring(*string,row,col)   - Scrittura stringa su LCD a partire dalla row-esima riga, col-esima colonna
   LCD_writenumber(int_num,decimalpart,giustification,row,col)

---[Variabili]
   row, col, character: char (es. row=1÷2, col=1÷16, character='a', 'b', 'c', '1', ',', ...)
   *string: const *char (es. "Hello, world!" ...)

---[Configurazione pin pin LCD = pin PIC]
   RS=RC4 (digitale, out)
   EN=RC5 (digitale, out)
   DB0=RB0 (digitale, out)
   DB1=RB1 (digitale, out)
   DB2=RB2 (digitale, out)
   DB3=RB3 (digitale, out)
   DB4=RB4 (digitale, out)
   DB5=RB5 (digitale, out)
   DB6=RB6 (digitale, out)
   DB7=RB7 (digitale, out)
   R/W=0 (digitale, solo scrittura)
   
---["Include" necessari nel programma principale]
   #include <delay.c>
   #include <htc.h>
   #include <math.h>
   #include <stdio.h>
*/

/* Preprocessore */
#define   RS RC4 // Register select
#define   EN RC5   // Enable
#define   data PORTB   // LCD data 0
#define cls 0b00000001 // Pulitura schermo
#define data_h 0b00000000 // DB0÷DB7=0

/* Prototipo delle funzioni */
void LCD_send(void); // Abilitazione acquisizione dati LCD
void LCD_cls(void); // Cancellazione schermo LCD
void LCD_start(void); // Inizializzazione display LCD
void LCD_stop(void); // Spegnimento display LCD
void LCD_gotoxy(unsigned char row,unsigned char col); // Posizionamento cursore alle coordinate (row,col)
void LCD_write(unsigned char character); // Scrittura carattere su LCD
void LCD_writechar(unsigned char character,unsigned char row, unsigned char col); // Scrittura carattere su LCD alla row-esima riga, col-esima colonna
void LCD_writestring(const char *string,unsigned char row,unsigned char col); // Scrittura stringa su LCD a partire dalla row-esima riga, col-esima colonna
void LCD_writenum(float number, unsigned char decimal_part,unsigned char giust,unsigned char row,unsigned char col);

/* Definizione delle funzioni */
void LCD_send(void) // Acquisizione dati
{// Impulso di abilitazione 0-1-0
   EN=1;
   DelayUs(2); // 1us (min 0,22us)
   EN=0;
}

void LCD_cls(void) // Cancellazione schermo LCD
{
   RS=0;
   data=cls;
   LCD_send();
   DelayMs(5); // 5ms (min 4,1ms)
}

void LCD_start(void) //Inizializzazione LCD
{
   RS=0;
   EN=0;
   DelayMs(20); // 20ms (min 15ms)
   data=0b00110000;
   LCD_send();
   DelayMs(10); // 42us
   LCD_send();
   DelayUs(120); // 120us (min 100us)
   LCD_send();
   DelayMs(10); // 10ms
   data=0b00111100; // Interfaccia 8bit, display a 2 linee, caratteri 5x10dots
   LCD_send();
   DelayUs(100); // 100us
   LCD_send();
   DelayUs(100); // 100us
   LCD_send();
   DelayUs(100); // 100us
   LCD_send();
   DelayUs(100); // 100us
   data=0b00001100; // Display on, cursore off, lampeggio off
   LCD_send();
   DelayUs(100); //100us
   LCD_cls(); // Pulitura display
   data=0b00000110; //Set Entry mode
   LCD_send();
   DelayUs(100); //100us
}

void LCD_stop(void) // Spegnimento display LCD
{
   RS=0;
   data=0b00001000;
   LCD_send();
   DelayUs(100); //100us
}

void LCD_gotoxy(unsigned char row, unsigned char col) // Posizionamento cursore allle coordinate (row,col) row=1÷2, col=1÷16
{
   RS=0;
   if (row==1) // Se è la prima riga
      data=(col-1)&data_h; // ((1÷16)-1)OR(FFh) =(00h÷0Fh)
   else // altrimenti ( se è la seconda)
      data=(col+63)&data_h; // ((1÷16)+63)OR(FFh) =(40h÷4Fh)
   LCD_send();
   DelayUs(100); // 100us
}

void LCD_write(unsigned char character) // Scrittura carattere su LCD
{
   RS=1;
   data=character;
   LCD_send();
   DelayUs(100); // 100us (min 46us)
}

void LCD_writechar(unsigned char character,unsigned char row, unsigned char col)  // Scrittura carattere su LCD all'i-esima riga, j-esima colonna
{
   LCD_gotoxy(row,col); // Posizionamento cursore alle coordinate (row, col) specificate
   LCD_write(character); // Scrittura carattere
}

void LCD_writestring(const char *string,unsigned char row, unsigned char col)  // Scrittura string su LCD a partire dalla i-esima riga, j-esima colonna
{
   LCD_gotoxy(row,col);
   for(;*string!='\0';*string++) //  A partire dal primo carattere puntato da *string fino all'ultimo diverso da /0 incrementa il puntatore al carattere
      LCD_write(*string);  // Scrittura carattere //
}

void LCD_writenum(float number, unsigned char decimal_part,unsigned char giust,unsigned char row,unsigned char col)
{
   char *number_string,num_char;
   num_char=sprintf(number_string,"%#.*f",decimal_part,number); // es. -123,456 --> -123,46
   if(giust==0) // Giustificato a destra
      LCD_writestring(number_string,row,col-num_char);
   else // Giustificato a sinistra
      LCD_writestring(number_string,row,col);
}
Ciao ...NRG...

« Un giorno la paura bussò alla porta, il coraggio andò ad aprire ma non trovò nessuno » - J.W. Goethe
Avatar utente
Foto UtenteNRG Power
115 2 5
Expert EY
Expert EY
 
Messaggi: 302
Iscritto il: 14 gen 2005, 23:04
Località: Stoccarda, Germania

0
voti

[90] Re: PIC E DISPLAY LCD

Messaggioda Foto UtenteNRG Power » 10 set 2009, 14:15

Allora, alcuni aggiornamenti: ho verificato positivamente il funzionamento dell'LCD gestendolo "manualmente" :mrgreen:, "cablando" i terminali per eseguire le istruzioni di inizializzazione e scrittura di un semplice carattere. Per questo sono sempre più convinto (il PIC funziona sicuramente) che vi siano delle temporizzazzioni non sufficienti: proverò ad inserire un ritardo iniziale, ed eventualmente incrementerò i ritardi intermedi...
Ciao ...NRG...

« Un giorno la paura bussò alla porta, il coraggio andò ad aprire ma non trovò nessuno » - J.W. Goethe
Avatar utente
Foto UtenteNRG Power
115 2 5
Expert EY
Expert EY
 
Messaggi: 302
Iscritto il: 14 gen 2005, 23:04
Località: Stoccarda, Germania

PrecedenteProssimo

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 18 ospiti