Vlad Mihai Postat Noiembrie 29, 2012 Partajează Postat Noiembrie 29, 2012 salut ma chinui sa fac un meniu(daca il pot numi asa) e in principal un VA-metru mai smecher, am incercat sa implement un buton si la apasarea lui sa afiseze ceva, dar nu pot implementa ma mult de 2... ce sa fie ? sbit 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;unsigned int Tensiune1, Tensiune2;unsigned int Curent1, Curent2, a, b,temperatura,t;unsigned long u1, u2,i2,i1,u,i,power1,power2,n;unsigned char ch;void main(){ //TRISC = 1; // designate PORTA as input //INTCON = 0; // Disable all interrupts //IRP_bit = 1 ; Lcd_Init(); // Initialize LCD Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off Lcd_Cmd(_LCD_CLEAR); // Clear display Delay_ms(100); LCD_Out(1,2,"Hello Handsome!"); LCD_Out(2,2,"Smps"); Delay_ms(1500); Lcd_Cmd(_LCD_CLEAR); // Clear display LCD_Out(1,2," Vlad Mihai"); LCD_Out(2,2," uc3843"); Delay_ms(1500); Lcd_Cmd(_LCD_CLEAR); // Clear display while (1) { for (b ; b < 2; b++) { Lcd_Cmd(_LCD_CLEAR); } // Voltage1 Tensiune1=ADC_read(0); // get ADC value for U from channel 1 delay_ms(30); u=(long)Tensiune1*5000; // covert adc reading to milivolts u1=u/1023; // 0..1023 -> 0-3500mV ch=u1/1000; // extract 10.00 U digit if (ch==0) { LCD_Chr(1,2, 32); // write empty space if digit is 0 } else { LCD_Chr(1,2,48+ch); // write ASCII digit at 1st row, 2nd column } ch=(u1/100) %10; // extract 01.00 U digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor point LCD_Chr_CP('.'); // write '.' at cursor point ch=(u1/10) %10; // extract 00.10 U digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor point ch=u1 %10; // extract 00.01 U digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor point ch=10*u1 %10; // extract 00.001 U digit LCD_Chr_CP(48+ch); LCD_Chr_CP('V'); // write 'V' at cursor point // Curent1 Curent1=ADC_read(1); // get ADC value for U from channel 1 delay_ms(20); i=(long)Curent1*8782; // covert adc reading to milivolts sunt d 0.47 i1=i/1023; // 0..1023 -> 0-3500mV ch=i1/1000; // extract 10.00 U digit LCD_Chr(1,11,48+ch); // write ASCII digit at 1st row, 2nd column LCD_Chr_CP('.'); // write '.' at cursor point ch=(i1/100) %10; // extract 01.00 U digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor point ch=(i1/10) %10; // extract 00.10 U digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor point ch=i1 %10; // extract 00.01 U digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor poin LCD_Chr_CP('A'); // write 'A' at cursor point // Voltage2 Tensiune2=ADC_read(2); // get ADC value for U from channel 1 delay_ms(30); u=(long)Tensiune2*5000; // covert adc reading to milivolts u2=u/1023; // 0..1023 -> 0-3500mV ch=u2/1000; // extract 10.00 U digit if (ch==0) { LCD_Chr(2,2, 32); // write empty space if digit is 0 } else { LCD_Chr(2,2,48+ch); // write ASCII digit at 1st row, 2nd column } ch=(u2/100) %10; // extract 01.00 U digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor point LCD_Chr_CP('.'); // write '.' at cursor point ch=(u2/10) %10; // extract 00.10 U digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor point ch=u2 %10; // extract 00.01 U digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor point ch=10*u2 %10; // extract 00.001 U digit LCD_Chr_CP(48+ch); LCD_Chr_CP('V'); // write 'V' at cursor point // Curent2 Curent2=ADC_read(3); // get ADC value for U from channel 1 delay_ms(20); i=(long)Curent2*8782; // covert adc reading to milivolts sunt d 0.47 i2=i/1023; // 0..1023 -> 0-3500mV ch=i2/1000; // extract 10.00 U digit LCD_Chr(2,11,48+ch); // write ASCII digit at 1st row, 2nd column LCD_Chr_CP('.'); // write '.' at cursor point ch=(i2/100) %10; // extract 01.00 U digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor point ch=(i2/10) %10; // extract 00.10 U digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor point ch=i2 %10; // extract 00.01 U digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor poin LCD_Chr_CP('A'); //temperatura while (Button(&PORTB, 6, 1, 1)) { for (a ; a < 3; a++) { Lcd_Cmd(_LCD_CLEAR); LCD_Out(1,3,"Temperatura:"); } temperatura = ADC_read(4); t=(temperatura*0.48876);//conversia tensiunii citite in grade celsius ch = t/100; //=> afisez sutele if (ch==0) { LCD_Chr(2,7, 32); // write empty space if digit is 0 } else { LCD_Chr(2,7,48+ch); // write ASCII digit at 1st row, 2nd column } ch = (t/10)%10; //=> afisez zecile LCD_chr(2,8,'0'+ch); ch = t%10; LCD_chr(2,9,'0'+ch); //=> afisez unitatile LCD_Chr_CP('C'); Delay_ms(3000); // Waits 3s b = 0; } a = 0; Delay_ms(300); // Waits 300ms //ran while (Button(&PORTB, 7, 1, 1)) { for (a ; a < 2; a++) { Lcd_Cmd(_LCD_CLEAR); LCD_Out(1,6,"*ran*"); } n=(u2*i2/u1*i1)*100; // extract 10.00 P digit ch=(n/1000) %10; // extract 01.00 P digit if (ch==0) { LCD_Chr(2,4, 32); // write empty space if digit is 0 } else { LCD_Chr(2,4,48+ch); // write ASCII digit at 2nd row, 2nd column } ch=(n/100) %10; // extract 01.00 P digit if (ch==0) { LCD_Chr(2,5, 32); // write empty space if digit is 0 } else { LCD_Chr(2,5,48+ch); // write ASCII digit at 2nd row, 2nd column } ch=(n/10) %10; // extract 0.10 P digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor point LCD_Chr_CP('.'); // write '.' at cursor point ch=n %10; // extract 0.01 P digit LCD_Chr_CP(48+ch); // write ASCII digit at cursor point LCD_Chr_CP('%'); // write 'W' at cursor point } Delay_ms(3000); // Waits 3s b = 0; } a = 0;} free photo hosting Link spre comentariu
bbogdanmircea Postat Noiembrie 29, 2012 Partajează Postat Noiembrie 29, 2012 Poti sa pui doar bucata de cod care nu merge nu tot programul?Poti sa explici mai pe larg ce se se intampla exact? Link spre comentariu
iuly Postat Decembrie 23, 2012 Partajează Postat Decembrie 23, 2012 Va rog sa ma scuzati ,daca postez, poate, unde nu trebuie,vreau si eu sa-mi fac un programator de pic prin usb ,dar, aici in oras la mine nu stiu pe nimeni ,care sa aiba un programator de pic.Problema este ca nu pot sa pun bootloader-ul in picul PIC18F2550SP.Daca este cineva dispus sa ma ajute sa-mi scrie pe pm? Link spre comentariu
Kreator Postat Ianuarie 9, 2013 Partajează Postat Ianuarie 9, 2013 Am si eu o mica problema: Am facut acest progaram - cronometru Nu conteaza in ce prg e scris ideea e urmatoarea: Dim j As ByteDim x As ByteDim sec As ByteDim min As ByteDim hor As ByteDim s0 As ByteDim s1 As ByteDim m0 As ByteDim m1 As ByteDim h0 As ByteDim h1 As ByteDim pdg1 As ByteDim pdg2 As ByteDim pdg3 As ByteDim pdg4 As ByteDim idg As ByteAllDigitalTRISA = 0x00TRISB = 0x00PORTA.3 = 1x = 0j = 0sec = 0min = 0hor = 0s0 = 0s1 = 0m0 = 0m1 = 0h0 = 0h1 = 0'setari intreruperiINTCON.GIE = 1 '7 enable all interrupts'INTCON.EEIE = 0 '6 disable write EPROM interruptsINTCON.T0IE = 1 '5 enable Timer0 interruptsINTCON.INTE = 0 '4 disable RBO interruptINTCON.RBIE = 0 '3 disable RB port interrupt'setari option_regOPTION_REG.T0CS = 0 'set Timer0 clock source to internalOPTION_REG.PSA = 0 'asign prescaler to Timer 0OPTION_REG.PS0 = 1 'asign prescaler value 0OPTION_REG.PS1 = 1 'asign prescaler value 1OPTION_REG.PS2 = 0 'asign prescaler value 2loop:If j = 125 Thenj = 0PORTA.3 = Not PORTA.3x = x + 1If x = 2 Then x = 0 sec = sec + 1 If sec = 60 Thensec = 0min = min + 1If min = 60 Thenmin = 0hor = hor + 1If hor = 24 Thenhor = 0Endifh0 = hor Mod 10h1 = hor / 10Endifm0 = min Mod 10m1 = min / 10Endifs0 = sec Mod 10s1 = sec / 10Endifpdg1 = 224 + s0pdg2 = 208 + s1pdg3 = 176 + m0If min < 10 Thenpdg4 = 240 + m1Elsepdg4 = 112 + m1EndifEndifidg = j Mod 4Select Case idgCase 0 PORTB = pdg1Case 1 PORTB = pdg2Case 2 PORTB = pdg3Case 3 PORTB = pdg4EndSelectGoto loopEnd On Interrupt 'interrupt routineSave Systemj = j + 1INTCON.T0IF = 0TMR0 = 9Resume Am folosit un cuatz de 4MHz, prescalerul setat 16, TMR0 = 9, Nr de cicluri 250 Rezulta o frecventa de fix 1 HZ Practic dupa 10 min am o diferenta de cateva sec fata de un ceas "real". De ce? Unde am gresit? Multumesc Link spre comentariu
sofian Postat Ianuarie 21, 2013 Autor Partajează Postat Ianuarie 21, 2013 256-9 face 247intreruperea apare cind TMR face tranzitia de la 255 la 256 deci cind este 256-9 Link spre comentariu
Kreator Postat Ianuarie 22, 2013 Partajează Postat Ianuarie 22, 2013 Merci! Am modificat tratarea intreruperii astfel: On Interrupt 'interrupt routineTMR0 = 6j = j + 1INTCON.T0IF = 0ResumeRezultatul e urmatorul: la 30 min ramane in urma 10 sec. Sa fie oare de la quartz? Daca nu, unde gresesc? Link spre comentariu
costi002 Postat Ianuarie 22, 2013 Partajează Postat Ianuarie 22, 2013 Nu te mai chinui. Si eu am pierdut mult timp cu asa ceva, am ajuns pana la 30 sec pe zi abatere, nu se merita. Pune un DS1307 si rezolvi problema elegant, ba mai ai si back-up cand ramane fara alimetare si inveti si I2C.Parerea mea. Link spre comentariu
Vizitator Postat Ianuarie 23, 2013 Partajează Postat Ianuarie 23, 2013 Salutare.As dori sa fac un decodor dintr-un pic.Ma poate ajuta cineva cu un cod pentru microcontrollere pic sau avr. de preferat in asm?Am atasat si o poza ca exemplu.Va multumesc. Link spre comentariu
Kreator Postat Ianuarie 24, 2013 Partajează Postat Ianuarie 24, 2013 Nu te mai chinui. Si eu am pierdut mult timp cu asa ceva, am ajuns pana la 30 sec pe zi abatere, nu se merita. Pune un DS1307 si rezolvi problema elegant, ba mai ai si back-up cand ramane fara alimetare si inveti si I2C.Parerea mea.Ok! dar nu stiu cum sa citesc adresele din RTC. Stiti cumva o documentatie de unde sa invat?Merci! Link spre comentariu
grifonul_alb Postat Ianuarie 31, 2013 Partajează Postat Ianuarie 31, 2013 Vreau sa programez un PIC in JAL. Pana acum mi-au functionat bine toate pana m-am impotmolit la mesajele care vreau sa le afisez pe un LCD. Deoarece aceste mesaje sunt repetitive as dori sa folosesc "un sir de siruri" - o matrice de caractere, ceva de genul : var byte mesaje[5][16] mesaje[0] = "Viteza = "mesaje[1] = "Consum = "mesaje[2] = "Temp = "Numai ca in JAL compilatorul nu vrea. Stie cineva o alta cale de a face asa ceva, stie doar de siruri, nu si matrice. Link spre comentariu
N47D20 Postat Februarie 16, 2013 Partajează Postat Februarie 16, 2013 Buna seara, sunt nou pe acest forum, am nevoie de ajutor daca se poate: Am scris un program pt un pic 12F675 care ar trebuii sa functioneze in felul urmator: -pe pinii GP4 si GP5 am conectate 2 butoane (intrari) -pe pinii GP0 si GP1 comand doua releeFunctionare:- daca are loc o apasare a unui buton, apasare mai scurta de 1 secunda, se va activa o iesire corespunzatoare butonului respectiv, dupa care releul ramane anclansat pana cand este apasat butonul de 4 ori, apasari mai lungi de o secunda.Am scris eu programul il compilez incarc in pic, dar cind introduc pic-ul in montajul meu se anclanseaza automat ambele relee, problema este sigur de soft deoarece fara cotroller sau cu controller-ul sters releele nu anclanseaza. Sunt la inceput cu prgramarea microcontrollerelor si v-as fi tare recunoscator daca ma ajutatiMultumesc anticipat. pic12f675.pdf Link spre comentariu
costi002 Postat Februarie 17, 2013 Partajează Postat Februarie 17, 2013 daca se aclanseaza automat, fara sa apesi vre-un buton, atunci pune undeva in initializarea pic-ului CLRF GPIO, sa fii sigur ca porneste cu porturile off. Link spre comentariu
N47D20 Postat Februarie 17, 2013 Partajează Postat Februarie 17, 2013 Multumesc de raspuns, o sa incerc CLRF GPIODar mai e o chestie, eu am uitat sa citesc OSCCAL (si sa il salvez), inainte sa programez pic-ul, ar putea sa fie asta problema? Link spre comentariu
N47D20 Postat Februarie 17, 2013 Partajează Postat Februarie 17, 2013 Nu-i dau de capat nici cum. Am incercat sa pun CLRF GPIO. Nu vrea sa mearga nici asa, intradevar nu se mai anclanseaza releele cat pun picul in soclu dar nu se intampla nimic daca apas butoanele. Nu mai am nici o idee, daca cineva ma poate ajuta astept cu interes.Multumesc anticipat. Link spre comentariu
costi002 Postat Februarie 18, 2013 Partajează Postat Februarie 18, 2013 pune programul modificat aici sa vedem care este problema. 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