Indirizzo Multiplexed / bus dati su PIC18F

J

jboud

Guest
Ciao a tutti,
Io uso la porta d multiplex per aggiungere / dati per il controllo di un modem (mfrc531)
ed ecco la mia funzione di lettura:

unsigned char leggi (char unsigned aggiungere)

(Unsigned char val;

SET_TRIS_D (0x00);
output_d (aggiungere); / / Invia indirizzo
delay_cycles (1);
output_high (ALE);
delay_cycles (1);
output_low (ALE);
delay_us (3);
output_low (NRD);
SET_TRIS_D (0xFF);
delay_us (3);
val = input_d (); / / ricevere dati
delay_cycles (1);
output_high (NRD);
delay_cycles (1);

return val;
)il problema è che val assume il valore di indirizzo che ho inviato previsiouly.

Non riesco a trovare il problema.

Vorrei davvero apprezzare ricevere il vostro aiuto.

Cordialmente

 
Ciao a tutti,
Io uso la porta d multiplex per aggiungere / dati per il controllo di un modem (mfrc531)
ed ecco la mia funzione di lettura:

unsigned char leggi (char unsigned aggiungere)

(Unsigned char val;

SET_TRIS_D (0x00);
output_d (aggiungere); / / Invia indirizzo
delay_cycles (1);
output_high (ALE);
delay_cycles (1);
output_low (ALE);
delay_us (3);
output_low (NRD);
SET_TRIS_D (0xFF);
delay_us (3);
val = input_d (); / / ricevere dati
delay_cycles (1);
output_high (NRD);
delay_cycles (1);

return val;
)il problema è che val assume il valore di indirizzo che ho inviato previsiouly.

Non riesco a trovare il problema.

Vorrei davvero apprezzare ricevere il vostro aiuto.

Cordialmente

 
Questo è probabilmente un problema di temporizzazione.Dovrete sperimentare per trovare i ritardi ottimale tra le chiamate.Provare ad aumentare il befor ritardo del porto di lettura.

Qual è il codice nelle dichiarazioni?
output_d (aggiungere);
val = input_d ();

Sono queste funzioni o macro?

Sarebbe meglio scrivere
LATD = add;
val = PORTD;

per evitare il sovraccarico di una chiamata di funzione, se queste sono le funzioni.

Se sono le macro, dont usarli.Le macro sono stati ammortizzati in quanto oscura la comprensione del codice e non sono altro che la sostituzione delle stringhe.

 
La ringrazio per la risposta.

output_d (aggiungere) e val = input_d () funzioni sono fornite dal compilatore CCS.
Non possiamo accedere al loro corpo.

Cercherò

LATD = add;
val = PORTD;

e vi terrò informati

cordialmente

 
Hi jboud

Sembra che tu possa essere la lettura del porto FERMO e non i perni porta
- Controllare il codice assembly generato sta leggendo registro 0xF83 (PORTD)

Suggerisco che il TRISD 0xFF collocato in mezzo al negativo Leggi Strobe (NRD)

Si può anche avere un problema con il bus.

Il foglio di dati protetti del MFRC531, che hai avuto problemi di sblocco, afferma che le linee dati avvenire entro 65ns del bordo di attacco negativo della strobo leggere NRD.

Alle ore max il 18F452 ha 100ns per l'istruzione - di rilasciare il bus (trisd 0xff), dopo aver affermato il flash è troppo tardi!

Come ho letto i tempi - la maggior parte dei vostri ritardi potrebbero essere rimosse in quanto sono inutili con il 18F452 a 40MHz.

hope this helps - Polymath

 

Welcome to EDABoard.com

Sponsor

Back
Top