Sari la conținut
ELFORUM - Forumul electronistilor

Frecventmetru cu probleme


Vizitator AmaliaMia

Postări Recomandate

Vizitator AmaliaMia

Buna,colegi! Apelez la voi, poate ma puteti ajuta.. Nu stiu ce sa mai fac...Se apropia licenta si nu imi functioneaza proiectul..Am facut un frecventmetru si un generator,care este realizat cu tinerul 555..Schema pentru acest generator este luata din datasheetul lui 555..Frecventa lui maxima este undeva la 200KHz parca.. asta nu conteaza,dar ideea este ca imi afiseaza 0000Hz.. Si pe placa la fel imi face....Nu stiu ce sa-i mai fac....Programul este  luat de pe net,deci nu prea stiu multe despre el...Va rog,sa ma ajutati!! :26

Pun mai jos schema in proteus si programul in MikroC:

 

// LCD module connectionssbit LCD_RS at RB4_bit;sbit LCD_EN at RB5_bit;sbit LCD_D4 at RB0_bit;sbit LCD_D5 at RB1_bit;sbit LCD_D6 at RB2_bit;sbit LCD_D7 at RB3_bit;sbit LCD_RS_Direction at TRISB4_bit;sbit LCD_EN_Direction at TRISB5_bit;sbit LCD_D4_Direction at TRISB0_bit;sbit LCD_D5_Direction at TRISB1_bit;sbit LCD_D6_Direction at TRISB2_bit;sbit LCD_D7_Direction at TRISB3_bit;// End LCD module connectionschar i;unsigned short cnt;//unsigned long long int freq_result;unsigned int freq_result; // Define Messageschar message1[] = "Frec:   Hz";//char message2[] = " Hz"; //char *freq = "0000";void Display_Freq(unsigned int freq2write) {  freq[0] = (freq2write/100)%10 + 48;  freq[1] = (freq2write/10)%10 + 48;  freq[2] = (freq2write/1)%10 + 48;  freq[3] = (freq2write/1)%10 + 48;   // Extract tens digit  freq[4] = freq2write %10 + 48;   // Extract ones digit Lcd_Out(1, 6, *freq); // Display Frequency on LCD}  void main()  {  TRISB = 0;  PORTB = 0x00;  TRISB = 0x00;  T1CON =0;   // Timer1 on, external input RC0 and 1:8 scalling  TMR1IF_bit = 0; // clear TMR1IF  TMR1H = 0x00; // Initialize Timer1 register  TMR1L = 0x00; // Initialize Timer1 register  TRISC = 0xff; // all input//////////////////////#LCD INITIALIZATION#////////////////////  Lcd_Init();   // Initialize LCD  Lcd_Cmd(_LCD_CLEAR);   // Clear display  Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off/////////////////////////////////////////////////////////////Lcd_Out(1,1,message1);   // Write message1 in 1st rowdo { TMR1H = 0; // reset high byte of timer 1 (takes effect when low byte written) TMR1L = 0; // reset low byte of timer 1 (also loads in high byte now)  Delay_ms(100);  // Delay 1 Sec  freq_result = TMR1L;   // get low byte of timer 1 count (and read high byte to buffer)  freq_result += TMR1H*256; // add in the high byte from buffer  freq_result *= 5;  Display_Freq(freq_result);   // show the result on LCD } while(1);  // Infinite loop   }

post-247640-0-38561400-1435739826_thumb.jpg

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

Top autori în acest subiect

  • Liviu M

    6

  • mars01

    4

  • bolek

    1

  • Dan57

    1

Zile populare

Top autori în acest subiect

Imagini postate

Hm, interesant mod de a te pregati pentru licenta...Eu stiam ca trebuie sa inveti, nu sa copiezi de pe net. Sau daca tot copiezi de pe net, macar sa incerci sa intelegi ce copiezi.Poti sa incepi prin a incerca sa intelegi ce fac liniile urmatoare:

freq[2] = (freq2write/1)%10 + 48;  freq[3] = (freq2write/1)%10 + 48;   // Extract tens digit  freq[4] = freq2write %10 + 48;   // Extract ones digit

PS Stiu ca in postul asta seman cu VM, da' uneori nici nu merge altfel.
Link spre comentariu
Vizitator AmaliaMia

Eu nu am pus ca sa fiu criticata.. pe mine nu ma ajuta absolut nimeni cu aceasta rogramare si nu pot face decat sa o copiez.. cat despre secventa aia, e cam singura pe care nu am inteles-o... si de acolo e si problema din cate am observat...

Link spre comentariu

Banuiesc ca ai copiat secventa de mai jos si ai incercat sa o modifici pt mai multe cifre. Ea era pt 3 , tu vrei 5 digiti.

 

Da sau ba?

 

// #############################################################################

 char message1[] = "Frequency= Hz";
 char *freq = "000";
 void Display_Freq(unsigned int freq2write)
{
 freq[0] =  freq2write/100 + 48;   // Extract ones digit
 freq[1] = (freq2write/10)%10 + 48;   // Extract tens digit
 freq[2] =  (freq2write/1)%10 + 48;   // Extract ones digit
 // Display Frequency on LCD
 Lcd_Out(2, 11, freq);
}

// #############################################################################

 

Numai ca ai initializat afisarea pt 4 cifre. Pe care aparatul le afiseaza desigur corect, si apoi cam asta si ramane...

 

char *freq = "0000";

 

Si pe deasupra, fix primele 2 semnificative sunt calculate...nasol. Digitul 3 e calculat la fel ca 2, iar primul...

 

  freq[3] = (freq2write/1)%10 + 48;   // Extract tens digit
  freq[4] = freq2write %10 + 48;   // Extract ones digit

 

Ai vrut sa imparti la 100, la 10, la 1 (?) , apoi ...?

Editat de bolek
Link spre comentariu

Eu nu am pus ca sa fiu criticata.. pe mine nu ma ajuta absolut nimeni cu aceasta rogramare

Sorry, viata e dura. De ce ti-ai ales proiect cu programare daca nu stii/daca nu poti invata?Stiu ca suna aiurea, dar de ce crezi ca e nevoie de ingineri care habar n-au? 

si nu pot face decat sa o copiez..

Ma rog, cum spuneam, poti si copia, dar poti incerca sa intelegi ce-ai copiat. Si pentru ca nu mai pod cita, folosesc code:
cat despre secventa aia, e cam singura pe care nu am inteles-o... si de acolo e si problema din cate am observat...
Este aritmetica. Simpla. Exista chiar si bucatele de explicatii.Daca te uitai la cod (orice prof isi da seama de aici ca habar n-ai ce prezinti ca proiect propriu), vedeai ca primele doua linii pe care le-am citat eu se repeta. Adica era suficienta una. Mai mult, cum impartierea la 1 nu face nimic, inseamna ca si a treia linie e echivalenta cu primele doua. Adica nici de aia n-ai nevoie. In schimb ai nevoie de unele care chiar sa faca cate ceva.Daca deschideai o carte de C, vedeai ca % inseamana restul impartirii.Daca te straduiai putin (daca scriai operatiile pe hartie si "rezolvai" functia pentru o frecventa oarecare), intelegeai ca functia aia incearca sa "transforme" fiecare cifra a frecventei intr-un caracter afisabil pe LCD.Da' na, e mai usor sa copiezi decat sa te gandesti.Uite si un exemplu cu ce intampla pentru, sa zicem, f=453 kHz:freq[0] = f/100 = 4. Explicatie: 4 si nu 4.53 pentru ca freq e definit ca numar intreg (char ala de mai sus), asa ca pastreaza doar partea intreaga a operatiei. Si ai "extras" sutele.freq[1] = (f/10)%10 = 5; f/10 = 45 % 10 = 5. Cinci pentru ca asta e restul impartirii (partea fractionara) a lui 45 la 10. Si ai extras zecile.freq[2] = f%10 = 3 (restul impartirii). Si ai obtinut unitatile.Ultimul mister ar fi + 48. Pentru elucidarea lui, trebuie sa te uiti intr-o tabela ASCII (oare ce-o fi aia) si sa vezi cum sunt reprezentate caracterele. LCD-ul tau afiseaza coduri ascii. E treaba ta sa adaptezi functia pentru numarul de caractere care-ti trebuie tie.PS bolek fu maii rapid si mai intelegator. Editat de Liviu M
Link spre comentariu
Vizitator AmaliaMia

Va multumesc ptr ajutor! Cat despre intrebarea "de ce ai ales un proiect cu uC?"...am fost pusa sa aleg asa ceva... nu ca mi-ar fi placut.... Multumesc mult ptr ajutor

Link spre comentariu

Schema ta cu 555 are o micuta lipsa, ca sa functioneze trebuie sa aiba pinul 5 (cinci) de la integrat leagat printr-un condensator fix de 10 nf. la masa (GND). Nu stiu daca frecventmetrul cu PIC va functiona dar nu vei avea ce citi daca oscilatorul cu 555 nu va functiona. Succes.

Link spre comentariu

Operatia in sine e inmultire (adica frecventa_finala = frecventa_citita * n).

La ce e buna... poate gasesti informatii de unde ai luat proiectul.

PS Incearca sa editezi codul si sa faci comentariile sa coincida cu operatiile comentate. (!!!! Delay_ms(100);  // Delay 1 Sec !!!!)

Link spre comentariu

Haideti sa nu fim rauti!

 

Acum doi ani, doua studente au facut practica la mine la servici. Fete foarte inteligente si dispuse sa invete. Doar ca desi faceau inginerie, habar nu aveau de foarte multe lucruri iar programarea era la nivel de ... sa zicem ceva Matlab. Subliniez, erau ca niste bureti, foarte curioase.

Din pacate sistemul de invatamant superior romanesc este axat mai mult pe chestii de genul: " NU PUNEEE MANAAA ... " ca strici nu stiu ce. "Studenti tampiti ..." zice el, desi poate ca odata a facut si el greseala aceea.

E de apreciat ca Amalia stie sa se foloseaca de Proteus ISIS.

 

LE: am pe undeva un cod de frecventmentru in mikroC pe care l-am facut mai de mult dar pentru un PIC16F1936. Daca il gasesc il postez aici ca sa te inspiri.

Editat de mars01
Link spre comentariu

Sorry, nu cred ca tema proiectului a fost primita ieri. Intrebarile n-au aparut pe parcursul elaborarii proiectului, ci in momentul in care copy-paste n-a mers.Ma rog, probabil sunt eu in faza proasta.

Link spre comentariu

Stiu cum este Liviu, "I've been there ... done that".

 

In alta ordine de idei.

 

Atat pentru Amalia cat si pentru cei interesati atasez o librarie pentru LCD 16x2 pe care am facut-o, nu este terminata ca m-am luat cu altele (inca nu suporta LCD cu 4 linii si mai sunt ceva functii de scroll etc care lipsesc dar sunt usor de adaugat).

Important este ca am functii care tiparesc numere cu tipul SIGNED LONG si functie pentru tiparire type FLOAT.

 

Amalia, toata partea cu tiparirea se va rezuma in a face ceva genul

LCD_lprint(freq);

Ai grija sa o faci fix la 1secunda  = 1000milisecunde pentru ca frecventa = numar de pulsuri intr-o secunda.

 

Enjoy.

 

LE: nu este criptata in pachetul mikroC ci este clasica, un header si fisier surse. Adaugati-le la proiect in folderele corespunzatoare.

 

LLE: nu am testat-o cu numere la limita, gen 2^32, s-ar putea sa fie nevoie sa se mareasca buffer-ul de la 11 elemente buf[10], la 12 elemente buf[11].

LCD_library_mikroC_mars01.zip

Editat de mars01
Link spre comentariu

Liviu:

De ce? Functia LCD_fprint(), ceea care tipareste FLOAT este cea care are dimensiuni mai mari. Altfel, ar trebui sa mearga pe orice PIC cu suficienta memorie. N-am nici-un LATx pe acolo.

 

Amalia, motivul pentru care frecventa era inmultita cu 10 era pentru ca tu masori pulsurile in 100 milisecunde (delay_ms(100)). Pentru a obtine frecventa, cum 1secunda = 1000ms = 10 * 100ms, rezulta ca trebuie sa inmultesti variabila freq cu 10 penru a obtine frecventa reala.

Editat de mars01
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