Vai al contenuto
PLC Forum


Auxiliary I/o Bus Rabbit3000


pidy

Messaggi consigliati

salve a tutti :)

sono nuovo da queste parti e diciamo anche nel campo... infatti prima di tutto spero di aver postato nella sezione corretta...

avrei bisogno di preziosi consigli... :P fino a poco tempo fa usavo un RABBIT2000, interfacciato con una FPGA, che comunicava tramite porta ethernet con un pc remoto.

essendo già in commercio, ma non avendolo ancora a disposizione, il RABBIT3000, avevo scritto un codice x emulare il bus esterno (auxiliary bus) sul 2000 stesso (proprio x il fatto che sapevo che prima o poi sarei passato al nuovo micro e questo AIO sembra portare notevoli vantaggi sotto molti punti di vista).

ora finalmente ho a dsiposizione il 3000 ma il problema è che mi trovo per la prima volta di fronte a questo BUS e non riesco ad utilizzarlo correttamente anche perchè dai manuali non si capisce molto.

innanzittuo una volta definita la seguente:

#define PORTA_AUX_IO

la porta parallela A e quella parallela B vengono automaticamente inizialiazzate come data_bus e address_bus o devo settare qualche altro registro particolare?

e poi quello che mi chiedo, il flusso dati (letture e scritture x capirci) è gestito automaticamente dal BUS o no? e per quanto riguarda gli strobe di lettura e scritura?

insomma qualcuno ha mai avuto a che fare con questo auxiliary bus?

grazie mille aspetto fiducioso ;)

Link al commento
Condividi su altri siti


Non ho in questo momento sottomano la documentazione completa (dovrei reinstallare il tutto) , quindi vado a memoria : nel rabbit c'e Questo schema con la loro demoboard dove implementano un master-salve con porta parallela ad 8 bit.

Dagli un'occhiata e cerca in empi\rcm3000 del compilatore (vado a memoria) perche' dovrebbe esserci anche un esempio di comunicazione master-slave.

Tale comunicazione nell'esempio era fatta tra 2 RABBIT e le loro librerie si occupavano della faccenda.

Se devi comunicare tra un RABBIT e l'FPGA o non ho capito bene con che cosa , potresti dare un'occhiata nelle librerie (che sono in codice sorgente) o in alternativa farti te un protocollo per lo scambio dei dati.

Concordo pienamente con te che la documentazione del Rabbit e' parecchio incompleta.

Ciao :)

Link al commento
Condividi su altri siti

più che di schematici è proprio un problema di codice C...

non riesco a capire se questo AIO una volta attivato con la riga #define AUX_PORTA_IO

setta automaticamente la porta A come bus dati e la porta B come address e se gestisce altrettanto automaticamente le varie letture/scritture dei registri...

se cosi fosse (e anche se non riesco a trovare conferme, credo che sia così altrimenti perche' fare delle porte dedicate) in teoria non mi dovrebbe servire inizializzare e definire i vari pin delle porte, e soprattutto non mi dovrebbe servire utilizzare le funzioni IN_DATA e OUT_DATA che avevo scritto x emulare l'AIO sul rabbit2000.

riporto qua sotto il codice che mi girava sul 2000 e mi emulava l'AIO.

in questo caso usavo la porta parallela F come bus dati e la G come indirizzamento.

PC0 e PC2 li usavo invece come IORD e IOWR visto che nel 2000 non c'erano.

qualcuno ha idea di come modificare il tutto per usare direttamente l'AIO sul 3000?

grazie mille ;)

/* La porta F e' utilizzata come bus dati. La porta G fornisce il reset (PG3) attivo basso,

l'indirizzo del particolare dispositivo selezionato (PG2-PG0) e l'indirizzo dei registri

interni della periferica (PG7 PG6). PC0 e PC2 fornicono gli strobe di lettura e scrittura

attivi bassi PD2 attivo basso emula funzionamento in modalita' I/O esterno del Rabbit 3000 */

void Initialize()

{

WrPortI(PDDDR, &PDDDRShadow, 0x04); // pin utiliz. D in uscita

WrPortI(PDDCR, &PDDCRShadow, 0x00); // no open drain

WrPortI(PFDDR, &PFDDRShadow, 0x00); // porta F in lettura

WrPortI(PFDCR, &PFDCRShadow, 0x00); // no open drain

WrPortI(PGDDR, &PGDDRShadow, 0xCF); // pin utiliz. G in uscita

WrPortI(PGDCR, &PGDCRShadow, 0x00); // no open drain

WrPortI(PGDR, &PGDRShadow, 0xCF); // uscite della porta G a 1

BitWrPortI(PDDR, &PDDRShadow, 0xFF, 2); // bit 2 porta D a 1

BitWrPortI(PCDR, &PCDRShadow, 0xFF, 0); // no IORD

BitWrPortI(PCDR, &PCDRShadow, 0xFF, 2); // no IOWR

}

void Init(unsigned char opc)

{

unsigned char temp; //costruzione del valore da caricare su PD

temp=0;

temp=temp|(opc&0x07);

WrPortI(PDDDR, &PDDDRShadow, 0x04); // pin utiliz. D in uscita

WrPortI(PDDCR, &PDDCRShadow, 0x00); // no open drain

WrPortI(PGDDR, &PGDDRShadow, 0xCF); // pin utiliz. G in uscita

WrPortI(PGDCR, &PGDCRShadow, 0x00); // no open drain

WrPortI(PFDDR, &PFDDRShadow, 0x00); // porta F in lettura

WrPortI(PFDCR, &PFDCRShadow, 0x00); // no open drain

WrPortI(PGDR, &PGDRShadow, temp); // scrive su porta G

BitWrPortI(PDDR, &PDDRShadow, 0x00, 2); // abilita il blocco di IO

BitWrPortI(PCDR, &PCDRShadow, 0x00, 0); // abilita IORD

wait(0); // simula Wait state

BitWrPortI(PCDR, &PCDRShadow, 0xFF, 0); // disabilita IORD

BitWrPortI(PDDR, &PDDRShadow,0xFF, 2); // disabilita il blocco di IO

temp=temp|0x08;

WrPortI(PGDR, &PGDRShadow, temp); // disabilita il reset

wait(1);

}

unsigned short In_Data (unsigned char opc, unsigned char reg)

{

unsigned short data;

unsigned char temp;

temp=0;

WrPortI(PDDDR, &PDDDRShadow, 0x04); // pin utiliz. D in uscita

WrPortI(PDDCR, &PDDCRShadow, 0x00); // no open drain

WrPortI(PGDDR, &PGDDRShadow, 0xCF); // pin utiliz. G in uscita

WrPortI(PGDCR, &PGDCRShadow, 0x00); // no open drain

WrPortI(PFDDR, &PFDDRShadow, 0x00); // porta F in lettura

WrPortI(PFDCR, &PFDCRShadow, 0x00); // no open drain

temp=temp|reg; // definizione della periferica da leggere

temp=temp<<6;

temp=temp|(opc&0x07);

temp=temp|0x08;

WrPortI(PGDR, &PGDRShadow, temp);

BitWrPortI(PDDR, &PDDRShadow, 0x00, 2); // abilita blocco I/O

BitWrPortI(PCDR, &PCDRShadow,0x00, 0); // abilita IORD

wait(0); // simula wait state

data=RdPortI(PFDR); // lettura

BitWrPortI(PCDR, &PCDRShadow,0xFF, 0); // disabilita blocco IORD

BitWrPortI(PDDR, &PDDRShadow,0xFF, 2); // disabilita blocco I/O

wait(1);

return(data);

}

void Out_Data(unsigned char opc, unsigned char reg, unsigned short data)

{

unsigned char temp;

temp=0;

WrPortI(PDDDR, &PDDDRShadow, 0x04); // pin utiliz. D in uscita

WrPortI(PDDCR, &PDDCRShadow, 0x00); // no open drain

WrPortI(PGDDR, &PGDDRShadow, 0xCF);

WrPortI(PGDCR, &PGDCRShadow, 0x00);

temp=temp|reg; // seleziona la periferica e i registro su cui scrivere

temp=temp<<6;

temp=temp|(opc&0x07);

temp=temp|0x08;

WrPortI(PGDR, &PGDRShadow, temp);

BitWrPortI(PDDR, &PDDRShadow, 0x00, 2); // abilita blocco I/O

WrPortI(PFDDR, &PFDDRShadow, 0xFF); // porta F in scrittura

WrPortI(PFDCR, &PFDCRShadow, 0x00); // no open drain

temp= (unsigned char)data;

WrPortI(PFDR, &PFDRShadow, temp); // dato su porta F

BitWrPortI(PCDR, &PCDRShadow,0x00, 2); // abilita IOWR

wait(0); // simula wait state

BitWrPortI(PCDR, &PCDRShadow,0xFF, 2); // disabilita IOWR

WrPortI(PFDDR, &PFDDRShadow, 0x00); // porta F in lettura

WrPortI(PFDCR, &PFDCRShadow, 0x00); // no open drain

BitWrPortI(PDDR, &PDDRShadow,0xFF, 2); // disabilita blocco I/O

wait(1);

}

Link al commento
Condividi su altri siti

Ti ripeto , prova a guardare nei sorgenti o nelle librerie del compilatore (li apri con un editor ascii) , studiandoteli un poco dovresti trovare risposta ai tuoi dubbi.

Ciao :)

Link al commento
Condividi su altri siti

ciao Luca e innanzitutto grazie...

neanche io infatti avevo mai usato questo AIO ma visto che col suo utilizzo le cose migliorano e di parecchio è giunta l'ora di immergersi nel campo...

quel link che hai segnalato l'avevo già visto (sono 3 giorni che giro su tutti i forum possibile e immaginabili senza risultati apprezzabili) ed è la dimostrazione che le idee su questo AIO sono molto confuse in quanto da lì sembrerebbe di capire che le porte A e B si inizializzino automaticamente mentre sullo stesso forum (che devo dire è anche il più completo) ma pochi post più sotto dicono l'esatto contrario e cioè che non basta la riga #define PORTA_AUX_IO :rolleyes:

qui x l'esattezza ma anche in altri post... http://69.93.17.252/support/bb/messages/14...html?1127321877

a questo punto non mi resta che provare, sperando che non incorro in uno di quei bug della porta A del 3000..

sto scrivendo del codice proprio in questo momento... spero che prima o poi trovi la soluzione

NB: la funzionalità master-slave è ben diversa dall'AIO bus ;)

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...