Vai al contenuto
PLC Forum


EMU SP-12 non funziona


ez9

Messaggi consigliati

Livio Orsini
9 ore fa, Claudio F ha scritto:

Essendo una memoria statica, dove per definizione i livelli rimangono stabili a tempo indeterminato, leggere i bit tutti in un colpo o uno alla volta per me è indifferente.

 

Questo è vero, se niente li fa cambiare.

Inoltre è anche necessario che i dati siano scritti e letti in modo corretto. Ad esempio se invece di scrivere 1010 scrivessi 1110, quando rileggi questo dato, se lo leggi in modo corretto, leggerai 1110; però credendo di aver scritto1010 lodefiniosci come errore.

 

Da quello che ha scritto EZ9, e dai risultati che riporta, mi sento di escludere problemi alla memoria perchè, se così fosse, dovrebbe esserci una certa costanza almeno di indirizzo delle celle in errore.

 

Il suggerimento di scrivere e leggere tramite latches, facilita la diagnosi visto che prima carichi il latch, quindi hai possibilità di vedere fisicamente cosa stai scrivendo e dove lo stai scrivendo.

Se metti dei LEDs sul latches e vai a scrivere passo - passo, puoi vedere fisicamente cosa stai scrivendo e dove lo stai scrivendo. E un lavoro da certosino, ma se non hai strumenti tipo analizzatore di stati logici, con una buona profondità di memoria, è l'unico modo di venirne fuori.

Ho ancora in giro, in uno degli armadi dove ammucchio i "ricordi", una scheda NASCOM, antesignana di un PC, basata su Z80, in cui riuscii ad individuare uno "sbaffo" tra 2 piste del bus indirizzi, proprio usando un sistema simile passo-passo; ho ancora anche l'attrezzo che mi costruii allo scopo. Però eravamo a metà anni 70, circa 50 anni fa, quindi ....io ero un'alta persona.🥴

Link al commento
Condividi su altri siti


  • Risposte 65
  • Created
  • Ultima risposta

Top Posters In This Topic

  • ez9

    29

  • Livio Orsini

    18

  • Ctec

    15

  • max.bocca

    2

Top Posters In This Topic

Posted Images

3 ore fa, Livio Orsini ha scritto:

Ho ancora in giro, in uno degli armadi dove ammucchio i "ricordi", una scheda NASCOM

Ma dai... Un Nascom, io ho il NASCOM BASIC disassemblato, e tempo fa ne cercavo uno. Grande... Hai il Nascom1 o il Nascom2?

 

Link al commento
Condividi su altri siti

14 ore fa, Claudio F ha scritto:

Non ho mai avuto problemi a leggere e scrivere memorie (CMOS) con ArduinoMega un bit alla volta.

Certo, perché il Mega è un CMOS. Il problema è che invece quelle vecchie memorie sono TTL. Il punto è anche che più tempo impieghi a fare un'operazione, più dai modo ai disturbi (esterni o problemi di livello) di incunearsi. Se per esempio hai scritto uno 0 in un bit e poi scrivi un 1 in quello accanto, non è escluso che per diafonia anche il primo sia "visto" come un 1, poiché la porta di ingresso della RAM è ancora aperta (WR a 0).

Poi ovviamente sono supposizioni, e consigli per cercare di capire dove sia il problema. L'ideale sarebbe un analizzatore logico multicanale...

Link al commento
Condividi su altri siti

Con un multimetro di precisione ho misurato le uscite di un ATMEGA328P-PU (che come caratteristiche elettriche di uscita è praticamente uguale all' ATMEGA2560) caricate con 270 Ω:

 

3546874.png.f95cf1cca6fd5986c69f14280bc65e70.png

 

Con un solo kΩ di carico la VOL scende addirittura a soli 133 mV.

 

Non credo che il problema siano i segnali Arduino -> memoria, ma piuttosto il contrario. Dalle specifiche la memoria ha una VOH minima di 2.4 V, che potrebbero essere al limite con i 3 V minimi di VIH richiesti da Arduino.

 

Un buffer HCT bidirezionale risolverebbe il problema:

 

 

676989.png.0a450688fb332e4c78a1dcc1b5d7f85e.png

 

 

 

 

 

Modificato: da Claudio F
Link al commento
Condividi su altri siti

Livio Orsini
4 ore fa, Ctec ha scritto:

... Hai il Nascom1 o il Nascom2?

 

Non so, credo sia Nascom1 (o forse Nascom0 😃).

Nel 1976, se ricordo bene, lo acquistai, in kit di montaggio, da un ex collega che era andato a lavorare in un'azienda commerciale che li importava. In pratica è costituito da una tastiera molto robusta, un'unica scheda su cui, oltre allo Z80, con i vari circuiti di controllo del busa dati e indirizzi, sono montati: memoria EPROM con firmware con funzioni di monitor, uno zoccolo per eventiali espansioni EPROM, 256 kbyte di RAM (ma non sono certo delle dimensioni), interfaccia per TV (facente funzioni di monitor), interfaccia per registratore a cassette che è la memoria di massa. Si doveva programmare in linguaggio macchina.

Divenni matto perchè, una volta montato, il monitor non voleva saperne di funzionare. COsì, con pazienza, un fine settimana mi costruii tutto lo Hw necessario per far avanzare il programma passo-passo, poi tramite buffer non invertetenti monitorai il bus indirizzi e dati tramite LEDS. Passo passo, arrivai all'indirizzo che impegnava una delle 2 linee di bus che erano in corto e notai l'errore di indirizzo. A questo punto, seguendo le piste riuscii a trovare lo "sbaffo". Avevo 30 anni e non 80 (quasi), quindi il potere di concentrazione era notevolmente superiore, le dita avevano tutta l'agilità necessaria e, soprattutto, la mia vista aveva un'acutezza tra 11 e 12 decimi!

 

Credo di avere ancora schema e manuale, oltre alla scheda che tengo per ricordo perchè, dopo quella messa in marcia, avevo acquisito una grandissima conoscenza Hw e Sw dello Z80!

 

Se ti servono informazioni sulla scheda chiedi.

Link al commento
Condividi su altri siti

Livio Orsini
4 ore fa, Ctec ha scritto:

Il punto è anche che più tempo impieghi a fare un'operazione, più dai modo ai disturbi (esterni o problemi di livello) di incunearsi.

 

Andrea concordo perfettamente con quello che scrivi, anche perchè a suo tempo ho avuto la sventura di verificarlo a mie spese, ma allora ero molto più giovane, più entusuasta ma anche molto più ignorante di ora.

Link al commento
Condividi su altri siti

Livio Orsini
4 ore fa, Claudio F ha scritto:

Un buffer HCT bidirezionale risolverebbe il problema:

 

In pratica è quello che Andrea ed io abbiamo suggerito qualche giorna addietro.🙂

 

Inoltre il comando di scrittura, per trasferire il contenuto del latch in memoria deve durare il tempo giusto, non di meno ma nemmeno di più, proprio per evitare che i disturbi possano "insinuarsi".

Stesso ragionamento per la lettura: il segnale di clock per trasferire l'uscita della memora nel latch deve avere la durata giusta.

Poi che arduino legga e scriva i bit uno alla volta diventa meno importante, ma anche qui è necessario che si ponga una certa cura nel cablaggio, proprio per evitare fenomeni di accoppiamenti e diafonie.

Link al commento
Condividi su altri siti

Grazie a tutti per i commenti, il bello di questa board e' che e' una miniera di componenti 😄

sono presenti 2 latch 74HCT245 ne utilizzero' uno per fare i test di lettura /scrittura sulle ram, intanto vedo di scrivere l'arduino poi passero' ai test tempo permettendo.

Vi aggiorno presto (spero...)

Link al commento
Condividi su altri siti

Inserita: (modificato)

ho collegato il 74HCT245 tra arduino e la Ram ora funziona decisamente meglio pero' ho uno strano comportamento di arduino.

in un ciclo di doppio di scrittura e lettura prima con 85 e poi con 170 (quindi 16384 cicli R/W) ho circa 90-11o errori.

ma gli errori son sempre solo sul Bit 0

per esempio:

ERROR AT ADDRESS 1

10101010 <---DATA WRITTEN = 85

00101010 <---DATA READ = 84

 

oppure

ERROR AT ADDRESS 4173
01010101 <---DATA WRITTEN = 170
11010101 <---DATA READ = 171

 

 

 

 

 

 

ho notato che nell'array del bus data il primo bit ha sempre una tensione piu' bassa (circa 3,5 V) e anche quando e' settato come input la tensione oscilla molto.

Inizialmente pensavo fosse il pin, ma anche cambiando pin nell'array, il primo dichiarato ha semre tensione piu' bassa degli altri,

 

Ho cambiato anche la RA da testare ma il problema e' sempre solo nel BIT 0

Anche scambiando il pin tra bit0 e altri pin l'errore resta semre e solo nel primo BIT che e' dichiarato nell'Array.

 

qui sotto riporto come e' dichiarato l'array e come viene settaqto nel ciclo di Write

 

int dataPins[8] = {30,31,32,33,34,35,36,37};

//Set data Pin modes to Ouput
  for (int i=0;i<8;i++)
  {
    pinMode (dataPins[i], OUTPUT);
  }

   // Setup Data Bits
 for (int i=0;i<8;i++)
  {
    if (bitRead(dataCounter, i)==1)
    {
      digitalWrite(dataPins[i],HIGH);
      //Serial.print("1");
    }
    else
    {
      digitalWrite(dataPins[i],LOW);
      //Serial.print("0");
    } 

 

come si spiega questo comportamenteo del BIT 0?

Modificato: da ez9
Link al commento
Condividi su altri siti

Livio Orsini

Fisicamente il bit0 su arduino a cosa corrisponde?

Hai misurato il livello direttamente sul pin di arduino?

Link al commento
Condividi su altri siti

8 minutes ago, Livio Orsini said:

Fisicamente il bit0 su arduino a cosa corrisponde?

Hai misurato il livello direttamente sul pin di arduino?

il Bit 0 corrisponde al pin 30, ma ho provato a metterlo anche su Pin diversi.

Si ho misurato la tensione sul pin 30 sia con il circuito collegato ma anche scollegato , ho circa 3,3V - 3,5V poi all'improvviso va a 4,9V per un po' per poi riscendere

fa lo stesso comportamento su altri pin ma solo se impostati come Bit0

per Es. se dichiaro:

int dataPins[8] = {30,31,32,33,34,35,36,37};

ho i 3,5V sul pin 30 , tutti gli altri a 4,9V

mentre se dichiaro

int dataPins[8] = {31,30,32,33,34,35,36,37};

ho i 3,5V sul pin 31 , tutti gli altri a 4,9V

Link al commento
Condividi su altri siti

Livio Orsini

Se hai un oscilloscopio controlla questa uscita: dovresti vedere o che è modulata in PWM o che viene scritta a "1" e a "0", alternativamente.

Link al commento
Condividi su altri siti

  • 2 weeks later...
Inserita: (modificato)

Effettivamente controllando con oscilloscopio il bit 0 delle scrittura era in PWM, ma la cosa strana e' che random tornava al 100%.

Boh... il loop di scrittura dei bit e' unico quindi in teoria avrei dovuto trovarmi lo stesso comportamente su tutti i pin contemporaneamente e non su uno solo.

Comunque...

ho fatto modifiche al codice e ora non ho piu' quello strano comportamento in PWM sul pin 0 (che poi era il bit che falliva sempre) e inserito una riprova di scrittura in caso di errore su lettura (max 3 volte poi da errore)

 

in pratica:

Loop 1 scrivo 85 su tutti gli indirizzi da 0 a 8191

Loop 2 rileggo tutti gli indirizzi da 0 a 8191

Loop 3 scrivo 170 su tutti gli indirizzi da 0 a 8191

Loop 4 rileggo tutti gli indirizzi da 0 a 8191

 

Durante i Loop 2 e 4 se trovo un errore provo a riscrivere e rileggere sullo stesso indirizzo per un max di 3 volte , dopodiche mi genere errore.

 

Facendo cosi ho provato varie volte sulla stessa ram e ha sempre passato il test con 0 errori ma dai 3 ai 49 retest (totali tra i 2 loop 2 e 4)

Secondo voi un test di questo tipo puo' essere affidabile?

PS. quasi sempre i retest sono nel loop 4, di solito nel loop 2 ho da 0 a 4 retest.

Modificato: da ez9
Link al commento
Condividi su altri siti

Livio Orsini
7 minuti fa, ez9 ha scritto:

Secondo voi un test di questo tipo puo' essere affidabile?

 

Sicuramente ti dice che la memoria non è difettosa.

 

Però per effettuare un test sicuramente affidabile e significativo bisognerebbe usare un microprocessore, non un microcontrollore, con il bus dati e indirizzi ed i latches.

 

Comunque già da questi test io mi sentirei di escludere problemi alla memorie.

Serebbe stato meglio scrivere 55H e AAH a bytes alternati, per poi ripeter il ciclo scambiando il dato, ovvero AAH e 55H alternati.

Si usa questo test per verificare anche eventuali problemi di diafonia.

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Purtroppo ho solo questo per provare, e si ho messo il latch (74HCT245) in mezzo come suggerito piu' su.

la prova e' stata fatta con 55H e AAH il mio 85 e 170 in decimale corrisponde appunto al binario con bit alternati.

ne ho 24 da testare, ne ho provate solo alcune procedo cosi e poi vediamo cosa salta fuori.

Grazie ancora per il supporto

Link al commento
Condividi su altri siti

Livio Orsini
1 ora fa, ez9 ha scritto:

la prova e' stata fatta con 55H e AAH il mio 85 e 170 in decimale corrisponde appunto al binario con bit alternati.

 

Non avevo compreso che fosse in decimale, chiedo venia.

L'importante che che i comandi di Write e Read, siano temporizzati correttamente sia in durata che in sincronismo con i dati

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