Sari la conținut
ELFORUM - Forumul electronistilor

Invatat programare de la zero


Postări Recomandate

Tocmai ce citeam si am dat peste licurici(operandul negatie).

 

void main() {  PORTB = 0; // initializare port B(toate iesirile in low)  TRISB = 0; // port B setat ca iesire

  while(1) {   PORTB =  ~PORTB; // basculare port B(isi schimba starea)   Delay_ms(1000);   // cu o pauza de 1 secunda  }}

Interesan e ca pare mai simplu.Intradevar modifica toti pinii portului dar avnd in vedere ca avem doar un led nu are importanta(zic eu...)

Editat de bobinatorul
Link spre comentariu
PORTB =  ~PORTB; // basculare port B(isi schimba starea)

schimba stare intregului port B. bitii care au fost 0 devin 1 si invers.

daca folosesti un singur PIN (bit din portul B) merge si asa.

 

totusi, schimbarea unui bit (toggle) dintr-un PORT se face cu XOR.

a explicat Liviu mai sus.

LE: si mai jos :)

Editat de Vezi Muti
Link spre comentariu

XOR e riscant pentru toggle, fiindcă nu-i păstrează intacţi pe ceilalţi.

De ce nu? Bitii pe care vrei sa-i lasi nemodificati ii "xorezi" cu 0. Nu?

Tocmai ce citeam si am dat peste licurici(operandul negatie).

void main() {  PORTB = 0;				 // initializare port B(toate iesirile in low)  TRISB = 0;				 // port B setat ca iesire  while(1) {    PORTB =  ~PORTB;		 // basculare port B(isi schimba starea)    Delay_ms(1000);		  // cu o pauza de 1 secunda  }}

 

Varianta care schimba numai pinul RB0 ar fi
void main() {  PORTB = 0;                 // initializare port B(toate iesirile in low)  TRISB = 0;                 // port B setat ca iesire  while(1) {    PORTB ^= 0x01;         // basculare RB0    Delay_ms(1000);          // cu o pauza de 1 secunda  }}
Desi in cazul asta cel mai simplu e probabil cu:
void main() {  PORTB = 0;                 // initializare port B(toate iesirile in low)  TRISB = 0;                 // port B setat ca iesire  while(1) {    RB0 =  ~RB0;         // basculare RB0(isi schimba starea)    Delay_ms(1000);          // cu o pauza de 1 secunda  }}
Varianta cu XOR e mai interesanta pentru biti pentru care nu avem deja "nume" sau cand vrem sa inversam mai mult de un bit si mai mutin de un byte odata. Editat de Liviu M
Link spre comentariu

Liviu, corect. '==' inseamna testare si nu numai cand gasesti acest operator in instructiuni conditionale, "if-uri"

 

RB0_bit == ON; //aprindem LED-ul ???

 

ai scapat "==" in loc de "=" cam peste tot.

 

Exact.

Am spus ca o sa discutam programul ulterior si o sa o facem.

As fi vrut sa includ si un #define scris defectuos, cu punct si virgula la final. Dar nu am discutat despre ce reprezinta directivele preprocesor.

 

Sunt cateva posibilitati de a crea bug-uri aproape indetectabile. Una este data de folosirea operatorului '==' in locul '=' si viceversa. Partea frumoasa este ca programul se compileaza fara erori :) si nu ai nici-un indiciu la ce se intampla.

Uneori se invata mai bine din greseli decat din programe impecabile ...

Dar am sa continui mai tarziu ...

Editat de mars01
Link spre comentariu

De ce nu? Bitii pe care vrei sa-i lasi nemodificati ii "xorezi" cu 0. Nu?

Varianta cu XOR e mai interesanta pentru biti pentru care nu avem deja "nume" sau cand vrem sa inversam mai mult de un bit si mai mutin de un byte odata.

 

Ai dreptate, nu ştiu la ce m-am gîndit.

Link spre comentariu

As fi vrut sa includ si un #define scris defectuos, cu punct si virgula la final.

Pe asta-l prinde compilerul. Mai interesante sunt cele cu comentarii "pe linie", gen 

#define _XTAL_FREQ 20000000 //frecventa clock

Am senzatie ca mai nou compilerele se descurca sa ignore comentariile astea, dar astfel de comentarii in define-uri pot da batai de cap.

Link spre comentariu

La ce te referi Liviu? Stiam ca liniile multiple in #define le faci cu backslash ...

 

Iar un ";" pus intr-un #define (LEla finalul #define - completare oferita de @Liviu_M) genereaza o gramada de erori de numai stii de tine. Cauti la paranteze de te plictisesti cand de fapt problema este dintr-un ';' pus unde nu trebuie (LE: adica la finalul liniei cu #define). Vorbesc din experienta :d

Editat de mars01
Link spre comentariu

mai trebuie studiata parte cu parantezele si acoladele inca imi dau dureri de cap.

Poti sa intrebi linistit (aici sau pe vreun topic dedicat). Eu, cel putin, raspund cu placere intrebarilor punctuale (asta inseamna ca intrebatorul isi da silinta). 

La ce te referi Liviu?

Ma refer la faptul ca in faza de precompilare numele definit de #define e inlocuit cu valoarea efectiva a acestuia. Cu alte cuvinte, in exemplul de mai sus, de fiecare data cand precompilatorul intalneste _XTAL_FREQ il inlocuieste cu

2000000 //frecventa clock

. Daca _XTAL_FREQ statea undeva la mijlocul unei expresii, ce vine dupa // se pierde.

Eu inca n-am avut probleme (am folosit si eu comentarii de genul asta dupa #define-uri), da' am citit pe undeva despre posibilitatea unor astfel de probleme, asa ca de atunci incerc sa le evit (scriu comentarii "block" /*..*/).

Editat de Liviu M
Link spre comentariu

@Vezi  Muti

Cum spuneam ... inca nu am discutat despre directivele preprocesor.

Oricum, buna treaba ca ai detectat chestia cu '==' in loc de '='. Arata ca ai fost atent.

 

Se pare ca stapanesti destul de bine partea cu directivele preprocesor, nu vrei sa scrii putin despre acestea aici pe topic? Poate invat ceva nou ...

 

@Liviu M

Intrebam pentru ca nu am avut probleme niciodata cu comentariile inline cu #define-uri. Dar e bine de stiut ca se poate (sau a fost posibil).

Editat de mars01
Link spre comentariu

 

 

delay_ms(10); //aceasta este intarzierea esentiala pentru cronometrarea timpului cat LED-ul sta aprins

 

nu inteleg aceasta linie . 

 

Linia precedenta  ("timp = timp - 1;") realizeaza practic temporizarea (variabila timp va scadea cu o unitate pentru fiecare 100ms care trec) , atunci de ce mai este nevoie si aceasta intarziere (delay_ms(10))   ?

Link spre comentariu

Pai cred ca daca nu ar fi temporizarea de 10 variabila timp ar scadea instantaneu de la 6000 la 0 in fuctie de viteza cu care se executa instructiunile.Cred totusi ca ar fi trebuit sa fie delay 1sec pentru a trece cele 10 minute.Ceva de genu Timp=timp-1 Delay 1sec Until timp=zeroDe fapt timpul scade cu o unitate odata la 10 ms.Dupa 60 de secunde ajunge la zero.Asta inseamna ca delay trebuie sa fie 100ms pentru 10 minute timp in care ledul sta aprins.100msX6000=600sec.Eu asta inteleg.

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