Vai al contenuto
PLC Forum


Strano comportamento pin RA4 PIC16F627


Eramita Analogico

Messaggi consigliati

Eramita Analogico
Buongiorno a tutti,
scrivo perché sto incontrando una difficoltà con il pin RA4 usato come uscita del PIC16F627/628
Come saprete, è un pin di I/O che in uscita ha solo una configurazione a Drain aperto. Sto usando questo PIC come convertitore da tastiera AT/PS2 ad ASCII per una replica compatta e migliorata del microcomputer Z80 di Nuova Elettronica che sto costruendo.
Il pin in oggetto, proprio perché Open Drain, lo uso come uscita Reset per lo Z80, ed in particolare l'ho collegato tramite una resistenza da 100 ohm al gruppo elettrolitico-resistenza che dà la temporizzazione per il classico circuito di reset originale, il tutto verso l'ingresso di un 74LS14 (io ho usato un HCT). Sullo stesso punto, fra elettrolitico e resistenza all'ingresso del 74LS14, si collega allo stesso modo anche il pulsante Reset del tastierino-display esadecimale dello Z80.

Il problema è che il RA4 resta sempre a zero.
Diciamo che se provo il PIC separatamente da tutto il resto, semplicemente con un led+resistenza fra +5V e RA4, vedo funzionare tutto correttamente con un breve impulso sul led quando alimento il circuito e quando premo l'apposita combinazione di tasti sulla tastiera AT
Se però metto io a massa il catodo del led, simulando il pulsante Reset del tastierino esadecimale, poi il led resta sempre acceso
Questo significa che quando all'accensione l'elettrolitico è scarico l'RA4 si trova forzato a zero e così resta, nonostante sia configurato come uscita e sia Open Drain
Come si spiega questo comportamento?

Il relativo Tris l'ho messo a 0, il CMCON l'ho messo a 7 per rendere tutta la PortA digitale...
Ho anche provato ad aumentare la resistenza da 100 ohm sull'uscita RA4, portandola fino anche a 10K, ma il problema rimane.
L'unico modo che ho trovato per risolvere è stato di sostituire la resistenza da 100 ohm su RA4 con un diodo messo con l'anodo verso l'elettrolitico di reset, catodo su RA4 insieme a una resistenza di pull-up di 47K. La resistenza ci vuole, non basta il diodo, è come se il pin del PIC resti forzato a zero se non sente una tensione presente.
A me sembra strana questa cosa, va in contrasto con il concetto di Open Drain, e poi c'era comunque già la resistenza di carica dell'elettrolitico. Com'è possibile che un pin Open Drain configurato come uscita sia influenzato da un evento esterno come se fosse un ingresso?

Grazie per le opinioni.
Link al commento
Condividi su altri siti


15 minuti fa, Eramita Analogico ha scritto:

Come si spiega questo comportamento?

 

Semplice. esternamente hai qualche cosa che forza a zero la porta.

Essendo un open drain, in pratica hai realizzato un Wired NOR.

Io, da quello che hai scritto, deduco che, probabilmente, sia l'elettrolitico che, non riuscendo a caricarsi, mantiene il livello prossimo allo zero volt

Link al commento
Condividi su altri siti

Eramita Analogico
è la RA4 che forza a zero l'elettrolitico. Se scollego la resistenza da 100 ohm fra RA4 ed elettrolitico questo si carica regolarmente.
RA4 sembra funzionare solo se ha una sua resistenza di Pull-Up separata da quella dell'elettrolitico, altrimenti la porta resta sempre a zero e non capisco il motivo. La separazione fra RA4 pulluppata ed elettrolitico l'ho fatta, come detto, con un diodo.
Mi sarei aspettato, come credo sia logico, che se da programma del PIC metto a 1 la RA4 l'elettrolitico inizia a caricarsi, ma non è così.
Link al commento
Condividi su altri siti

3 ore fa, Eramita Analogico ha scritto:

è la RA4 che forza a zero l'elettrolitico. Se scollego la resistenza da 100 ohm fra RA4 ed elettrolitico questo si carica regolarmente.

Cosa intendi? Che se gli dai direttamente il positivo questo si carica, ed escludi un problema di quella parte di circuito? Prova a postare uno schema del tutto, il Pic ha una corrente d'uscita che pilota appena un led, il condensatore potrebbe caricare troppo l'uscita del pic.

Link al commento
Condividi su altri siti

Ora non ricordo se su quel tipo di PIC esiste il pull up interno per le porte Open collector. Se esiste devi configurare la porta per il pull up interno, altrimenti devi mettere il resistore esterno.

Doveresti anche pubblicare lo schemino di come hai "arrangiato" questo circuito, altrimenti si capisce poco, da come lo spieghi.

Link al commento
Condividi su altri siti

Eramita Analogico

Ho allegato il circuito del reset, è uno schema piuttosto comune.

Sul punto contrassegnato con "RES_SW" ci si collegano due cose.

La prima è un pulsante verso massa, con una resistenza da 100 ohm in serie.

La seconda è il pin RA4 del PIC, configurato come uscita OD e sempre con una resistenza da 100 ohm in serie.

 

Con il PIC scollegato funziona tutto regolarmente.

 

Con il PIC collegato l'RA4 resta a zero ed impedisce all'elettrolitico di caricarsi.

 

Se tolgo l'elettrolitico e accendo il circuito la tensione va su e il Reset è rilasciato (l'elettrolitico scarico al transitorio iniziale non forza più a massa l'RA4).

In queste condizioni se dalla tastiera AT collegata al PIC premo i tasti per il reset, l'RA4 va regolarmente a zero per qualche ms e poi torna aperto, così come dovrebbe essere.

Se premo l'altro pulsante collegato a massa anche l'RA4 va a massa e ci resta finché non do un altro comando di reset tramite la tastiera AT collegata al PIC.

 

Come ulteriore prova ho preso il PIC a parte e su RA4 ci ho collegato un LED con la sua resistenza verso il +5V

Se da tastiera lancio il reset vedo il led accendersi brevemente, se metto brutalmente a massa l'RA4 (come farebbe il pulsante o l'elettrolitico inizialmente scarico) il led si accende e resta acceso anche quando tolgo il collegamento a massa.

 

Spero di aver spiegato chiaramente la situazione. Ora mi pare certo che ci sia un comportamento anomalo dell'uscita RA4, forse ho commesso qualche errore nella programmazione ma non saprei dove guardare se non nel TRISA (configurato come uscita all'inizio del programma e poi non più toccata, e nel CMCON

La PortA non ha pullup, e concettualmente non dovrebbe esserci.

L'errore è ripetibile perché accade anche con un secondo pic tipo 16F628

 

 

Immagine.jpg

Link al commento
Condividi su altri siti

Il diodo D2 collegato in quel modo non serve o, meglio, servirebbe solo come limitatore di tensione a 5,7V per l'ingresso delinvertitore.

 

Programma la porta R4 con il pull up interno, se è possibile, altrimenti metti un resistore da 4,7k tra R4 e +5V; poi prova a mettere C65 tra. con in serie il resitore da 100 ohm R4 e 0V. S comandi R4 come alto dovresti vedere il condensatore che si carica.

Attenzione Se il condensatore è carico, quando comandi R4 basso hai solo la resistenza da 100 ohm a limitre la corrente di scarica, quindi la porta deve drenare 50mA circa come valore iniziale di scarica; 50mA mi sembrano un po' troppi anche se istantaneo, quindi meglio una 390 ohm.

Link al commento
Condividi su altri siti

Eramita Analogico

Ok grazie. Se ti riferisci a D3, quello non c'entra con il PIC, serve a scaricare velocemente C65 in caso di spegnimento del circuito e riaccensione dopo breve tempo.

Il diodo che ho aggiunto io ha l'anodo sul punto "RES_SW" e il catodo sulla porta RA4 (praticamente sostituendo la resistenza di scarica di 100 ohm)

La resistenza di scarica da 100 ohm l'avevo già aumentata per prova fino anche a 10K, ma RA4 resta sempre forzato basso anche se lo programmo a 1, cosa che non capisco.

Come detto, il tutto funziona solo se metto un pullup esterno su RA4 (ho messo 47K) e il già citato diodo fra C65 e porta RA4

 

Quello che sarebbe da capire è perché questa porta OD resta a zero se esternamente c'è qualcosa che la tiene momentaneamente a zero (condensatore scarico o secondo pulsante di reset premuto)

Link al commento
Condividi su altri siti

Eramita Analogico

Così dovrebbe essere comprensibile.

Posso essere d'accordo per il diodo aggiunto, ma la resistenza di pullup a che servirebbe? Concettualmente è superflua, e invece senza di quella la RA4 resta a 0

 

Funziona.jpg

Non funziona 1.jpg

Non funziona 2.jpg

Link al commento
Condividi su altri siti

13 ore fa, Eramita Analogico ha scritto:

ma la resistenza di pullup a che servirebbe? Concettualmente è superflua, e invece senza di quella la RA4 resta a 0

 

No! Non è superflua nemmeno concettualmente.

Inoltre hai anche la prova pratica, visto che se metti il pull up ti funziona regolaramente. Dovresti verificare sul data sheet del PIC se quella porta può avere una resistenza di pull up interna, nel qua lcaso, come ti ho già scritto, devi abilitare il pull up interno.

Link al commento
Condividi su altri siti

Eramita Analogico

No, il PIC ha Pullup solo sul PortB che però non ha uscite OD, solo normali.

Ok, però dovresti spiegarmi il concetto secondo il quale serve quella resistenza di pullup.

Di certo servirebbe se da quell'uscita Open Drain dovessi ottenere sia uno 0 che un 1 logico, però, per come l'ho usata in questo caso, dovrebbe solamente scaricare il condensatore, non deve fornire un 1 logico quindi non vedo perché sarebbe necessaria la resistenza.

Oltretutto non mi pare abbia senso che l'uscita resti forzata a zero se non c'è il pull-up, semmai impostandola a 1 dovrebbe restare flottante.

 

 

Link al commento
Condividi su altri siti

La resistenza R30 fa già da Pull-Up, ma da 47Kohm  mi sembra troppo, sicuro che non deve essere da 4,7 Kohm ?

prova a ridurre il valore di quella resistenza.

Modificato: da NovellinoXX
Link al commento
Condividi su altri siti

52 minuti fa, Eramita Analogico ha scritto:

Oltretutto non mi pare abbia senso che l'uscita resti forzata a zero se non c'è il pull-up, semmai impostandola a 1 dovrebbe restare flottante.

 

 

Rimane a "0", perchè non c'è suffciente corrente per farla salire a "1".

 

Sono andato a leggermi ildata sheet del pic16f627. Ammesso che:

  • Tu abbia programmato correttamente il registro TRISA
  • Che lo schema di collegamento reale corrisponda allo schema elettrico che hai pubblicato

Se comandata a "1" la porta RA4 non sale, come ho scritto prima, dipende dal fatto che non c'è suffiente corrente per farla salire.

Con 47k e 5V nominali di tensione la corrente nominale dovrebbe essere poco più di 0,1mA che sembra un po' poca. Inoltre, probabilmente, quel condensatore non è dei migliori.

Se metti un resitore 4k7 direttamente sulla porta, la corrente di pull up sale ad 1mA che è più che sufficiente a far salire la porta, però la costante di tempo di carica del gruppo RC si riduce ad 1/10 di quella che avresti senza questo resistore.

Però, se invece di settare la porta come uscita e mandarla ad "1", tu la mandi normalmente in tree state, mettendo "1" il bit corrispondente nel TRISA, e predisponi RA4 come uscita, esclusivamente per effettuare il reset. dovresti risolvere il problema.

 

Link al commento
Condividi su altri siti

Eramita Analogico

Grazie per il tempo dedicato. Quella di impostare RA4 come ingresso finché non è in uso mi sembra una buona idea, proverò senz'altro, però ancora non capisco perché la porta RA4 richieda una corrente minima per andare su. Non dovrebbe essere flottante e basta? Cioè come se fosse scollegata, così come il concetto Open Drain o Open Collector.

D'altra parte se scollego RA4 dal circuito, il condensatore si carica normalmente e il ciclo di Reset si completa correttamente.

è questo che non capisco.

 

Link al commento
Condividi su altri siti

52 minuti fa, Eramita Analogico ha scritto:

D'altra parte se scollego RA4 dal circuito, il condensatore si carica normalmente e il ciclo di Reset si completa correttamente.

è questo che non capisco.

Evidentemente quel "open collector" non e' proprio ... open, ma ha una resistenza finita verso massa e insieme alla R30 formano un partitore di tensione tale da non raggiungere il livello di soglia del livello "alto".

Senza alterare la costante di tempo, modifica il circuito come sotto, sicuramente funziona!

Controlla che il C65 non sia in perdita.

 image.png.5929448423d6ac7646668d2322b2419f.png

Modificato: da NovellinoXX
Link al commento
Condividi su altri siti

Prova a togliere il condensatore e verifica se la porta sale anche con la sola 47k.

In effetti, dovrebbe salire anche con 470k come pull up.

2 minuti fa, NovellinoXX ha scritto:

Evidentemente quel "open collector" non e' proprio ... open, ma ha una resistenza finita verso massa e insieme alla R30 formano un partitore di tensione

tale da non raggiungere il livello di soglia.

 

No da datasheet ci sono solo 2 diodi, come protezione, verso zero e +5V .

Link al commento
Condividi su altri siti

22 ore fa, Eramita Analogico ha scritto:

Concettualmente è superflua, e invece senza di quella la RA4 resta a 0

Sull'uscita del pic serve a niente, l'unica cosa che vedo esagerata, è la capacità di 22 μF. Se serve a temporizzare il reset tramite pic, aumenta la resistenza in serie e diminuisci la capacità.

Se carichi l'uscita del pic, questo non commuta, secondo me il problema è tutto li. Prova da software a programmare l'uscita del pic che si accende e spegne ogni 5 secondi, e controlla se l'uscita commuta, con e senza condensatore.

 

Modificato: da Gennar0
Link al commento
Condividi su altri siti

Il condensatore, se non è in perdita, non ha alcuna influenza, se se non durante la scarica perché  la porta deve tirare la corrente di scarica.

La riprova è il fatto che mettendo un resistore di pull up il tutto  funziona regolarmente.

Se avessi letto dall'inizio lo avresti visto perché è scritto nel messaggio di apertura.

 

 

Link al commento
Condividi su altri siti

  • 2 weeks later...

Finalmente una domanda interessante 😁

Ma la causa qual è?

 

Far lavorare un'uscita OD in quelle condizioni, cioè con bassissima corrente, evidenzia il problema della conduzione di sotto soglia di cui sono affetti tutti i VLSI, se poi quell'uscita deve pilotare un ingresso di una HCT che ha altissima impedenza, succederà che dopo la prima commutazione del mosfet, la porta non vedrà più altri cambiamenti di stato al suo ingresso, nonostante lo stato logico che il micro invia alla sua uscita OD, anche perché la tensione di soglia Vgs è funzione della tensione Vds.

Con la resistenza di pull-up aggiuntiva viene stabilita una corrente minima che circola nell'uscita OD, quindi il problema non si verifica.

Link al commento
Condividi su altri siti

1 ora fa, dott.cicala ha scritto:

Con la resistenza di pull-up aggiuntiva viene stabilita una corrente minima che circola nell'uscita OD, quindi il problema non si verifica.

 

Bravo Stefano che hai dato la mspiegazione completa del perchè con corrente al di sotto della soglia moinima, la porta non commuta.

Io mi ero limitato a scrivere: "Rimane a "0", perchè non c'è suffciente corrente per farla salire a "1"."

 

Purtroppo, come capita troppo spesso, l'autore della discussione è sparito! Avrà risolto? Non gli sono piaciute le risposte ricevute?

 

Ci voleva l'arrivo di Babbo natale per poterti rileggere!

Se ci voglio domande interessanti (per te) potrei inventarmene una alla settimana, tanto per avere il piacere di leggerti.🙂

 

Link al commento
Condividi su altri siti

Il 9/12/2023 alle 10:49 , NovellinoXX ha scritto:

Evidentemente quel "open collector" non e' proprio ... open, ma ha una resistenza finita verso massa

 

Link al commento
Condividi su altri siti

A pensar male si fa peccato, ma spesso ci si prende. Nel 16f62x, Di TRISA e TRISB, l'unica porta OD è la RA4.

Modificato: da Gennar0
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...