Marian Postat Noiembrie 13, 2013 Partajează Postat Noiembrie 13, 2013 @nel65 revin cu ceea ce am promis: /*Afisaj digital multiplu -Afisare Tensiune 0-100V, Curent 0-100A, si Putere 0-10000W *Configuratie: -PIC16F876A -Cristal 4 Mhz -LCD alfanumeric 16X2 *Autor Marian@Elforum *Beneficiar @Nel65 Elforum *///Conexiuni LCDsbit LCD_RS at RB7_bit;sbit LCD_EN at RB6_bit;sbit LCD_D4 at RB5_bit;sbit LCD_D5 at RB4_bit;sbit LCD_D6 at RB3_bit;sbit LCD_D7 at RB2_bit;sbit LCD_RS_Direction at TRISB7_bit;sbit LCD_EN_Direction at TRISB6_bit;sbit LCD_D4_Direction at TRISB5_bit;sbit LCD_D5_Direction at TRISB4_bit;sbit LCD_D6_Direction at TRISB3_bit;sbit LCD_D7_Direction at TRISB2_bit;//Declarare variabileunsigned char ch, ADCx;unsigned int Tensiune, Curent;unsigned long V, A, Pw;//Functie principalavoid main() { INTCON = 0; // Dezactivare intreruperi TRISA = 0x03; // RA0, RA1 setate ca intrari Lcd_Init(); // Initializare LCD Lcd_Cmd(_LCD_CURSOR_OFF); // Dezactivare cursor Lcd_Cmd(_LCD_CLEAR); // Stergere Ecran while (1) { //Achizitie ADC Tensiune = 0; Curent = 0; for (ADCx=0; ADCx<10; ADCx++) { Tensiune += ADC_Read(0); // Achizitie ADC pentru tensiune Curent += ADC_Read(1); // Achizitie ADC pentru curent Delay_ms(10); } //Tensiune Tensiune = Tensiune/ADCx; // Alocare valoare tensiune V = (long)Tensiune*1000; // Converteste rezultat in milivolti V = V/1023; // 0...1023 => 0...1000mV ch = V/1000; // Extrage sute 100.00 Lcd_Chr(1,1,48+ch); // Afisare rezultat in format ASCII linia 1, coloana 1 ch = (V/100) % 10; // Extrage zeci 010.00 Lcd_Chr_CP(48+ch); // Afiseaza rezultat in format ASCII ch = (V/10) % 10; // Extrage unitati 001.00 Lcd_Chr_CP(48+ch); // Afiseaza rezultat in format ASCII Lcd_Chr_CP('.'); // Afiseaza caracter '.' ch = (V/1) % 10; // Extrage sutimi 000.10 Lcd_Chr_CP(48+ch); ch = V % 10; // Extrage zecimi 000.01 Lcd_Chr_CP(48+ch); LCD_Chr_CP('V'); // Afiseaza caracter 'V' Delay_ms(10); //Curent Curent = Curent/ADCx; // Alocare valoare curent A = (long)Curent*1000; // Convertire rezultat in milivolti A = A/1023; // 0..1023 => 0-1000mV ch = A/1000; // Extragere sute 100.00 Lcd_Chr(1,9,48+ch); // Scrie rezultatul in format ASCII linia 1, coloana 9 ch = (A/100) % 10; // Extragere zeci 010.00 Lcd_Chr_CP(48+ch); // Scrie rezultatul in format ASCII ch = (A/10) % 10; // Extragere unitati 001.00 Lcd_Chr_CP(48+ch); Lcd_Chr_CP('.'); ch = (A/1) %10; // Extragere sutimi 00.10 Lcd_Chr_CP(48+ch); // Scrie rezultatul in format ASCII ch = A % 10; // Extragere zecimi 00.01 Lcd_Chr_CP(48+ch); Lcd_Chr_CP('A'); // Afisare caracter 'A' la final Delay_ms(10); //Putere Pw = V*A/100; // Seteaza valoare Putere ch = Pw/10000; // Extrage zeci de mii 10000 Lcd_Chr(2,1,48+ch); // Scrie rezultatul in format ASCII linia 2, coloana 1 ch = (Pw/1000) %10; // Extrage mii 01000 Lcd_Chr_CP(48+ch); ch = (Pw/100) %10; // Extrage sute 00100 Lcd_Chr_CP(48+ch); ch = (Pw/10) %10; // Extrage zeci 00010 Lcd_Chr_CP(48+ch); ch = (Pw/1) %10; // Extrage unitati 00001 Lcd_Chr_CP(48+ch); Lcd_Chr_CP('W'); // Afiseaza "W" la sfarsit Delay_ms(10); }}In simulare pare a fi ok, testeaza cand poti si spune-mi daca este in regula. Configuratia este la fel ca la @giongiu, PIC16F876A, cristal de 4Mhz, intrarile folosite sunt cele din pinii 2 si 3 ( la 2 tensiune, la 3 curent )... O imagine cu simularea ilustrand modul de afisare: Si hex-ul: [attachment=0]Nel65.rar[/attachment] @Vasile1968 o sa-mi arunc un ochi pe cablaj si vedem ce se poate rezolva, revin cu noutati cat de curand o sa pot. Link spre comentariu
Mircea Postat Noiembrie 13, 2013 Partajează Postat Noiembrie 13, 2013 @Marian, cum trece vremea... cand ziceai ca tu nu stii programare etc... Acuma faci programele pentru colegi. Mult respect pentru disponibilitate!@Vasile1968 - se poate dezasambla, dar mai dificil de interpretat si modificat (pentru ne-profesionisti ca noi). Muuuuuuult mai simplu sa faci unul nou de la bun inceput. In plus, nimic special in acel program deci nu merita efortul sa gandesti in assambler. Link spre comentariu
nel65 Postat Noiembrie 13, 2013 Partajează Postat Noiembrie 13, 2013 da,merge exact cum am zis,fara introducere,direct in masurare.Domeniul de masura este chiar mai mare ,respectiv 079.00 V si 100.00A,puterea ,evident 07900wCe s-ar mai imbunatati este stergerea definitiva a zero-ului de sute de volti,sutele de A sa apara doar daca trebuie sa afiseze 100.00A,daca e mai complicat poate ramane si asa .La fel la puteri ,zero-ul din fata lui 7900W stins definitiv.Totodata citirea sa se faca la un interval mai mare ,de exemplu de doua ori pe secunda,asa cum e acum ,cam joaca zecimile de A si de V ,si deci si de W.Una peste alta ,esti pe drumul cel bun cu programarile ,eu nu le am de niciun fel ,decat sa bag hexul in chip, BRAVO si mersiPSas vrea si sutimile de V si de A sa dispara,sa ramana doar zecimile .De exmplu la o valoare afisata de 50V si 70A ,ma intereseaza putin spre deloc cateva sutimi de Volt si cateva sutimi de AmperPS2 acum am observat ,zecimile si sutimile de V si A sunt afisate identic ,cu aceeasi cifra ,adica xx.77 ,xx.55, xx.33, xx.44Deci inca un motiv sa renunt la sutimi Link spre comentariu
bratueduard Postat Noiembrie 13, 2013 Partajează Postat Noiembrie 13, 2013 Buna seara!O modificare pentru 220V (tensiune de la 0-500V) si curent de la 0-50A cu afisarea puterii pe randul de jos si fara zecimale, se poate va rog?Ma intereseaza pentru o monitorizare a retelei (220) din locuinta.Suntul si divizarea de tensiune o rezolv fara problema.cu stimaBratu Eduard Link spre comentariu
Marian Postat Noiembrie 13, 2013 Partajează Postat Noiembrie 13, 2013 @nel65 iata codul modificat conform cerintelor: /*Afisaj digital multiplu -Afisare Tensiune 0-90V, Curent 0-100A, si Putere 0-9000W *Configuratie: -PIC16F876A -Cristal 4 Mhz -LCD alfanumeric 16X2 *Autor Marian@Elforum *Beneficiar @Nel65 Elforum *///Conexiuni LCDsbit LCD_RS at RB7_bit;sbit LCD_EN at RB6_bit;sbit LCD_D4 at RB5_bit;sbit LCD_D5 at RB4_bit;sbit LCD_D6 at RB3_bit;sbit LCD_D7 at RB2_bit;sbit LCD_RS_Direction at TRISB7_bit;sbit LCD_EN_Direction at TRISB6_bit;sbit LCD_D4_Direction at TRISB5_bit;sbit LCD_D5_Direction at TRISB4_bit;sbit LCD_D6_Direction at TRISB3_bit;sbit LCD_D7_Direction at TRISB2_bit;//Declarare variabileunsigned char ch, ADCx;unsigned int Tensiune, Curent;unsigned long V, A, Pw;//Functie principalavoid main() { INTCON = 0; TRISA = 0x03; Lcd_Init(); Lcd_Cmd(_LCD_CURSOR_OFF); Lcd_Cmd(_LCD_CLEAR); while (1) { //Achizitie ADC Tensiune = 0; Curent = 0; for (ADCx=0; ADCx<10; ADCx++) { Tensiune += ADC_Read(0); Curent += ADC_Read(1); Delay_ms(50); } //Tensiune Tensiune = Tensiune/ADCx; V = (long)Tensiune*90; V = V/1023; ch = V/10; if (ch==0) { Lcd_Chr(1,1,32); } else { Lcd_Chr(1,1,48+ch); } ch = (V/1) % 10; Lcd_Chr_CP(48+ch); LCD_Chr_CP('V'); Delay_ms(10); //Curent Curent = Curent/ADCx; A = (long)Curent*100; A = A/1023; ch = A/100; if (ch==0) { LCD_Chr(1,9, 32); } else { LCD_Chr(1,9,48+ch); } ch = (A/10) % 10; Lcd_Chr_CP(48+ch); ch = (A/1) % 10; Lcd_Chr_CP(48+ch); Lcd_Chr_CP('A'); Delay_ms(10); //Putere Pw = V*A; ch = Pw/1000; Lcd_Chr(2,1,48+ch); ch = (Pw/100) %10; Lcd_Chr_CP(48+ch); ch = (Pw/10) %10; Lcd_Chr_CP(48+ch); ch = (Pw/1) %10; Lcd_Chr_CP(48+ch); Lcd_Chr_CP('W'); Delay_ms(10); }}La tensiune i-am setat o gama de 0-90V in caz ca tensiunea mai depaseste cei 79V de care ai zis, daca nu este ok asa atunci modific pentru 79V. La curent am pus 0-100A.Si aici hex-ul, testeaza-l si spune-mi daca este ok asa: [attachment=0]Nel65#2.rar[/attachment] @thunderer multumesc pentru apreciere. Link spre comentariu
nel65 Postat Noiembrie 13, 2013 Partajează Postat Noiembrie 13, 2013 Merge ,maxim 90V si 100A,dar nu mai afiseaza zecimalele,se poate rezolva si pentru zecimale (fara sutimi)?folosesc la bancul de baterii acest voltampermetru si trebuie sa reglez la zecimi de volt ,mai precis 27.5-27.8V ,deci imi trebuie zecimalele Link spre comentariu
Marian Postat Noiembrie 13, 2013 Partajează Postat Noiembrie 13, 2013 Pai am editat mai sus spunand ca am pus eu 90V, daca vrei pot pune 79 ca-i simplu, aleasesem 90 ca am crezut ca cei 79V mai pot fi depasiti... nu stiu la ce o folosesti si am zis sa fie acolo, dar fac cum ti se pare mai potrivit, deci ramane la 90 sau pun alta cifra pentru maxim?Apoi nu sunt sigur ca inteleg chestia cu zecimalele, ai zis mai sus ca sa renunt la valorile subunitare, sa inteleg ca le vrei totusi? si daca da atunci in ce format? adica spre exemplu 10,1V, sau 10,10V? sau poate nu inteleg eu si atunci imi cer scuze ca-s mai greu de cap... Link spre comentariu
nel65 Postat Noiembrie 13, 2013 Partajează Postat Noiembrie 13, 2013 am zis ca nu-mi trebuie sutimile ,doar zecimile,adica doar prima cifra dupa virgulaE bine 90vprimul hex mergea pana la 100V dar eu aveam pe placuta (veche) de VA-metru si un semireglabil in calea de masurare tensiuni si d-aia arata maxim 79v,acum l-am scosDeci trebuie sa arate doar cu o cifra dupa virgula,si amperii si volti Link spre comentariu
Marian Postat Noiembrie 13, 2013 Partajează Postat Noiembrie 13, 2013 Ok acuma am inteles ( zisei eu ca-s mai greu de cap ).Verifica te rog pe asta si spune-mi daca e mai bine asa:[attachment=0]Nel65#3.rar[/attachment] Link spre comentariu
nel65 Postat Noiembrie 13, 2013 Partajează Postat Noiembrie 13, 2013 da,asta e,merge perfect asa cum e acummersi inca o data si scuza-ma ca te-am batut la cap ,nici eu nu am fost prea coerent in exprimare Link spre comentariu
Marian Postat Noiembrie 13, 2013 Partajează Postat Noiembrie 13, 2013 Cu mare placere oricand Acuma urmeste colegul @Vasile1968, sa vad ce pot face si pentru el, apoi daca iese totul ok si la el, si mai e timp, rezolvam si pe @bratueduard. Link spre comentariu
Marian Postat Noiembrie 13, 2013 Partajează Postat Noiembrie 13, 2013 @Vasile1968 revin cu ce ti-am promis, nu am reusit o conversie identica penca n-am stiut sa realizez conexiunea cu LCD ca in acea simulare, RW la uC si nu la masa cum il pun eu de obicei, in ciuda incercarilor mele, LCD-ul nu se initializeaza asa, au trebuit ceva modificari la cablaj pe care le-am facut eu pentru tine, iata intai codul sursa: //Conexiuni LCDsbit LCD_RS at RB1_bit;sbit LCD_EN at RB3_bit;sbit LCD_D4 at RB4_bit;sbit LCD_D5 at RB5_bit;sbit LCD_D6 at RB6_bit;sbit LCD_D7 at RB7_bit;sbit LCD_RS_Direction at TRISB1_bit;sbit LCD_EN_Direction at TRISB3_bit;sbit LCD_D4_Direction at TRISB4_bit;sbit LCD_D5_Direction at TRISB5_bit;sbit LCD_D6_Direction at TRISB6_bit;sbit LCD_D7_Direction at TRISB7_bit;//Declarare variabileunsigned char ch, ADCx;unsigned int Tensiune, Curent;unsigned long V, A;//Functie principalavoid main() { INTCON = 0; ANSEL = 0x03; ANSELH = 0; TRISA = 0x03; Lcd_Init(); Lcd_Cmd(_LCD_CURSOR_OFF); Lcd_Cmd(_LCD_CLEAR); Lcd_Out(1,1,"Tensiune:"); Lcd_Out(2,1,"Curent:"); while (1) { //Achizitie ADC Tensiune = 0; Curent = 0; for (ADCx=0; ADCx<10; ADCx++) { Tensiune += ADC_Read(0); Curent += ADC_Read(1); Delay_ms(50); } //Tensiune Tensiune = Tensiune/ADCx; V = (long)Tensiune*350; V = V/1023; ch = V/100; if (ch==0) { Lcd_Chr(1,10,32); } else { Lcd_Chr(1,10,48+ch); } ch = (V/10) % 10; Lcd_Chr_CP(48+ch); Lcd_Chr_CP('.'); ch = (V/1) % 10; Lcd_Chr_CP(48+ch); LCD_Chr_CP('V'); Delay_ms(10); //Curent Curent = Curent/ADCx; A = (long)Curent*500; A = A/1023; ch = A/100; LCD_Chr(2,8,48+ch); Lcd_Chr_CP('.'); ch = (A/10) % 10; Lcd_Chr_CP(48+ch); ch = (A/1) % 10; Lcd_Chr_CP(48+ch); Lcd_Chr_CP('A'); Delay_ms(10); } }Imagine cu simularea ilustrand valorile maxime si conexiunea dintre PIC si LCD: Inca un print cu cablajul modificat: Asadar PIC16F883, cristal de 4Mhz, LCD 16x2, Tensiune 0-35V, curent 0-5A. Atasez si o arhiva care contine hex-ul, simularea in proteus si proiectul de cablaj in acelasi program ca originalul, modificat de mine, verifica te rog si compara cu imaginea din simulare sa fii sigur ca totul corespunde la conexiunile LCD cu PIC, apoi testeaza si vezi daca este ok, proteus zice ca da, insa testul practic este cel mai credibil. [attachment=0]Vasile1968#1.rar[/attachment] Link spre comentariu
Vizitator Vasile1968 Postat Noiembrie 14, 2013 Partajează Postat Noiembrie 14, 2013 @ Marian...multumesc de osteneala ...numai ca nu pot deschide fisiere de tip .LYT , nu am Proteus sa vad simularea....Altfel, in alt format nu-mi poti da cablajul, gen pdf , word, jpeg ? Te rog sa nu te superi, dar nu am " in dotare" programe din astea dedicate (cad....etc)...Multumesc din suflet ! Link spre comentariu
nel65 Postat Noiembrie 14, 2013 Partajează Postat Noiembrie 14, 2013 vasile ,lasa simularea ca l-am executat eu acum si merge hexul pus de marian, Vasile1968#1.rar ,asa cum a zis ,35v 5A.Am pus un PIC16F886 , e identic cu 883 doar ca are memorie mai mare si chestii d-astea,se vede in pdf. Pinul 5 la lcd la masa marian ,daca tot ai facut softul pentru picurile din seria 88x ,fa-l te rog si pentru astea pana la 100V /100A si putere,am exemplarul asta de pic de cativa ani,si acum o sa-i dau de lucru.Nu conteaza cu ce legaturi lcd-pic ,le fac asa cum iese din foto simulare Si ca sa ingros obrazul si mai mult ,te mai rog ,daca stii,sa mai introduci o functie.Vreau ca atunci cand tensiunea este mai mare de 27.5v si curentul mai mic de 4A ,sa se aprinda un led pe unul din porturile libere ale picului (if si then.Asta pe softul Nel65#3.rar care e cu 876a mersi Link spre comentariu
Vizitator Vasile1968 Postat Noiembrie 14, 2013 Partajează Postat Noiembrie 14, 2013 @nel165...multumesc de info...dar, spune-mi te rog , ai folosit cablajul din arhiva initiala postata de mine doar ca ai pus pinul 5 LCD la masa ???? sau ai facut pe cablaj de proba, respectand schema ce rezulta din cablaj schimband doar pinul 5 LCD la masa ?Nu ma intereseaza simularea in Proteus, vreau doar sa-l pun " la munca....picul " si sa stiu ce cablaj sa folosesc. Multumesc mult si tie si lui Marian !!!! 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