Vlad Mihai Postat Decembrie 27, 2013 Partajează Postat Decembrie 27, 2013 Buna dimineata, ma chinui de cateva zile sa programez un pic16f876a sa primeasca date din labview(numere) si sa seteze pwm cu ele. Din LAbview trimit un numar si un carriere return(CR) ca sa sincronizez, am vazut pe serial cu hyperterminal ca trimite bine datele, dar nu reusesc sa programez in mikroC sa interpretez, am incercat sa afisez pe LCD ceea ce primesc, si am observat ca se incurca intre ele cifrele(cifra zecilor cu cifra sutelor etc etc). char dist[] = "000.0"; int i;unsigned short current_duty1,current_duty2;void main() { UART1_Init(9600); // Initialize USART module (8 bit, 38400 baud rate, no parity) Delay_ms(300); INTCON = 0; //DEZACTIVARE INTRRUPERI TRISA= 0xFF; //PORTUL A CA INTRARE ANALOG TRISB.F0=0; //CONTROL TRISB.F1=0; //CONTROL TRISB.F2=0; //CONTROL TRISB.F3=0; //CONTROL TRISC.F5=0; //LED TRISC.F4=0; //LED TRISC.F3=0; //BUZZER PORTB.F0=0; PORTB.F1=0; PORTB.F2=0; PORTB.F3=0; PORTC.F4=0; PORTC.F5=0; PORTC.F3=0; PWM1_Init(10000); current_duty1 = 0; PWM1_Start(); PWM1_Set_Duty(current_duty1); PWM1_Init(10000); current_duty2 = 0; PWM2_Start(); PWM2_Set_Duty(current_duty2); while (1) { PORTB.F2=1; if(UART1_Data_Ready()) //if data ready { if(UART1_Read() == 0x0D) //check for new line character { for(i=0;i<3;) { if(UART1_Data_Ready()) // if data ready { dist[i] = UART1_Read(); // read data i++; } } } } current_duty1 = dist; PWM1_Set_Duty(current_duty1); }}In limbajul arduino este o functie care seteaza limitele unei valori ca sa nu aiba valori peste maximul admis se numeste constrain http://arduino.cc/en/reference/constrain, cum se poate implementa o asfel de functie si in mikroC? Sarbatori fericite si multumesc! Link spre comentariu
Mircea Postat Decembrie 27, 2013 Partajează Postat Decembrie 27, 2013 Functia Constrain sub procedure Constrain(x, a, b as byte/word) a = 10 b = 100 if x < a then x = a end if if (x >= a) and (x <= b) then x = x end if if x > b then x = b end ifend sub Dupa fiecare citire a lui x, apelezi Constrain() si apoi x va fi limitat intre valorile necesare. Altfel, faci o interpolare liniara http://en.wikipedia.org/wiki/Linear_interpolation. Functia creata Constrain nu este liniara, dar poate nu ai nevoie de liniaritate. Cu comunicatia UART nu stiu ce sa zic. Link spre comentariu
brad Postat Decembrie 27, 2013 Partajează Postat Decembrie 27, 2013 in coditiile in care: unsigned short current_duty1; char dist[] = "000.0";ce intelege compilatorul cand vede: current_duty1 = dist; ?daca este asa, este urat :)nu am folosit mikroC pina acum. Link spre comentariu
Mircea Postat Decembrie 28, 2013 Partajează Postat Decembrie 28, 2013 Intradevar, compilatorul nu intelege de ce vrei sa pui un string (text) intr-o variabila short (int), dar va face implicit conversia. Ca este urat sau nu, este uneori util ca sa nu-ti dea erori de compilare, ci doar "warning-uri" ca ai o conversie implicita si apoi iti modifici tipurile in consecinta.Oricum, un char sau un short nu pot fi date "cu virgula". Ele au valori intregi intre 0 si 255. Link spre comentariu
Elef Postat Decembrie 29, 2013 Partajează Postat Decembrie 29, 2013 Compilatorul o sa inteleaga ca vrei sa scrii adresa continuta de dist in current_duty1(pointer catre char intr-un short int).Si chiar daca adresa ar incapea in curent_duty1 tot ar fi aberant .Corect ar fi sa trimita un singur octet care sa contina valoarea impusa sau daca se vrea mai complicat se poate trimite un sir de caractere, dar in cazul asta trebuie facuta conversia valorii adica o functie apelata cu sirul de caracter care returneaza o valoare de tipul dorit(int,float...) nu un cast. Link spre comentariu
Vlad Mihai Postat Ianuarie 4, 2014 Autor Partajează Postat Ianuarie 4, 2014 Buna ziua, si La multi ani, tocmai ce am revenit din vacanta si m-am si apucat de treaba astazi, am citit comentariile voastre si va multumesc, am incercat altfel sa modific turatia cu Labview, in sensul ca am selectat 10 trepte de viteza(pas de 25 la pwm pe 8 biti-255 valori), astfel cand trimit o litera pe serial din Labview el imi seteaza automat o variabila virtuala cu o valoare multiplu de 25. functionea perfect codul, schimb si sensul, si frana etc, acum urmeaza sa implementez si funtiile de monitorizare parametri. thunderer multumesc de functie, nici nu ai idee cat am cautat o astfel de secventa, ca de obicei cand dau de greu in programare ma scapi. Acesta este codul actual, fara parametri urmeaza sa implementez si asta. O zi frumoasa. unsigned short current_duty1,current_duty2; unsigned char uart_rd; int val; void frana(){ current_duty1=255; PWM1_Set_Duty(current_duty1); current_duty2 = 255; PWM2_Set_Duty(current_duty2); PORTB.F2=0; PORTB.F3=0; PORTC.F4=1; //LED PORTC.F5=1; //LED } void stanga(){ PORTB.F2=1; PORTB.F3=0; PORTC.F4=1; //LED PORTC.F5=0; //LED PORTB.F5=1; PORTB.F6=0; } void dreapta(){ PORTB.F2=0; PORTB.F3=1; PORTC.F5=1; //LED PORTC.F4=0; //LED PORTB.F5=0; PORTB.F6=1; }void main() { UART1_Init(9600); // Initialize USART module (8 bit, 38400 baud rate, no parity) Delay_ms(300); INTCON = 0; //DEZACTIVARE INTRRUPERI TRISA= 0xFF; //PORTUL A CA INTRARE ANALOG TRISB.F2=0; //CONTROL High side TRISB.F3=0; //CONTROL High side TRISC.F5=0; //LED TRISC.F4=0; //LED TRISC.F3=0; //BUZZER TRISB.F5=0; // PORT VIRTUAL TRISB.F6=0; // PORT VIRTUAL PORTB.F0=0; PORTB.F1=0; PORTB.F2=0; PORTB.F3=0; PORTC.F4=0; PORTC.F5=0; PORTC.F3=0; PORTB.F5=0; PORTB.F6=0; PWM1_Init(10000); current_duty1 = 0; PWM1_Start(); PWM1_Set_Duty(current_duty1); PWM1_Init(10000); current_duty2 = 0; PWM2_Start(); PWM2_Set_Duty(current_duty2); while (1) { if (UART1_Data_Ready()) { // If data is received, uart_rd = UART1_Read(); // read the received data, if (uart_rd==0x41) //A val=25; if (uart_rd==0x42) //B val=50; if (uart_rd==0x43) //C val=75; if (uart_rd==0x44) //D val=100; if (uart_rd==0x45) //E val=125; if (uart_rd==0x46) //F val=150; if (uart_rd==0x47) //G val=175; if (uart_rd==0x48) //H val=200; if (uart_rd==0x49) //I val=225; if (uart_rd==0x4A) //J val=255; if (uart_rd==0x4D) //M dreapta(); if (uart_rd==0x4E) //N stanga(); if (uart_rd==0x4F) //O frana(); } if(PORTB.F5 == 1) { current_duty1=val; PWM1_Set_Duty(current_duty1); current_duty2 = 0; PWM2_Set_Duty(current_duty2); } else{ current_duty1=0; PWM1_Set_Duty(current_duty1); } if(PORTB.F6 == 1) { current_duty1=0; PWM1_Set_Duty(current_duty1); current_duty2 = val; PWM2_Set_Duty(current_duty2); } else{ current_duty2=0; PWM2_Set_Duty(current_duty2); } delay_ms(100);} } Link spre comentariu
Liviu M Postat Ianuarie 4, 2014 Partajează Postat Ianuarie 4, 2014 @thunderer: de ce initializezi a si b hard in functie daca tot sunt parametri? Link spre comentariu
Mircea Postat Ianuarie 4, 2014 Partajează Postat Ianuarie 4, 2014 Liviu, evident nu au ce cauta in functie, ai dreptate . Trebuie pusi in programul principal la initializare, in afara oricarei bucle.Am scris repede acea functie, dar n-as folosi-o decat daca n-as avea memorie program. Altfel, o interpolare are face functia ceruta mai bine. 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