Vai al contenuto
PLC Forum


Dip switch in pull down mi abbassano tensione su uscite


Darlington

Messaggi consigliati

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 al commento
Condividi su altri siti


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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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 al commento
Condividi su altri siti

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