Jump to content
PLC Forum


Sign in to follow this  
Tecnica Impianti

Fotodiodo E Pic (Sto Impazzendo)

Recommended Posts

Tecnica Impianti

Buongiorno, mi è sorto un problema, ho collegato un fotodiodo con relativa resistenza da 10Kohm ad un pin del mio pic e programmato come input normale come se avessi collegato un normalissimo pulsante.

Ma non funziona...... non è che dovrei programmare il pin per misurare la sua tensione?

Share this post


Link to post
Share on other sites

Livio Orsini

Ma come lo hai collegato? Metti lo schemino, altrimenti non si riesce a capire il problema.

Share this post


Link to post
Share on other sites
Tecnica Impianti

Domanda come si include un disegno?

Share this post


Link to post
Share on other sites
Tecnica Impianti

60735183.png

Ok c'e' l'ho fatta a caricare il disegno..... la resistenza è da 10Kohm....

Share this post


Link to post
Share on other sites
Livio Orsini

Se quello è il collegamento non può funzionare!

Il fotodiodo deve essere polarizzato in modo inverso, altrimenti conduce sempre. Se misuri la tensione ai capi del diodo misurerai sempre un valore < 1 V. Inverti il diodo e vedrai che la tensione ai suoi capi varia in funzione dell'illuminazione; teoricamente si passa da circuito aperto, caso di buio, a bassissima resistenza in caso di piena illuminazione. Poi verifica sul data sheet del diodo quale luminosità necessita e la banda ottica del diodo (visibile, infrarosso vicino, infrarosso lontano, etc.).

Share this post


Link to post
Share on other sites
Tecnica Impianti

Guarda la polarizzazione lo già invertita e tra le altre cose sul disegno o sbgliato, e questo tipo di

fotodiodo l'ho gia utilizzato per costruire delle barriere con il laser, infatti l'ho vado a illuminare proprio con il laser

A questo punto non vorrei che si trattasse di qualche errore che ho commesso sulla saldatura del pin del micro

o qualche impostazione....

Non riesco proprio a capire...

Share this post


Link to post
Share on other sites
Livio Orsini

Dici che il diodo è connesso in modo corretto e che è sbagliato il disegno, va bene. Però a questo punto dovresti anche dire cosa misuri in assenza di collegamento al PIC, quella è la prima cosa da fare. Solo se i livelli buio-luce sono corretti si va ad investigare su come hai paramentrizzato la porta del PIC o altro.

Share this post


Link to post
Share on other sites
Tecnica Impianti

Ho misurato come dicevi tu, e infatti senza illuminazione ho 0,08 volt quando lo illumino arrivo a 5 volt quindi secondo me sbaglio qualcosa nella programmazione che adesso vado a rivedere.....

Ti faccio sapere l'esito....

Share this post


Link to post
Share on other sites
Livio Orsini

Come hai programmato al porta usata? Non è che l'hai programamta come uscita? :smile:

Misura anche le tensioni con diodo connesso alla porta, non vorrei che fosse troppo caricato.

Share this post


Link to post
Share on other sites
Tecnica Impianti

Allora ho preso il mio bel tester e ho fatto delle misure.

a fotodiodo non illuminato mi trovo tra il pin del pic RA0 e gnd 5 volt circa.

a fotodiodo illuminato i volt scendono quasi a 0.

ma il led sulla portb continua a rimanere acceso.

Ti posto il programma perchè sinceramente non sò che pensare..


#include <p18f2550.h>

#include <delays.h>

#include <timers.h>

#pragma config FOSC = HSPLL_HS

#pragma config IESO= ON

#pragma config WDT = OFF

#pragma config LVP = OFF

#pragma config PBADEN = OFF


//OSC = HSPLL_HS Impostato per lavorare ad alta frequenza CON PLL ATTIVATO

//PLL = attivato la divisione

//WDT = OFF Disabilito il watchdog timer

//LVP = OFF Disabilito programmazione LVP

//PBADEN = OFF Disabilito gli ingressi analogici


//Impostazione per bassa priorità

void Low_Int_Event (void);

#pragma code low_vector=0x18

void low_interrupt (void){

//salto per la gestione dell'interrupt a bassa priorità

_asm GOTO Low_Int_Event _endasm;

}

#pragma code

#pragma interruptlow Low_Int_Event

//Funzione per la gestione dell'interrupt a bassa priorità

void Low_Int_Event (void){

// controllo che l'interrupt sia stato generato dal timer0

if(INTCONbits.TMR0IF==1){

PORTBbits.RB2=~PORTBbits.RB2;

INTCONbits.TMR0IF=0;

}

}


void main (void){

//Abilitazione oscilatore interno

//Abilitazione TIMER0

T0CONbits.TMR0ON=1; //abilito il timer0

T0CONbits.T08BIT=1; // lo configuro a 8 bit

T0CONbits.T0CS=0; //clock interno

T0CONbits.PSA=0; // assegno il prescaler al timer0

T0CONbits.T0PS2=1; //valore di prescaler 1:32

T0CONbits.T0PS1=1; //valore di prescaler 1:32

T0CONbits.T0PS0=1; //valore di prescaler 1:32

INTCONbits.TMR0IE=1; //interruzioni abilitate

INTCONbits.GIE=1; //Interrupt globali

INTCONbits.PEIE=1;//Interrupt a bassa priorità

INTCON2bits.TMR0IP=0;//Bassa priorità

RCONbits.IPEN=1; //Interrupt priorità abilitato


// Imposto PORTA tutti ingressi

TRISA = 0b11111111;


ADCON1= 0b11111111; //Imposto come 1/0 tutti i pin del lato A, avrei potuto anche impostarne uno solo.


// Imposto PORTB tutti ingressi

TRISB = 0b11111000;


// Imposto PORTC tutti ingressi

TRISC = 0b11111111;


//Dico al Pin RA0 che il suo stato se premuto è uguale a 1 cosi il Pin del LED RB0 si attiva

if(PORTAbits.RA2==1){

PORTBbits.RB0=0;

}

else {PORTBbits.RB0=1;

}


//Dico al fotodiodo che se si trova illuminato allora mi deve accendere il led altrimenti deve stare spento

if ( PORTAbits.RA0==1){

PORTBbits.RB1=0;

}

else {PORTBbits.RB1=1;}

while (1){

}

}

Tieni conto che allo stesso modo è collegato il pulsante su RA0 e funziona benissimo

Share this post


Link to post
Share on other sites
Livio Orsini

A aprte il fatto che i commenti non corrispondono sempre alle istruzioni, mi sembra che ci sia un sacco di roba che non serve.

Io non uso quel compilatore, perchè lavoro con CCS, però così ad occhio per fare quello che vuoi bastan 3 istruzioni assembler, più una decina di righe di inizializzazione.

Sfronda il programma di tutto quello che non serve, per fare quello che desideri. Poi provi a farlo funzionare. Qundo riconosci lo stato di buio o luce, ed il LED lo ricopia, avrai il tuo mattocino pronto, funzionante e debuggato da inserire in un programma più complesso quando è necessario.

Tu, se ho compreso bene, sei alle prime armi con la programmazione. Bisogna imparare prima il metodo corretto, ed il metodo corretto per no impazzire e perdere giornate a debuggare è crearsi tanti mattoncini elementari. Io ne alcuni che sono oramai più che maggiorenni. :smile:

Poi quando si prova una funzione nuova, o un nuovo dispositivo, bisogna ridurre al minimo indispensabile le istruzioni di contorno, così da avere sotto controllo le cose che veramente interessano.

Share this post


Link to post
Share on other sites
Tecnica Impianti

Ha perfettamente ragione...... Proverò a seguire il suo consiglio....

Share this post


Link to post
Share on other sites
Tecnica Impianti

Buongiorno ho un piccolo problema, sto cercando di fare accende un led illuminando un fotodiodo.

Premetto che mi sta facendo uscir matto perchè non vuol funzionare.

Dopo ripetuti tentativi ho preso in mano il tester e sono andato a misurare le tensioni che ho su un pulsante che mi fa accendere un altro led e poi ho misurato la tensione sul fotodiodo.

sul pulsante ho 5 volt a pulsante non premuto e 0volt a pulsante premuto e il led si accende.

sul fotodiodo ho 4,5 volt a fotodiodo non illuminato e 0,04 volt a fotodiodo illuminato ma il led ' sempre acceso..

cosa può essere????

vi posto anche il codice..


				#include <p18f2550.h>

				#pragma config FOSC = HSPLL_HS

				#pragma config IESO= ON

				#pragma config WDT = OFF

				#pragma config LVP = OFF

				#pragma config PBADEN = OFF				


				//OSC = HSPLL_HS Impostato per lavorare ad alta frequenza CON PLL ATTIVATO

				//PLL = attivato la divisione

				//WDT = OFF Disabilito il watchdog timer

				//LVP = OFF Disabilito programmazione LVP

				//PBADEN = OFF Disabilito gli ingressi analogici				

				void main (void){

				// Imposto PORTA tutti ingressi

				TRISA = 0b11111111;				


				ADCON1= 0b11111111;//Imposto come 1/0 tutti i pin del lato A, avrei potuto anche impostarne uno solo.				// Imposto PORTB tutti ingressi

				TRISB = 0b11111110;				

				// Imposto PORTC tutti ingressi

				TRISC = 0b11111111;				

if (PORTAbits.RA2==1){

				PORTBbits.RB0=0;

				}

				else{

				PORTBbits.RB0=1;

				}				

				while (1){				

}

				}				

GRAZIE

Si prega di notare, anche se non sono indicati i pulsanti codice di discussione e smile, sono ancora utilizzabili

Share this post


Link to post
Share on other sites
patatino59

Non avendo lo schema elettrico posso ipotizzare o un errore nei collegamenti o un difetto del processore.

Prova ad invertire le porte utilizzate per la coppia Fotodiodo/led-che-non-funziona con la coppia Tasto/led-che-funziona e vedi se il problema si inverte.

Il fotodiodo sembra essere efficiente ed i valori di tensione misurati sono OK.

Share this post


Link to post
Share on other sites
Tecnica Impianti

Hai ragione devo provare a collegare il fotodiodo su di un'altra porta perchè non riesco proprio a spiegarmi qual'è il problema....

Pensavo che fosse un problema di voltaggio visto che non mi arriva a 0 pensavo fosse quello....

Share this post


Link to post
Share on other sites
Livio Orsini

Perchè hai aperto una nuova discussione? Serve solo a far confusione.

Ora le ho riunite e sei invitato a continuare con questa discussione.

sul pulsante ho 5 volt a pulsante non premuto e 0volt a pulsante premuto e il led si accende.

Hai provato a collegare il pulsante al posto del diodo, lasciando tutto il resto così com'è e, viceversa, il diodo al posto del pulsante?

Consiglio generale. Se disponi di altre porte è sempre meglio usare la porta B come ingresso, perchè si può lavorare anche ad interrutp; usare la porta A solo per ingressi analogici. Non è obbligatorio, ma è un modus operandi che può tornare utile.

Share this post


Link to post
Share on other sites
Tecnica Impianti

Devo provare giusto per curiosità a provare il collegamento su un'altro ingresso, ma questo lo farò domani.... grazie ancora e a presto

Share this post


Link to post
Share on other sites
Tecnica Impianti

Come sospettavo, ho cambiato il pin di collegamento da RA2 a RA3 ma il discorso non cambia, allora probabilmente devo utilizzare l'entrata come ADC e leggere la tensione che mi da il fotodiodo, oppure creare una circuiteria con ad esempio un relè che mi da un segnale 1/0 pulito.

Vero?

Share this post


Link to post
Share on other sites
Livio Orsini

No! Se usi la porta A come I/O digitali, se quel tipo di micro lo consente (questo non lo so perchè non ho letto il data sheet specifico), Il sistema deve funzionare.

Rileggi quello che ti ho scritto nel #16 e fai quelle 2 semplici prove che ti ho suggerito.

Anche per capire quello che succede si deve operare con metodo; fare prove ad libitum è solo una perdita di tempo.

Share this post


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.

Sign in to follow this  

×
×
  • Create New...