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?
PIC E DISPLAY LCD
Moderatore:
Paolino
0
voti
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.
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
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-

Paolino
32,6k 8 12 13 - G.Master EY

- Messaggi: 4226
- Iscritto il: 20 gen 2006, 11:42
- Località: Vigevano (PV)
0
voti
Wow...scusa ma sei un mostro
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 
No, Gli slave li vorrei construire in base alla master, ma ho diciamo il necessario
485?Magari, credo sarebbe perfetta...
Cosa vuol dire?
20 uscite per ogni slave.
Non sono un cima se non è così difficile e puoi spiegarmi qualcosina...
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...
che differenza c'è?
si, fondamentalmente sono tutti uguali.
Eventualmente posso passarti qualche immagine di una fatta completamente manuale, vorrei rimanere sullo stesso stile diciamo...
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...
-

InColdBlood
0 2 - New entry

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

InColdBlood
0 2 - New entry

- Messaggi: 68
- Iscritto il: 9 feb 2009, 15:42
0
voti
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...
-

InColdBlood
0 2 - New entry

- Messaggi: 68
- Iscritto il: 9 feb 2009, 15:42
0
voti
Ciao, potreste consigliarmi dei buoni libri per imparare a driverare LDC in linguaggio C?
Vi ringrazio.
Vi ringrazio.
-

christianpalazzolo
0 1 - Messaggi: 3
- Iscritto il: 7 apr 2009, 21:38
0
voti
0
voti
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
) (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
LCD_2x16_8bit.c
Impiego un PIC 16F876A con quarzo a 4MHz ed un LCD della Displaytech con retroilluminazione guasta (....colpa mia...colpa mia
) (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
« Un giorno la paura bussò alla porta, il coraggio andò ad aprire ma non trovò nessuno » - J.W. Goethe
-

NRG Power
115 2 5 - Expert EY

- Messaggi: 302
- Iscritto il: 14 gen 2005, 23:04
- Località: Stoccarda, Germania
0
voti
Allora, alcuni aggiornamenti: ho verificato positivamente il funzionamento dell'LCD gestendolo "manualmente"
, "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
« Un giorno la paura bussò alla porta, il coraggio andò ad aprire ma non trovò nessuno » - J.W. Goethe
-

NRG Power
115 2 5 - Expert EY

- Messaggi: 302
- Iscritto il: 14 gen 2005, 23:04
- Località: Stoccarda, Germania
Torna a Realizzazioni, interfacciamento e nozioni generali.
Chi c’è in linea
Visitano il forum: Nessuno e 18 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)
