Sari la conținut
ELFORUM - Forumul electronistilor

Putin ajutor cu Texas Instruments Lounchpad


Postări Recomandate

RoGeorge, presupun ca are legatura cu intrebarea 7 de mai sus.Ca sa fac toggle scriu stfel, cred: P1OUT = P1OUT | LED_ROSU ^ 1111 1111 sauP1OUT |= LED_ROSU ^ 1111 1111

Nu-s convins ca cele doua variante ale tale sunt echivalente (desi de data asta cred ca merge), da' cum tot vorbim aici de good practice vin si eu cu o recomandare. Si anume ca atunci cand exista posibilitatea sa "confuzezi" compilatorul (sau sa te confuzezi), sa folosesti cu incredere parantezele.Prima varianta eu as fi scris-o
P1OUT = P1OUT | (LED_ROSU ^ 1111 1111)
LE Am facut un test si mie
010 | 011 ^ 111
imi da diferit de
010 | (011 ^ 111)
, da' nu garantez ca am socotit bine. :jytuiyu
Link spre comentariu
  • Răspunsuri 155
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

Top autori în acest subiect

Fara paranteze cred ca ordinea operatiilor va fi

Din pacate, din cate stiu eu, nu exista nici un felde standard pentru modul in care compilatoarele evalueaza operatiile, asa ca sunt sanse ca unele compilatoare sa compileze in ordinea gandita/dorita de tine si altele nu. De-aia am recomandat parantezele.
Link spre comentariu

Oricum, tin sa va multumesc amandorura RoGeorge si Liviu M pentru ca ati avut rabdare cu mine si mi-ati explicat foarte bine toate lucrurile astea care, pentru un cunoscator, sunt banalitati dar pentru mine sunt o mare realizare!

Link spre comentariu

RoGeorge, presupun ca are legatura cu intrebarea 7 de mai sus.Ca sa fac toggle scriu stfel, cred: P1OUT = P1OUT | LED_ROSU ^ 1111 1111 sauP1OUT |= LED_ROSU ^ 1111 1111

LED_ROSU ^ 1111 1111 înseamnă0000 0001 ^ 1111 1111 adică 1111 1110 (vezi tabela de adevăr a funcţiei XOR)Mai departe,P1OUT = P1OUT | 1111 1110;va seta toţi biţii din P1OUT pe 1, mai puţin cel corespunzător LED-ului roşu, pe care îl lasă neschimbat.Nu e ce vroiam noi.Funcţia XOR are o particularitate interesantă:- dacă fac XOR între un bit oarecare şi 0, obţin acelaşi lucru, adică bitul oarecare neschimbat- dacă fac XOR între un bit oarecare şi 1, obţin inversarea bitului oarecareLa final, un program care schimbă starea ambelor LED-uri (face toggle) pentru LED-urile roşu şi verde.Dacă butonul este apăsat, LED-urile clipesc in contratimp, altfel clipesc simultan.
#include "msp430g2231.h"#define	LED_ROSU	BIT0#define	LED_VERDE	BIT6#define	BUTON_S2	BIT3void main(void) {		int i;   	WDTCTL = WDTPW + WDTHOLD;      //Stop watchdog timer   	P1DIR = LED_VERDE | LED_ROSU;	//Configureaza pinii P1.0 si P1.6 ca iesiri (restul ca intrari)	P1REN = BUTON_S2;				//Activeaza rezistoarele de pe intrarea P1.3	P1OUT = LED_VERDE | BUTON_S2;   //Aprinde LED-ul verde, stinge restul, iar pe P1.3 activeaza pull up resistor	while(1) {		if (!(P1IN & BUTON_S2))	{//daca butonul S2 e apasat (P1.3 = 0 inseamna apasat)			P1OUT |= LED_ROSU;	// aprinde LED-ul rosu, restul bitilor din P1OUT raman nemodificati			P1OUT &= ~LED_VERDE; }	// stinge LED-ul verde, restul bitilor din P1OUT raman nemodificati		else {			P1OUT |= LED_ROSU;	// aprinde LED-ul rosu, restul bitilor din P1OUT raman nemodificati			P1OUT |= LED_VERDE;	}	// aprinde LED-ul verde, restul bitilor din P1OUT raman nemodificati				for (i = 1; i <= 10; i++) {				P1OUT ^= LED_ROSU | LED_VERDE; // inverseaza (toggle) simultan starea ambelor LED-uri			_delay_cycles(500000);		}			}}
Link spre comentariu

Văd că aţi chat-uit, nu glumă.

 

Fara paranteze cred ca ordinea operatiilor va fi

Din pacate, din cate stiu eu, nu exista nici un felde standard pentru modul in care compilatoarele evalueaza operatiile, asa ca sunt sanse ca unele compilatoare sa compileze in ordinea gandita/dorita de tine si altele nu. De-aia am recomandat parantezele.
Ordinea operaţiilor în C este bine stabilită şi se numeşte "precedenţa operatorilor".

În C, fiecare operator are o anumită prioritate.

- Operatorii cu prioritate mai mare se execută înaintea celor cu prioritate mai mică.

- Operatorii cu aceeaşi prioritate se execută de la stânga la dreapta.

- Priorităţile pot fi modificate cu ajutorul parantezelor rotunde. Operaţiile dintre paranteze se execută de la interior către exterior.

Detalii găseşti cu Google, cum ar fi:

http://web.cs.mun.ca/~michael/c/op.html

 

De exemplu, pentru operaţii logice pe biţi (bitwise operators), operaţiile unare se execută înaintea operaţiilor binare, adică "~" se evaluează inaintea unui "|" sau a unui "&". Între "AND" şi "OR" logic, "AND" are prioritate mai mare. În logica pe biţi, operaţia "ŞI" este echivalentul înmulţirii iar "SAU" este echivalentul adunării. De aici şi ordinea operaţiilor. "NOT" este echivalentul operaţiei "-", de schimbare de semn (nu "-" ca la scăderea între două numere).

 

Atunci când nu eşti sigur de precedenţa operatorilor (adică de ordinea operaţiilor), mai bine foloseşti paranteze decât să te trezeşti cu o expresie evaluată altfel decât vroiai.

 

Dacă îţi merge şi ai înţeles exemplul de program din mesajul anterior, trecem la debouncing.

Link spre comentariu
Văd că aţi chat-uit, nu glumă.

E chiar asa de rau? :nas:

 

În C, fiecare operator are o anumită prioritate...

- Operatorii cu aceeaşi prioritate se execută de la stânga la dreapta.

Esti sigur de chestia asta?

Ca eu am ramas in cap cu documentatii de genul:

An expression can contain several operators with equal precedence. When several such operators appear at the same level in an expression, evaluation proceeds according to the associativity of the operator, either from right to left or from left to right. The direction of evaluation does not affect the results of expressions that include more than one multiplication (*), addition (+), or binary-bitwise (& | ^) operator at the same level. Order of operations is not defined by the language. The compiler is free to evaluate such expressions in any order, if the compiler can guarantee a consistent result.
, de unde si confuzia. Se pare ca trebuie sa mai studiez.
Link spre comentariu

Cine a zis că e rău că aţi chat-uit?

Mă plângeam doar, pentru că aveam în editare un răspuns la o întrebare mai veche şi nu mă înduram să-l arunc.

 

Vorbeam despre acelaşi tip de operatori, în cazul nostru despre cei învăţaţi, operatorii pe biţi.

 

Ordinea operaţiilor este bine stabilită la toţi operatorii, indiferent de limbaj, altfel nu vei putea şti niciodată ce rezultat întoarce o expresie.

Chiar în tabelul pe care l-ai dat ca link, ai toate regulile pentru operatorii din C.

 

În afară de precedenţă, asociativitatea contează şi ea, bineînţeles, dar lecţiile nu au ajuns încă la noţiunea respectivă.

Link spre comentariu

Am inteles tot ce e scris in program. Functioneaza, doar ca la apasarea pe S2 nu schimba modul de clipire de fiecare data; vreau neaparat sa inteleg cum fac debounce-ul ca e foarte enervant ce se intampla la apasarea butonului.

Link spre comentariu

...Pentru debouncing ideea este să citeşti S2 şi dacă îl găseşti apăsat atunci mai faci o citire peste câteva milisecunde, să zicem peste 5 ms. Dacă şi atunci e tot apăsat atunci poţi să spui că ai o apăsare fermă, altfel consideri că a fost vibraţie.

Încearcă să faci un program care să implementeze ideea de mai sus.
Link spre comentariu

Cine a zis că e rău că aţi chat-uit?

Tin minte o perioada in care chatul era vazut asa, degradant...

Chiar în tabelul pe care l-ai dat ca link, ai toate regulile pentru operatorii din C.

Regulile/precedenta o cam stiu. Ce se pare ca confuzez inca e directia de evaluare a unei expresii cu mai mult de o operatie (cu aceeasi precedenta, normal). Si inca nu m-ai convins. :jytuiyu O sa-ti dau dreptate dupa ce-mi gasesc "biblia" (C programming language de K&R) pe care se pare ca trebuie s-o mai rasfoiesc. :da
Link spre comentariu

Am reusit ceva ceva...merge mult mai bine, dar mai are cate o scapare odata la 6-7 apasari. Problema e ca nu stiu exact car inseamna un ciclu de delay asa ca am facut probe pana am gasit ceva cat de cat acceptabil:

 

if (!(P1IN & BUTON_S2))		 _delay_cycles(160000);	 	 if (!(P1IN & BUTON_S2))	 		 if ((P1OUT & LED_ROSU))	 			 P1OUT = BUTON_S2;	 		 else	 			 P1OUT = 0x09;

L.E. Imi cer scuze, nu stiam cum sa fac sa apara asa cum il am eu scris in ccs.

Link spre comentariu

Incearca te rog sa folosesti tag-urile code si indexarile cand postezi cod, altfel e un chin sa-l citesti.In cazul de fata, aproape as zice ca-ti lipsesc niste acolade ({}).LE Incet-incet ma convingeti sa-mi caut launchpad-ul prin sertare.

Link spre comentariu

Incearca te rog sa folosesti tag-urile code si indexarile

Tag code-urile şi indexările sunt cu totul altceva.

Alinierea frumoasă a codului în scopul unei citiri mai uşoare, se numeşte identare.

 

------------------------------------------

 

Total offtopic:

Ca să nu creadă lumea că sunt complet nebun scriind pagini întregi, sau că fac pe deşteptul insistând pe formalism şi pe folosirea corectă a terminologiei, încerc să mă explic.

 

Acum ceva vreme vroiam să pornesc un proiect numit

Microcontroller? Ce Satana mai e si asta?!

ca mai apoi să-l pot transforma într-o carte. Până acum nu am mai publicat şi mi-am dat seama foarte repede că, indiferent cât de bine sau de rău aş cunoaşte subiectul, ca să mă fac înţeles de cititorul începător, nu e o treabă uşoară.

 

În discuţia de aici încercam să îmi reglez exprimarea astfel încât să conţină numai informaţii corecte, complete şi să fie uşor de înţeles. Până acum nu mi-a reuşit. Deşi adyyo prinde repede şi e interesat de subiect, se pare că eu am carenţe mari la exprimare concisă în scris. Când explic "pe gură" e mult mai simplu, astfel de probleme nu apar, pentru că în afară de cuvinte mai sunt alte elemente care ajută la exprimare, cum ar fi intonaţia sau gesturile. În scris totul se întâmplă încet, se pierde şirul ideilor, există tendinţa de a reveni şi a modifica fraza, trebuie să faci economie de cuvinte, să ţii cont de semnele de punctuaţie, de diacritice, etc. Pe lângă exprimarea prin viu grai, scrisul e un adevărat coşmar, cel puţin pentru mine.

Pe scurt, constat că nu ştiu să scriu. :cry:

Link spre comentariu

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări