Sari la conținut
ELFORUM - Forumul electronistilor

Interfata pic in labview


Vlad Mihai

Postări Recomandate

Salut, vreau sa comand practic un pic16f877a din labview si sa vizualizez ceea ce imi afiseaza el pe LCD propriu zis. Am scris codul in mikroC fara chestia cu uart ca nu stiu exact cum se implementeza. In labview vreau sa citesc cele 2 tensiuni care imi apar pe ecran si sa comand cele 2 butoane de up si down pentru pwm.

sbit LCD_RS at RB0_bit;sbit LCD_EN at RB1_bit;sbit LCD_D4 at RB2_bit;sbit LCD_D5 at RB3_bit;sbit LCD_D6 at RB4_bit;sbit LCD_D7 at RB5_bit;sbit LCD_RS_Direction at TRISB0_bit;sbit LCD_EN_Direction at TRISB1_bit;sbit LCD_D4_Direction at TRISB2_bit;  //conexiune LCDsbit LCD_D5_Direction at TRISB3_bit;sbit LCD_D6_Direction at TRISB4_bit;sbit LCD_D7_Direction at TRISB5_bit;  bit oldstate, oldstate1;  short int  i,k,x;  unsigned long j,ii,valoare_pwm,pwm_var;  char duty_cycle[4] ;  unsigned char txt1[] = "Hello Handsome!";  unsigned char txt2[] = "SMPS with PIC";  unsigned char txt3[] = "freqency: 62.5KHz";  unsigned char ch;  unsigned int Tensiune;  unsigned long u;void main() {  TRISB = 0xC0;          // set RB0,RB1 pin as input  PORTB = 0x00;  ADCON1     = 0x80;                       // configure Vref, and analog channels  TRISA      = 0xFF;                       // designate PORTA as input  i = 0;  ii = 0;  oldstate = oldstate1 = 0;  pwm_var = 99;//  EEPROM_Write(0x02,0x00);               // Write some data at address 2  i =  EEPROM_Read(0x02);  ii = EEPROM_Read(0x02);  pwm_var = EEPROM_Read(0x04);   if (ii > 99) {    i = ii = 0;   }   if (pwm_var > 99) {    pwm_var = 99;   }  Lcd_Init();                        // Initialize LCD  Lcd_Cmd(_LCD_CLEAR);               // Clear display  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off  PWM1_Init(625);           // f=62.500 KHz     !!!!!!!!!!!!!!  PWM1_Start() ;  PWM1_Set_Duty(255);  Lcd_Out(1,2,txt1);                 // Write text in first row  Lcd_Out(2,2,txt2);                 // Write text in second row  Delay_ms(300);  Lcd_Cmd(_LCD_CLEAR);               // Clear display  Lcd_Out(2,2,txt3);                 // Write text in first row  Delay_ms(300);  Lcd_Cmd(_LCD_CLEAR);               // Clear display  LCD_Out(1, 1,"Vin:");  LCD_Out(1, 9,"Vo:");  LCD_Out(2, 1,"Duty Cycle: ");  LCD_Out(2, 15,"%");while (1) {      if (ii > 99) {      i = ii = 99;      }if (Button(&PORTB, 6, 1, 1)) {                 // Detect logical one       oldstate = 1;}   if (oldstate && Button(&PORTB, 6, 1, 0)) {      i = i++;      delay_ms(10);      EEPROM_Write(0x02,i);      delay_ms(100);      ii = EEPROM_Read(0x02);      pwm_var = pwm_var--;      delay_ms(100);      EEPROM_Write(0x04,pwm_var);      oldstate = 0;         if (ii > 99) {         i = ii = 0;         }   }if (Button(&PORTB, 7, 1, 1)) {                 // Detect logical one       oldstate1 = 1;}   if (oldstate1 && Button(&PORTB, 7, 1, 0)) {       i = i--;       delay_ms(10);       EEPROM_Write(0x02,i);       delay_ms(100);       ii = EEPROM_Read(0x02);       pwm_var = pwm_var++;       delay_ms(100);       EEPROM_Write(0x04,pwm_var);       oldstate1 = 0;  //        if (ii > 99) {  //        i = ii = 0;  //        }   }    //valoare_pwm = ii*2.57575757;      valoare_pwm = pwm_var*2.5757575757575757575757575757576;      PWM1_Set_Duty(valoare_pwm);      ByteToStr(ii,duty_cycle);      LCD_Out(2,12,duty_cycle);      // Voltage Vin      Tensiune=ADC_read(1);                // get ADC value for U from channel 1      u=(long)Tensiune*5000;               // covert adc reading to milivolts      u=u/1023;                            // 0..1023 -> 0-3500mV      ch=u/1000;                           // extract 10.00 U digit      if (ch==0)        {          LCD_Chr(1,5, 32);                // write empty space if digit is 0        }      else        {          LCD_Chr(1,5,48+ch);              // write ASCII digit at 1st row, 2nd column        }      ch=(u/100) %10;                      // extract 01.00 U digit      LCD_Chr_CP(48+ch);                   // write ASCII digit at cursor point      LCD_Chr_CP('V');                     // write 'V' at cursor point      // Voltage Vout      Tensiune=ADC_read(3);                // get ADC value for U from channel 1      u=(long)Tensiune*50000;               // covert adc reading to milivolts      u=u/1023;                            // 0..1023 -> 0-5000mV      ch=u/10000;                           // extract 100.00 U digit      if (ch==0)        {          LCD_Chr(1,12, 32);                // write empty space if digit is 0        }      else        {          LCD_Chr(1,12,48+ch);              // write ASCII digit at 1st row, 2nd column        }      ch=(u/1000) %10;                     // extract 010.00 U digit      LCD_Chr_CP(48+ch);      ch=(u/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=(u/10) %10;                       // extract 00.10 U digit//    LCD_Chr_CP(48+ch);                   // write ASCII digit at cursor point      LCD_Chr_CP('V');                     // write 'V' at cursor point }}

Are careva idee ce trebuie modificat in soft, pc etc.?

post-65525-139829607721_thumb.jpg

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

Top autori în acest subiect

  • Vlad Mihai

    6

  • Stefan

    3

  • masterpic77

    1

Top autori în acest subiect

Imagini postate

  • 1 lună mai târziu...

am avut ceva timp ieri si azi sa studiez chestiunea asta, am realizat un cod care trimite pe Tx valoarea unei temperaturi citita de uC cu lm35z. problema e ca daca fac conexiunea din proteus cu labview, functioneaza corect dar daca testez practic intre uC si labview nu merge. am testat cu hyper terminal sa vad ce trimite atat virtual cat si practic. prima fotografie e ceea ce trimite virtual simulat proteus, a 2-a e ceea ce trimite practic controlerul de pe placa. mentionez ca folosesc un usb to ttl converter cu pl2303 e de ajuns sau trebuie neaparat max232, urmeaza sa testez si cu max232. atasez si un cod.

Posted Image

 

Posted Image

 

 

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;            //configurare  conexiune pic catre LCDsbit LCD_D5_Direction at TRISB1_bit;sbit LCD_D6_Direction at TRISB2_bit;sbit LCD_D7_Direction at TRISB3_bit; #include "Splash.h" unsigned int val1,val2,val3,valm;  //declaram valoriile  citirii portului ADC  unsigned int t,a, b;  unsigned long u;unsigned char ch;void main(){   UART1_Init(9600);                       // Initialize USART module (8 bit, 38400 baud rate, no parity)                                              Delay_ms(100);  Lcd_Init();                        // Initialize LCD  Lcd_Cmd(_LCD_CURSOR_OFF);          // Cursor off   Ar2r();                                  // Show splash screen   Lcd_Cmd(_LCD_CLEAR);               // Clear display  Delay_ms(100);  LCD_Out(1,2,"  *Digital*");               //Afiseaza un text pe prima linie a LCD  LCD_Out(2,2," *Termometer*");              ////Afiseaza un text pe a-2-a linie a LCD  Delay_ms(100);  Lcd_Cmd(_LCD_CLEAR);               // Clear display  LCD_Out(1,2,"  ");  LCD_Out(2,2,"  ");  Delay_ms(100);  Lcd_Cmd(_LCD_CLEAR);   LCD_Out(1,2,"      ");  LCD_Out(2,2, "    ");               // Clear display  Delay_ms(100);   Lcd_Cmd(_LCD_CLEAR);   LCD_Out(1, 6,"C");    while (1)    {      for (b ; b < 2; b++) {      }      // Grade Celsius      val1=ADC_read(2);                // citim    tensiunea  generata de seznor in portul ADC1      delay_ms(30);      val2=ADC_read(2);      delay_ms(30);                       //citim de  3 ori aceasti tensiune si facem o medie      val3=ADC_read(2);      delay_ms(30);      valm=((val3+val2+val1)/3);     t=(valm*0.48876);//conversia   tensiunii citite in grade celsius   ch = (t/10)%10;               //=> afisez zecile       UART1_Write(48+ch);                  // write ASCII digit on serial port       LCD_chr(1,2,'0'+ch);   ch = t%10;       LCD_chr(1,3,'0'+ch);       //=> afisez unitatile        UART1_Write(48+ch);                  // write ASCII digit on serial port        UART1_Write('\n');                   // write '\n' on serial port        LCD_Chr_CP(10111010);  }}
Ce sa ii fac?

LE: am testat circuitul cu pl2303 cu un program din labview care citeste si scrie pe port serial, merge corect. deci e ceva ce nu a fost configurat corespunzator.

Link spre comentariu

In program initializezi UART-ul la baud 9600 si in HT vad ca il ai setat la 2400, corecteaza asta si pe urma vedem daca mai sunt alte probleme.folosesc un convertor cu PL2303 si nu sunt probleme la interpretarea nivelelor logice de la PIC.

Link spre comentariu

atunci ai cuarţul de o alta valoare fata de ce e setata in compilator. pickit2-ul are UART Toolp.s: vezi ca eu am testat practic si functioneaza ok partea de seriala, probleme mai sunt la partea de calcul al temperaturii.

Link spre comentariu

Vai de mine, nici prin cap nu mi-a trecut că aveam cuarţuri diferite, acum merge ok în hyper terminal, dar în labview primesc nişte erori la string. Mulţumesc!

Link spre comentariu

Cum se separa valorile in Labview? daca trimit 4 valori din controller nu le afiseaza in ordinea care le trimite, le ia aiurea. le-am separat cu \n, si am facut setare in scan from string dar tot le incurca. :sparge:

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