PIC che si comporta imprevedibilmente

May 16, 2011 18 Replies

Premetto che sono lungi dall'essere esperto in elettronica ma ogni tanto qualche circuito lo costruisco e alla fine di solito funziona! Ora ne ho uno, sulla carta molto semplice, con dentro un PIC che mi sta facendo dannare. Il pic si comporta in maniera assolutamente imprevedibile. Esegue il programma solamente una volta ogni tanto, in maniera casuale. Se no rimane l=EC "amorfo" senza buttar niente su nessuna uscita. Neanche se metto qualcosa come bsf PORTB,0 come prima istruzione. Lo esegue una volta s=EC e 3 no. Non =E8 un problema del PIC perch=E8 ne ho gi=E0 cambiati 4 e succede lo stesso con tutti. Deve essere un problema del resto del circuito che si riflette sul pic. Ho cambiato i bit di configurazione per usare il MCLR interno, nel caso ci fosse rumore su questa linea, ma non =E8 cambiato niente. Anzi... Il programma ora gira una volta su 20 al posto che una su 3. Il circuito sostanzialmente ha dentro il pic, un ponte ad H integrato (lmd18200) per pilotare un motore, un 7805, resistenze e condensatori. Il pwm del pic si collega all'ingresso del pwm dell'lmd18200, gli altri ingressi li ho messi a terra. L'unica altra cosa che fa il pic =E8 prendere il segnale dell'encoder del motore e leggerlo da una parte, e mandar fuori dei segnali con la portA (sostanzialmente faccio un simil convertitore D/A a 3 bit con 3 pin e dopo un filtro RC ci attacco un elettrocardiogramma). Il rumore indotto dal motore dovrei averlo trattato bene perch=E8 non faccia casino all'alimentazione del pic....ma comunque escludo sia questo il problema perch=E8 il pic si comporta a caso anche se stacco il motore!! Funziona a caso anche se disabilito il pwm e metto la porta fissa alta o bassa.



Cosa diamine posso andare a controllare???? Pu=F2 esserci qualche problema nel 7805?? Tralaltro quando funziona se vado a leggere il segnale in uscita con l'ecg (sia quando c'=E8 che quando non c'=E8) vedo un segnale pulito (ho disabilitato il filtro, non temete!!) , nonostante si tratti di un segnale da 1mV di picco (con sottopicchi da 0,2mV o meno). Quindi vuol dire che non ci sar=E0 troppo rumore in giro nel circuito, no?


Luca85 ha scritto:

Senza uno schema e senza anche poter studiareminimamente il montaggio, come facciamo a capire dove HAI o HANNO sbagliato?

"Luca85" ha scritto nel messaggio news: snipped-for-privacy@u26g2000vby.googlegroups.com... Premetto che sono lungi dall'essere esperto in elettronica ma ogni tanto qualche circuito lo costruisco e alla fine di solito funziona! Ora ne ho uno, sulla carta molto semplice, con dentro un PIC che mi sta facendo dannare. Il pic si comporta in maniera assolutamente imprevedibile. Esegue il programma solamente una volta ogni tanto, in maniera casuale. Se no rimane lì "amorfo" senza buttar niente su nessuna uscita. Neanche se metto qualcosa come bsf PORTB,0 come prima istruzione. Lo esegue una volta sì e 3 no. [...]

A parte che potresti anche dirci il tipo di pic (pic16,pic18,pic24) visto che hanno configurazioni di uscita differenti, ritengo probabile che il tuo problema sia legato al 'noto' problema che nasce dal fatto che le uscite dei pic (non tutti) sono del tipo read-modify-write. Se con una uscita piloti 'velocemente' un carico capacitivo con una istruzione del tipo BSF PORTB, potrebbe essere che il pin non commuti affatto (in quanto la capacità sull'uscita non fa n tempo a caricarsi) Cosa differente se utilizzi un micro dotato del registro LATB (che espone appunto lo stato del latch di uscita), modificando il quale sei sempre sicuro che il pin andrà al livello desiderato. Se il problema è questo, come soluzione o riduci la capacità 'vista' dal pin di uscita, oppure utilizzi i registri LATx

Roberto P.

Giusto, dimenticavo questa cosa! Pic 16 (F819) semplice semplice.

Non =E8 affatto questo il caso! Quando dico che gli faccio il BSF intendo che faccio SOLO quello in tutto il programma e poi lo lascio fisso con una instruzione del tipo clrf PORTB bsf PORTB,1 loop nop goto loop

Niente cambi "veloci". Come se il pic non partisse del tutto!!! Tutte le uscite rimangono a 0. Solo clk_out va mostra che l'oscillatore sta oscillando.

me

Mah... Vedo di postartelo questa sera o domani. Ma non volevo che mi analizzaste da cima a fondo il circuito, anche perch=E8 penso che il problema sia in come =E8 stato costruito pi=F9 che in come =E8 stato progettato :) Volevo avere idea se ci sono dei problemi "noti" contro cui un principiante non ha ancora sbattuto la testa.

"Luca85" ha scritto nel messaggio news: snipped-for-privacy@k17g2000vbn.googlegroups.com...

Giusto, dimenticavo questa cosa! Pic 16 (F819) semplice semplice.

Non è affatto questo il caso! Quando dico che gli faccio il BSF intendo che faccio SOLO quello in tutto il programma e poi lo lascio fisso con una instruzione del tipo clrf PORTB bsf PORTB,1

Questo qui sopra è un cambio veloce... Cmq se cerchi veramente aiuto devi dare + info, non siamo veggenti... Nelle 4 righe che hai postato, per esempio manca il settaggio del trisb e così come è fatto se è abilitato il wd si resetta continuamente

Roberto P

Luca85 ha scritto:

Fa delle foto anche al tuo montaggio va, che è meglio.

Luca85 wrote in news:6f6a3fe6-6e5d-4404-b464- snipped-for-privacy@u26g2000vby.googlegroups.com:

Se il tuo circuito è alimentato attraverso un secondo alimentatore prova ad alimentarlo a batterie e a vedere se anche a batterie ti fa lo scherzetto.

...

Il clock. Se stai utilizzando un clock esterno (risonatore ceramico o qurzo), verifica bene la presenza delle oscillazioni. Sono incappato in risonatori SMD montati su ceramica con perdite lungo il perimetro a causa della saldatura sporca di flussante (poco buono). Scorrendo coi puntali del multimetro lungo la ceramica, vedevo una resistenza indesiderabilissima variare corrispondentemente. Una volta ripulito il componente tutto tornava a funzionare.

Le prime cose da controllare sono in genere:

- alimentazione corretta

- clock

- reset

A volte clock e reset sono subalterni l'uno all'altro quindi la sequenza non deve essere presa rigorosamente. Se la scheda =E8 prototipale, male non fa verificare la "sporcizia" sulla pista di massa dal punto di qualit=E0 (tipicamente un condensatore elettrolitico) al pin GND del micro. Importante =E8 il tragitto GND-micro to risonatore-ceramico (o condensatori montati intorno ad esso), pista che non deve essere condivisa con null'altro. Non speculo sull'importanza del reset per non dire ovviet=E0.

Se il micro =E8 in contenitore DIP e montato su zoccolo, puoi provare anche ad estrarlo ed interporre uno zoccolo privato dei pin non essenziali per la mera accensione. Lasciando solo Vcc, Gnd, clock e reset dovresti poter far girare un minimo software per verificare con l'oscilloscopio la funzionalit=E0.

Piccio.

Da eterno principiante a principiante... ma col simulatore interno all'MPLAB funziona? Il watchdog è disabilitato?? Hai stabilito con le direttive org un inizio delle aree di programma e di dati? E poi non potresti fare un brutale copia e incolla del tuo codice?

On May 16, 10:32=A0pm, "blisca" <

Assolutamente s=EC! In ognuna delle mille versioni provate! (comprese quelle accendi PORTB, lasciala accesa)

Esatto!

s=EC

Non penso sia rilevante, visto che ho sempre lo stesso problema con qualsiasi codice. Comunque ho "trovato" l'errore. Stava nel codice, non nel circuito. In particolare negli interrupt. Continuava ad entrare nella routine di interrupt e non eseguiva mai il codice, se non rare volte e in maniera non prevedibile. Ho disabilitato la routine di interrupt e ora funziona tutto correttamente (ma non posso fare quel che mi serviva senza gli interrupt!). Ora cercher=F2 perch=E8 succedeva questa cosa. Nota buffa a lato: ora quando programmo un pic poi questo diventa irriprogrammabile!!!!! Anche se lo sposto su un'altra basetta e tento di riprogrammarlo da l=EC. Eppure tutte le protezioni nei configuration bits sono settate correttamente (disabilitate). E nella settimana prima non ho mai avuto questo problema (con gli stessi configuration bits e stesso circuito!) Ne ho gi=E0 dovuti mettere da parte 3!! Devo capire dove sta il problema prima di bruciarmi anche l'ultimo!

Luca85 ha scritto:

Senti posta delle foto del montaggio e lo schema, altrimenti ci appesantisci solo i coglioni....

Spero d'esser stato chiaro... :PPP

Il 17/05/2011 12:35, Luca85 ha scritto:

Le tue due frasi sono in antitesi... ;)

Marco

Marco Trapanese ha scritto:

Questo ha funzionamento random per via del codice, minchia se siamo messi male....

sci

Non che sia niente di segreto, ma dovrei fotografare il montaggio e disegarmi in fidocad il circuito. Mi ci vorrebbe tempo! Poi oggi alla fine ho risolto tutti i problemi ed ho scoperto che non erano dati dal circuito! Quindi sarebbe uno sforzo inutile ;)

A prima vista s=EC. In realt=E0 il codice era corretto e il circuito pure. Il problema =E8 che venivano triggerati interrupt non previsti (e quindi pure mal gestiti) che lasciavano il codice sempre dentro alla routine di interrupt. Cosa che chiaramente non succedeva con mplab dato che non simulavo stimoli perch=E8 pensavo che non ne arrivassero (dal circuito avevo fisicamente staccato i cavi che prendevano il segnale che dava gli interrupt dall'esterno!). Quando cambiavo il programma lasciavo tutta la parte di setup iniziale!! Quindi l'inchiodarsi nell'interrupt succedeva lo stesso in qualunque modo cambiassi il resto del codice.

Ti d=F2 ragione! ;) Far assumere comportamenti random a un coso programmato in assembler non =E8 per nulla facile! Per=F2...alla fine gli interrupt sono per definizione asincroni...quindi ci sta! Infatti per questo ci ho messo giorni a trovare l'errore. Perch=E8 escludevo che fosse il codice perch=E8 era troppo random quello che succedeva. Di solito a debuggare i codici del livello di difficolt=E0 con cui mi posso trovare a che fare mi ci va massimo mezza giornata!

Il 16/05/2011 18.31, Luca85 ha scritto:

Come se il pic non partisse del tutto!!! Tutte

per me ti resta in reset (brown-out? watchdog?) oppure non è clocckato per qualche errore nel settaggio fuses

-ice-

Comportamenti aleatori in un circuito digitale fanno spesso pensare, a naso, a ingressi CMOS lasciati aperti. Pu=F2 succedere letteralmente di tutto. E' sempre buona norma utilizzare resistenze di pull up o pull down sugli ingressi che potrebbero venir staccati.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required