Jump to content
PLC Forum


Sign in to follow this  
francesco93

Termostato Con Pic16F876

Recommended Posts

francesco93

salve a tutti, è la mia prima discussione che apro, quindi mi scuso se effettuo qualche errore.

Ho visto che ci sono molti utenti preparati in questo forum e credo che riusciranno a darmi una mano. Come dal titolo, sto cercando di realizzare un termostato (il più semplice possibile) con il pic16f876. in sostanza voglio che il pic attiverà una determinata uscita(es. riscaldatori) se la temperatura scende sotto una temperatura di riferimento minima e attivarne un altra(es. ventole di raffreddamento) se la temperatura supera una temperatura di riferimento massima.

infine magari utilizzare un display per la visualizzazione delle varie temperature.

Se avete un pò di materiale a disposizione per questo progetto certamente mi tornerà utile!

grazie!

Share this post


Link to post
Share on other sites

Livio Orsini

Definisci materiale. :smile:

magari comincia a chiarirti le idee sul tipo di sensore che vorrai usare e sul tipo di attuatore, sulle loro caratteristiche e necessità. Sul tipo di visualizzatore, sul modo di inserire, variare le soglie, etc.

Cos'è? Un progetto amatoriale? Un esercizio scolastico?

Share this post


Link to post
Share on other sites
francesco93

è un progetto che volevo portare all'esame...solo che visto che a scuola stiamo un pò indietro ho deciso di chiedere aiuto a voi!Grazie comunque ;)

Share this post


Link to post
Share on other sites
francesco93

il sensore da utilizzare è lm35,ho pensato a questo in quanto ci da un valore in tensione.Per la visualizzazione invece un display 16x2. per variare le soglie invece avevo pensato a dei pulsanti, due per ogni soglia, se però si va a complicare troppo il programma mi accontento anche di soglie fisse che preimposto in fase di programmazzione.

Share this post


Link to post
Share on other sites
Livio Orsini

Benissimo hai delineato nelle linee essenziali quello che vuoi fare.

Ora, per poterti aiutare, sono necessarie altre informazioni.

La parte Hw. Cosa userai? Hai già una scheda fatta? Hai un bread board? altro?

Poi gli strumenti Sw. Ovviamente userai l'ambiente gratuito di MPLAB. Che linguaggio andrai ad usare? La suite gratuita "C" di MPLAB? altro?

Più informazioni dai più facile sarà aiutarti. Spendi un po' di tempo a descrivere cosa vuoi fare, cosa sai fare e cosa vuoi ottenere.

Share this post


Link to post
Share on other sites
francesco93

okok :smile: purtroppo non ho le idee ben chiare...comunque per quanto riguarda la parte hw dovrò comprare la maggior parte dei componenti e montarli su bread-board. il circuito che voglio realizzare è piuttosto indicativo diciamo, anche per gli attuatori ad esempio potrei utilizzare semplicemente un led per indicare che sono stati attivati i riscaldamenti e la ventola di un pc nel momento in cui viene superata la temperatura di riferimento massima.

Per la parte di programmazione ho meno esperienza, ho pensato di utilizzare mikrobasic per scrivere in c in maniera da utilizzare eventuali librerie e semplificare il programma rispetto a un linguaggio assembler.

spero di essere stato abbastanza chiaro.

Share this post


Link to post
Share on other sites
Livio Orsini

Forse ti converrebbe usare una schedina con micro per impieghi generali. C'è quella prodotta dalla medesima azienda che produce MikroC, la EasyPIC7 che in questo periodo viene offerta a prezzo speciale di 56€ (ieshop.it) ed ha gia a bordo display, sensore di temperatura LM35, ingressi ed uscte.

Leggere lo LM35 lo leggi direttamente dall'ingresso analogico del PIC. Se programmi l'ingresso per convertire su10 bit hai praticamente la temperatura in diretta. Impstare due sogle di comparazione è semplicissimo.

COmincia a pensare alla topologia Hw, poi per fare il programma è quasi automatico. :smile:

Share this post


Link to post
Share on other sites
francesco93

non avevo mai sentito parlare di queste schede...comunque nel sito che mi hai proposto l'ho trovata ha un prezzo molto più alto! e credo che non mi conviene per l'utilizzo che ne devo fare...

Share this post


Link to post
Share on other sites
Livio Orsini

Forse è finita la promozione. Comunque di schedine per pochi euro ne trovi di gia fatte.

Comunque prova a leggere questa discussione Nel mesaggio 3 e 4 c'è il link allo schema delle schede che si possono vedere in foto. Se vuoi non sono difficili da realizzare.

Ho deciso di non continuare con questo lavoro perchè sembra non interesssi ad alcuno.

Share this post


Link to post
Share on other sites
maguls
Ho deciso di non continuare con questo lavoro perchè sembra non interesssi ad alcuno.

E' un vero peccato Livio, secondo me è un argomento molto interessante che poteva raccogliere anche molti utenti nuovi sul forum.

Però certo ci vuole almeno un piccolo feedback...

All'università io ho lavorato con fpga, dsp, microcontrollori, però quando le cose non le si utilizza spesso vanno nel dimenticatoio.

Certo è che mi sono ripromesso di ricominciare a riguardare qualcosa, poi a me la programmazione non dispiace anzi.

Share this post


Link to post
Share on other sites
Livio Orsini
Però certo ci vuole almeno un piccolo feedback...

Se vai a scorrere l'elenco dei progetti "on line" ne trovi parecchi, tutti abortiti per mancanza di partecipazione. Son tutti li che aspettano i risulttati, acquattati ed in silenzio. Son veramente pochi quelli che offrono collaborazione.

Abbiamo persino lanciato un'iniziativa per la costruzione e progettazione di un PLC, regalando alcuni kit CUBLOC. FOrse ci sono ancora dei kit disponibili... :wacko:

Share this post


Link to post
Share on other sites
francesco93

comunque nel caso in cui porto a termine questo progetto(spero tanto) lo posto qui!

Share this post


Link to post
Share on other sites
Livio Orsini
comunque nel caso in cui porto a termine questo progetto(spero tanto) lo posto qui!

Bravo hai centrato perfettamente lo spirito del forum!

Comunque se hai domande e richieste non esitare a chiedere, nei limiti del possibile l'aiuto non ti verrà negato.

Se ti metti d'impegno ce la dovresti fare. Una volta che hai realizzato il prototipo Hw, scrivere il codice è abbastanza semplice e in caso di difficoltà una mano a venirne fuori te la daremo senz'altro.

Share this post


Link to post
Share on other sites
francesco93

Eccomi ragazzi :smile: Dopo aver lavorato e studiato un pò di cose ho iniziato a realizzare qualcosa sperando che sta piuttosto bene.

Riguardo la parte Hw non ho ancora comprato il materiale, quindi non ho potuto provare niente, ho pensato di non utilizzare schede già realizzate, ma acquistare i singoli componenti...comunque ho realizzato il circuito su eagle.

Ho realizzato anche la parte Sw utilizzando mikrobasic...Premetto che non avevo mai utilizzato questo software, infatti ho molti, anzi moltissimi dubbi riguardo a ciò che ho realizzato :(

Adesso vorrei postare il circuito realizzato su eagle e il programma in mikrobasic...devo caricarli nella sezione up/download prima di postarli qui?

Share this post


Link to post
Share on other sites
Livio Orsini

Gli schemi siicuramente.

Share this post


Link to post
Share on other sites
francesco93

posto ciò chhe ho realizzato...il programma lo metto qui di seguito perche non ho capito bene come allegarlo...

//program term

//'16F876,

//'termostato digitale

main:

{

PORTB = 0; //setta a 0 le porte B

TRISB = 1; //porte B come ingressi

PORTC = 0; //setta a 0 le porte C

TRISC = 0; //setta le porte C come uscite

ADCON0 = 0b11000001; // utilizzo il clokc interno e la porta RA0 come analogica

ADCON1 = 0b10000000; //il risultato in ADRESH è giustificato a destra, settaggio porteA analogiche

Tmin=1; //definisco la temperatura di soglia minima

Tmax=1; //definisco la temperatura di soglia max

while(1);

{

ADCON0.ADON=1;

ADGO = 1; // fa partire la conversione

while(ADGO); //aspetta che il bit torni a 0 da solo(conversione terminata)

ADCON0.ADON=0; //disattiva ADC

Dato_ADC=ADRESH;

Va = (5.0/256.0)*Dato_ADC;

temp = Va*10;

if (temp <= Tmin)

{

PORTA.RC0=1;

PORTA.RC1=0;

}

else

if (temp >= Tmax)

{

PORTA.RC0=0;

PORTA.RC1=1;

}

else

{

PORTA.RC0=0;

PORTA.RC1=0;

}

{

if portb.0=0 than // se è stato premuto il pulsante RB0

Tmin=Tmin+1; // incrementa la variabile Tmin

if portb.1=0 than // se è stato premuto il pulsante RB1

Tmin=Tmin-1; // decrementa Tmin

if portb.2=0 than // se è stato premuto il pulsante RB2

Tmax=Tmax+1; // incrementa la variabile Tmax

if portb.3=0 than // se è stato premuto il pulsante RB2

Tmax=Tmax-1; // decrementa Tmax

}

{

LCD_Config(PORTC,7,6,5,4,PORTC,3,0,2); //

Lcd_Cmd(Lcd_CURSOR_OFF); // spegni il cursore

txt = temperatura;

txt1 = °;

txt2 = Th;

txt3 = Tc;

Lcd_Out(1, 1, txt); // scrivi la parola contenuta in text sul display

Lcd_Out(2, 1, txt2);

Lcd_Out(2, 9, txt3);

Lcd_Out(1, 14, txt1);

Lcd_Out(2, 7, txt1);

Lcd_Out(2, 15, txt1);

WordToStr(temp,t);

Lcd_Out(1, 12, t);

}

end.

Share this post


Link to post
Share on other sites
Livio Orsini

Se il programma lo racchiudi entro i tags "code", quelli del pulsante con l'icona "<>" è meglio leggibile.

Non uso microbasic, però mi sembra che usi la conversione a 8 bits (256 counts), forse ti conviene usare la conversione a 10 bits (1024 conts).

Share this post


Link to post
Share on other sites
francesco93

ah ok grazie non avevo capito che si mettevano li i programmi.

comunque ho utilizzato la conversione a 8 bit sia per utilizzare un solo registro dove avere il valore digitale e poi perchè avevo lettosu alcune guide che il convertitore del pic16f876 era a 8bit

Share this post


Link to post
Share on other sites
Livio Orsini
che il convertitore del pic16f876 era a 8bit

I convertitori dei vari pic sono geenralmente a 10 bits, alcuni tipi hanno anche convertitori a 12 bits.

Se usi la conversione a 10 bits è l'ideale per convertire lo LM35.

Share this post


Link to post
Share on other sites
francesco93

ok...quindi andrò ad utilizzare il registro adresh e adresel in questo modo credo:


  Dato_ADC=ADRESH+(ADRESL<<8)

  Va = (5.0/1024.0)*Dato_ADC;

  temp = Va*10;

Share this post


Link to post
Share on other sites
Livio Orsini

Non saprei perchè non conosco il microbasic, in "C" è sufficiente dichiare la variabile come intero da 16 bits e la funzione che legge lo A/D_C rende il valore in questa variabile, senza necesità di shift o altro perchè vengono allineati a destra azzerando i bits più significativi. DOvresti leggere bene il manuale del microbasic; suppongo che ci sia la built in function che permette di leggere le conversioni su 10 bits.

Share this post


Link to post
Share on other sites
francesco93

eccomi finalmente sono riuscito a fare qualcosa ;) le temperature di soglia però non è possibile variarle durante il funzionameto, quindi solo in fase di programmazione. Per scriverlo ho utilizzato mikrobasic...


   program termometro

dim temp as longint

dim temperatura as word

dim decine, unita, decimi as byte

dim gradi as word

main:

	 TRISA = $FF

	 TRISB = $00

	 TRISC = $FF

	 ADCON0 = %11000000

	 ADCON1 = %10000011

	 PORTB = $00

	 Lcd_Init(PORTC)

	 Lcd_Cmd(LCD_CURSOR_OFF)

	 Lcd_Cmd(LCD_CLEAR)

	 Lcd_Out(1,1 ,"temp:")

	 Delay_ms(1000)

    while TRUE

	   temperatura = Adc_Read(0)

	   temp = temperatura * 5000

	   temperatura = temp >> 10

	   decine = temperatura div 1000

	   temperatura = temperatura mod 1000

	   unita = temperatura div 100

	   temperatura = temperatura mod 100

	   gradi = (decine * 10) + unita

	    if (gradi >= 34)  then

		    Lcd_Out(2,1 ,"condizionamento")

		    else

			 if (gradi <= 32) then

				 Lcd_Out(2,1 ,"riscaldamento ")

			   else

			    Lcd_Out(2,1 ,"			   ")

			 end if

	    end if


	   if (temperatura < 25)then

		   decimi = 0

	   else

		  if (temperatura <= 75) then

			  decimi = 5

		  else

			  decimi = 10

		  end if

	   end if

	   if (decimi = 10) then

		   decimi = 0

		   unita = unita + 1

		   if (unita = 10) then

			   unita = 0

			   decine = decine +1

		   end if

	    end if

	    decine = decine + 48

	    if (decine = "0") then

		    decine = " "

	    end if

	    Lcd_Chr(1,6,decine)

	    Lcd_Chr(1,7,unita + 48)

	    Lcd_Chr(1,8,".")

	    Lcd_Chr(1,9,decimi + 48)

	    Lcd_Out(1,10,"°C")

	    delay_ms(5000)

    wend


end.


anche per quanto riguarda l'isteresi non riuscendo a fare diversamente ho pensato di introdurre un ritardo maggiore...

Share this post


Link to post
Share on other sites
walterword

ciao Francesco

Una domanda ....tu usi microbasic piuttosto che microc piuttosto che micropascal , i compilatori dei serbi

Pero' non hai la scheda che vendono loro

Quindi produci l'eseguibile e poi lo scarichi con MPLab e il cavo usb della microchip?

ciao

Walter

p.s. ciao Livio mi confermi ll'operazione ?

Share this post


Link to post
Share on other sites
giacomo56

Qualsiasi compilatore produce un file .hex che contiene il codice binario del programma che andrà caricato sul pic con uno dei programmatori

che ci sono in commercio della Microchip o di terze parti.

Ciao.

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