Sari la conținut
ELFORUM - Forumul electronistilor

Numarator binar si pe afisor


Vizitator iusmar

Postări Recomandate

Vizitator iusmar

Salutari baieti si bine v-am gasit.Am un PIC16F876A-I/SP si vreau sa fac un programel care sa-mi numere pana la 32 si sa-mi afiseze pe un afisor cu 7 segmente numarul in baza 10 si pe 5 LED-uri acelasi numar in baza 2.Am motat PIC-ul pe placa, oscilatorul, condensatorii, afisoarele si LED-urile. Mai raman de facut conexiunile si programarea. Aici m-am blocat. Se poate putin ajutor? :jytuiyu

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

Top autori în acest subiect

  • 10vid

    3

  • yo9hnf

    2

  • marinp

    1

  • Drk_alien

    1

Top autori în acest subiect

Imagini postate

Multumesc foarte mult. Apreciez efortul. O intrebare: in varianta cu tranzistori, care este rolul lor in curcuit?

Portul uC poate furniza decat cativa mA (trecut in datasheet). Daca tu vrei sa comanzi un LED de putere, sau 10 LEDuri, sau orice altceva care consuma un curent mai mare decat curentul maxim furnizat de port, atunci trebuie sa folosesti tranzistori de comanda (driveri).
Link spre comentariu
Vizitator iusmar

Am scris asta:void main() { TRISC = 0; for (;;) { PORTC = 0x00; delay_ms (500); PORTC = 0xFF; delay_ms (500); }}in mikroC for PIC si cu Pik Kit am descarcat hex-ul pe placa. Teoretic un consumator conectat la 5V (sau masa) si poarta C ar trebui sa se stinga si sa se aprinda la fiecare jumate de secunda. Un LED legat in acest fel merge, dar afisorul imi sta aprins. Afisorul are anodul comun, in mijloc, conectat la 5V, iar catodurile la poarta.

Link spre comentariu

Daca cu anodul conectat la 5V, pui cate un electrod (de catog) pe rand la masa, se aprinde segmenul respectiv ? - cu rezistentele de rigoare in catod.

Link spre comentariu
Vizitator iusmar

Da, segmentul se aprinde. (n-am incercat decat cu doua, a mers si am sudat si celelalte doua fara sa le mai verific individual). Deci "eroarea" mea se manifesta pentru segmentele a,b,c,d ( formeaza C in oglinda) ca doar astea-s sudate deocamdata.E bai mare daca nu am rezistoare? Segmentele-s verde luminos. (daca verific cu 5V direct din USB se aprind portocalii si parca vor sa se faca rosii daca le-as lasa sub tensiune, dar banuiesc ca se ard)

Link spre comentariu
Vizitator iusmar

Individual, fiecare segment functioneaza, palpaie. Dar daca am deja doi segmenti conectati la poarta, nu mai palpaie ci stau aprinsil; dar cu LED-uri merge. Care sa fie motivul?

Link spre comentariu

Salutare.Blocarea ta apare din cauza portului pe care l-ai setat ca fiind 0xFF (adica 11111111) sau 0x00, asta insemnand ca tu pe acele iesiri vei scoate 5v pe fiecare pin din poarta,astfel tie ti se pare ca afisorul s-a blocat pe toate ledurile aprinse sau pe toate ledurile stinse.incearca sa faci asa:PORTC=0xAC; Acum configuratia ledurilor din afisor s-a schimbat.Acum gandeste-te la un program care sa contina un "FOR" care sa iti numere pana la 32.fii foarte atent la program.Daca ceva nu merge bine verifica din nou programul pas cu pas.numai bine si spor.si bun venit intre noi!!!

Link spre comentariu
Vizitator iusmar

O sa incerc sa montez niste rezistori si o sa vad daca/cum merge. Drk_alien, uita-te ca imi functioneaza cu LED-uri, in schimb afisorul se blocheaza pe aprins daca-s conectati cel putin doi segmenti. Conexiunile is bune, nu se scurtcircuiteaza.

Link spre comentariu
Vizitator iusmar

Am pus rezistori de 460 si merge bine. Atat e bai ca nu-i place ceva, nu-mi stinge toti segmentii care trebuie, cand ii dau sa-mi afiseze un numar; de exemplu pentru 1 ( 0x9F ) se aprinde bine, dar pentru 2 ( 0x25 ) lasa aprins si segmentul din stanga sus... Deocamdata-s multumit, mai ma chinui cu el la sfarsitul saptamanii cand o sa conectez anodul la o alta poarta, nu direct la 5V din alimentare. Poate am gresit la transformari..

Link spre comentariu

Presupun ca segmentele sunt conectate la pini in felul urmator:

_+--RB6--+_|       |RB1     RB5_|       |_+--RB0--+_|       |RB2     RB4_|       |_+--RB3--+
si ca 1 inseamna segment aprins, poti sa faci in felul urmator:

declari:

const unsigned char lut[10]={0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B};

 

si ca sa afisezi pe un digit o cifra faci:

 

PORTB = lut[c];

 

unde c este cifra dorita;

 

Ca sa afisezi pe cele 2 digit-uri, si numararea pe led poti sa faci asa:

const unsigned char lut[10]={0x7E,0x30,0x6D,0x79,0x33,0x5B,0x5F,0x70,0x7F,0x7B};unsigned char nr,dg1,dg2;int contor;void main(void){	nr = 0;	dg1 = 0;	dg2 = 0;	contor = 27777;	while(1){		//aici se face afisarea numarului pe cei 2 digiti + leduri		//se repeta mereu pentru ca ledurile si digiti sunt multiplexati 		//si vor parea aprinsi toti 3 din cauza persistentei vederii		PORTB = 0xFC; //selectare primul digit		PORTC = lut[dg1];//afisare primul digit				PORTB = 0xF3; //selectare al doilea digit		PORTC = lut[dg2];//afisare al doilea digit				PORTB = 0xCF; //selectare leduri		PORTC = nr;				//avansarea numarului poate fi facuta prin asteptare		if(contor!=0)contor--;		else{			nr++;			if(nr==32)nr = 0;			dg1 = nr/10;			dg2 = nr%10;			contor =27777;// presupunere : 1s / ( 36 instructiuni pt tot while   x 1uS pe instructiune @ 4Mhz ) = 27777  pentru ~ 1 s		}		//sau mai elegant prin intrerupere la un timer	}}

Tie ti se aprind segmente din digit care nu doresti pentru ca pui direct numarul codat in baza 2 pe intrarile afisajului (presupun ca asta faci).Trebuie sa selectezi tu pentru fiecare cifra ce segmente sa aprinzi , nu merge asa direct.

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