adyyo Postat Mai 2, 2012 Partajează Postat Mai 2, 2012 Salutare.Mi-am achizitionat de curand aceasta placa de dezvoltare de la texas instruments in speranta ca voi reusi sa invat si eu cat de cat putina programare de microcontrolere, atata cat sa pot comanda niste LED-uri sau realiza alte aplicatii simple.Am ceva cunostinte de C++(ce am facut prin anul 1 la facultate) dar este prima oara cand incerc programare de microcontrolere.Bon...am inceput cu aplrinsul unui LED, dupa tutorialul dat de TI, apoi am modificat codul pt. a aprinde celalalt LED de pe placuta de dezvoltare. Apoi am facut sa clipeasca alternativ cele doua LED-uri, iar ultima aplicatie a fost introducerea unui for pt. a clipi de un numar finit de ori. Aplicatia in stadiul actual este cel din atasament (Blink.txtBlink.txt).Problema mea este urmatoarea: ca urmator pas, asi vrea sa pot aprinde LED-urile simultan dar nu reusesc. Am incercat sa declar cei doi biti la care se afla LED-urile apoi sa ii aprind dar nu merge. Codul este: while(1) { P1DIR = 0x40; P1OUT = 1; P1DIR = 0x0001; P1OUT = 1; P1OUT = 0x40; P1OUT = 0x0001; _delay_cycles(500); }Dar clipeste doar LED-ul rosu. Cum ar trebui sa arate codul pt. a le aprinde si a le face sa clipeasca simultan?Multumesc. Link spre comentariu
Liviu M Postat Mai 2, 2012 Partajează Postat Mai 2, 2012 Fiecarei iesiri a unui port ii corespunde un bit de directie si un bit de "stare" (High/Low). Fiecare comanda (P1DIR, P1OUT) iti seteaza toti bitii din registri/toate iesirile portului. Daca vrei ca mai multe iesiri sa fie intr-o anumita stare, trebuie sa modifici bitii corespunzatori lor intr-o singura comanda: P1DIR = 0x41;P1OUT = 0x41;sau sa folosesti "masti": P1DIR = 0x40;P1DIR = P1DIR | 0x01; //folosind OR am lasat bitii 7..1 neschimbati si am facut bitul 0 = 1;P1OUT = 0x41; //aici n-are rost sa folosesti masti, pentru ca vrei sa comuti ambele iesit o data Link spre comentariu
Vizitator Postat Mai 2, 2012 Partajează Postat Mai 2, 2012 Pentru mai multe detalii, te rog citeşte atent toate comentariile în română. E codul dat de tine, comentat şi cu o buclă for adăugată la sfârşit. Dacă sunt nelămuriri, întreabă. /* * main.c */ // #include <msp430g2553.h> //Linia asta este buna numai daca //pe MCU-ul din soclu scrie G5535, //al meu e modelul G2231 (asa a venit LaunchPad-ul meu) deci am modificat //cu linia de mai jos:#include "msp430g2231.h"#ifndef TIMER0_A1_VECTOR#define TIMER0_A1_VECTOR TIMERA1_VECTOR#define TIMER0_A0_VECTOR TIMERA0_VECTOR#endifint i;void main(void){ WDTCTL = WDTPW + WDTHOLD; // watchdog timer setup BCSCTL3 |= LFXT1S_2; // clock system setup IFG1 &= ~OFIFG; _bis_SR_register(SCG1 + SCG0); BCSCTL2 |= SELM_3 + DIVM_3; P1DIR = 0x40; // I/O setup //Instructiunea de mai sus seteaza toti pinii portului P1 ca intrare, //mai putin pinul 6, corespunzator LED-ului verde, //pin care este 1 logic, adica setat ca iesire //Setarea se memoreaza, nu e nevoie sa o bagi in bucla for //cel mai simplu ar fi fost sa faci din prima ambii pini de tip iesire //adica si cel corespunzator LED-ului rosu, astfel: //P1DIR = 0x41 P1OUT = 0; //face toate iesirile de pe portul P1 egale cu 0 //adica stinge LED-urile. in cazul de fata stinge doar LED-ul VERDE for(i=0; i < 3; i++) { P1OUT = 0x40; // LED off //instructiunea de mai sus face exact pe dos, //adica _APRINDE_ LED-ul verde, // nu il stinge, cum e scris in engleza _delay_cycles(500); //P1OUT = 0; //nu e gresit dar fi consistent in notatii P1OUT = 0x00; _delay_cycles(500); } //P1DIR = 0x0001; // I/O setup - e pe 8 biti, nu e nevoie de 0x0001 (16 biti) // 0x01 e suficient P1DIR = 0x01; //aceleasi observatii ca la primul IO setup, cu observatia ca //de data asta ai setat ca iesire DOAR pinul corespunzator LED-ului ROsU //restul i-ai setat ca intrare, deci nu vor putea fi folositi pentru a aprinde //altceva decit LED-ul rosu. Cel verde nu se va aprinde //indiferent ce ai scrie la P1OUT, chiar si P1OUT = 0xFF //tot nu aprinde LED-ul verde pentru ca pinul corespunzator lui //l-ai facut de tip intrare in loc sa-l faci de tip iesire P1OUT = 0x00; //face toate iesirile de pe portul P1 egale cu 0 //adica stinge LED-urile. in cazul de fata stinge doar LED-ul ROsU for(i=0; i < 4; i++) { P1OUT = 0x0001; // LED off _delay_cycles(500); P1OUT = 0; _delay_cycles(500); } // ***************************************************** P1DIR = 0x41; // I/O setup // ***************************************************** //Am facut atat bitul 0 (corespunzator LED-ului 1 - ROsU) //cat si bitul 6 (corespunzator LED-ului 2 - VERDE) //de tip iesire P1OUT = 0; for(i=0; i < 3; i++) { P1OUT = 0x40; // LED off - gresit //asta face LED verde ON (il aprinde) _delay_cycles(500); P1OUT = 0; //stinge tot _delay_cycles(500); P1OUT = 0x0001; // LED off - gresit //asta face LED rosu ON (il aprinde) _delay_cycles(500); P1OUT = 0; //stinge tot _delay_cycles(500); } //ca sa clipeasca (le aprinzi/stingi) simultan faci asa: //Observa ca //setarea directiei portului P1 nici nu o mai fac, //a ramas facuta de la bucla for anterioara P1OUT = 0x00; //sting tot, preventiv, oricum LED-urile erau stinse for(i=0; i < 5; i++) { P1OUT = 0x41; //aprinde simultan ambele LED-uri _delay_cycles(500); P1OUT = 0x00; //stinge simultan ambele LED-uri _delay_cycles(500); } } Link spre comentariu
adyyo Postat Mai 2, 2012 Autor Partajează Postat Mai 2, 2012 Am inteles, teoretic. Voi face cateva programele pana reusesc sa inteleg exact si voi reveni cu eventualele probleme. Multumesc mult de ajutor.L.E. RoGeorge, comanda P1OUT = 0x41 imi face toate iesirile de pe portul P1 Output, sau doar iesirile 0 si 6?Dar in cazul in care vreau sa fac de exemplu iesirea 0, iesirea 6 si iesirea 7 Output iar restul sa ramana Input, cum ar trebui sa arate codul? Adresele bit-ilor sunt 0x01, 0x40 si 0x80.L.E. Cred ca am reusit... P1DIR = P1DIR | 0x40 | 0x01 | 0x80;// Output pinii 6 si 0 P1OUT = 0x0;//0 toti pinii for(i=0; i < 5; i++) { P1OUT = 0x41;//toti pinii on _delay_cycles(1000); P1OUT = 0x00;//toti pinii off _delay_cycles(1000); }E corect asa?Multumesc Liviu M Link spre comentariu
adyyo Postat Mai 2, 2012 Autor Partajează Postat Mai 2, 2012 P1DIR = P1DIR | 0x40 | 0x01 | 0x80;// Output pinii 6, 0 si 7 P1OUT = 0x0;//0 toti pinii for(i=0; i < 5; i++) { P1OUT = 0x40 | 0x01;//pin 6 si 0 on _delay_cycles(1000); P1OUT = 0x00;//toti pinii off _delay_cycles(1000); }Pot folis astfel "mastile" pentru a aprinde cate LED-uri am navoie? Link spre comentariu
Vizitator Postat Mai 2, 2012 Partajează Postat Mai 2, 2012 Desigur. Înainte de a compila codul pentru MCU, toate expresiile cu constante sunt evaluate şi înlocuite cu rezultatul evaluării. Următoarele scrieri sunt echivalente P1OUT = 0x40 | 0x01; P1OUT = 0x40 + 0x01; P1OUT = 0x41; P1OUT = 0x44 - 3; P1OUT = 65; P1OUT = BIT6 | BIT0; //BIT0 ... BITF sunt definite in fisierul msp430g2231.h cu ajutorul directivei #define P1OUT = BIT6 + BIT0; Deschide fişierul header corespunzător MCU-ului tău (la mine e msp430g2231.h) ca să vezi ce alte definiţii utile în afară de BIT0 - BITF mai sunt acolo. Link spre comentariu
adyyo Postat Mai 2, 2012 Autor Partajează Postat Mai 2, 2012 Multumesc de informatii.Urmatoarea etapa care o voi incerva in vreo cateva zile va fi sa comand aprinderea LED-urilor din butoane, dar deocamdata ma mai joc cu LED-urile asa. Revin cu un cod dupa ce imi dau seama cum sa preiau comanda de la buton.A si inca ceva, exista un numar finit de cicluri scriere/stergere a MCU? Sper sa nu-l ard tot scriind programele si stergandu-le. Link spre comentariu
MifTy Postat Mai 2, 2012 Partajează Postat Mai 2, 2012 tot în datasheet e dată și informația asta...undeva pe la ”performanțe”, cred (așa erau puse prin toate datasheeturile de mcu-uri care conțin memorie flash citite de mine până acum...) Link spre comentariu
Vizitator Postat Mai 3, 2012 Partajează Postat Mai 3, 2012 Există un număr de scrieri dar e foarte mare. Nu ai cum să-l arzi scriind programe nici dacă îl programezi non stop timp de ani la rând. Probleme de genul ăsta apar numai dacă faci un program care să scrie din greşeală la nesfârţit în aceeaşi pagină din flash. Chiar dacă îl arzi, mai ai un MCU. Kit-ul LaunchPad vine cu 2 MCU-uri, un MSP430G2231 şi încă unul puţin diferit, MSP430G2211, cu comparator în loc de ADC. Pe lângă programator şi cablu USB, mai ai în cutie un cristal de 32768 Hz şi nişte conectori, toate nelipite pe placă. Chiar dacă l-ai arde (vezi că MCU-ul e alimentat la maxim 3.6V, NU la 5V !!!), tot kit-ul costă cam cât un pachet de ţigări, adică fix 4.30 USD fără niciun fel de alte taxe, dacă îl comanzi direct de la Texas Instruments. Download-ează datasheet-urile şi parcurge-le. Vezi că sunt două fişiere. Unul este pentru toată familia MSP430 http://www.ti.com/lit/ug/slau144i/slau144i.pdf şi altul este specific modelului cu care lucrezi http://www.ti.com/lit/ds/symlink/msp430g2231.pdf. Ca să înţelegi ce se întâmplă ai nevoie de amândouă şi, în plus, de manualul de la LaunchPad http://www.ti.com/lit/ug/slau318b/slau318b.pdf . Baftă! Link spre comentariu
adyyo Postat Mai 7, 2012 Autor Partajează Postat Mai 7, 2012 Bon...cu LED-urile am inteles cam toat ce am vrut, am reusit sa le aprind pe rand, sa le aprind odata, sa clipeasca...acum intampin probleme la citirea informatiilor de la butoane. Vreau sa fac un program care, atunci cand tin apasat butonul sa faca ceva, cand nu e apasat sa faca altceva.Din ce am citit pe gogu si de prin programele care le-am mai vazut, chestia asta se face folosind intreruperi...nu prea reusesc sa inteleg cum e treaba cu intreruperile astea. Nu se poate face ceva mai simplu, de genul:if(BIT3=1){expresie}else{expresie}?Sper ca nu stresez pe nimeni, nu vreau mur in gura, doar ca nu gasesc niste exemple de programele simple, cu functiile de baza, dupa care sa ma ghidez si sa inteleg. Link spre comentariu
Vizitator Postat Mai 7, 2012 Partajează Postat Mai 7, 2012 Aşa e, se poate şi fără întreruperi.Încearcă fără frică orice idee, nu ai ce să strici.Totuşi, dacă vei vrea să rulezi codul dat de tine, vei vedea că nu merge.Ghici de ce? Link spre comentariu
Liviu M Postat Mai 7, 2012 Partajează Postat Mai 7, 2012 Ba merge, da' numai cum vrea el. Link spre comentariu
Vizitator Postat Mai 7, 2012 Partajează Postat Mai 7, 2012 Nu merge deloc, nici măcar nu se poate compila. S-a mai scris deja aici: viewtopic.php?p=1001983#p1001983, BIT3 e definit în fişierul "msp430g2231.h" ca fiind: #define BIT3 (0x0008) Instructiunea if (BIT3 = 1)... se traduce: if ((0x0008) = 1)... (0x0008) = 1 nu are sens în C, aşa că nici măcar nu poate fi compilată. Citirea butonului S1 se poate face cu P1.3 sau prin alte metode, cu BIT3 nu se poate. În afară de asta, mai sunt şi alte motive pentru care nu merge. Link spre comentariu
Vizitator Postat Mai 8, 2012 Partajează Postat Mai 8, 2012 Exemplu de program complet: LED-ul verde stă aprins mereu, în timp ce LED-ul roşu se aprinde numai când butonul S2 este ţinut apăsat. #include "msp430g2231.h"#define LED_ROSU BIT0#define LED_VERDE BIT6#define BUTON_S2 BIT3void main(void) { WDTCTL = WDTPW + WDTHOLD; //Stop watchdog timer P1DIR = LED_VERDE | LED_ROSU; //Configureaza pinii P1.0 si P1.6 ca iesiri (restul ca intrari) P1OUT = LED_VERDE; //Aprinde LED-ul verde, de control, stinge restul while(1) { if (!(P1IN & BUTON_S2)) //daca butonul S2 e apasat (P1.3 = 0 inseamna apasat) P1OUT |= LED_ROSU; //atunci aprinde LED-ul rosu (fara sa umble la LED-ul verde) else P1OUT &= ~LED_ROSU; //altfel stinge LED-ul rosu (fara sa umble la LED-ul verde) }} Link spre comentariu
Liviu M Postat Mai 8, 2012 Partajează Postat Mai 8, 2012 Nu merge deloc...Ai dreptate. Iar am raspuns fara sa fiu atent/fara sa ma informez cum trebuie. Sorry. 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