Vizitator Zuma Delux Postat Iulie 1, 2017 Partajează Postat Iulie 1, 2017 Buna ziua,incerc sa citesc RA0 si RA1 pe un 16f716 si am incercat sa scriu un cod in C,recunosc sunt absolut la inceput de drum si sper ca se gaseste cineva sa-mi spuna unde gresesc.Am redus codul,el nu mai contine si textele pe care oricum la simulare in ISIS 7 si reala le scrie pe lcd care e un 2x16.Dar in rest nu vrea sa-mi puna cele doua valori pe lcd. Daca aveti un pic de timp sa ma indrumati si pe mine va rog din suflet.Nu vreau sa abandonez doar pentru ca la inceput de drum mi-am cam prins urechile. Va multumesc. Aveti ma jos codul: sbit LCD_RS at RB3_bit; sbit LCD_EN at RB2_bit; sbit LCD_D4 at RB4_bit; sbit LCD_D5 at RB5_bit; sbit LCD_D6 at RB6_bit; sbit LCD_D7 at RB7_bit; sbit LCD_RS_Direction at TRISB3_bit; sbit LCD_EN_Direction at TRISB2_bit; sbit LCD_D4_Direction at TRISB4_bit; sbit LCD_D5_Direction at TRISB5_bit; sbit LCD_D6_Direction at TRISB6_bit; sbit LCD_D7_Direction at TRISB7_bit; int vala; int valb; char a[4]; char b[4];void main(){ TRISA.RA0=1; TRISA.RA1=1; ADC_Init(); Lcd_Init(); Lcd_Cmd(_LCD_CURSOR_OFF); Lcd_Cmd(_LCD_CLEAR); while(1); { vala=adc_read(0); vala=vala*19.60; // (5*1000/255) valb=adc_read(1); valb=valb*19.60; // (5*1000/255) floattostr(vala,a); floattostr(valb,b); LCD_Out (1,1,a); LCD_Out (2,1,b); delay_ms(500); }} Link spre comentariu
costi002 Postat Iulie 1, 2017 Partajează Postat Iulie 1, 2017 Lcd out cred ca scoate doar un caracter catre lcd, iar a si b cred ca trebuie sa aiba mai mult de 4 byte. Link spre comentariu
Mircea Postat Iulie 1, 2017 Partajează Postat Iulie 1, 2017 (editat) Valoarea dupa FloatToStr e de 11 caractere 14 caractere (multumesc Marius). Tu ai numai 4 asignate, dupa cum spune si colegul costi.Adc_read(x) iti va da o valoare de 10 biti. Deci impartirea ta la 255 (trebuia sa fie 256 pentru 8 biti) trebuie facuta la 1024.LE: ai dreptate cu 8 biti la ADC.LE2: Arata ceva LCD-ul? Caci bibliotecile MikroC sunt pentru 44870. Incearca si asta (la toate conexiunile catre LCD): sbit LCD_RS at PORTB3_bit Editat Iulie 1, 2017 de thunderer Link spre comentariu
mars01 Postat Iulie 1, 2017 Partajează Postat Iulie 1, 2017 (editat) Salut. 1. Scrie in clar ce compilator C folosesti. Chiar daca esti incepator, noi nu trebuie sa ghicim ca este vorba de mikroC. 2. Variabilele vala si valb ar fi mai "citibile" daca le-ai scrie ca val_a si val_b, adica folosind un underscore 3. Variabilele vala si valb le declari ca INTEGER adica valori intregi (stocheaza valori de la -2^15 pana la (2^15)-1 pentru controlerul ales). Mai apoi stochezi o valoare returnata de ADC (care poate avea valori doar intre 0 si 255 - ADC pe 8 bit), ceea ce este OK pentru ca acest interval este inclus in intervalul de valori al INT. Dar ceea ce nu este OK este ca apoi tu incerci sa stochezi in aceasi variabila tip INT (vala sau valb, este la fel pentru oricare) o valoare FLOAT. Ceea ce nu se poate pentru ca majoritatea compilatoarelor C (mikroC inclus) fac promotie automata la INT si nu la FLOAT. Ori declari variabilele vala si valb ca FLOAT si cand faci asignarea valorii ADC in ele, o faci cu casting la FLOAT. Adica: float vala; float valb; /* cod */ vala = (float)adc_read(0); // cod valb = (float)adc_read(1); // cod Sau renunti la zecimale si faci casting la INT unde este cazul, plus ca vei folosi in acest caz functia IntToStr(int input, char *string). BTW, cum au spus si colegii, functia floattostr are nevoie ca stringurile de destinatie sa: "Destination string should be at least 14 characters in length." - din helpul mikroC. LE: Big issue: Cam ce crezi ca face ; dupa: while(1); Nu cumva ramane in bucla infinita si numai executa nimic dupa? Ia incearca sa scoti acel punct si virgula ... si fa modificarile pe care ti le-am sugerat ... Editat Iulie 1, 2017 de mars01 Link spre comentariu
Vizitator Zuma Delux Postat August 3, 2017 Partajează Postat August 3, 2017 Va multumesc tuturor pentru sfaturi,pana la urma am mai studiat problema si in final am reusit sa scriu codul in mikroc pro care si functioneaza atat in simulare cu Proteus cat si realizat fizic.Asa arata codul acum: // LCD module connections sbit LCD_RS at RB2_bit; sbit LCD_EN at RB7_bit; sbit LCD_D4 at RB6_bit; sbit LCD_D5 at RB5_bit; sbit LCD_D6 at RB4_bit; sbit LCD_D7 at RB3_bit; sbit LCD_RS_Direction at TRISB2_bit; sbit LCD_EN_Direction at TRISB7_bit; sbit LCD_D4_Direction at TRISB6_bit; sbit LCD_D5_Direction at TRISB5_bit; sbit LCD_D6_Direction at TRISB4_bit; sbit LCD_D7_Direction at TRISB3_bit; // End LCD module connections float val; char v[8]; void main() { LCD_Init(); ADC_Init(); TRISA.RA0=1; TRISB=0; LCD_cmd(_LCD_CLEAR); LCD_cmd(_LCD_CURSOR_OFF); LCD_out(1,1,"Voltmetru"); delay_ms(1000); LCD_cmd(_LCD_CLEAR); while(1) { val=ADC_read(0); val=val*5; val=val/255; floattostr(val,v); v[4]=0; LCD_out(2,1,"RA0="); LCD_out(2,5,Ltrim(v)); LCD_out(2,10,"Volti"); delay_ms(300); } } Link spre comentariu
Vizitator Zuma Delux Postat August 10, 2017 Partajează Postat August 10, 2017 Am o alta mare rugaminte,acum ma chinui la propriu cu un ceas fara RTC,doar cu tmr1,am incercat cu tmr0 dar ori o ia inainte ori inapoi.Tot cu 16f716,cu ce valoare trebuie sa incarc registrii tmr1h si tmr1l in cazul unui oscilator extern cu cuartz de 4 Mhz,am tot incercat cu calculatorul de la mikroc,dar patesc aceeasi chestiune,ori inainte ori inapoi.Si ar mai fi INTCON care in cazul meu este 0b00100001,este valoarea corecta si cum sa fac intreruperea la 1 secunda.Scuze pentru imbecilitatea mea manifestata la 20 de ani cand am ignorat aceste lucruri.Acum la 52 sper sa imi vina mintea la cap.Poate,sper,ca nu e prea tarziu.Multumesc anticipat. Link spre comentariu
Vizitator Zuma Delux Postat August 11, 2017 Partajează Postat August 11, 2017 Am rezolvat intre timp,cu TMR2 si cu ajutorul calculatorul de timer de la mikroc.Acum dupa vreo 5 ore de mers e la secunda.Ce nu inteleg este de ce cu tmr0 nu e precis. 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