Sari la conținut
ELFORUM - Forumul electronistilor

Cum sa programez un PIC


sofian

Postări Recomandate

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;}
Posted Image

free photo hosting

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

Top autori în acest subiect

  • Liviu M

    54

  • Vlad Mihai

    28

  • bbogdanmircea

    27

  • seichter

    24

Top autori în acest subiect

Imagini postate

  • 4 săptămâni mai târziu...

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
  • 3 săptămâni mai târziu...

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
  • 2 săptămâni mai târziu...

Merci!

Am modificat tratarea intreruperii astfel:

On Interrupt  'interrupt routineTMR0 = 6j = j + 1INTCON.T0IF = 0Resume
Rezultatul e urmatorul: la 30 min ramane in urma 10 sec. Sa fie oare de la quartz? Daca nu, unde gresesc?
Link spre comentariu

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

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

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. :jytuiyu Stiti cumva o documentatie de unde sa invat?Merci!
Link spre comentariu

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
  • 3 săptămâni mai târziu...

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

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

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