Vai al contenuto
PLC Forum


Termostato Con Pic16F876


francesco93

Messaggi consigliati

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!

Link al commento
Condividi su altri siti


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?

Link al commento
Condividi su altri siti

è 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 ;)

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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:

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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:

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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?

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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;

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

  • 1 month later...

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

Link al commento
Condividi su altri siti

  • 4 weeks later...

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 ?

Link al commento
Condividi su altri siti

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.

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