adyyo Postat Iunie 12, 2012 Autor Partajează Postat Iunie 12, 2012 Am reusit eu sa fac ceva...Aproape Se deruleaza la stanga, Doar ca prima linie nu reusesc sa o fac sa miste. In plus cred ca ar trebui sa mai pun o bucla for ca sa reia de la capat literea deoarece acum, cand ajunge la capatul stang, nu se reia din partea dreapta. Atasez link-ul la filmare sa vedeti ce vreau sa zic. //-----Matrice LED 5x8, v1.2-----#include "msp430g2553.h"#define UART_RXD BIT2 // RxD is on P1.2#define RST BIT5#define CLK BIT4#define COL_MAX 5int i;int n;int j;char display_buffer[5]; //---Tabelele de caractere---const int LITERA_A[5] = {0x1C, 0x22, 0x3E, 0x22, 0x22};void pulseP1(int bit){ P1OUT |= bit; P1OUT &= ~bit;}void main(void){ WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer WDTCTL = WDT_MDLY_0_5; // Start Watchdog Timer (interval is ~0.5ms) IE1 |= WDTIE; // Enable WDT+ interrupts P2DIR = 0x3F; // setez toti biti lui P2 ca iesiri P1DIR = RST | CLK; __enable_interrupt(); // Enable interrupts (global) for(;;) { for (i = 0; i < 5 ; i++) { display_buffer[i] = LITERA_A[i]; //încarca litera in bufferul care va fi afisat pe LED-uri for (i = 0; i < 5 ; i++) { display_buffer[i] >>= 1; } } //for (i = 0 ; i < 5 ; i++) _delay_cycles(1000000); } //for(;;)} //main#pragma vector = WDT_VECTOR__interrupt void Watchdog_Timer(void){ static int col; col++; if (col > COL_MAX) { col = 0; pulseP1(RST); } //if (col > COL_MAX) else { pulseP1(CLK); } //else //afiseaza pe LED-uri coloana desenata in buffer P2OUT = display_buffer[col];} //interrupt https://picasaweb.google.com/1001569190 ... 6591282002 Link spre comentariu
Liviu M Postat Iunie 12, 2012 Partajează Postat Iunie 12, 2012 Vezi ca in continuare ai doua bucle for imbricate cu acelasi contor (i). In mod normal ar trebui sa nu mearga nimic corect. Cand intri in bucla exterioara il faci pe i=0, dupa care in cea interioara il faci 5, motiv pentru care se termina si bucla exterioara. Cel putin asa-mi da mie.Defineste inca un contor pentru bucla interioara (j sau contorShift sau contorDeplasare sau ucContorDeplasare daca-l faci unsigned char, ca sa stii ce fel de variabila e...). Link spre comentariu
adyyo Postat Iunie 12, 2012 Autor Partajează Postat Iunie 12, 2012 Stiam ca am doua bucle imbricate, dar am vazut ca merge si am zis ca e bun asa Acum am facut calumea, si am reusit sa fac un A care danseaza stanga - dreapta Este ca mai mare realizare pana cum. Simt ca sunt pe drumul cel bun. Peste 10 minute cred ca il dau gata :daL.E. Dupa 15 minute, L-am facut la psihic pe nenea launchpad Link spre comentariu
Vizitator Postat Iunie 13, 2012 Partajează Postat Iunie 13, 2012 Foarte bine că l-ai făcut să meargă. Pune şi codul final ca să-l putem comenta. N-ar strica şi o schemă actualizată, cea de la început nu cred că mai corespunde. 1. Ca regulă generală, când faci modificări la un proiect, documentează-le cât mai repede. Altfel vei uită şi, peste ceva vreme, nu vei mai şti ce şi cum ai făcut. Stiam ca am doua bucle imbricate, dar am vazut ca merge si am zis ca e bun asa Faptul că ai două bucle "for" imbricate (adică una e inclusă în cealaltă) NU deranjează. Poţi avea oricâte bucle imbricate. Problema era că foloseai aceeaşi variabilă "i" pe post de contor în ambele bucle. Urmarea era că cea de-a doua buclă îi suprascria contorul primei bucle. Aşa ceva nu are cum să meargă corect, fiecare buclă trebuie să aibă contorul ei propriu, pe care să nu-l altereze altcineva, îţi scriseseră deja două persoane. Dacă ceva e contrar aşteptărilor (adică, în cazul tău, părea că merge deşi ţi s-a spus că nu are cum să meargă) atunci investighezi ce se întâmplă, în niciun caz nu treci mai departe până nu lămureşti ce se întâmplă. 2. Ca regulă generală, orice contradicţie trebuie investigată şi rezolvată. În cazul de faţă îţi rămânea o coloană pe loc, dar putea să însemne, la fel de bine, prăbuşirea unui avion. icon_hang Citeşte aici despre bucle: http://www.codingunit.com/c-tutorial-fo ... d-continue Câte ceva şi despre variabile locale şi globale: http://www.lix.polytechnique.fr/~libert ... _vars.html Ca să înţelegi variabilele, cine le poate modifica şi de unde (variable scope or valability), când sunt create sau distruse: http://www.eskimo.com/~scs/cclass/notes/sx4b.html display_buffer[i] << 1; //roteste În linia de mai sus, pe lângă faptul că am mâncat semnul egal, am folosit impropriu cuvântul "roteşte" în comentariu. Corect era să fi folosit "deplasează". Atunci cănd deplasezi spre stânga, bitul cel mai din stânga se pierde, iar în dreapta se introduce automat un bit de valoare zero. Dacă vrei să roteşti litera, adică scrisul să iasă pe o parte şi să intre pe partea cealaltă, va trebui să salvezi bitul cel mai din stânga şi, după ce faci deplasarea la stânga, să îl suprapui peste bitul cel mai din dreapta. Jumper-ul RXD lasă-l scos, altfel ai doi pini de tip ieşire legaţi în paralel, cel de la MCU-ul tău şi cel de la MCU-ul LaunchPad-ului. Când două ieşiri se bat cap în cap, rezultatul e imprevizibil. Am observat şi un "magic number" la tine în cod, adică un 5. Aşa ceva nu se face, vorbim despre asta după ce pui codul care merge. Până atunci citeşte despre hardcoding: http://en.wikipedia.org/wiki/Hard_coding. 3. Ca regulă generală, hardcoding-ul este un stil defectuos de programare, deci trebuie evitat. L-am facut la psihic pe nenea launchpad E bine că l-ai dovedit, dar să ştii că până acum, bătăliile tale au fost cu C-ul, nu cu LaunchPad-ul. Încă n-am început să vorbim despre LaunchPad şi despre MSP430. Link spre comentariu
adyyo Postat Iunie 13, 2012 Autor Partajează Postat Iunie 13, 2012 Nu am postat ieri ca mai aveam putin de lucru. Iata si codul final, pana in momentul de fata. //-----Matrice LED 5x8, v1.2-----#include "msp430g2553.h"#define UART_RXD BIT2 // RxD setat pe bit2#define RST BIT5 // RST setat pe bit5#define CLK BIT4 // CLK setat pe bit4int x;int i; // Variabila ichar display_buffer[5]; // Matricea display_buffer cu 5 elementeunsigned char ContorLinie;unsigned char ContorColoana; //---Tabelele de caractere---const int LITERA_A[5] = {0x0E,0x11,0x1F,0x11,0x11};const int LITERA_D[5] = {0x0F,0x11,0x11,0x11,0x0F};const int LITERA_R[5] = {0x0F,0x11,0x0F,0x09,0x11};const int LITERA_I[5] = {0x0E,0x04,0x04,0x04,0x0E};const int LITERA_N[5] = {0x11,0x13,0x15,0x19,0x11};void pulseP1(int bit) //Comanda impuls CLK/RST{ P1OUT |= bit; P1OUT &= ~bit;} //---Programul principal---void main(void){ WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer WDTCTL = WDT_MDLY_0_5; // Start Watchdog Timer (interval is ~0.5ms) IE1 |= WDTIE; // Enable WDT+ interrupts P2DIR = 0x3F; // setez toti biti lui P2 ca iesiri P1DIR = RST | CLK; // Setez RST si CLK iesiri pe P1 __enable_interrupt(); // Enable interrupts (global) for(;;) { for (i = 0; i < 5 ; i++) { display_buffer[i] = LITERA_A[i]; // Incarca litera in bufferul care va fi afisat pe LED-uri } // End for (i = 0 ; i < 5 ; i++) _delay_cycles(1000000); for (ContorLinie = 0; ContorLinie < 6 ; ContorLinie++) { for (ContorColoana = 0 ; ContorColoana < 5 ; ContorColoana++) { display_buffer[ContorColoana] <<= 1; // Muta fiecare bit cu cate un pas la stanga } // End for (ContorColoana = 0 ; ContorColoana < 5 ; ContorColoana++) _delay_cycles(100000); } // End for (ContorLinie = 0; ContorLinie < 6 ; ContorLinie++) for (i = 0; i < 5 ; i++) { display_buffer[i] = LITERA_D[i]; // Incarca litera in bufferul care va fi afisat pe LED-uri } // End for (i = 0 ; i < 5 ; i++) _delay_cycles(1000000); for (ContorLinie = 0; ContorLinie < 6 ; ContorLinie++) { for (ContorColoana = 0 ; ContorColoana < 5 ; ContorColoana++) { display_buffer[ContorColoana] <<= 1; // Muta fiecare bit cu cate un pas la stanga } // End for (ContorColoana = 0 ; ContorColoana < 5 ; ContorColoana++) _delay_cycles(100000); } // End for (ContorLinie = 0; ContorLinie < 6 ; ContorLinie++) for (i = 0; i < 5 ; i++) { display_buffer[i] = LITERA_R[i]; // Incarca litera in bufferul care va fi afisat pe LED-uri } // End for (i = 0 ; i < 5 ; i++) _delay_cycles(1000000); for (ContorLinie = 0; ContorLinie < 6 ; ContorLinie++) { for (ContorColoana = 0 ; ContorColoana < 5 ; ContorColoana++) { display_buffer[ContorColoana] <<= 1; // Muta fiecare bit cu cate un pas la stanga } // End for (ContorColoana = 0 ; ContorColoana < 5 ; ContorColoana++) _delay_cycles(100000); } // End for (ContorLinie = 0; ContorLinie < 6 ; ContorLinie++) for (i = 0; i < 5 ; i++) { display_buffer[i] = LITERA_I[i]; // Incarca litera in bufferul care va fi afisat pe LED-uri } // End for (i = 0 ; i < 5 ; i++) _delay_cycles(1000000); for (ContorLinie = 0; ContorLinie < 6 ; ContorLinie++) { for (ContorColoana = 0 ; ContorColoana < 5 ; ContorColoana++) { display_buffer[ContorColoana] <<= 1; // Muta fiecare bit cu cate un pas la stanga } // End for (ContorColoana = 0 ; ContorColoana < 5 ; ContorColoana++) _delay_cycles(100000); } // End for (ContorLinie = 0; ContorLinie < 6 ; ContorLinie++) for (i = 0; i < 5 ; i++) { display_buffer[i] = LITERA_A[i]; // Incarca litera in bufferul care va fi afisat pe LED-uri } // End for (i = 0 ; i < 5 ; i++) _delay_cycles(1000000); for (ContorLinie = 0; ContorLinie < 6 ; ContorLinie++) { for (ContorColoana = 0 ; ContorColoana < 5 ; ContorColoana++) { display_buffer[ContorColoana] <<= 1; // Muta fiecare bit cu cate un pas la stanga } // End for (ContorColoana = 0 ; ContorColoana < 5 ; ContorColoana++) _delay_cycles(100000); } // End for (ContorLinie = 0; ContorLinie < 6 ; ContorLinie++) for (i = 0; i < 5 ; i++) { display_buffer[i] = LITERA_N[i]; // Incarca litera in bufferul care va fi afisat pe LED-uri } // End for (i = 0 ; i < 5 ; i++) _delay_cycles(1000000); for (ContorLinie = 0; ContorLinie < 6 ; ContorLinie++) { for (ContorColoana = 0 ; ContorColoana < 5 ; ContorColoana++) { display_buffer[ContorColoana] <<= 1; // Muta fiecare bit cu cate un pas la stanga } // End for (ContorColoana = 0 ; ContorColoana < 5 ; ContorColoana++) _delay_cycles(100000); } // End for (ContorLinie = 0; ContorLinie < 6 ; ContorLinie++) } // End for(;;)} // End main#pragma vector = WDT_VECTOR__interrupt void Watchdog_Timer(void){ static int col; col++; // incrementare col if (col > 5) // Daca col > 5 { col = 0; // Adu contoru la 0 pulseP1(RST); // Reseteaza numarator coloane } // End if (col > COL_MAX) else // Daca nu { pulseP1(CLK); // Schimba coloana } // End else P2OUT = display_buffer[col]; // Afiseaza pe matrice buffer-ul} // End interrupt Iata si filmuletul... https://picasaweb.google.com/1001569190 ... 4093797602 Mai am 1 lucru de facut, vreau sa scap de toate for-urile pentru fiecare litera, acum incerc sa fac o bucla care sa imi incarce pe rand cate o litera. Am zis de la inceput ca is aproape 0 in ceea ce consta programarea, dar pana la urma o invat si pe asta cat de cat L.E. Foarte utile link-urile, fix problema legata de variabile nu o intelesesem eu prea bine si desigur bucla. Link spre comentariu
Vizitator Postat Iunie 13, 2012 Partajează Postat Iunie 13, 2012 1. Pune te rog şi schema montajului de acum, cea veche nu mai corespunde. Cu ocazia asta scoate-i şi grila aia de puncte, ca să se vadă mai clar. 2. Din film reiese că nu merge cum am vrut, după ce pui schema, corectăm împreună. 3. Codul din întrerupe merge bine cu o condiţie, să ai intrările de la U5 (ULN2801) legate într-un anume fel. Cred că am scris cum trebuie legate, am impresia că nu ai citit tot ce s-a scris, sau nu ai citit suficient de atent. Nu te grăbi, ia-le pe rând şi, dacă ceva nu e clar, întreabă. 4. De ce sunt aşa în dreapta buclele for? Se strică indentarea când copiezi programul în elforum, sau aşa le-ai scris în editorul din CCS? În CCS se pot muta stânga/dreapta mai multe rânduri deodată. Pentru indentare foloseşti TAB sau spaţii? 5. Acum l-ai făcut şi mai hardcoded, de ce ai renunţat la constanta COL_MAX? L.E. Foarte bună intenţia de a scăpa de for-urile pentru fiecare literă. Fă o funcţie care să ştie să scrie o literă, apoi chemi funcţia, cu parametru litera care urmează să fie scrisă. După aceea vorbim despre codul ASCII şi definim toate literele şi cifrele, ca să putem construi mai târziu o funcţie căreia să îi dai textul şi ea să-l afişeze, adică: print("Hello world"); să scrie Hello world pe LED-uri. Link spre comentariu
adyyo Postat Iunie 13, 2012 Autor Partajează Postat Iunie 13, 2012 1. Trebuie sa redesenez schema, maine seara o voi posta, in seara asta trebuie sa invat pentru ultimu examen de maine 4. In editor am facut indentarea astfel incat sa imi fie mie usor sa o urmaresc. In general folosesc tab. S-a modificat cand am pus codul pe forum. Am vrut sa atasez un text sa vezi exact cum arata, dar vad ca si in text se modifica identarea.5. M-am gandt ca nu am nevoie de constanta din moment ce am doar 5 linii... si nu are cum sa se schimbe vreodata... Presupun ca nu am gandit bine Link spre comentariu
Vizitator Postat Iunie 14, 2012 Partajează Postat Iunie 14, 2012 Atunci, lasă jucăriile şi nu mai pierde vremea pe Internet, examenele au prioritate. Vorbim după ce se termină sesiunea. Baftă! Link spre comentariu
adyyo Postat Iunie 14, 2012 Autor Partajează Postat Iunie 14, 2012 Azi am avut ultimul examen. De acum incolo pana la licenta sunt liber Revenind. Am facut schema exact cum e acum realizata. Sincer nu stiu de ce se aprind slab restul LED-urilor care in mod normal trebuiau sa fie stinse. Legat de conexiune, stiu ca mi-ai zis sa leg LED-urile in ordine la P1 de la 0 la 7, dar le-am legat la P2 ca asa mi-a venid la indemana. Trebuiau neaparat legate la P1? Matrice LED 5x8.pdf Link spre comentariu
picolo Postat Iunie 14, 2012 Partajează Postat Iunie 14, 2012 Azi am avut ultimul examen. De acum incolo pana la licenta sunt liber Revenind. Am facut schema exact cum e acum realizata. Sincer nu stiu de ce se aprind slab restul LED-urilor care in mod normal trebuiau sa fie stinse. Legat de conexiune, stiu ca mi-ai zis sa leg LED-urile in ordine la P1 de la 0 la 7, dar le-am legat la P2 ca asa mi-a venid la indemana. Trebuiau neaparat legate la P1?sunt curios. care-i este tema licentei tale? are legatura cu LED-urile,si cu P1 de la 0 la 7 ?ps: da Liviu , cunosc "picolo strikes again (posturi pline de "substanta" da' fara nici o utilitate)"Ce lagatura are cu "Alte microcontrolere" ce ziceti voi aici?Prezentarea rimei imperecheate,incrucisate sau imbratisate a loop-urilor for {}? Link spre comentariu
adyyo Postat Iunie 14, 2012 Autor Partajează Postat Iunie 14, 2012 Din pacate licenta mea nu are nici o legatura cu MCU-urile. Discutia de aici este pentru timpul meu liber, un hobi foarte interesant. Si ca fapt divers, specializarea mea e pe partea de energetica deci...In ceea ce priveste discutia noastra, din cate stiu eu MSP430 nu are legatura nici cu PIC-urile, nici cu Atmel deci nu vad care-i off-topicul. Ba chiar, datorita bunavointei si rabdarii lui RoGeorge am reusit sa adunam cateva pagini bune de cod si explicatii amanuntite care ar putea reprezenta un tutorial foarte bun pentru oricare incepator care vrea sa inteleaga bazele programarii... Link spre comentariu
Liviu M Postat Iunie 14, 2012 Partajează Postat Iunie 14, 2012 Ce lagatura are cu "Alte microcontrolere" ce ziceti voi aici?Poate ca n-are nici o legatura, da' asa suntem noi baieti buni si ajutam (chiar offtopic) un coleg politicos si cu dorinta de invatat. Ce nu inteleg e de ce te miri de offtopic tocmai tu, de la care cred ca am vazut maxim 2 posturi la subiect si utile. Link spre comentariu
Vizitator Postat Iunie 15, 2012 Partajează Postat Iunie 15, 2012 Despre denumirea fişierelor şi despre versiuni. Deja avem două scheme "Matrice LED.pdf" şi "Matrice LED 5x8.pdf". Acum ştiu că cea cu 5x8 în coadă e ultima, dar peste 2-3 ani, sigur n-am să mai ştiu. La fel, avem deja mai multe variante de soft. În scurt timp ne vom încurca în fişiere. Pentru a evita încurcăturile şi pentru a face referire cu uşurinţă la o anumită variantă de fişier, s-au inventat diverse sisteme de numerotare a fişierelor, sau versiunile. http://en.wikipedia.org/wiki/Software_versioning sau, mai general, http://www.google.ro/search?q=version+numbering Există multe scheme de numerotare. Mie îmi place să pun două numere. Incrementarea celui mic o fac la orice modificare sau corectură, oricât de mică, cel mare la transformări majore. De exemplu, "Matrice LED.pdf" va deveni "Matrice LED v0.1.pdf", iar "Matrice LED 5x8.pdf" devine "Matrice LED v0.2.pdf". Alt exemplu, trecerea la afişarea pe întreruperi ar putea primi un increment pentru numărul major de versiune, pe când corectarea instrucţiunii în care mâncasem egalul, primeşte un increment pentru numărul minor. Am observat că ai folosit versiuni la software, ai făcut foarte bine. Aceeaşi practică se aplică şi la hardware. De ce se aprind slab unele LED-uri? Observăm că fenomenul dă impresia că lumina s-ar scurge din LED-urile de mai sus în cele de mai jos. N-am găsit altă exprimare mai bună. Numai LED-urile de sub cele aprinse sunt luminate uşor, altele nu. Asta se întâmplă pentru că întâi se dă pulsul de trecere la următoarea coloană, apoi se schimbă datele din P2. Circuitul integrat 4017 numără pe frontul crescător, deci, în timpul dintre frontul crescător şi instrucţiunea "P2OUT = display_buffer[col];", la ieşirea lui P2 încă se află datele de la vechea coloană. Această afişare nedorită, pentru foarte scurt timp, a vechii coloane pe noua coloană, face să apară acele LED-uri aprinse slab, ca o umbră de la coloana anterioară. Ca să scapi de asta, mai întâi stingi coloana veche, pe urmă dai pulsul de trecere la următoarea coloană, apoi aprinzi noua coloană. Nu s-ar fi văzut dacă programai ceasul la 16 MHz şi divizorul de la WDT+, astfel încât întreruperile să vină mult mai rar în raport cu durata unei instrucţiuni, dar suficient de repede încât să nu pâlpâie afişajul, aşa cum vorbisem când s-a trecut la varianta cu întreruperi. Greşeala este cel mai bun profesor. Nu e cazul să ai atitudinea asta: atunci cănd ceva nu e bine. În procesul de învăţare, greşelile sunt binevenite. Din greşeli, înveţi. Totul e să nu le repeţi mai târziu. Rânduri sau coloane? Deşi le-ai numit coloane, dacă mă uit la litera afişată, văd 5 rânduri de câte 8 LED-uri, nu 5 coloane. Cu toate astea, propun să zicem în continuare că avem 5 coloane. Dacă vei vrea să scrii şi cu litere mici, vei vedea că ai nevoie de mai mult de 5 pixeli. Atunci vei fi nevoit să roteşti afişajul cu 90*, iar rândurile de acum vor deveni coloane. Minimul pentru un set complet de caractere este 7 pixeli înălţime şi 5 pixeli lăţime. Cum legăm cele 8 rânduri la MCU? Le poţi lega oricum, dar cu cât sunt mai amestecate, cu atât va fi mai greu să faci afişarea. Cel mai simplu ar fi ca fiecărui rând să-i corespundă un bit dintr-un octet. Ziceam să le pui la rând pe P1, pentru că la MCU-ul meu (MSP430G2231), P1 era singurul port la care erau disponibili toţi cei 8 biţi. Dacă la al tău (MSP430G2553) ai disponibili toţi biţii din P2, atunci poţi lega cele 8 rânduri la P2. Oricum ai face, leagă toate cele 8 rînduri. Nu are rost să iroseşti 25% din afişaj. Dacă nu-i pui la rând, atunci modifică funcţia de afişare astfel încât fiecare bit din "display_buffer[col]" să ajungă pe rândul corespunzător de LED-uri, adică să facă maparea corectă a celor 8 biţi din "display_buffer[col]" la pinii de ieşire. Nu programa hardcoded. Chiar dacă 5 ar apărea într-un singur loc (deşi în cazul tău nu-i adevărat, 5 apare de multe ori), ăsta nu e un motiv să bagi "numere magice" prin program. Programele trebuie să fie cât mai clare şi mai uşor de înţeles, atât de tine cât şi de alţii. Claritatea codului e foarte importantă, te fereşte de greşeli şi scade costurile de întreţinere a programului. Un alt avantaj major în favoarea folosirii unui identificator în locul unui număr, este că, mai târziu, poţi modifica uşor codul pentru mai multe coloane. Parcă văd că îi mai pui căteva matrici de LED-uri. Never say never. Acum probabil crezi că exagerez eu, dar dacă ai avea un program cu mii de linii de cod pline de numere magice, îmi vei da dreptate. Dacă va mai trebui şi să modifici ceva prin acel program, atunci toate numerele alea vor deveni coşmarul tău. Asta ca să nu mai amintesc de soft scris în echipă. Ar mai fi multe de spus, dar s-a făcut târziu. Dacă ai timp, corectează umbrele, scoate numerele magice, leagă toate rândurile la MCU şi citeşte despre reprezentarea caracterelor şi despre codul ASCII. Cred că mai scăpaseră ceva greşeli la afişare, verificăm după ce vii cu o nouă versiune. Ce rol au R1 şi R2 din schemă? Link spre comentariu
adyyo Postat Iunie 15, 2012 Autor Partajează Postat Iunie 15, 2012 Bon... -Am scos "prelingerea de lumina" (imi place cum suna) de pe display stergand afisarea anterioara -Am scapat de toate cifrele magice -Am conectat toate LED-urile la P1 pentru ca pe P2 aveam disponibil doar de la 0 la 5 -Am facut un nou filmulet -Si desigur am updatat schema. Am fost foarte ocupat in dupa-amiaza asta https://picasaweb.google.com/1001569190 ... 8032068386 L.E. Uitasem de rezistori. I-am pus la inceput cand am probat montajul fara MCU. Mi s-a parut ca sunt prea sensibile portile lui 4017 si prindeau impulsuri parazite. Am vrut sa fac un ecranaj si au ramas acolo. Mi se parea mie ca lipseste ceva din postul meu /*---------------------------Matrice LED 5x8, v1.3Made by adyyo15-06-2012---------------------------*/#include "msp430g2553.h"#define RST BIT5 // RST setat pe bit5#define CLK BIT4 // CLK setat pe bit4int i; // Variabila iconst int ColMax = 5; // Numar maxim coloaneconst int RandMax = 8; // Numar maxim de randurichar display_buffer[5]; // Matricea display_buffer cu 5 elementeunsigned char ContorLinie; // Contor pentru linieunsigned char ContorColoana; // Contor pentru coloana//---Tabelele de caractere---const int LITERA_A[5] = {0x0E,0x11,0x1F,0x11,0x11};const int LITERA_D[5] = {0x0F,0x11,0x11,0x11,0x0F};const int LITERA_R[5] = {0x0F,0x11,0x0F,0x09,0x11};const int LITERA_I[5] = {0x0E,0x04,0x04,0x04,0x0E};const int LITERA_N[5] = {0x11,0x13,0x15,0x19,0x11};void pulseP2(int bit) //Comanda impuls CLK/RST{ P2OUT |= bit; P2OUT &= ~bit;}//---Programul principal---void main(void){ WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer WDTCTL = WDT_MDLY_0_5; // Start Watchdog Timer (interval is ~0.5ms) IE1 |= WDTIE; // Enable WDT+ interrupts P1DIR = 0xFF; // setez toti biti lui P2 ca iesiri P2DIR = RST | CLK; // Setez RST si CLK iesiri pe P1 __enable_interrupt(); // Enable interrupts (global) for(;;) {for (i = 0; i < ColMax ; i++){ display_buffer[i] = LITERA_A[i]; // Incarca litera in bufferul care va fi afisat pe LED-uri} // End for (i = 0; i < ColMax ; i++) _delay_cycles(1000000); for (ContorLinie = 0; ContorLinie < RandMax ; ContorLinie++) { for (ContorColoana = 0 ; ContorColoana < ColMax ; ContorColoana++) { display_buffer[ContorColoana] <<= 1; // Muta fiecare bit cu cate un pas la stanga } // End for (ContorColoana = 0 ; ContorColoana < ColMax ; ContorColoana++) _delay_cycles(100000); } // End for (ContorLinie = 0; ContorLinie < RandMax ; ContorLinie++)for (i = 0; i < ColMax ; i++){ display_buffer[i] = LITERA_D[i]; // Incarca litera in bufferul care va fi afisat pe LED-uri} // End for (i = 0; i < ColMax ; i++) _delay_cycles(1000000); for (ContorLinie = 0; ContorLinie < RandMax ; ContorLinie++) { for (ContorColoana = 0 ; ContorColoana < ColMax ; ContorColoana++) { display_buffer[ContorColoana] <<= 1; // Muta fiecare bit cu cate un pas la stanga } // End for (ContorColoana = 0 ; ContorColoana < ColMax ; ContorColoana++) _delay_cycles(100000); } // End for for (ContorLinie = 0; ContorLinie < RandMax ; ContorLinie++)for (i = 0; i < ColMax ; i++){ display_buffer[i] = LITERA_R[i]; // Incarca litera in bufferul care va fi afisat pe LED-uri} // End for (i = 0; i < ColMax ; i++) _delay_cycles(1000000); for (ContorLinie = 0; ContorLinie < RandMax ; ContorLinie++) { for (ContorColoana = 0 ; ContorColoana < ColMax ; ContorColoana++) { display_buffer[ContorColoana] <<= 1; // Muta fiecare bit cu cate un pas la stanga } // End for (ContorColoana = 0 ; ContorColoana < ColMax ; ContorColoana++) _delay_cycles(100000); } // End for for (ContorLinie = 0; ContorLinie < RandMax ; ContorLinie++)for (i = 0; i < ColMax ; i++){ display_buffer[i] = LITERA_I[i]; // Incarca litera in bufferul care va fi afisat pe LED-uri} // End for (i = 0; i < ColMax ; i++) _delay_cycles(1000000); for (ContorLinie = 0; ContorLinie < RandMax ; ContorLinie++) { for (ContorColoana = 0 ; ContorColoana < ColMax ; ContorColoana++) { display_buffer[ContorColoana] <<= 1; // Muta fiecare bit cu cate un pas la stanga } // End for (ContorColoana = 0 ; ContorColoana < ColMax ; ContorColoana++) _delay_cycles(100000); } // End for for (ContorLinie = 0; ContorLinie < RandMax ; ContorLinie++)for (i = 0; i < ColMax ; i++){ display_buffer[i] = LITERA_A[i]; // Incarca litera in bufferul care va fi afisat pe LED-uri} // End for (i = 0; i < ColMax ; i++) _delay_cycles(1000000); for (ContorLinie = 0; ContorLinie < RandMax ; ContorLinie++) { for (ContorColoana = 0 ; ContorColoana < ColMax ; ContorColoana++) { display_buffer[ContorColoana] <<= 1; // Muta fiecare bit cu cate un pas la stanga } // End for (ContorColoana = 0 ; ContorColoana < ColMax ; ContorColoana++) _delay_cycles(100000); } // End for for (ContorLinie = 0; ContorLinie < RandMax ; ContorLinie++)for (i = 0; i < ColMax ; i++){ display_buffer[i] = LITERA_N[i]; // Incarca litera in bufferul care va fi afisat pe LED-uri} // End for (i = 0; i < ColMax ; i++) _delay_cycles(1000000); for (ContorLinie = 0; ContorLinie < RandMax ; ContorLinie++) { for (ContorColoana = 0 ; ContorColoana < ColMax ; ContorColoana++) { display_buffer[ContorColoana] <<= 1; // Muta fiecare bit cu cate un pas la stanga } // End for (ContorColoana = 0 ; ContorColoana < ColMax ; ContorColoana++) _delay_cycles(100000); } // End for for (ContorLinie = 0; ContorLinie < RandMax ; ContorLinie++) _delay_cycles(2000000); } // End for(;;)} // End main#pragma vector = WDT_VECTOR__interrupt void Watchdog_Timer(void){ static int col; P1OUT &= ~0xFF; // Stinge coloana anterioara col++; // incrementare col if (col > ColMax) // Daca col > 5 { col = 0; // Adu contorul la 0 pulseP2(RST); // Reseteaza numarator coloane } // End if (col > COL_MAX) else // Daca nu { pulseP2(CLK); // Schimba coloana } // End else P1OUT = display_buffer[col]; // Afiseaza pe matrice buffer-ul} // End interrupt Matrice LED 5x8 v1.3.pdf Link spre comentariu
adyyo Postat Iunie 15, 2012 Autor Partajează Postat Iunie 15, 2012 Nu inteleg de ce se modifica indentarea cand postez pe forum. In CCS arata mai frumos... 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