Vizitator Postat Decembrie 8, 2019 Partajează Postat Decembrie 8, 2019 (editat) Salutare, doresc sa realizez un program, în care doresc sa se afiseze pe un led 8x8, numerele de la 1 la 9 (numerele sa stea aprinse un interval de 1sec). Codul pentru a afisa numarul 1 este: void main() { TRISB = 0; //initializez portul B TRISD = 0; //initializez portul D PORTB = 0; //setez liniile portului B ca iesiri PORTD = 0; //setez liniile portului D ca iesiri while(1){ //numarul 1 PORTB = 0x08; PORTD = 0x00; Delay_ms(1); PORTB = 0x10; PORTD = 0xBF; Delay_ms(1); PORTB = 0x20; PORTD = 0xDF; Delay_ms(1); //numarul 2 } } Cum as putea afisa dupa numarul 1, numarul 2, mentionez ca sta incontinuu afisat? Am pus PORTB = 0x00; PORTD = 0xFF; Delay_ms(1000); Dar nu apuc sa vizulizez deloc numarul 1, deoarece dispare imediat. Va multumesc. Editat Decembrie 8, 2019 de Vizitator Link spre comentariu
Liviu M Postat Decembrie 12, 2019 Partajează Postat Decembrie 12, 2019 Ai incercat sa pui Delay_ms(1000); dupa ce "scrii" 1 si inainte sa "stergi ecranul"/sa scrii 2? Link spre comentariu
Bandi Szasz Postat Decembrie 12, 2019 Partajează Postat Decembrie 12, 2019 Salut, Matricea este multiplexata prin urmare orice fel de delay o sa faca sa dispara numarul 1. Cea mai buna solutie este sa te folosesti de timer0 si sa faci acel delay cu ajutorul timer-ului in loc de delay care este blocanta. Daca imi zici la ce frecventa lucreaza PIC-ul sa pot calula valorile necesare pt timer0 o sa iti fac un mic exemplu. Link spre comentariu
Liviu M Postat Decembrie 12, 2019 Partajează Postat Decembrie 12, 2019 (editat) Eu as zice sa posteze tot programul, ca daca 1 nu sta aprins cu nici un delay, nu vad de ce ar sta 2 aprins. LE Sau foaia de catalog a matricei. Editat Decembrie 12, 2019 de Liviu M Link spre comentariu
Bandi Szasz Postat Decembrie 12, 2019 Partajează Postat Decembrie 12, 2019 (editat) Ii sta aprins si 2 ul doar ca el vrea sa fie afisat 1 timp de 1s dupa care sa ii stea afisat 2 timp de 1s etc... E o matrice simpla cu catod sau anod comun nu conteaza... Numarul 1 este afisat pe 3 coloane de acolo si cele 3 linii de cod cu cate 1ms delay intre. PORTB = 0x08; PORTD = 0x00; Delay_ms(1); // Afiseaza prima coloana PORTB = 0x10; PORTD = 0xBF; Delay_ms(1); // Afiseaza a doua coloana PORTB = 0x20; PORTD = 0xDF; Delay_ms(1); // Afiseaza a treia coloana Cum stim despre orice fel de display care este multiplexat fie matrice fie 7 segmente etc... intre segmente sau coloane trebuie sa fie un delay mai mic de 50Hz.. orice valoare mai mare de delay intre si o sa vezi efectul de flicker. El daca puna delay de 1000ms sau 1 secunda normal ca ii dispare numarul 1 pentru ca timp de 1secunda din cele 3 coloane necesare afisarii o sa stea aprins unu-l singur.. Lui ii trebuie o functie care schimba coloana de afisare din cele 8 la intervale de 1ms iar orice alta temporizare trebuie facuta prin timer sa nu afecteze functia de afisare care trebuie sa ruleze continu. Editat Decembrie 12, 2019 de Bandi Szasz Link spre comentariu
Liviu M Postat Decembrie 12, 2019 Partajează Postat Decembrie 12, 2019 Da, n-am pierdut prea mult timp cu ganditul la functionarea matricei. Tu zici ca trebuie ceva de genul while(1){ //numarul 1 for(int i = 0; i < 333; i++) { //timp de 1 secunda (333 * 3 ms) afiseaza 1 PORTB = 0x08; PORTD = 0x00; Delay_ms(1); PORTB = 0x10; PORTD = 0xBF; Delay_ms(1); PORTB = 0x20; PORTD = 0xDF; Delay_ms(1); } //numarul 2 for(int i = 0; i < 333; i++) { //timp de 1 secunda (333 * 3 ms) afiseaza 2 // cod pentru 2 } Codul e blocant, stiu, era numai pe post de "am inteles?". Link spre comentariu
Bandi Szasz Postat Decembrie 12, 2019 Partajează Postat Decembrie 12, 2019 Exact, este si mai simplu doar ca in functie de cate coloane are trebuie sa recalculeze cate iteratii sa aiba "for" urile, de acea sugeram sa configuram timer0 la 1ms si la fiecare intrerupere sa incrementam o variabila "millis" si cand au trecut 1000ms sa incrementam o alta variabila care sa indice numarul dorit care sa fie verificat prin "if" uri (exact cum este si functia millis in arduino ). Urmatorul pas ar fi sa fie stocate valorile necesare pentru PORTB si PORTD intr-o lista si atunci nici de if-uri nu mai este nevoie. Link spre comentariu
Vizitator Postat Decembrie 12, 2019 Partajează Postat Decembrie 12, 2019 Am reusit sa rezolv problema. Multumesc pentru ajutor. Link spre comentariu
Liviu M Postat Decembrie 12, 2019 Partajează Postat Decembrie 12, 2019 Pai posteaza si solutia. Urmatorul care va avea aceeasi problema si va cauta pe forum va gasi solutia fara sa mai intrebe. Link spre comentariu
vijelie02 Postat Decembrie 12, 2019 Partajează Postat Decembrie 12, 2019 N-o sa vedeti solutia. Sa ceri ajutor e foarte usor dar sa postezi ceva functional/rezolvat e mai greu. 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