Sari la conținut
ELFORUM - Forumul electronistilor

voltampermetru cu pic 16f876


winston

Postări Recomandate

@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:

Posted Image

 

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

@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

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

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

@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. :aplauze

Link spre comentariu

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

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

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

@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:

Posted Image

 

Inca un print cu cablajul modificat:

Posted Image

 

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

@ Marian...multumesc de osteneala :101 ...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

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

@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

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