Vizitator AmaliaMia Postat Iulie 1, 2015 Partajează Postat Iulie 1, 2015 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!! 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 } Link spre comentariu
Liviu M Postat Iulie 1, 2015 Partajează Postat Iulie 1, 2015 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 digitPS Stiu ca in postul asta seman cu VM, da' uneori nici nu merge altfel. Link spre comentariu
Vizitator AmaliaMia Postat Iulie 1, 2015 Partajează Postat Iulie 1, 2015 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
bolek Postat Iulie 1, 2015 Partajează Postat Iulie 1, 2015 (editat) 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 Iulie 1, 2015 de bolek Link spre comentariu
Liviu M Postat Iulie 1, 2015 Partajează Postat Iulie 1, 2015 (editat) Eu nu am pus ca sa fiu criticata.. pe mine nu ma ajuta absolut nimeni cu aceasta rogramareSorry, 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 Iulie 1, 2015 de Liviu M Link spre comentariu
Vizitator AmaliaMia Postat Iulie 1, 2015 Partajează Postat Iulie 1, 2015 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
Dan57 Postat Iulie 1, 2015 Partajează Postat Iulie 1, 2015 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
Vizitator AmaliaMia Postat Iulie 1, 2015 Partajează Postat Iulie 1, 2015 Dar secventa asta incadrata cu rosu mi-o poate explica cineva? era initial cu 10..dar i-am pus 5.. ptr ca la un moment dat, mergea bine,imi afisa valoarea corecta, cu -1Hz... http://www10.zippyshare.com/v/EsoC9Rlh/file.html Link spre comentariu
Liviu M Postat Iulie 1, 2015 Partajează Postat Iulie 1, 2015 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
mars01 Postat Iulie 1, 2015 Partajează Postat Iulie 1, 2015 (editat) 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 Iulie 1, 2015 de mars01 Link spre comentariu
Liviu M Postat Iulie 1, 2015 Partajează Postat Iulie 1, 2015 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
mars01 Postat Iulie 1, 2015 Partajează Postat Iulie 1, 2015 (editat) 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 Iulie 1, 2015 de mars01 Link spre comentariu
Liviu M Postat Iulie 1, 2015 Partajează Postat Iulie 1, 2015 inca nu suporta LCD cu 4 liniiMa tem ca Amaliei n-o sa-i ajute.Ma rog, ii ajuta daca modifica hardware-ul. Link spre comentariu
mars01 Postat Iulie 1, 2015 Partajează Postat Iulie 1, 2015 (editat) 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 Iulie 1, 2015 de mars01 Link spre comentariu
Liviu M Postat Iulie 1, 2015 Partajează Postat Iulie 1, 2015 4 linii inseamna 4 linii pe afisor (16x4)? Daca da, scuze, am interpretat aiurea. Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum