spacer.png, 0 kB

Torna indietro   Roboitalia.com - Il primo portale in Italia sulla robotica amatoriale > Robotica di base > Elettronica > E. Digitale

Rispondi
 
Strumenti discussione Modalit visualizzazioe
  #1  
Vecchio 06-06-2010, 10.42.57
maverik46 maverik46 non è collegato
Robottaro senior
 
Data registrazione: 16-12-2009
Residenza: teramo
Et: 33
Messaggi: 49
Potenza reputazione: 42
maverik46 E' per ora ancora un mistero
Predefinito Aiuto urgente dspic30 + libreria lcd T6963C per progetto di Tesi

Salve a tutti, sto scrivendo la libreria per pilotare un display con controller T6963C attraverso un dspic30f4011 per il mio progetto di Tesi . Per fare cio' sto' prendendo spunto dalla libreria che ho trovato su un articolo di ELETTRONICA IN che pero' e' scritta per un pic18f4620. Il mio problema e' di pura programmazione e cerchero' di spiegarlo: La libreria scritta per il pic18 usa per inviare i dati e i comandi a 8 bit un intero regristro PORTB che e' composto da 8 porte RB0 ... RB7 , quindi quando scrive un dato DA 8 bit scrive semplicemente su PORTB . Il mio dspic30f4011 invece ha la PORTB che e' composta da 9 pin tra cui gli ingressi analogici che dovro' usare per altri scopi , mentre le altre porte (PORTC , PORTD ,PORTE ,PORTF ) hanno tutte meno di 8 pin necessari per scrivere sul bus dati dell' LCD.
Quindi dovro' usare du porte distinte, e quindi due distinti registri PORT per inviare dati e comandi all' LCD ... e questo e' il problema , visto che non sono un programmatore esperto. Ho pensato che dovrei definire una struct su un header file dove definisco una ''PORTDATI'' composta da elementi di varie porte , pero' non so' come fare e soprattutto se e' lecito farlo .Oppure devo usare una direttiva #define ..... Oppure ci sono altri metodi ?

Vi prego aiutatemi perche' mi sono impantanato !!!

Ultima modifica di maverik46 : 06-06-2010 alle ore 10.51.11
Rispondi citando
  #2  
Vecchio 07-06-2010, 06.32.11
L'avatar di sergio_camici
sergio_camici sergio_camici non è collegato
Administrator
 
Data registrazione: 24-05-2002
Residenza: Binasco (MI)
Et: 55
Messaggi: 2,665
Potenza reputazione: 303
sergio_camici La sua reputazione  oltre la sua famasergio_camici La sua reputazione  oltre la sua famasergio_camici La sua reputazione  oltre la sua famasergio_camici La sua reputazione  oltre la sua famasergio_camici La sua reputazione  oltre la sua famasergio_camici La sua reputazione  oltre la sua famasergio_camici La sua reputazione  oltre la sua fama
Predefinito

Non ho ben capito cosa hai in testa ma non credo possa funzionare.
Io fari una routine che prende il byte e loespone sulle porte filtrando e shiftando.
con un AND estrai solo i bit che ti servono e con uno shift li metti nella posizione che ti serve.
__________________
ciao
Sergio
---
Hai deciso di costruire un robot? Bene...
Cominciamo dalle brutte notizie: non e' facile...
Rispondi citando
  #3  
Vecchio 07-06-2010, 11.52.28
maverik46 maverik46 non è collegato
Robottaro senior
 
Data registrazione: 16-12-2009
Residenza: teramo
Et: 33
Messaggi: 49
Potenza reputazione: 42
maverik46 E' per ora ancora un mistero
Predefinito forse risolto

Forse ho risolto, ho scritto questa funzione :

void send_BUS_LCD(unsigned char Data)
{
LATFbits.LATF0 = (Data) & 0x01; //scrive DB0
LATFbits.LATF1 = (Data>>1) & 0x01; //scrive DB1
LATFbits.LATF2 = (Data>>2) & 0x01; //scrive DB2
LATFbits.LATF3 = (Data>>3) & 0x01; //scrive DB3
LATFbits.LATF4 = (Data>>4) & 0x01; //scrive DB4
LATFbits.LATF5 = (Data>>5) & 0x01; //scrive DB5
LATFbits.LATF6 = (Data>>6) & 0x01; //scrive DB6
LATEbits.LATE0 = (Data>>7) & 0x01; //scrive DB7
}

Che isola i singoli bit del dato a 8 bit e li invia ai pin singolarmente
Rispondi citando
  #4  
Vecchio 07-06-2010, 12.01.41
L'avatar di sergio_camici
sergio_camici sergio_camici non è collegato
Administrator
 
Data registrazione: 24-05-2002
Residenza: Binasco (MI)
Et: 55
Messaggi: 2,665
Potenza reputazione: 303
sergio_camici La sua reputazione  oltre la sua famasergio_camici La sua reputazione  oltre la sua famasergio_camici La sua reputazione  oltre la sua famasergio_camici La sua reputazione  oltre la sua famasergio_camici La sua reputazione  oltre la sua famasergio_camici La sua reputazione  oltre la sua famasergio_camici La sua reputazione  oltre la sua fama
Predefinito

E' parecchio pi "time expensive" della mia idea ma sicuramente funziona.

Considera che in fin dei conti hai bisogno solo del bit pi alto in una posizione non naturale.
__________________
ciao
Sergio
---
Hai deciso di costruire un robot? Bene...
Cominciamo dalle brutte notizie: non e' facile...
Rispondi citando
  #5  
Vecchio 07-06-2010, 12.28.30
maverik46 maverik46 non è collegato
Robottaro senior
 
Data registrazione: 16-12-2009
Residenza: teramo
Et: 33
Messaggi: 49
Potenza reputazione: 42
maverik46 E' per ora ancora un mistero
Predefinito

Tu come mi suggeriresti di fare per ottimizzare il tempo?

Intendi cosi :

void send_BUS_LCD(unsigned char Data)
{
LATF = (Data) & 0x7f; //scrive DBO ... DB6
LATEbits.LATE0 = (Data>>7) & 0x01; //scrive DB7
}

Ultima modifica di maverik46 : 07-06-2010 alle ore 12.33.03
Rispondi citando
  #6  
Vecchio 07-06-2010, 13.31.35
L'avatar di astrobeed
astrobeed astrobeed non è collegato
Robottaro sostenitore
 
Data registrazione: 18-03-2004
Residenza: Roma
Et: 60
Messaggi: 3,377
Potenza reputazione: 350
astrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua fama
Predefinito

Citazione:
Orginalmente inviato da maverik46 Visualizza messaggio
Quindi dovro' usare du porte distinte, e quindi due distinti registri PORT per inviare dati e comandi all' LCD ... e questo e' il problema
Il modo pi semplice, nonch efficace anche dal punto di vista tempi di esecuzione creare una union dove hai sia il dato che la sua suddivisione in bit, poi tramite una funzione, o macro define, assegni i singoli bit del dato ai singoli pin che vuoi usare.
In pratica hai una cosa di questo tipo:

Questa la definizione dell'unione
Codice:
union ld
{
 unsigned char dp;	
 struct Lcd_bit
  {
    char data0:1;
    char data1:1;
    char data2:1;
    char data3:1;
    char data4:1;
    char data5:1;
    char data6:1; 
    char data7:1;
  } dbits;
};
Per usarla
Codice:
union ld dataport;        // abbina al nome simbolico dataport l'unione ld


dataport.dp = dato;     // scrivo il carattere da inviare

// trasferisco i singoli bit ai vari GPIO
// questa pu essere sotto forma di funzione o macro define
LATFbits.LATF0 = dataport.dbits.data0;
LATFbits.LATF1 = dataport.dbits.data1;
LATFbits.LATF2 = dataport.dbits.data2;
LATFbits.LATF3 = dataport.dbits.data3;
LATFbits.LATF4 = dataport.dbits.data4;
LATFbits.LATF5 = dataport.dbits.data5;
LATFbits.LATF6 = dataport.dbits.data6;
LATEbits.LATE0 = dataport.dbits.data7;
__________________
Bye
Rispondi citando
  #7  
Vecchio 07-06-2010, 15.22.43
maverik46 maverik46 non è collegato
Robottaro senior
 
Data registrazione: 16-12-2009
Residenza: teramo
Et: 33
Messaggi: 49
Potenza reputazione: 42
maverik46 E' per ora ancora un mistero
Predefinito

Grazie Astrobeed . Pero' non ho capito una cosa:

Codice:
union ld dataport;        // abbina al nome simbolico dataport l'unione ld


dataport.dp = dato;     // scrivo il carattere da inviare

// A questo punto il dato si trova nella variabile dp della union , non nella  
// "struct Lcd_bit dbits" , come faccio a trasferirli ai singoli pin ????
//forse non mi e' chiara molto bene la '' union ''

LATFbits.LATF0 = dataport.dbits.data0;
LATFbits.LATF1 = dataport.dbits.data1;
LATFbits.LATF2 = dataport.dbits.data2;
LATFbits.LATF3 = dataport.dbits.data3;
LATFbits.LATF4 = dataport.dbits.data4;
LATFbits.LATF5 = dataport.dbits.data5;
LATFbits.LATF6 = dataport.dbits.data6;
LATEbits.LATE0 = dataport.dbits.data7;
Inoltre cosa intendi quando dici : "questa pu essere sotto forma di funzione o macro define " ???
Rispondi citando
  #8  
Vecchio 07-06-2010, 15.54.56
L'avatar di astrobeed
astrobeed astrobeed non è collegato
Robottaro sostenitore
 
Data registrazione: 18-03-2004
Residenza: Roma
Et: 60
Messaggi: 3,377
Potenza reputazione: 350
astrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua fama
Predefinito

Citazione:
Orginalmente inviato da maverik46 Visualizza messaggio
Grazie Astrobeed . Pero' non ho capito una cosa:

// A questo punto il dato si trova nella variabile dp della union , non nella
// "struct Lcd_bit dbits" , come faccio a trasferirli ai singoli pin ????
//forse non mi e' chiara molto bene la '' union ''
L'unione ti permette di rappresentare lo stesso dato in vari modi, se scrivi dentro dp automaticamente l'hai scritto anche nella struttura perch la stessa variabile (dataport), ovviamente vale anche viceversa.
__________________
Bye
Rispondi citando
  #9  
Vecchio 07-06-2010, 16.03.38
maverik46 maverik46 non è collegato
Robottaro senior
 
Data registrazione: 16-12-2009
Residenza: teramo
Et: 33
Messaggi: 49
Potenza reputazione: 42
maverik46 E' per ora ancora un mistero
Predefinito

Ho capito , grazie mille

Cosa intendevi per " macro define " , mi potresti fare un esempio ?
Rispondi citando
  #10  
Vecchio 07-06-2010, 16.51.18
L'avatar di astrobeed
astrobeed astrobeed non è collegato
Robottaro sostenitore
 
Data registrazione: 18-03-2004
Residenza: Roma
Et: 60
Messaggi: 3,377
Potenza reputazione: 350
astrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua famaastrobeed La sua reputazione  oltre la sua fama
Predefinito

Citazione:
Orginalmente inviato da maverik46 Visualizza messaggio
Cosa intendevi per " macro define " , mi potresti fare un esempio ?
Una macro define una define dove invece di sostituire un nome simbolico con una variabile reale lo sostituisci con una serie di istruzioni separate dalla virgola.
Esempio:

#define lcd_data (istruzione1, istruzione, istruzione3 ............. , istruzioneN)

Nel tuo caso forse conviene pi definire una vera e propria funzione dove vengono assegnati i singoli bit dei GPIO a quelli dei dati.
__________________
Bye
Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione
Modalit visualizzazioe

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code Attivato
Le smilies sono Attivato
[IMG] Attivato
Il codice HTML Disattivato

Vai al forum

Discussioni simili
Discussione Autore discussione Forum Risposte Ultimo messaggio
Progetto (tesi) RFId edo.poli Arduino 8 27-09-2012 16.08.51
aiuto urgente xbee series 1 non si associano ribellion Elettronica 10 02-04-2011 18.20.09
aiuto su progetto rc car robotizzata bixiostyle Forum generale 0 30-03-2010 15.49.12
Aiuto Progetto FrancescoCapone Forum generale 1 27-08-2008 15.49.19
Aiuto Tesi C++ Open Cv NunzioCristian OpenCV 1 17-07-2007 09.03.21


Tutti gli orari sono GMT. Adesso sono le: 15.57.16.


Basato su: vBulletin Versione 3.8.8
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Realizzazione siti web Cobaltica Foligno
spacer.png, 0 kB