ratza Postat Ianuarie 24, 2016 Partajează Postat Ianuarie 24, 2016 XOR e riscant pentru toggle, fiindcă nu-i păstrează intacţi pe ceilalţi. Link spre comentariu
bobinatorul Postat Ianuarie 24, 2016 Partajează Postat Ianuarie 24, 2016 (editat) 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 Ianuarie 24, 2016 de bobinatorul Link spre comentariu
Vezi Muti Postat Ianuarie 24, 2016 Partajează Postat Ianuarie 24, 2016 (editat) 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 Ianuarie 24, 2016 de Vezi Muti Link spre comentariu
Liviu M Postat Ianuarie 24, 2016 Partajează Postat Ianuarie 24, 2016 (editat) 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 fivoid 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 Ianuarie 24, 2016 de Liviu M Link spre comentariu
mars01 Postat Ianuarie 24, 2016 Partajează Postat Ianuarie 24, 2016 (editat) 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 Ianuarie 24, 2016 de mars01 Link spre comentariu
ratza Postat Ianuarie 24, 2016 Partajează Postat Ianuarie 24, 2016 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
bobinatorul Postat Ianuarie 24, 2016 Partajează Postat Ianuarie 24, 2016 Ahaaaa incepe sa se faca lumina,matematica booleana de clasa a 5-a sau a 6-a,inmultire adunare ,sau exclusiv. Ma opresc momentan cu intrebarile mai trebuie studiata parte cu parantezele si acoladele inca imi dau dureri de cap. Link spre comentariu
Liviu M Postat Ianuarie 24, 2016 Partajează Postat Ianuarie 24, 2016 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
mars01 Postat Ianuarie 24, 2016 Partajează Postat Ianuarie 24, 2016 (editat) La ce te referi Liviu? Stiam ca liniile multiple in #define le faci cu backslash ... Iar un ";" pus intr-un #define (LE: la 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 Editat Ianuarie 24, 2016 de mars01 Link spre comentariu
Liviu M Postat Ianuarie 24, 2016 Partajează Postat Ianuarie 24, 2016 (editat) 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 Ianuarie 24, 2016 de Liviu M Link spre comentariu
Vezi Muti Postat Ianuarie 24, 2016 Partajează Postat Ianuarie 24, 2016 Iar un ";" pus intr-un #define genereaza o gramada de erori de numai stii de tine. Nu este o regula. ok? Poti pune ";" intr-un #define daca asa cere sintaza macroului; Link spre comentariu
mars01 Postat Ianuarie 24, 2016 Partajează Postat Ianuarie 24, 2016 (editat) @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 Ianuarie 24, 2016 de mars01 Link spre comentariu
Liviu M Postat Ianuarie 24, 2016 Partajează Postat Ianuarie 24, 2016 Nu este o regula. ok? Poti pune ";" intr-un #define daca asa cere sintaza macroului; Probabil ca exprimarea corecta ar fi "nu termina un #define cu ;". Sau? Link spre comentariu
iuli09 Postat Ianuarie 24, 2016 Partajează Postat Ianuarie 24, 2016 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
bobinatorul Postat Ianuarie 24, 2016 Partajează Postat Ianuarie 24, 2016 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
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