Vlad Mihai Postat Martie 25, 2013 Partajează Postat Martie 25, 2013 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.? Link spre comentariu
masterpic77 Postat Martie 26, 2013 Partajează Postat Martie 26, 2013 Pai unde ai implementat in soft comunicatia pe RS232 cu PC-ul ? Sau cum vrei sa comunici ? Link spre comentariu
Vlad Mihai Postat Martie 26, 2013 Autor Partajează Postat Martie 26, 2013 inca nu am implementat ca nu stiu cum. comunic prin seriak rs232. Link spre comentariu
Vlad Mihai Postat Mai 4, 2013 Autor Partajează Postat Mai 4, 2013 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. 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
Stefan Postat Mai 4, 2013 Partajează Postat Mai 4, 2013 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
Vlad Mihai Postat Mai 4, 2013 Autor Partajează Postat Mai 4, 2013 am schimbat si viteza, nu s-a rezolvat problema. Link spre comentariu
Stefan Postat Mai 4, 2013 Partajează Postat Mai 4, 2013 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
Vlad Mihai Postat Mai 4, 2013 Autor Partajează Postat Mai 4, 2013 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
Stefan Postat Mai 4, 2013 Partajează Postat Mai 4, 2013 pune in loc de UART1_Write('\n'); asta UART1_Write(13); , in terminal sigur o sa iti afiseze mai frumos. Link spre comentariu
Vlad Mihai Postat Mai 10, 2013 Autor Partajează Postat Mai 10, 2013 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. 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