Sari la conținut
ELFORUM - Forumul electronistilor

Sistem de achizitie de date cu PIC16F877A


Vizitator Iwly

Postări Recomandate

Cer ajutorul acelora dintre voi mai experimentati in lucrul cu microcontrolerele. Cu un PIC16F877A vreau sa folosesc ADC intern pentru a citi temperatura de la un senzor de temperatura Dallas; temperatura s-o afisez pe un LCD cu doua randuri conectat la unul dintre porturi; de asemeni, vreau sa interfatez microcontrolerul cu o tastatura (pseudo)numerica 4randurix4coloane care sa fie conectate la un port. As vrea sa stiu daca este FEZABIL :jytuiyu . Este proiectul meu de licenta, va multumesc!

Link spre comentariu
  • Răspunsuri 16
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • costi002

    4

  • Liviu M

    2

  • nooob64

    1

  • vcdec

    1

Top autori în acest subiect

Imagini postate

Este realizabil, depinde insa de nivelul tau de cunostinte... daca ai intrebari concrete colegii de pe forum iti vor acorda ajutor, trebuie insa sa arati si tu ca te preocupi, te documentezi si nu vrei un proiect de-a gata. Ce programator ai?Ce soft folosesti pt codul uC?

Link spre comentariu
Vizitator Iwly

Este realizabil, depinde insa de nivelul tau de cunostinte... daca ai intrebari concrete colegii de pe forum iti vor acorda ajutor, trebuie insa sa arati si tu ca te preocupi, te documentezi si nu vrei un proiect de-a gata.

Ce programator ai?

Ce soft folosesti pt codul uC?

Deocamdata, urmaresc sa-mi iasa simularile in Proteus si sa mearga programul OK. Odata acestea rezolvate, atunci ma va preocupa montajul practic(am tot ce trebuie in laboratoarele facultatii). Despre nivelul meu de cunostinte... sa zicem ca-s unul care invata repede si care n-a lipsit de la cursuri, doar ca asa ceva nu s-a facut la ore; acolo- doar PIC16F84, niciodata vreun uC varf de gama cu ADC, CCP etc.. Pentru programare folosesc C (compilator MikroC si Hi-Tech) si assembler. Precizez ca singurul meu scop este acela de A INVATA ! stiu in schimb ca pentru cei cu experienta este o aplicatie destul de frecventa si voi aprecia mult ajutorul si indicatiile voastre :) multumesc
Link spre comentariu

Daca esti incepator si vrei sa realizezi ceva rapid eu zic sa nu te aventurezi la Hi-Tech C pentru ca nu iti ofera aceeasi usurinta de lucru ca si mikroc.

Pt. a citii un senzor de temperatura gen DS18x20 mikroc-ul are exemple insa pentru un singur senzor pe bus , iar pentru a citii mai multi senzori exista un procedeu special pentru cautarea fiecarui senzor si apoi interogarea lor unul cite unul http://www.maxim-ic.com/app-notes/index.mvp/id/187 , am testat acest cod si functioneaza cu mici modificari la delay-uri ...

Link spre comentariu

Cer ajutorul acelora dintre voi mai experimentati in lucrul cu microcontrolerele. Cu un PIC16F877A vreau sa folosesc ADC intern pentru a citi temperatura de la un senzor de temperatura Dallas; temperatura s-o afisez pe un LCD cu doua randuri conectat la unul dintre porturi; de asemeni, vreau sa interfatez microcontrolerul cu o tastatura (pseudo)numerica 4randurix4coloane care sa fie conectate la un port. As vrea sa stiu daca este FEZABIL :jytuiyu . Este proiectul meu de licenta, va multumesc!

este FEZABIL. merge si ca teza pentru doctorat.esti amabil sa spui si la ce spirulache studiezi si care-i idiotu care va trimite pe forumuri pentru licenta?
Link spre comentariu
Vizitator Iwly

este FEZABIL. merge si ca teza pentru doctorat.esti amabil sa spui si la ce spirulache studiezi si care-i idiotu care va trimite pe forumuri pentru licenta?

Nu e vina profului, nici a institutiei. Eu sunt singurul responsabil pentru ca nu mi-am dat licenta la timp, dar vreau sa indrept asta. Am hotarat ca voi folosi senzorul de temp cu iesire analogica LM35 de la TI/ NS conectat la ADC PIC16F877 si LCD-ul si tastatura le conectez la porturile libere. Am aflat ca este realizabil, ma apuc de treaba si voi veni doar cu intrebari concrete. va multumesc pentru indicatii
Link spre comentariu
  • 9 luni mai târziu...
Vizitator Iwly

Nu m-am descurcat cu LCD-ul, am facut pana la urma pe afisaj cu LED-uri. La tastatura am renuntat. Pentru incepatorii interesati, mai jos este codul. E un pic rudimentar, desigur, poate fi optimizat, dar macar functioneaza. Am atasat de asemeni si schema in Proteus

Hidden text: ON
Available only to registered users.

 

#include <pic.h>      // introducem biblioteca pic #include <htc.h> // introducem libraria compiler #include <pic16F877A.h>   // introducem biblioteca integratului int rezultat;	//int rezultat;			int i;int x;// unsigned int digit[10]={0b11000000,0b11111001,0b10100100, 0b10110000, 0b10011001,0b10010010, 0b10000010, 0b11111000, 0b10000000,0b10010000}; C. C.unsigned int digit[10]={0b00111111,0b00000110,0b01011011, 0b01001111, 0b01100110,0b01101101, 0b01111101, 0b00000111, 0b01111111,0b01101111}; //valoare digit//unsigned int caracter[4]={0x01, 0x02, 0x04, 0x08};unsigned int caracter[4]={0xFE, 0xFD, 0xFB, 0xF7};  //selectie canalvoid delay(void)		//functie intarziere{	for(i=1;i<500;i++);   //rutina intarziere 500 de cicluri masina}void afisare(void)    //functie afisare	{	PORTC=caracter[0]; //selectie canal sute	x=rezultat/100; 	//determinare sute	    PORTB=digit[x];		//afisare sute	delay();			//intarziere	PORTC=caracter[1];	//selectie canal zeci 	x=(rezultat/10)%10;	// determinare zeci	PORTB=digit[x]; 	//afisare zeci	delay();			//intarziere	PORTC=caracter[2];	//selectie canal unitati		x=rezultat%10;		//calcul unitati	PORTB=digit[x];		//afisare unitati	delay();			//intarziere	PORTC=caracter[3];	//selectare canal 4	PORTB=0b00111001;	//afisare simbol celsius	delay();			//intarziere	}//init porturi	void init(void)	{	TRISA=0XFF;			//porta intrari	TRISB=0X00;				//portb iesiri	PORTB=0x00;	TRISD=0x00;		//portd iesiri	TRISC=0X00;		//porta iesiri	}//INIT ADC	void ADC_init(void)	{	ADCON0=0b10000000;  //ADCON0=0b10000101;	ADCON1=0b00001110;	}void main(void)	{	init();	ADC_init();		while(1)		{		ADCON0bits.ADON=1;			delay();		delay();		delay();		ADCON0bits.GO=1;		delay();		delay();		delay();		while(ADCON0bits.GO==1);		delay();		delay();		delay();			rezultat=ADRESH<<1;  //rezultat=ADRESH*2;			delay();		delay();		delay();		afisare();		ADCON0bits.ADON=0;			delay();		delay();		delay();		ADCON0bits.GO=0;		delay();		delay();		delay();				}	}
Link spre comentariu

Felicitari, e bine ca merge, da' as avea cateva observatii/intrebari.

1. Nu e nevoie sa incluzi toate 3 fisierele pe care le incluzi tu, e suficient sa incluzi htc.h si sa selectezi picul corect in mplab (vad ca si lama are observatia asta).

2. Toate variabilele tale sunt int, adica pe 16 biti, ceea ce inseamna risipa de memorie. In cazul tau nu e o problema, programul e scurt si incape, da' cand o sa vrei sa scrii ceva mai complex o sa constati ca nu mai incape. Singura variabila care are rost sa fie int e rezultat, desi si pe asta tot pe 8 biti o folosesti.

3. Eu as fi pus cuvantul de configurare (directiva __CONFIG()) in cod.

4. Imi e neclar ce parte din valoarea achizitionata folosesti (ma rog, imi e clar, da' nu inteleg de ce). Din cate vad eu ( rezultat=ADRESH<<1; //rezultat=ADRESH*2; ), folosesti numai 7 biti din cei 10.

5. Ce face functia delay() mai exact? Din cate stiu eu, functiile de intarziere din picc arata putin altfel (in functie de versiune sunt DelayMs()/DelayUs() sau __delay_ms()/__delay_us()) si au nevoie de parametri. Nu de alta, da' daca citesti la pagina 129 din Data-Sheet, o sa vezi ca intre ADON = 1 si GO iti trebuie o pauza minima "de achizitie". Esti sigur ca delay() iti asigura pauza asta?

 

Schema:

1. N-am facut pana acum nimic cu afisoare pe led-uri, asa ca sunt sanse sa zic prostii, da' R2..R11 nu trebuie puse in serie cu ledurile afisorului?

2. Bazele tranzistoarilor sunt conectate direct la pinii PIC-ului; cred ca-ti trebuie rezistente totusi.

3. D3 e inutila. De obicei se foloseste cand ai si conector pentru programare pe placa si pinul MCLR/Vpp primeste 13 V de la programator in timpul programarii. In cazul asta, dioda se inseriaza intre VDD si pinul MCLR.

4. Nici D1, D2 nu-ti trebuie (cred eu), iar R13 si C5 s-ar putea chiar sa fie "daunatoare" timpului de achizitie.

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări