Jump to content


Photo

Invatat programare de la zero


  • Please log in to reply
218 replies to this topic

#1 OFFLINE   riciu

riciu

    Membru

  • Membri
  • PipPip
  • 148 posts

Posted 20 January 2016 - 01:06 AM

Dupa multe tentative de a invata programarea microcontrolerelor, limbaje, Arduino etc... am decis sa ma apuc sa recitesc si documentatia de pe site-ul Microchip pt PIC 16F84,varianta tradusa in romana. De 4 zile citesc la ea si in afara de o gramada de expresii si cuvinte straine pt mine , nu inteleg nimic. Culmea, ca despre limbajul C si PIC-uri se spune chiar si aici ca e ceva simplu. O fi simplu pt altii, dar eu deja sint satul de microcontrolere ca dupa ce am intors netul pe toate partile nu am gasit nici o documentaite care sa explice programarea ca la prosti. Asadar, plin de nervi, am zis sa mai incerc o metoda. Sa-mi dea cineva un program de aprins un led si apoi sa-mi explice fiecare litera si fiecare expresie din programul ala, astfel incat dupa ce inteleg practic, sa inteleg si teoretic ce se spune prin documentatii.. La mine mai merge metoda asta. Daca nu, ma apuc de invatat circuite logice si gata. Simt ca pierd timp degeaba doar cititnd robotic si neintelegand nimic. Cred ca sint trei ani de cand ma chinui cu microcontrolerele astea si sint zero. Nici macar din cartea lui Surducan, care se spune ca e explicata bine si pe intelesul oricui, nu am reusit sa inteleg nimic. 



Cu_reclama

Cu_reclama
  • Membri

#2 OFFLINE   mars01

mars01

    上昇

  • Membri
  • PipPip
  • 907 posts
  • Locatie:Bucuresti / Pitesti

Posted 20 January 2016 - 02:23 AM

Ca sa stim de unde plecam.

Un microcontroler este un procesor la care este atasata ceva memorie flash pentru stocare program, memorie RAM pentru executie program si periferice.

 

Analogic vorbind memoria flash la microcontrolere este cum este HDD-ul la PC iar memoria RAM la microcontrolere este la fel ca memoria RAM la PC-uri.

Simplist vorbind, la pornirea microcontrolerului, se proceseaza programul din memoria flash linie dupa linie, se incarca datele din memoria flash in memoria RAM, procesorul din controler va procesa datele din RAM si va salva datele in alte locatii din memoria RAM. Ulterior aceste date vor fi folosite pentru a face o schimbare in periferice.

Perifericele sunt "interfata" cu lumea exterioara. 

 

Toate procesele din controler au un singur scop: ca la finalul operatiilor sa se execute o schimbare in lumea exterioara. Ca schimbi starea unui pin dintr-un port ("portul" este o forma de organizare hardware dar si software a pinilor), sau trimiti o informatie pe un port de comunicatie sau etc se numeste ca te interfatezi cu lumea exterioara si schimbi ceva.

 

Asadar. Simplist vorbind. Ai o parte de procesare a datelor. Adica pornind de la o situatie data, preiei informatie (poate de la lumea exterioara prin pinii controlerului sau poate intern de la un timer de ex samd), faci ceva cu informatia si apoi intr-un final controlezi perifericele ca sa faca ceva.

 

Un concept esental este cel  de "registru".

Registrii sunt folositi ca sa controleze perifericele. Cu registrii configurezi perifericele, dar cu registrii trimiti si informatie catre lumea exterioara, sau dupa caz, in registri se stocheaza prima oara datele provenite din lumea exterioara, reala.

Registrii sunt chestii hardware dar aceasi denumire de registri se foloseste si pentru "variabilele" (mai corect spus adrese speciale in memorie) prin care se seteaza din software acei registri.

 

Poti sa iti imaginezi un registru ca o colectie de intrerupatoare. Pentru procesoarele uzuale in lumea "hobby" adica cele pe 8biti, registrii sunt o "colectie de 8 intrerupatoare". O grupa de 8 intrerupatoare are un nume, registrul cutare sau cutare. Fiecare "intrerupator" se poate actiona individual, independent de celalalt (ma rog, e o discutie si pe aici dar sa o lasam asa pe moment). Fiecare "intrerupator" are o anume functie, "face ceva" unui periferic. Sunt registri care actioneaza exlusiv in controler dar nu vorbim despre aceia acum.

 

Spre ex luam un controler cum ar fi 16F877A pentru ca este plin net-ul de exemple cu acesta.

 

Sa zicem ca vrem sa aprindem un LED si sa stingem LED-ul la un interval timp de sa zicem 500ms, asa-numit-ul "licurici".

 

Bun. Cum facem aceasta?

 

Tradus noi vrem ca un pin al controlerului sa isi schimbe starea de la nivel LOW (adica "zero" logic =~ 0V) la nivel HIGH (adica "unu" logic =~ 5V) in urmatoarea secventa:

pin controler HIGH (~5Volti)
pauza 500ms
pin controler LOW (~0Volti)
pauza 500ms

si tot asa la infinit.

 

Faptul ca noi schimbam starea pin-ului intre HIGH si LOW inseamna ca acel pin va functiona in regim DIGITAL.

Ce facem mai departe?

Citim datasheet-ul pentru PIC16F877A.

Search Google "16F877A pdf", download datasheet. la mine primul link este acesta de la Sparkfun, dar este OK: https://cdn.sparkfun.../PIC16F877A.pdf

 

Ne alegem un pin al controlerului care sa aprinda LED-ul, citim datasheet-ul si alegem un pin care este parte al unui asa numit "port". In cazul nostru alegem pinul 2 care este parte a PORTA. Toti pinii controlerului (cu cateva exceptii) sunt grupati in aceste porturi. In cazul 16F877A sunt grupati in porturile: A, B, C, E.

Exceptiile sunt pinii de alimentare si pinii unde se conecteaza oscilatorul extern. La alte controlere doar pinii de alimentare sunt exceptii si restul pinilor sunt toti organizati in porturi.

 

Buuun, ne alegem sa zicem pinul 2. Este notat cu RA0/AN0. Aceasta inseamna ca pinul are functii multiple. Uzual la controlere este sa poti face mai multe chestii pe acelasi pin dar nu simultan. Functiile pinului se configureaza din ... registrii asociati.

RA0 arata ca pinul este parte din portul A, poate fi configurat ca intrare sau iesire digitala (adica reactioneaza doar la HIGH si LOW cand este intrare si ofera nivele de HIGH si LOW cand este configurat ca iesire) si este controlat digital de bit-ul ("intrerupatorul") 0 din registrul PORTA.

Atentie: PORTA este un cuvant cheie si poate fi folosit ca atare in program. Se scrie legat, PORTA.

AN0 arata ca pinul poate fi configurat si ca intrare analogica. Mai concret poate fi configurat ca intrare ADC (convertor analogic digital) adica intrarea accepta o tensiune analogica cu orice valoare intre 0 volti si 5volti.

 

Noi vom configura pinul 2 ca si iesire digitala unde vom conecta LED-ul. Asadar deja stim ca vom lucra cu RA0 si vom trebui sa dezactivam AN0 de pe acel pin.

 

Ne uitam dupa I/O ports (input / output ports), vad ca sunt la pagina 41. 

 

La pagina 43, tabelul 4-2 vedem ca portul A are asociati un numar de registri.

Daca te uiti la poza cu pinii controlerului pe la inceputul datasheet-ului o sa vezi ca portul A are asociati pinii de la 2 la 7; nu sunt decat 5 pini in portul asta si nu 8 cum am zis dar e uzual sa mai gasesti porturi "incomplete" din cauza limitarii date de numarul de pini - sunt standarde la numarul de pini per capsula.

 

Registrii asociati pentru portul A sunt:

PORTA, TRISA, CMCON, CVRCON, ADCON1.

Citesti despre fiecare registru in parte si ce face fiecare "intrerupator" mai corect spus, bit, din fiecare din registrii de mai sus.

 

Mai pe scurt, dupa ce citesti o sa te lamuresti ca din:

- PORTA, bit 0, vei schimba starea pinului 2 (pe care l-am ales noi sa il folosim)

- TRISA, bit 0, vei configura pinul 2 ca si iesire digitala.

- CMCON - in acest registru trebuie dezactivezi comparatorul (periferic care este conectat se pare si el la acest pin cu ceva)

- ADCON1 - in acest registru trebuie sa deazctivam perifericul de intrare analogica pentru pinul 2

 

Va urma.


Edited by mars01, 20 January 2016 - 03:00 AM.


#3 OFFLINE   mars01

mars01

    上昇

  • Membri
  • PipPip
  • 907 posts
  • Locatie:Bucuresti / Pitesti

Posted 20 January 2016 - 02:56 AM

Ce am facut mai sus a fost sa ne familiarizam cu ce o sa avem de-a face in program.

Dar am sarit peste cateva chestii esentiale.

 

Prima treaba care trebuie facuta este configurarea initiala a controlerului. 

 

Asadar,

PASUL 1: configurarea controlerului

 

Aceasta este descrisa in datasheet la pagina 143,sectiunea 14.1 CONFIGURATION BITS.

Acel registru 14-1: CONFIGURATION WORD se modifica conform necesarului. 

 

La unele compilatoare C pentru PIC cum ar fi XC8 produs chiar de Microchip, configurarea aceasta se face direct in program, inainte de orice altceva cu ajutorul unor directive #pragma config.

Alte compilatoare C pentru PIC cum este de ex mikroC for PIC produs de Mikrolectronica, seteaza valorile acestui registru intr-un mod grafic, din proprietatile proiectului.

 

PARANTEZA: Proiectul ... hmm .. poate nici asta nu stii ce este. In lumea moderna, cand faci un program C pentru controlere, usual trebuie mai intai sa faci un proiect. De regula te plimba printr-un "wizard" in care in diversi pasi iti cere sa spui locatia unde stochezi acest proiect, numele sau, ce controler folosesti, cum spuneam mai sus unele compilatoare te lasa sa setezi cuvintele de configurare (registrul de care vorbeam mai sus, Configuration Words) si apoi salveaza o structura de foldere in locatia unde ai spus tu sa il salveze.

Este o chestie de bucatarie interna a compilatoarelor (de fapt mai corect spus al IDE-ului = integrated development enviroment, practic editorul unde vei scrie codul plus alte cateva chestii cum ar fi un debugger, simulator etc).

 

Sigur, poti programa si in Notepad sau Notepad++, salvezi cu extensia .c ca sa stii ca nu e un text aiurea dar apoi va trebui sa faci tu compilarea la nivel de linie de comanda ceea ce nu cred ca vrei.

END PARANTEZA.

 

Registrul acesta CONFIGURATION WORDS este ceva mai lung, are 14biti dupa cum vezi (0 ... 13)

bit 13 CP il facem 0 = nu vrem sa protejam la copiere :d

bit 12 il lasam cum este pentru ca nu este implementat

bit 11 DEBUG = 1 - nu ma intereseaza sa fac debug, poate vreau sa fac ceva cu pinii RB6, RB7 dar este doar alegerea mea. Nu te incurca sa il faci 0 doar ca nu este util in acest caz ca nu facem debugging

bit 10 si bit 9 WRT1-WRT0 ii facem 1 pe amandoi - dezactivam WRITE protection. De ce? Pentru ca nimic nu imi spune ca am nevoie sa protejez la scriere. Vei umbla aici doar cand in design-ul tau o sa apara informatii ca ai nevoie de asa ceva

bit 8 CPD = 1 - pentru ca nu vreau sa protejez la scriere EEPROM-ul. Poate o sa scriu pe acolo, nu e cazul aici dar de ce sa imi bag bete-n roti :)

bit 7 LVP = 0 - ce sa zic ... nu am folosit niciodata low voltage programming si nici nu am auzit pe cineva sa foloseasca asa ca ... il facem OFF adica scriem zero pe acest bit. "Intrerupatorul" este OFF

bit 6 BOREN = 0 - dezactivam brown-out detection - o chestie foarte utila in medii zgomotoase dar noi doar aprindem un LED, nu?

bit 5 si bit 4 sunt neimplementati de Microchip asa ca ii lasam in pace

bit 3 PWRTEN = 1 - bitul asa este activ LOW asa ca atunci cand il facem 1 de fapt il dezactivam. Daca l-am activa ar intarzia putin pornirea controllerului ca sa lase timp sa se stabileze totul: tensiune alimentare, oscilator etc. O chestie buna dar aici nenecesara. Poti daca vrei sa il si activezi facand-ul zero, nu deranjeaza.

bit 2 WDTEN = 0 - se dezactiveaza WATCH-DOG-ul. Asta este un periferic de care nu vreau sa discut aici, este o alta discutie. E suficient sa spun ca daca il activezi atunci procesorul  o sa stea intr-un reset continuu daca nu faci ceva in program.

bit 1 si bit 0 FOSC1:FOSC0 = 01 adica bit 1 = 0 iar bit 0 = 0. Foarte IMPORTANT. Ii spunem astfel controllerului ca am optat sa ii conectam un cuartz (adica un High Speed Oscillator) pe pinii dedicati (pinii 13 si 14)

 

Repet, facem 0 sau 1 bitii aia de mai sus dar in unele medii de dezvoltare (IDE-uri) se face toata treaba grafic, selectand chestii cu ON sau OFF pentru optiunile respective care sunt si descrise sumar acolo.

Alte medii de dezvoltare/compilatoare ofera tot chestii ON si OFF pentru a iti fi usor dar undeva in spate, acei ON si OFF sunt "tradusi" tot in 1 sau in 0.


Edited by mars01, 20 January 2016 - 03:08 AM.


#4 OFFLINE   mars01

mars01

    上昇

  • Membri
  • PipPip
  • 907 posts
  • Locatie:Bucuresti / Pitesti

Posted 20 January 2016 - 03:50 AM

Pentru exemplul nostru am sa ma folosesc de IDE-ul si compilatorul mikroC for PIC produs de mikroElectronica.

Motivul este simplitatea. Este mai usor de lucrat cu acest mediu de dezvoltare (Integrated Development Enviroment (IDE) + compilator)

 

1. Mai intai cream un proiect.

 

15qunvd.jpg

 

2. Apoi setam proiectul: nume, locatie, controler folosit, frecventa oscilatorului folosit si foarte important trebuie bifat (daca nu este deja) "Open Edit Project Window to set Configuration bits"

 

16itgtd.jpg

 

3. Pasul urmator, nu avem fisiere de adaugat (librarii cum le spun eu sau cum le spun unii, biblioteci :) ) asa ca ... click NEXT

 

e84ky0.jpg

 

4. Apoi, pentru incepatori este mai sigur sa includeti toate librariile de functii oferite "moca" de mikroC si click FINISH

 

2e5p9bp.jpg

 

5. Se dechide fereastra unde se configureaza GRAFIC, registrul (registrii) Configuration Words

 

2hweetc.jpg

 

Dupa cum vedeti aici aveti si optiuni de ales, mai simplu fiind grafice, se poate vedea si controllerul folosit cat si frecventa pe care doriti sa o folositi pentru oscilator. 

ATENTIE: frecventa folosita pentru oscilator (am selectat HS oscilator deci frecventa va fi data de un cuartz conectat pe pinii 12 si 13 ai controlerului) nu trebuie sa fie mai mare decat frecventa maxima care este data in specificatiile din datasheet. Prin primele pagini.

Am subliniat cuartz pentru ca asta intelege Microchip prin HS oscillator.

 

Se poate vedea ce rezulta in urma configurarii din stanga ferestrei.

In dreapta scrie CONFIG: $2007: 0x2F0A

 

$2007 este adresa in memoria controllerului unde se gaseste registrul acesta CONFIGURATION WORDS.

Cum spuneam, dpdv software, registrii sunt niste adrese in memorie unde sunt scrisi bitii registrului, unul dupa altul, de la cel mai mare spre cel mai mic (adica se incepe cu bitul 13 si se termina cu bitul 0). Chestia aceasta se numeste "little endian" adica cel mai mic bit (bitul 0, denumit si LSB adica least semnificative bit) este ultimul iar cel mai mare bit (in cazul nostru bitul 13) este primul bit (adica MSB = most semnificative bit).

 

iar 0x2F0A este forma hexazecimala (mai condensata vizual decat forma binara) a setarilor facute din drop down list-urile din stanga.

 

In datasheet o sa gasiti bitii in fomat binar asa ca sa scriem 0x2F0A in format binar ca sa vedem ce am setat noi (folosesc pentru conversie calculatorul din Windows setat in Programmer mode).

 

0x2F0A = 0010 1111 0000 1010

 

Primii doi biti, adica 15 si 14 nu sunt folositi.

Bit 13 = 1 deci CP = 1

Bit 12 = 0 este neimplementat deci nu conteaza ce este aici

bit 11 = 1 deci DEBUG = 1

bit 10 = 1 deci WRT1 = 1

bit 9 = 1 deci WRT0 = 1

bit 8 = 1 deci CPD = 1

bit 7 = 0 deci LVP = 0

bit 6 = 0 deci BOREN = 0

bit 5 = 0 neimplementat de Microchip asa ca nu conteaza

bit 4 = 0 neimplementat de Microchip asa ca nu conteaza

bit 3 = 1 deci PWRTEN = 1

bit 2 = 0 deci WDTEN = 0

bit 1 = 1 deci FOSC1 = 1

bit 0 = 0 deci FOSC0 = 0

 

Semnificatia bitilor ma descris-o mai sus dar se gaseste si la pagina 144 din datasheet.

 

Observati in ultima poza, ca in stanga au fost create un set de directoare (foldere) iar in folder-ul SOURCES a aparut un fisier blink.c al carui continut se vede ca este doar functia void main(). Functia aceasta este functia care efectiv este executata de controler. Restul de eventuale functii (grupari de instructiuni la modul simplist spus) sunt toate apelate si folosite din aceasta functie principala.

Nu se poate fara aceasta functie.

 

Ma opresc aici deocamdata, va urma cu codul efectiv.


Edited by mars01, 20 January 2016 - 04:05 AM.


#5 OFFLINE   of-of

of-of

    Membru

  • Banati
  • PipPip
  • 181 posts

Posted 20 January 2016 - 04:18 AM

O initiativa mai mult decat laudabila. O lectie pe zi ar fi extraordinar. Am un singur PIC16F84A-04/P, nefolosit. E bun de ceva sau e prea vechi ?


Edited by of-of, 20 January 2016 - 04:30 AM.


#6 OFFLINE   spark

spark

    vesnic incepator

  • Membri
  • PipPip
  • 305 posts
  • Locatie:Romania

Posted 20 January 2016 - 07:32 AM

@mars01__multumiri , pentru curs__ai curaj nu gluma

am pregatit caietul si pixul

""

 

0x2F0A = 0010 1111 0000 1010

0x2F0A__este adresa hexazecimala ??????????????

iar 0010  1111  0000  1010__este corespondentul binar ??????

scuze pina prind smecheria___am incercat sa ma imprietenesc cu FLOWCODE dar mai am doi neuroni si ii las de saminta ca nu se stie

asteptam lecson-2



#7 OFFLINE   pinky

pinky

    Membru avansat

  • Membri
  • PipPipPipPip
  • 1,496 posts
  • Locatie:Timisoara

Posted 20 January 2016 - 07:45 AM

Astept si eu continuarea. Multumesc.

#8 ONLINE   pop_ady44

pop_ady44

    incurca lume

  • Membri
  • PipPipPipPip
  • 1,718 posts
  • Locatie:maramures romanesti

Posted 20 January 2016 - 08:28 AM

Frumos explicat  ,chiar o sa urmaresc  si eu topicu .



#9 ONLINE   GeoMar

GeoMar

    Membru avansat

  • Membri
  • PipPipPipPip
  • 2,075 posts
  • Locatie:Mereni - Teleorman

Posted 20 January 2016 - 09:45 AM

Foarte bine explicat si detaliat.

 

Astept si eu cu nerabadare continuarea "lectiilor", in functie de timpul liber al colegului mars01.

 

Felicitari pentru initiativa.  :aplauze

 

Deja m-am "abonat" la acest topic.



#10 OFFLINE   spark

spark

    vesnic incepator

  • Membri
  • PipPip
  • 305 posts
  • Locatie:Romania

Posted 20 January 2016 - 09:56 AM

chestia cu ""blinking led"" este cam naspa

daca martianul nostru ar avea bunavointa sa inceapa un exemplu cu un contor ( numarator up/down ) pe lcd

poate asa inteleg mai bine cum se ""misca bitii""



#11 OFFLINE   elmar

elmar

    Membru evoluat

  • Membri
  • PipPipPipPipPip
  • 5,194 posts

Posted 20 January 2016 - 10:27 AM

Bravo  frate! Eşti tare!...mă bucur că mai există OAMENI care vor să facă ceva pentru semenii săi!

Am să încerc să urmăresc şi eu aceste lecţii cu mare interes, poate se prinde ceva şi de mine...

Din păcate, sunt analfabet şi-n acest domeniu...dar, aş vrea măcar să încerc să fiu ceva mai sus de atât!Poate,poate ...

 

Multumesc!

 

P.S. Eu aş zice să-l lăsăm să-şi facă(ţină) lecţia aşa cu doreşte el! Că dacă începem cu fel de fel de pretenţii ..


Edited by elmar, 20 January 2016 - 10:28 AM.


#12 OFFLINE   riciu

riciu

    Membru

  • Membri
  • PipPip
  • 148 posts

Posted 20 January 2016 - 11:11 AM

O surpriza placuta! Diseara voi incepe studiul, cred eu, cu mai mult optimism. Multumesc de pe acum lui mars01 pt rabdarea cu care explica totul.



#13 OFFLINE   mars01

mars01

    上昇

  • Membri
  • PipPip
  • 907 posts
  • Locatie:Bucuresti / Pitesti

Posted 20 January 2016 - 01:01 PM

Multumesc pentru aprecieri!

Incerc sa fac cat mai intuitiv tot procesul asa ca vor fi greseli.

Sigur, voi incerca sa le corectez, dar apreciez orice forma de critica. Atata timp cat este constructiva.

 

Apreciez daca oricine altcineva intervine pe parcurs pentru a isi oferi propria opinie personala. Aceasta nu va face decat sa imbogateasca continutul si va permite o intelegere mai ampla a subiectului.

 

Revenind la oile noastre.

 

Am spus anterior ca:

Registrii asociati pentru portul A sunt:

PORTA, TRISA, CMCON, CVRCON, ADCON1.

Citesti despre fiecare registru in parte si ce face fiecare "intrerupator" mai corect spus, bit, din fiecare din registrii de mai sus.

 

Mai pe scurt, dupa ce citesti o sa te lamuresti ca din:

- PORTA, bit 0, vei schimba starea pinului 2 (pe care l-am ales noi sa il folosim)

- TRISA, bit 0, vei configura pinul 2 ca si iesire digitala.

- CMCON - in acest registru trebuie dezactivezi comparatorul (periferic care este conectat se pare si el la acest pin cu ceva)

- ADCON1 - in acest registru trebuie sa dezactivam perifericul de intrare analogica pentru pinul 2

 

 

Am ales pinul 2 al controlerului 16F877A ca fiind pinul unde conectam LED-ul.

El are eticheta RA0/AN0 atasata cand va uitati la poza cu controllerul din pagina 3 a datasheet-ului.

Aceasta inseamna ca este de fapt controlat de bitul 0 al portului A.

 

Cum vedem si mai sus, in citat, trebuie ca in prima parte a programului sa ne ocupam de configurarea acestui pin astfel incat in final sa avem un pin configurat ca iesire digitala si sa dezactivam toate celelalte functii / periferice care sunt conectate intern la acest pin al controlerului.

 

Asadar configurarea pinului va arata asa:

 

1. dezactivam intrarea comparatorului care ne spune datasheet-ul ca poate fi multiplexata si pe pinul 2. Facem aceasta dezactivand TOT comparatorul. Acuma, ca sa fim cinstiti, in datasheet scrie ca in mod default, dupa pornirea controlerului, cel putin la acest controler, starea comparatorului este dezactivata. Dar ca si cod de bune practici hai sa il dezactivam, chiar daca nu este absolut necesar el fiind deja dezactivat.

 

Citim la pagina 135 din datasheet, sectiunea Comparator Module. Vedem ca acest modul sau periferic sau cum vreti sa ii spuneti, comparatorul, este controlat de registrul cu numele CMCON.

Citim mai departe, in pagina 136, la subsectiunea Configurarea Comparatorului (12.1 Comparator Configuration) in figura 12-1 ca starea comparatorului este dezactivata cand bitii CM2:CM0 = 111 . Acesti bti se poate vedea ca sunt din registrul CMCON de pe pagina anterioara.

Citim CM2:CM0 = 111 ca totuna cu CM2 = 1 si CM1 = 1 si CM0 = 1.

Deoarece noi dezactivam comparatorul nu ne ma intereseaza restul de biti din registrul CMCON.

 

Asadar, tot ce trebuie sa facem este sa incarcam in registrul CMCON valoarea 111 pe bitii CM2:CM0.

Daca privim registrul CMCON ca aratand dpdv binar are Bit7 Bit6 Bit5 Bit 4 Bit3 Bit 2 Bit1 Bit0 si cum registrul CMCON este:

 

29xhnpf.jpg

 

Atunci este clar ca noi trebuie sa incarcam 111 pe ultimii 3 biti din registrul CMCON. Iar aceasta este simplu pentru ca pur si simplu punem urmatoarea valoare: 0000 0111 in registrul CMCON.

 

Asadar prima linie in program va arata asa:

CMCON = 0b00000111;

Zerourile pe celelalte pozitii apar pentru ca nu ne intereseaza ce mai este pe acolo atata timp cat noi am dezactivat comparatorul.

Remarcati ca in fata la cuvantul binar efectiv apare chestia: 

'0b'

Aceasta este un mod foarte raspandit ca in limbajul C sa ii spunem ca ce urmeaza dupa 0b (zero b) este un cuvant binar (este totuna cu numar binar).

Remarcati ca la sfarsitul liniei apare ';' (punct si virgula)

 

Punct si virgula este esentiala in C. Fiecare linie trebuie terminata cu punct si virgula. Mai mult, dupa fiecare operatie (fie ea asignare - adica faci egal cu ceva, fie o comparatie, o bucla sau mai stiu eu ce) trebuie pus punct si virgula. Cu exceptia faptului ca nu se pune punct si virgula dupa acolade.

 

Acoladele in C arata ca ce este intre acolade este o secventa de cod care trebuie tratata impreuna. Dar despre aceasta mai tarziu.

 

Daca aveti curiozitatea o sa vedeti ca:

 

00000111 in binar este totuna cu cifra 7 in zecimal si cu numarul 0x7 in hexazecimal.

 

So, 

CMCON = 0b00000111;

se poate scrie si:

CMCON = 7; 

sau

CMCON = 0x07; 

In CMCON = 0x07; se pune zero in fata la 7 (nu are nici o influenta fiindca zero in fata se ignora) doar ca sa arat ca CMCON este un registru pe 8 biti (fiindca primul zero scris in hexa se scrie 0000 in binar iar 7 in hexa se scrie 0111 in binar, deci impreuna 00000111 in binar sunt 8 biti deci registrul CMCON este pe 8biti).

 

Dupa cum vedeti cand scrieti un numar in binar puneti in fata '0b'. Cand il scrieti in format hexazecimal il scrieti cu '0x' in fata (zero x). Cand il scrieti in format zecimal nu e nevoie sa puneti ceva in fata.

 

Un numar se poate scrie in toate cele 3 formate. Formatul binar este mai usor cand manipulezi bitii intr-un registru(setezi sau stergi, altfel spus faci 1 logic sau, respectiv, 0 logic sau altfel spus faci HIGH respectiv LOW). Formatul zecimal se explica singur, ne este cel mai familiar. Formatul hexazecimal eu cred ca este util pentru ca este mai compact si cu un pic de practica se poate citi usor. (Eu imi pastrez in cap ca F este totuna cu 1111 si E este totuna cu 0111 E este totuna cu 1110 si tot asa).

Mai sus corectie cu ajutorul lui Liviu. Multumesc.

 

@SPARK: da asa este: 0x2F0A  este totuna cu 0010 1111 0000 1010  indiferent ca este adresa sau altceva. In cazul nostru adresa inceputului era la 0x2007 (si adresa este tot in hexa, am omis sa precizez anterior) si continutul care se gasea la acea adresa era 0x2F0A (sau 0010 1111 0000 1010 in binar).

Numerele in hexazecimal se pot scrie cu '0x' (zero x) in fata sau puneti dupa numar litera 'h'.

 

Adica 0x2007 este totuna cu 2007h

 

f04vi0.jpg

 

2hpozuv.jpg


Edited by mars01, 20 January 2016 - 01:53 PM.


#14 ONLINE   Liviu M

Liviu M

    -

  • Membri
  • PipPipPipPipPip
  • 3,071 posts
  • Locatie:In sat cu Doru

Posted 20 January 2016 - 01:09 PM

Ai curaj, felicitari!

  E este totuna cu 0111 si tot asa).

 

Aici le-ai scris LSB first. :rade:

Mie-mi place sa scriu toti bitii, asa ca la mine e 0x0E = 0x00001110.



Cu_reclama

Cu_reclama
  • Membri

#15 OFFLINE   danpin

danpin

    Membru

  • Membri
  • PipPip
  • 465 posts
  • Locatie:IASI

Posted 20 January 2016 - 01:17 PM

0x0E =0b00001110






1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users