catalin004 Postat Ianuarie 3, 2018 Autor Partajează Postat Ianuarie 3, 2018 ok....asta din urma este interesanta...dar cred ca este mult de munca....o sa muncesc la schimbarea tipului de procesor...mai am de lucru la placa cu DSPIC Link spre comentariu
catalin004 Postat Ianuarie 4, 2018 Autor Partajează Postat Ianuarie 4, 2018 Salutare....am cautat strasnic pe net si am gasit acest mod de a face afisajul, la fel cu copierea rom in ram....si se pare ca merge...acum nu stiu ce face functia aceea mai clar, pentru ca nu are comentarii.... Acum o treaba iar importanta: ca sa nu imi mai apara restul de la scris in celelalte pagini este bine sa fac cu spatiere(space) in declarare sau LCD_CLEAr, care am inteles ca este mai greu sa il faca...acum de, pe prima pagina or sa apara si date de citire in timp real....si ma gandeam cum sa fac... const char txt11[]="PARAMETRII", txt21[]="RPM", txt31[]="Load", txt41[]="Duty"; const char txt12[]="MENIU ", txt22[]="SETARI GENERALE", txt32[]="START MOD", txt42[]="PARAMETRII MOTOR"; char txt[21]; void strcopy( const char *src, char *dst) { while (*src) *(dst++) = *(src++); *dst = 0; } void menu_page(){ switch (menu){ case 1: strcopy(txt11,txt); Lcd_Out(1, 6, txt); strcopy(txt21,txt); Lcd_Out(2, 1, txt); strcopy(txt31,txt); Lcd_Out(3, 1, txt); strcopy(txt41,txt); Lcd_Out(4, 1, txt); break; case 2: strcopy(txt12,txt); Lcd_Out(1, 6, txt); strcopy(txt22,txt); Lcd_Out(2, 1, txt); strcopy(txt32,txt); Lcd_Out(3, 1, txt); strcopy(txt42,txt); Lcd_Out(4, 1, txt); break; } } Link spre comentariu
mars01 Postat Ianuarie 4, 2018 Partajează Postat Ianuarie 4, 2018 Salut Catalin! Critica constructiva: cum e mai usor de citit functia strcopy()? Cum ai scris-o tu, adica asa (daca nu citesti cu atentie te induce in eroare, mai ales cum ai folosit indentarea liniei *dst = 0;): void strcopy( const char *src, char *dst) { while (*src) *(dst++) = *(src++); *dst = 0; } sau intr-un mod mai uman, adica asa: void strcopy( const char *src, char *dst) { while (*src) { *(dst++) = *(src++); } *dst = 0; } ------------------------------ Daca ai un afisaj cu 20 coloane atunci fa stringurile txt sa fie toate cu lungimea de 21 elemente (de ex txt21[21]). Cand initializezi acele stringuri asigura-te ca sunt tot timpul 16 caractere. Unde sunt mai putine caractere decat 16 adaugi spatii goale. De ex din: txt21[]="RPM"; faci asa: txt21[21] = "RPM "; 21-le din parantezele patrate nu este obligatoriu dar este un indiciu cand citesti codul. Link spre comentariu
catalin004 Postat Ianuarie 4, 2018 Autor Partajează Postat Ianuarie 4, 2018 (editat) Cer scuze pentru constructie, insa asa am copiat de pe un site...dar ma bucur enorm ca merge...ok...pentru constructie, ca nu le inteleg deloc Oricum RAM-ul mi se consuma acum doar 11%, deci foarte putin....si pot sa scriu cat vreau....Acum mai am sa bag functia de citire si afisare ADC ...care imi da iarasi de cap void strcopy( const char *src, char *dst) { while (*src) //1 tab? { *(dst++) = *(src++); 2 tab-uri? } *dst = 0; } Editat Ianuarie 4, 2018 de catalin004 Link spre comentariu
Bandi Szasz Postat Ianuarie 4, 2018 Partajează Postat Ianuarie 4, 2018 Acea functie face exact cum e descris in denumirea lui, din memoria ROM ( tot ce e definit cu const) copieaza in spatiul RAM, avantajul este ca in loc sa ti toate textele in RAM acuma ai doar un singur "buffer" ( zona de memorie RAM) alocata iar restul este tinut in ROM. Cand vrei sa scrii ceva pe LCD acea functie copieaza textul in acel buffer RAM care mai apoi e folosit de functia LCD. In concluzie in loc sa ai o zona RAM pentru fiecare text acuma ai doar unu-l singur pentru toate textele definite. Eu folosesc LCD_Clear doar cand se schimba pagina in rest ori il completez cu spatii cum zice mars ori cand e vorba de numere ma asigur ca cand convertesc din int sau ce o fi in char sa includ si cateva spatii in plus de exemplu daca valoarea anterioara a fost "5.15" iar noua variabila este doar "5.2" la convertire adaug un spatiu in plus sa fie "5.2 " astfel acel spatiu va elimia acel 5 din ultima valoare. Eu de obicei fac refresh la 0.5s, daca se face mai repede mai ales cu valori care se pot schimba devine foarte greu de citit. De cod venind vorba da acela este "1 tab" care in general inseamna 4 spatii, MikroC e destul de prost pe partea de editor text si da mari rateuri la tab, eu dau simplu 4 spatii. Pentru a putea citii mai usor un cod se indenteaza cu 1 tab partea de cod care se afla sub o functie. Cum vezi si in exemplul pus de mars "while" este indentat cu 1 tab fata de denumirea functiei, tot ce se afla sub "while" din nou e indetat cu 1 tab. Parantezele in C se pun pe o linie noua, eu paranteza de dechidere il pun pe aceasi linie cu functia cum ai tu la "menu_page(){" doar ca se lasa un spatiu inatinte de paranteza "menu_page() {", formatul acesta este folosit in Java, eu lucrand zilnic in Java asa m-am obijnuit si mi se pare mai economic din punct de vedere a lungimii codului. La proiecte cu PIC nu prea ajungi cu cod foarte mare dar in proiecte pentru PC, eu sunt in zona de Web development sunt momente cand ajungi ca un singur fisier sa contina 1500-2000 de linii de cod si atunci acolo chiar conteaza cum e scris codul. 1 Link spre comentariu
mars01 Postat Ianuarie 4, 2018 Partajează Postat Ianuarie 4, 2018 (editat) Cand am scris mai devreme: Daca ai un afisaj cu 20 coloane atunci fa stringurile txt sa fie toate cu lungimea de 21 elemente (de ex txt21[21]). Cand initializezi acele stringuri asigura-te ca sunt tot timpul 16 caractere. Unde sunt mai putine caractere decat 16 adaugi spatii goale. De ex din: txt21[]="RPM";faci asa: txt21[21] = "RPM ";21-le din parantezele patrate nu este obligatoriu dar este un indiciu cand citesti codul. Am facut o varza. Aveam de lucru, eram atent mai degraba la ce aveam de facut si initial am scris pentru un afisaj cu 16 coloane apoi am vazut ca ai 4 linii si prin urmare am realizat ca folosesti un afisaj 20x4 adica cu 20 de coloane. Corect era ceva de genul: "Daca ai un afisaj cu 20 coloane atunci fa stringurile txt sa fie toate cu lungimea de 21 elemente (de ex txt21[21]). Cand initializezi acele stringuri asigura-te ca sunt tot timpul 20 caractere. Unde sunt mai putine caractere decat 20, adaugi spatii goale. De ex din: txt21[]="RPM"; faci asa: txt21[21] = "RPM "; 21-le din parantezele patrate nu este obligatoriu dar este un indiciu cand citesti codul. Editat Ianuarie 4, 2018 de mars01 Link spre comentariu
catalin004 Postat Ianuarie 5, 2018 Autor Partajează Postat Ianuarie 5, 2018 Mars stai linistit ca am vazut ca te-ai gandit la 2x16, insa nu este asta o problema....Nu stiu ce inseamna acel: dst....src???sunt ceva date de mikroC? sau sunt niste variabile la intamplare? Link spre comentariu
catalin004 Postat Ianuarie 5, 2018 Autor Partajează Postat Ianuarie 5, 2018 se poate introduce header in header? adica un header sa in tre si in main si in alt header? Am incercat cu #define "xxx.h" si imi zice ceva de redefinire...este alt tip de adresare? Link spre comentariu
catalin004 Postat Ianuarie 5, 2018 Autor Partajează Postat Ianuarie 5, 2018 (editat) Am vazut ca le ia singur....fara nici o adresare Editat Ianuarie 5, 2018 de catalin004 Link spre comentariu
Elison Postat Ianuarie 5, 2018 Partajează Postat Ianuarie 5, 2018 Nu stiu ce inseamna acel: dst....src???sunt ceva date de mikroC? sau sunt niste variabile la intamplare? Functia strcopy are doi parametri, destinatie si sursa, dst (destination) si src (source) fiind prescurtarile celor doi parametri. In cazul prezentat,in loc de str si dst puteai sa pui orice alta denumire. Atunci cand apelezi functia, de exemplu strcopy(txt11,txt); txt11 este sursa si txt este destinatia sau buffer-ul in care se copiaza continutul sursei. 1 Link spre comentariu
Bandi Szasz Postat Ianuarie 5, 2018 Partajează Postat Ianuarie 5, 2018 In legatura ca header-ele, nu se pot defini de doua ori dar al doilea header definit o sa contina si ce este in primul header. #include "header_1.h" #include "header_2.h" #include "header_3.h" In header_2 ai acces la tot ce contine header_1 iar in header_3 ai acces la tot ce contine header_1 si header_2. Include de fapt la momentul compilarii inseamna copiaza tot ce contine acel fisier in fisierul acesta, de acea in al doilea include ai acces la ce contine primul include findca tot codul din interiorul primului include este copiat. Link spre comentariu
catalin004 Postat Ianuarie 5, 2018 Autor Partajează Postat Ianuarie 5, 2018 super frumos Link spre comentariu
svi67 Postat Martie 9, 2018 Partajează Postat Martie 9, 2018 Buna seara, Cer scuze ca postez aici ,dar nu am vrut sa mai deschid un topic separat. Am un encoder tip quadratura cu switch, dar este analogic,informatia este culeasa de pe un singur pin. Switchul are pin separat. Asi dori sa-l folosesc tot in domeniul pagini cu meniu. Informatia citita cu adc-ul: poz 0 = 770 trecere din 0 in 1 = 340 poz 1 = 250 trecere din 1 in 0 = 440 prin codul de mai jos am obtinut pentru rotire in sensul acelor de ceasornic : if(adc_1>700 && adc_1<800){a1=1;}else a1=0; if(adc_1>300 && adc_1<350){a2=1;}else a2=0; if(adc_1>200 && adc_1<270){a3=1;}else a3=0; if(adc_1>390 && adc_1<460){a4=1;}else a4=0; a1 a2 a3 a4 1 0 0 0 poz 0 0 1 0 0 tranzitie intre pozitii 0 0 1 0 poz 1 0 0 0 1 tranzitie intre pozitii 1 0 0 0 poz 2 0 1 0 0 tranzitie intre pozitii 0 0 1 0 poz 3 tura completa de 360 = 12 pozitii. Poate ca nu este metoda cea mai buna de detectie, dar atat am reusit pana acum. Rog frumos daca cineva are o idee despre cum as putea detecta sensul ,eventual si o optimizare. Va multumesc. Link spre comentariu
catalin004 Postat Martie 10, 2018 Autor Partajează Postat Martie 10, 2018 Salut...nu cred ca ar fi o postre gresita....cred ca este foarte bine unde ai postat....pentru ca si pe mine m-ar interesa acesta aspect cu encoder...inas o sa deschid un alt topic doar pentru encodere....insa la pasul meu doar cu PIC.... 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