Vai al contenuto
PLC Forum


Interfaccia dsPIC30f4011 - BUS ISA PC/104


Edge

Messaggi consigliati

Avrei bisogno di un consiglio.

Ho realizzato una semplice interfaccia tra dsPIC30f4011 e il Bus ISA della PC/104 perchè dovevo fare delle acquisizioni.

Ho notato però che il dsPIC è molto lento rispetto al bus isa a 8Mhz, nel senso che ogni tanto perde la lettura, in genere fa una lettura giusta, poi due ne sbaglia e la terza la fa bene. "Perde" due cicli di lettura. Premetto che non sono espertissimo di elettronica digitale e quindi ho utilizzato il PIC per fare questa interfaccia perchè sapevo usare quelli. In internet ho visto per esempio gli ARM che potrebbero fare al caso mio. Ma non volendo perdere troppo tempo e costi con un nuovo processore, pensavo di usare un buffer esterno, tipo una dual_port ram. Volevo quindi sapere se qualcuno poteva consigliarmi delle dual-port (tipo DIP) da poter utilizzare.

Memoria necessaria minima da 256 byte, alimentazione +5V.

Vi ringrazio per l'attenzione concessami.

Link al commento
Condividi su altri siti


Livio Orsini

Mi sembra strano che un DSPIC non riesca a leggere e scrivere a soli 8MHz. Come lo hai impiegato?

Link al commento
Condividi su altri siti

Anche per me infatti. Ma non credo di aver fatto errori.

Per quanto riguarda il circuito ho utilizzato un 74LS688N come comparatore degli indirizzi con dipswitch per selezionare gli indirizzi. Ho usato il 300h come indirizzo perchè era libero.

Poi ho utilizzato un 74LS245N bidirezionale. Il gioco ovviamente è semplice. Quando sul comparatore c'è l'indirizzo esatto e su pin DIR del 74LS245 è in corso una lettura, flusso dati va in unda direzione, altrimenti nell'opposta.

Ovviamente sia il DIR che il G del 74LS245 sono connessi anche a due porte del PIC per conoscere lo stato.

Il dsPIC monta un quarzo da 10Mhz (con PLL interno a 4x).

Riporto anche il listato per correttezza. E' un codice di prova per testare il funzionamento:

#include "p30f4011.h"

#include "stdio.h"

#include "math.h"

#include "dsp.h"

#include "can.h"

// ------------------

//-----------CONFIGURAZIONE BIT------------

// ------------------

_FOSC(CSW_FSCM_OFF & XT_PLL4);

_FWDT(WDT_OFF);

_FBORPOR(MCLR_EN & PWRT_OFF & BORV_27 & PBOR_OFF);

_FGS(CODE_PROT_OFF);

//-----------------------------------------

#define PORT_C_MASK 0x6000

#define PORT_D_MASK 0x0004

#define PORT_E_MASK 0x0100

unsigned char Txdata[16]={0x7C,0x1FF,0x02,0x03,0x04,0x05,0,0xD1,0x7F,0xFB,0x32,0x13,0x54,0xA5,0xAA,0xEE};

unsigned int var_c;

unsigned int var_d;

unsigned int var_e;

int index=0, valido = 0, counter = 0, down_counter=0;

int index_array[128];

int data_array[128];

int main (void)

{

//inizializzazione sistema

int rc,rd,re,enable,bale=0,aen=0;

TRISB=0;

TRISC=PORT_C_MASK;

TRISD=0x000F | PORT_D_MASK;

TRISE=PORT_E_MASK;

/////////////////////////

//PORTB = Txdata[index];

while(1)

{

/*

var_c=PORTC;

var_d=PORTD;

var_e=PORTE;

rc = var_c & PORT_C_MASK;

rd = var_d & PORT_D_MASK & 0x0004;

re = var_e & PORT_E_MASK;

*/

var_d=PORTD;

//}

//if(valido == 0 && bale == 0 && var_d & 0x0001){

if(var_d & 0x0001){

bale=1;

}

if(((~var_d) & 0x0008) != 0){

aen=1;

}

/*

if(valido == 1 && bale == 1 && ~var_d & 0x0001){

bale=0;

valido = 0;

}

*/

down_counter=10;

//while((((~var_d) & 0x0008) != 0)){

//while((((~var_d) & 0x0008) != 0) && (valido ==0)){

//while((((~var_d) & 0x0008) != 0) && bale == 1 && valido == 0){

//while((((~var_d) & 0x0008) != 0) && var_d & 0x0001){

while(aen && down_counter>0){

var_d=PORTD;

var_c=PORTC;

//var_d=PORTD;

var_e=PORTE;

rc = var_c & PORT_C_MASK;

rd = var_d & PORT_D_MASK;

re = var_e & PORT_E_MASK;

index = (rc >> 13) + (re >> 6) + (rd << 1);

PORTB = Txdata[index];

index_array[counter] = index;

data_array[counter]= (int)Txdata[index];

counter++;

if(counter>=128) counter=0;

valido = 1;

// for(down_counter=10000;down_counter>0;down_counter--);

down_counter--;

}

if(down_counter==0){

bale=0;

aen=0;

}

//if((((~var_d) & 0x0008) == 0) && bale == 1 && (valido==1)) {

/*

if((((~var_d) & 0x0008) == 0) && (valido==1)) {

down_counter++;

if(down_counter>=128) down_counter=0;

valido = 0;

bale == 0;

}*/

}

}

////////////////////////////////

Link al commento
Condividi su altri siti

  • 4 weeks later...

I dsPIC30F lavorano bene fino a 30 MIPS. Con un quarzo da 10 MHz ed il PLL 4x dovrebbe lavorare a 40 MHz, ovvero 40 MIPS: forse un problema potrebbe già essere questo.

Secondo, che tipo di segnali devi rilevare?

Sono molto veloci? Stai usando interrupt o tutto viene fatto in polling?

Link al commento
Condividi su altri siti

Con un frequenza di 8Mhz i segnali MEMW# e MEMR# del bus possono essere

lunghi sull'ordine di 150-200nS se non inserisci ulteriori wait-states nella sessione.

Quello che hai realizzato e' a mio avviso comunque un po' "critico".

Ti consiglio comunque di misurare con precisione la tua frequenza media del tuo ciclo software. Puoi fare questa operazione semplicemendo cambiando lo stato di un piedino spare e misurare queste tempestiche con l'oscilloscopio. Se devi catturare un evento di circa 200nS (Mi riferisco ai segnali MEMW# e MEMR#) dovresti avere una frequenza di campionamento di almeno 10Mhz

Come saprai i compilatori "C" producono un inevitabile "rigonfiamento" del codice per cui la durata del tempo di esecuzione puo' a volte riservare delle sorprese.

Potresti, sempre con riferimento con quanto detto, scrivere la tua porzione in linguaggio assembly ed ottimizzare cosi' la risposta del sistema

Ciao

Gianluca

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...