Jump to content
PLC Forum


Darlington

Dip switch in pull down mi abbassano tensione su uscite

Recommended Posts

Darlington

Ho una applicazione tutto sommato semplice: un 16F628, 4 pulsanti e 4 spie luminose.

 

I pulsanti sono collegati ad altrettanti optoisolatori che vanno a 4 pin della PORTB del pic, ovviamente i fototransistor degli opto sono in pullup, mentre agli altri 4 pin di PORTB ci sono 4 dip switch, stavolta in pulldown (chiudono i 5V diretti quando attivi).

 

Il problema è che quando è attivo uno dei dipswitch la tensione sulle uscite del pic (quattro uscite su PORTA) si abbassa da 5 a circa 3V, e le spie luminose, pilotate da un ULN2004 calano di intensità.

 

Le resistenze di pulldown sono da 6.8k, inizialmente sospettavo del pullup software del pic e quindi lo ho disabilitato , senza ottenere risultati.

 

Forse le resistenze per il pulldown sono troppo basse, anche se mi sembra strana come cosa? (abitualmente si usano valori anche più bassi)

 

Avete qualche idea su come potrei risolvere? Non è un problema di alimentazione perché i 5V al pic arrivano correttamente, non sembra essere un problema di falsi contatti sul pcb...

Link to post
Share on other sites

patatino59

Non si capisce molto, puoi postare uno schema di principio di una delle 4 sezioni ?

Link to post
Share on other sites
GiRock

Su PORTA hai i Comparatori che devi disabilitare e anche il T0CKI che deve essere disabilitato...

 

CMCON = 0x07;

OPTION_REG.T0CS = 0x00;

 

Posta la tua configurazione dei registri, il linguaggio, il compilatore e al limite anche lo schemino, almeno elenca che pin della PORTA stai utilizzando e il tipo di oscillatore...

Link to post
Share on other sites
Darlington

Ecco uno schemino, per brevità ho riportato solo un optoisolatore, ce ne sono altri 3 collegati a RB0/1/2 ma comunque quelli funzionano, è quando chiudo i dip che iniziano i problemi, e trattandosi di un timer i 4 dip dovrebbero settare il tempo su base binaria, quindi non ne posso fare a meno.

 

Uso ldmicro, è tutto scritto in ladder logic, oscillatore un quarzo da 4MHz, ma anche usando per prova l'oscillatore interno del pic, il risultato non cambia.

Neppure alzando le resistenze di pulldown fino a 68k ci sono stati cambiamenti, a dirla tutta neanche togliendole del tutto (eccezione fatta per gli effetti psichedelici dati dai disturbi sull'ingresso flottante).

 

Su RA4 ho collegato un altro ingresso dell'ULN che però attualmente non è utilizzato dal codice, essendo che è una porta open drain la ho pulluppata con un resistore da 4k7, comunque non ci azzecca niente perché anche forzando quella porta a livello basso da codice non cambia niente.

 

La cosa che mi infastidisce è che anni fa ho realizzato un'applicazione quasi identica, e quella funziona, solo che non ricordo se in quel caso i pin dei dip erano in pullup o pulldown, e non ho modo di andare a verificare perché non ce la ho qui con me.

 

Spostare i dip in pulldown (farli chiudere verso massa con resistenze al positivo) sarebbe anche fattibile ma perderei la ICSP, se pulluppo quelle linee il programmatore da di matto.

 

084a05d9703fe78afc7b1ad8b7984070.jpg

Link to post
Share on other sites
Livio Orsini

La causa più probabile è che hai configurato i 4 pins della porta come uscite e non come ingressi.

 

16 ore fa, GiRock scrisse:

Posta la tua configurazione dei registri, il linguaggio, il compilatore e al limite anche lo schemino, almeno elenca che pin della PORTA stai utilizzando e il tipo di oscillatore...

 

Quoto Gio.

Link to post
Share on other sites
GiRock

Tieni conto che nel caso che i Comparatori non fossero stati inizialmente disabilitati, hai mandando i 5V diretti agli Ingressi, Uscite e Vref, facile cuocere qualcosa in quella configurazione, purtroppo non uso il ladder e mi è difficile aiutarti, Io di solito cerco sempre di mettere le pull-up e chiudo a massa i dip-switch...

 

Ma non ti conveniva mettere due JUMPER per la ICSP?

Link to post
Share on other sites
ilguargua
1 ora fa, GiRock scrisse:

Ma non ti conveniva mettere due JUMPER per la ICSP?

Se mette i pullup dovrebbe bastare un solo jumper verso i 5V per escluderli, o sbaglio (non conosco i PIC)?

 

Ciao, Ale.

Link to post
Share on other sites
Darlington

A saperlo prima che avrei avuto quei problemi avrei messo un dip a 6 posizioni e due le avrei usate per escludere le resistenze.

 

Avevo provato prima su breadboard a chiudere verso massa i dip, usando però solo il weak pullup del pic, ma avevo avuto gli stessi problemi.

 

Proverò a disabilitare le periferiche su PORTB e vedere se cambia qualcosa, comunque tutta la PORTB dovrebbe essere settata come ingresso, infatti i cambiamenti dello stato dei dip li rileva, non è escluso ci possa essere qualche bug nel compilatore, proverò anche a forzare manualmente il registro trisb per vedere se si risolve, come ultima soluzione proverò a far chiudere i dip verso massa, però con pullup hardware.

 

La configurazione dei registri non la so perché ldmicro non la mostra all'utente, o almeno non che io sappia. È però possibile scrivere manualmente il valore che vuoi, specificando l'indirizzo del registro in una apposita istruzione MOV.

Link to post
Share on other sites
del_user_97632

Per altro non e' buona norma andare diretti ai 5V per pull-uppare, ne diretti a massa per pull down-are. Si dovrebbe usare una resistenza anche in quel caso. Proprio perche' se hai un conflitto sulle linee (output <-> output) preservi le porte e il funzionamento.

Link to post
Share on other sites
Darlington

Riassunto delle prove:

 

- forzare portb come input (0xFF su trisb) = cambiato niente

 

- dip chiusi verso massa con resistenze di pullup = cambiato ancora meno

 

funziona tutto correttamente ma la lampadina in uscita continua a fare uno sputo di luce appena attivo un dip qualsiasi.

 

in più con due resistori in serie tra PGD e PGC l'icsp non funziona per niente.

Link to post
Share on other sites
Livio Orsini

Togli i dip switches e prova a far ponticelli tra ingresso e +5V, uno alla volta. Controlla se quando connetti un ingresso al +5V hai un calo di tensione di alimentazione.

Link to post
Share on other sites
Darlington

Già fatto, i 5V al pic arrivano sempre stabili, è in uscita che calano a 2-3V

Link to post
Share on other sites
ilguargua
34 minuti fa, Darlington scrisse:

Già fatto, i 5V al pic arrivano sempre stabili, è in uscita che calano a 2-3V

Controlla se cambia in maniera significativa l'assorbimento del PIC mentre accade, poi : hai provato a guardare con un oscilloscopio cosa accade realmente all'uscita?

 

Ciao, Ale.

Link to post
Share on other sites
Darlington
7 ore fa, ilguargua scrisse:

Controlla se cambia in maniera significativa l'assorbimento del PIC mentre accade, poi : hai provato a guardare con un oscilloscopio cosa accade realmente all'uscita?

 

Ciao, Ale.

 

Domani provo con l'oscilloscopio, comunque voglio fare dei test su breadboard per capire se il quarzo ha qualche attinenza col problema, ricordo che avevo avuto lo stesso problema facendo chiudere i dip direttamente a massa sulla breadboard, ma non ricordo se avevo fatto anche gli stessi test con i dip verso la +5V.

 

L'unica cosa di cui sono certo è che non è il software perché lo fa anche con un programma minimale (la cui unica istruzione è di tenere accesa una spia)

Link to post
Share on other sites
Livio Orsini

Se cala la tensione solo sui pins in uscita ci possono essere solo due cause:

  1. Il micro sta assorbendo esageratamente per qualche causa, ma dovresti anche sentire un riscaldamento del chip
  2. Le uscite / l'uscita sta oscillando, ma questo lo vedi con un oscilloscopio.
Link to post
Share on other sites
del_user_97632

Se il PIC e' ben alimentato, mmm, alcune idee

 

- forse la mcu non sta girando. Io mi traccerei su seriale qualche byte, o togglerei qualche porta per vedere se il firmware gira e a che frequenza di clock (on off, ma con programma in asm, (i pic nascono con l'assembly, poi hanno fatto i vari linguaggi ad alto livello), questo per eliminare dubbi sw dei compilatori).

- fusibili (config word) etc, sono settati giusti ?

- provare con oscillatore RC interno ?

- verificherei massa sia ben saldata / collegata al pic (Vss),

- non e' che su quei pin c'e' qualche funzionalita' ICSP da disabilitare ? A volte sui PIC vanno disabilitate separatemente.

- poi magari puoi provare a togglare un output se rilevi un certo stato su un input. Io suggerisco sempre almeno una resistenzina per dargli i 5V o la massa.

 

 

saluti

 

Link to post
Share on other sites
GiRock

Ho letto che puoi generare anche il codice sorgente dal ladder, a questo punto forse sarebbe meglio vedere cosa sta facendo al posto di tirare ad indovinare...

Link to post
Share on other sites
Darlington

Forse ho risolto!

 

Alla fine era proprio quel che avevo escluso credendolo improbabile, il software

 

A quanto pare su LDMicro non puoi avere due istruzioni che richiamano la stessa porta di uscita del micro, altrimenti il pic non gradisce e succede quello.

 

Infatti sono riuscito a ricreare il problema con due istruzioni che mi attivassero la stessa uscita sia attivando il dip 1 (e mantenendo 2, 3, 4 a massa), sia premendo il pulsante.

 

Se invece faccio comandare la stessa porta da due relè virtuali in parallelo, nessun problema di sorta.

 

Rivedrò il codice, intanto vi ringrazio comunque per il supporto :)

Link to post
Share on other sites
max.bocca

Non avrei mai citato che utilizzi Ld micro. In realtà la tensione non era bassa ma presente solo per il tempo che intercotteva tra il rug che era attivo e il rug che era disattiva. Questo succede in tutti i PLC se non controllano la duplicazione dell'utilizzo delle uscite o M. 

Link to post
Share on other sites
Darlington
il 4/5/2018 at 07:26 , max.bocca scrisse:

Non avrei mai citato che utilizzi Ld micro. In realtà la tensione non era bassa ma presente solo per il tempo che intercotteva tra il rug che era attivo e il rug che era disattiva. Questo succede in tutti i PLC se non controllano la duplicazione dell'utilizzo delle uscite o M. 

 

Questo non lo sapevo, pensavo che quando l'uscita era presente in una rung che in quel momento non era energizzata, il compilatore la "lasciasse libera", non che ne forzasse l'uscita a livello logico 0.

 

Tra l'altro in simulazione non me ne sarei mai accorto perché non viene mostrata l'oscillazione dell'uscita, in simulazione mostra il livello logico 1 per tutto il tempo in cui il timer richiede sia attiva, e basta.

 

Ora cercherò di ricordarmene alla prossima occasione :)

Link to post
Share on other sites
del_user_97632

rung ?? Dunque era come se fosse in alta impedenza ?

Link to post
Share on other sites
Darlington

In sostanza, si spegneva tutte le volte che il programma incontrava la rung con l'istruzione che la poneva a 0, e restava accesa per il restante tempo perché una rung le diceva che doveva essere accesa. Tutto ciò diventava una sorta di PWM non voluto, provocando appunto il calo della luce della spia. In realtà lampeggiava ad alta frequenza, come appunto accade in un vero controllo PWM.

 

Ora che conosco il problema, se il tempo me lo consentirà proverò a ricrearlo su breadboard e verificare il comportamento della porta con l'oscilloscopio.

Link to post
Share on other sites
Livio Orsini
7 ore fa, _angelo_ scrisse:

rung ??

LDMicro è un compilatore gratis per PIC16 e AVR. Si programma in LADDER come i PLC. Il termine "rung" significa riga.

 

Link to post
Share on other sites
del_user_97632

Ok grazie dei chiarimenti. PLC style insomma. Sono un classico, in genere per i core avr uso gcc, e per i PIC gpasm, non ero al corrente, buono a sapersi.

 

 

Link to post
Share on other sites
Darlington
4 ore fa, _angelo_ scrisse:

Sono un classico, in genere per i core avr uso gcc, e per i PIC gpasm, non ero al corrente

 

Io ho provato assembler, mikrobasic e hi-tech C++, e ldmicro è l'unico compilatore con cui sia riuscito ad ottenere qualcosa che non fosse farmi venire un gran mal di testa; ha parecchi difetti, supporta pochissimi microcontroller, spesso si beccano dei bug grossolani (io ne ho beccato uno qui, ad esempio), ma almeno funziona.

 

Su github è attiva anche una community che ha preso il progetto originale ed è tuttora al lavoro per aggiungere funzionalità ed ampliare il supporto hardware.

 

Il problema degli altri compilatori (almeno, quel che ho notato io), è che partono con l'idea che tu impari a compilare per partenogenesi: se cerchi tutorial, passi direttamente dal classicissimo programmino per far lampeggiare un led, al come realizzare la replica funzionante del sistema di guida dei veicoli Apollo; vie di mezzo non ne esistono.

 

Infatti ho abbandonato perché non ho trovato, ad esempio, un tutorial decente per gestire i pulsanti con gli interrupt, che poi sarebbe la base se vuoi realizzare qualsiasi cosa.

 

Con ldmicro dopo una settimana ero riuscito a realizzare un timer luce scale che permettesse anche di mantenere la luce accesa fissa con la pressione lunga del pulsante, corredando il tutto di una spia che segnalasse la condizione di luce fissa lampeggiando, per ricordarti di spegnerla. Brutto e scritto male, ma funzionante già da un paio d'anni; con gli altri compilatori dopo una settimana avevo finito il prontuario delle bestemmie ed iniziavo a bestemmiare divinità di altre religioni.

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...