Sari la conținut
ELFORUM - Forumul electronistilor

Invatat programare de la zero


riciu

Postări Recomandate

 

se poate scrie si 

while (1 == 1) {

 

...

 

}

 

ok , cred ca am inteles . Pe limba mea ar fi asa : cat timp unu este egal cu unu (adica mereu) se executa liniile care urmeaza intre acolade , rezultand o bucla infinita . 

Link spre comentariu

 

core, tu ai spus la un moment dat ..."sau mapeaza direct stari de control sau semnale externe."  Nu am intles ce ai vrut sa spui aici. A mapa ce inseamna?

 

Registrul e un termen generic, in general specific arhitecturii hardware, are o valoare fixa si inseamna altceva in functie de valoare. De exemplu PORTA are valoare 5 si inseamna valoare logica a pinilor externi. Porturile pot avea valori diferite daca sunt scrise sau citite, adica nu intotdeauna ce scrii, aia si citesti. Cand valoare este folosita intr-o instructiune care accepta un registru, procesorul stie ce inseamna si face o actiune in functie daca vrei sa citesti sau sa scrii in registru. Atribuirea unei valori fixe unui registru, legand anumite actiuni de acea valoare, se face de producatorul microcontrollerului si se numeste mapare.

Posted Image

Mapare se poate face si de catre programator, prin termenul de pointer, si/sau prin termenul de vector/tablou/sir de elemente. Doar ca programatorul nu poate mapa senzori, decat indirect, poate mapa locatii de memorie, in acest fel rearanjand locatiile de memorie dupa cum ii convine.

In general mapare hardware se ia ca atare, iar in limbaj inalt de programare, cu e C, nu se lucreaza cu adresele porturilor direct, exista un header, fisier .h, care defineste aceste adrese in functie de configuratia proiectului.

Se poate vorbi si maparea de biti, nu doar de octeti.

Practic mapare e procesul de punere pe harta (map), a legendei cu termeni, si explica ce inseamna fiecare :)

Link spre comentariu

@Core .. Desi am trecut de mult de nivelul de a aprinde un led si avand habar despre ce vorbesti ... NU am inteles absolut nimic din ce ai spus mai sus. Chiar sunt curios daca cei care s-au "inscris" la acest "curs" au inteles ceva. In schimb am alta intrebare pentru tine. La ce ma ajuta atunci cand programez in C ca incepator sa stiu la ce adresa se afla PORTA ? Daca raspunsul contine orice legat de ASM il consider ca si inexistent.

Link spre comentariu

Pentru cei care nu au Proteus si vor totusi sa vada cum ruleaza instructiunile programului licurici si cum se comporta un port in urma executiei unei instructiuni atasez o animatie in banalul excel.Pentru ca executia instructiunilor sa fie vizibila am adaugat in simulare un delay de 200ms.

Simulare.rar

Link spre comentariu

Unii oameni inteleg lucrurile pe jumatate. Este in firea lucrurilor ca sa existe evolutie. Nu putem asimila informatia instantaneu, avem nevoie de timp pentru aceasta. Este ca atunci cand gusti un vin bun. Il "rostogolesti" in gura pentru a simti aroma completa.

Ar trebui sa ne ferim sa explicam cand nu avem habar de un subiect.

 

Memoria controlerului...

 

Memoria este ca un spatiu de depozitare in care sunt multe rafturi. Cam ca intr-o biblioteca. Biblioteca sa fie ...

Dar pentru ca oamenii vor sa stie tot timpul unde gaseste cutare carte, se pastreaza un cuprins iar fiecare loc unde este o carte are un numar asociat. Un numar dupa care poate fi identificata locatia cartii. Pentru ca aceste numere sunt in ordine este usor sa gasesti cartea.

O adresa.

 

Tot asa si la controlere.

 

Atunci cand un designer de controlere se gandeste cum sa faca ordine intr-un controller el aloca in momentul proiectarii o parte din memoria disponibila, pentru configurarea modulelor din controller cat si pentru functionarea interna a controlerului. Cand spun ca se aloca memorie vreau sa spun ca memoria incepand de la o adresa x pana la o adresa y este rezervata pentru functionarea controlerului.

Bucati de cate 8biti din aceasta memorie alocata sunt asa numitii registri. Fiecare registru (cu alte cuvinte bucatica de memorie de 8 biti) are o adresa.

 

De ex. PORTA al controlerului PIC16F877A are adresa 05h (05h este in hexazecimal si atentie, nu este valoarea registrului ci adresa registrului. O diferenta foarte mare ...).

 

Intr-adevar controllerul habar nu are ce este aia PORTA (adica numele asta, PORTA) ... el stie insa ca la adresa 05h din memorie se gaseste registrul in care daca se scrie, vor fi influentati pinii hardware grupati intr-un port care este numit A.

In toate operatiile, controlerul se foloseste de adresa.

 

Dar pe noi nu ne intereseaza adresa ca numar. Deoarece compilatorul are grija de noi si creaza o asociere intre aceasta adresa, 05h, si numele PORTA. De fiecare data cand folosim denumirea de PORTA, compilatorul va sti ca noi ne referim de fapt la adresa 05h si are el grija sa aranjeze lucrurile cum trebuie.

 

Este similar cu adresele de pe Internet. Toata lumea stie ca site-urile au o adresa IP de genul xxx.xxx.xxx.xxx (de ex www.yahoo.com are adresa IP: 46.228.47.114) dar cine sta sa scrie adresa IP in bara de adrese a browser-ului? Toata lumea scrie www.yahoo.com nu scrie 46.228.47.114.

Pentru ca oamenilor le este mai usor sa lucreze cu nume si nu cu numere.

 

Tot asa si compilatorul ne ajuta si putem folosi nume predefinite pentru registri si nu trebuie sa ne folosim de adresa lor. Evident poti sa faci si una si alta. Dar consider pe cei care se chinuie cu adrese, masochisti :)

 

Fiecare controller are propriile adrese la care stocheaza registrii. Nu am stat sa ma uit daca Microchip a pastrat aceleasi adrese pentru registrii similari, pentru toate controlerele. Si nici nu ma intereseaza ca sa fiu sincer atata timp cat stiu ca pot accesa registrul cu un nume (nume care il gasesc in datasheet).

 

Pentru cine vrea sa vada la ce adrese se gasesc registrii PIC16F877A, se pot gasi la pagina 17 din datasheet.

 

Posted Image

Editat de mars01
Link spre comentariu

Ce am scris mai sus este un mod de a explica. Nu te arunci sa vorbesti despre pointeri si alocari de memorie cand noi nu am vorbit nici macar despre ce este o variabila si despre tipurile (TYPE) de variabile. 

Mie mi-a luat foarte mult timp sa inteleg ce sunt pointerii si aplicatia lor.

Efectiv nu reuseam sa le vad utilitatea si ma incurca prezenta stelutei '*' atat la declarare cat si in dereferentiere ... Dar acesta este un topic complicat care poate il vom aborda, poate ca nu.

Si asa e mult de vorbit (aka scris) si vad ca nimeni nu se incumeta sa faca o explicatie mai mare de cateva fraze.

 

VARIABILE (cele basic, primare)

 

Ce este o variabila? Ce este in contrast o constanta? Pentru a organiza lucrurile, constantelor chiar li se spune variabile speciale. Adica o constanta ar fi o variabila care nu poate fi schimbata :) Fun, nu? Variabila prin definitie este ceva schimbator ... :) Cam ca la aia care vin cu expresii de genul: "crestere negativa ..."

 

Toata lumea a invatat la matematica ce este o variabila. Este o entitate matematica caruia i se pot atribui valori si care se poate schimba in timp.

De ex: x = 3. dar mai tarziu x = 7. Si mai tarziu x = -1 ... Si tot asa.

 

Ideea care sta in spate este ca o variabila este o locatie in care pui ceva pentru mai tarziu. E ca si cum scrii pe hartie cati bani ai cont inainte ca sotia sa mearga la cumparaturi si pe urma pe aceasi hartie scrii cat a ramas ... daca a mai ramas ceva ... :)

 

Intuim ca o variabila are legatura cu memoria (vezi hartia de mai sus pe care faci notatii). De scurta durata adesea, dar alteori de lunga durata.

Am mentionat mai devreme locatie. Cand spui locatie nu esti prea departe de termenul de adresa.

 

Daca punem cap la cap cele doua: memorie si adresa => adresa de memorie.

 

Hopaaa ... cred ca am dat peste ceva. O variabila este de fapt o zona de memorie (mai mare sau mai mica) care se gaseste la o anumita adresa.

E ca si cum spui ca in camara ai o zona speciala in care pui portocale. Intra cam 1Kg sau mai multe portocale dar ideea este spatiul pentru portocale este bine definit. Uneori poti sa faci loc sa pui mai multe portocale daca in jur mai este loc disponibil.

 

Bun.

Daca punem cap la cap avem urmatoarele concepte. O variabila are o adresa in memorie si la acea adresa in memorie este un spatiu unde poti sa pui ceva. Acel spatiu nu este infinit, are si el o dimensiune. E cat cosul de portocale. Mai mare sau mai mic. Dar ideea este ca nu e fix. Cosul poate fi facut mai mare dupa nevoie. Deci si spatiul de stocare al variabilei poate fi ajustat dupa dorinta.

 

O idee esentiala in C este ca variabilele trebuie declarate.

Ce inseamna? Inseamna ca inainte sa te apuci de program, trebuie sa "tipi" sus si tare :) ca ai variabilele cutare si cutare si ce dimensiune in memorie ocupa.

 

Scriem ceva de genul:

int x;

sau

int x = 0;

Remarcati urmatoarele cuvinte cheie: int, x, semnul egal, numarul zero si punct si virgula.

 

In C nu este nevoie sa ii spui la program la ce adresa sa se gaseasca variabila x. Sarcina de a gasi loc in memorie si de a face asocierea intre numele variabilei, x, si adresa in memorie unde vom putea pune ceva (numere) este a compilatorului.

 

Nici nu ne intereseaza, de regula (nu ma luati cu pointeri acuma ...), pe unde pune compilatorul variabilele in memorie ... Si compilatorul nu doar cauta locatii in memorie pentru variabile dar iti si spune (la compilare), cand e cazul, ca nu a putut sa faca alocarea de memorie din simplul motiv ca numai este memorie disponibila.

 

Punct si virgula se pune dupa fiecare operatie. Ca e atribuire, ca e comparatie, punct si virgula incheie o linie de program.

 

Ce este acel 'int'?

 

Ei bine, spuneam ca avem cosul nostru de portocale. E mai mare sau mai mic. Acel 'int' ii spune compilatorului sa rezerve o cantitate de memorie cat sa incapa acolo un numar de tipul INT. Int este o prescurtare de la integer (tradus 'intreg').

 

Ce sunt tipurile (TYPE)?

Tipurile sunt categorii de numere facute pentru a optimiza alocarea de memorie. Cuvinte mari: optimizare alocare de memorie ... Dar hai sa intelegem motivul din spatele acestor tipuri.

 

Cum banuim sau stim deja, numerele in lumea digitala sunt scrise sub forma de 1 sau 0. Cu cati mai multi 1 sau 0 unul dupa altul, cu atat mai mare este numarul. Prin urmare pentru un numar mare avem nevoie de locuri speciale in memorie ca sa punem mai multi 1 sau 0. Aceste locuri speciale sunt biti de memorie sau mai bine zis unitatea de baza a memoriei. Se pot privi ca mici intrerupatoare. Cand e inchis avem 1, cand e deschis avem 0. Cand ii citim pe toti acesti biti care sunt grupati impreuna pentru a stoca o variabila, deja avem un numar. Scris in format binar evident.

 

Dar memoria in lumea embedded este limitata si nu putem sa alocam memorie multa (un numar de biti mare) cand poate avem un numar care poate fi stocat la fel de bine intr-un numar mai mic de biti.

 

Asa au aparut tipurile de date sau TYPE cum li se spune.

Aceste tipuri de date pot sa difere de la categorie de controlere la alta.

 

Dar pentru cazul nostru, PIC16F877A, tipurile de date sunt asa:

 

CHAR - acest tip aloca 8biti (1 byte)

INT - acest tip aloca 16biti (2 byte)

LONG - acest tip aloca 32biti (4 byte)

FLOAT - acest tip aloca 24biti sau 32biti (3 sau 4 byte)

 

Ce inseamna aceasta. Inseamna ca atunci cand declaram o variabila x ca fiind de tipul INT, compilatorul se va apuca sa caute prin memorie o zona libera unde poate aloca (rezerva), unul dupa altul, un numar de 16 biti. Iar variabila noastra va putea stoca date, numere care se pot stoca in maxim 16biti.

 

Dar cat de mari sunt numerele (in zecimal ca suntem oameni doar) stocate pe 16biti ?

Dar aceasta ne duce la intrebarea urmatoare ... ce fel de numere?

 

Stim ca numerele pot fi naturale (numere pozitive), intregi (numere negative si numere pozitive), reale (numere cu virgula, cu zecimale) ...

 

Cei care au facut limbajul C s-au gandit ei si astfel a aparut o diferentiere a tipurilor in:

 

CHAR - se aloca 8 biti

unsigned CHAR - se aloca 8 biti

signed CHAR - se aloca 8 biti

 

INT - se aloca 16biti

unsigned INT - se aloca 16biti

signed INT - se aloca 16biti

 

LONG - se aloca 32biti

unsigned LONG - se aloca 32biti

signed LONG - se aloca 32biti

 

FLOAT - se aloca, dupa caz, 24biti sau 32biti.

 

Complicat? Nu.

Cand pui signed in fata, practic spui ca se vor stoca in variabila cu tipul acela numere care pot fi si cu semn adica negative.

Cand pui unsigned in fata, practic spui ca se vor stoca in variabila cu tipul acela numere care pot fi numai pozitive.

 

Exceptia este la tipul FLOAT cel care stocheaza numere reale, cu virgula. Aici intotdeauna vor fi stocate si numerele negative. Nu exista un tip special FLOAT care sa stocheze numai numere pozitive.

 

Va urma.

Editat de mars01
Link spre comentariu

Continuare la Variabile.

 

Cum spuneam variabilele pot fi stocate pe 8bit, 16bit, 32bit si in cazul tipului FLOAT se poate si pe 24bit.

 

Stocarea la tipul FLOAT (numere reale, cu zecimale) se poate face si pe 24bit (este o setare in compilatorul XC8 care stabileste pe cati biti se face stocarea in cazul tipului FLOAT).

Stocarea tipului FLOAT pe 24 de biti presupune o reducere a gradului de precizie (numarul de zecimale) in favoarea unei performante mai ridicate.

 

Folosirea de variabile, numere de tip FLOAT taxeaza puterea de calcul a controler-ului foarte puternic. Si ocupa si faorte multa memorie program (flash).

 

Controlerele pe 8bit ale Microchip, cum este si 16F877A, nu au unitate de calcul floating point (un modul special care se ocupa cu calcule numere reale) si trebuie sa emuleze cumva aceasta. Ori aceasta emulare consuma mult timp de procesor.

Din aceast cauza se cam evita folosirea numerelor reale in combinatie cu controlerele pe 8bit.

 

Asadar, daca aveti posibilitatea, nu folositi numere cu tipul FLOAT adica numere reale. Sunt modalitati prin care se poate evita utilizarea de numere/variabile FLOAT, in anumite situatii. 

 

Ma repet, avem tipurile posibile:

 

unsigned char

signed char

unsigned int

signed int

unsigned long

signed long

float

 

Cand dati doar de: char, int sau long (fara signed sau unsigned in fata) trebuie sa cititi manualul la compilator pentru ca de ex INT poate fi totuna cu signed int.

Este doar o prescurtare. L-am scris pe 'int' cu litere mari ca sa iasa in evidenta. Altfel uzual se scrie simplu:

int z;

Pe 8 biti (adica un byte) se pot scrie 2^8 =256 de valori (2 la puterea 8biti) adica daca avem numai valori pozitive, putem scrie pe 8biti valori de la 0 la 255.

Daca avem si valori negative, pe 8 biti se pot scrie tot 256 valori (adica 2 la puterea 8bit) dar in felul urmator. Valori de la -128 la 127.

Probabil va intrebati de ce -128 pana la 127 si nu -127 pana la 128 ...

 

Pentru ca numerele negative se scriu intr-un mod special in format binar. Nu intru in detalii dar cand se stie ca intr-un numar de 8biti se stocheaza si numere negative, atunci cand numerele sunt negative, bitul 7 (adica bitul cel mai semnificativ, MSB) va fi 1. Codificarea de numere negative se face in complement fata de 2.  

 

Cititi pe Google despre two's complement.

 

Pe 16 biti (adica 2 bytes) se pot scrie:

- cand tipul este unsigned, numere de la 0 la 65535

- cand tipul este signed (cu numere negative), numere de la -32768 pana la 32767

 

Pe 32 biti (adica 4 bytes) se pot scrie:

- cand tipul este unsigned, numere de la 0 la 4294967295 (adica de la 0 la (2^32)-1)

- cand tipul este signed (cu numere negative), numere de la -2147483648 pana la 2147483647 (adica de la -2^16 pana la (2^16)-1)

 

Cazul FLOAT (si aici sunt 32bit = 4 bytes) va las sa studiati in application note-ul lui Microchip de aici.http://ww1.microchip.com/downloads/en/AppNotes/00660.pdf  :wretre

 

REZUMAT variabile pana aici:

 

O variabila este doar o eticheta catre un spatiu in memorie. Variabila de fapt tine cont de adresa locatiei in memorie unde se pun date, informatii, numere.

Functie de cum o declaram, cu ce tip, intr-o variabila se pot pune numere mai mari sau mai mici, numai poztive sau si pozitive si negative, sau chiar numere reale adica cu virgula.

 

Motivul pentru care exista si tipuri care permit stocarea de numere mai mici cand ar putea sa fie un tip foarte incapator si gata, este ca atunci cand scrii de ex numarul 58 intr-o variabila de tip INT faci risipa de memorie.

 

De ce?

Daca scriem numarul 58 in binar, pe 16bit (cat are tipul INT) numarul se scrie asa: 0000 0000 0011 1010

Remarcati cei 8biti de zero din fata. Aia vor fi inutil rezervati de compilator. Doar vor sta acolo degeaba fara nici-un rost.

 

58 scris in binar este asa: 0011 1010 adica incape pe 8bit adica intr-un tip CHAR si astfel memoria este ocupata mai optim.

 

Tipurile acestea de date asociate variabilelor presupun ca programatorul cam stie in ce limite vor fi datele care le va stoca intr-o variabila. Daca nu stie atunci merge pe principiul "better safe than sorry" (adica mai bine in siguranta decat sa iti para rau) si foloseste un tip de date mai incapator pentru variabila.

 

De ex cei din comunitatea Arduino, pentru ca majoritatea care ajung acolo sunt incepatori, promoveaza utilizarea tipului de date INT peste tot.

INT si nu unsigned INT pentru ca un incepator este totdeuna posbil sa incerce o chestie GRESITA cum ar fi:

unsigned int y = -2001;

E gresit pentru ca se incearca mai sus sa se puna un numar negativ intr-o variabila de tip unsigned adica una care poate stoca doar numere pozitive.

 

Variabilele se declara numai o singura data. Odata ce ai declarat-o ca fiind de un tip sau altul gen:

int x;

pe urma in program este suficient sa scrii:

x = -125;....x = 32;....x =x*10;....

unde ... sunt alte linii de cod.

 

*********************************

O chestie IMPORTANTA.

*********************************

 

Ce se intampla cand incrementezi (aduni 1) o varibila de tip unsigned, sa zicem CHAR, si ajungi la maximul posibil de stocat in variabila?

 

Spuneam ca o variabila unsigned char poate lua valori de la 0 la 255.

 

Sa zicem ca x= 253.

Facam x =x + 1 si x devine 254 (x = 253+1 = 254)

Mai facem odata x=x+1 si acum x=254+1 = 255

Mai facem odata x=x+1 si acum x = .... surpriza ... x = 0.

 

De ce? Pentru ca odata ce a ajuns la maxim, in acest caz 255, variabila o ia de la inceput, in acest caz de la zero. x= 255+1 (suma este mai mare decat 255 care este maximul pentru unsigned CHAR si x devine 0, adica minimul posibil pentru unsigned CHAR).

 

Fenomenul se numeste rollover, adica o ia de la inceput. E una dintre chestiile care genereaza bug-uri pentru ca daca nu esti atent si nu folosesti un tip de date suficient de incapator s-ar putea sa ajungi la maxim si in loc sa cresti, scazi din nou la minim.

 

[Din aceasta cauza, functia millis() de la Arduino care tine minte timpul trecut de la pornirea Arduino, dupa cca 52 de zile, "crap", o ia de la capat, de la 0.]

 

Asadar atentie la fenomenul de rollover pentru ca este o sursa de bug-uri.

 

Pentru tipurile de date signed, rollover-ul se intampla la fel, dupa trecerea de maxim, se duce la minim.

Pentru un signed INT (acesta ia valori intre -32768 si 32767) cand ajungi la 32767 si mai faci o incrementare ajungi cu valoarea variabilei la -32768 (atentie la minus).

 

Sigur, rollover-ul se intampla nu numai pentru cresterea cu cate o unitate ci si cand aduni mai mult.

De ex:

unsigned char y;y = 250;y= y + 65;// y in acest moment are valoarea y = 250 + 65= 315 = 315-256 = 59(mai mult decat 255 cat este maximul pentru unsigned char ... asadar o ia de la capat si ajunge sa fie 59)

Am scazut mai sus 256 din cauza ca sunt 256 valori intr-un unsigned char (valori de la 0 la 255 = 256 valori).

 

NOTA:  am descris fenomenul de ROLLOVER cand se atinge limita de sus a capacitatii de stocare pentru un tip (TYPE). Dar acelasi lucru se intampla si pentru limita inferioara cand scazi o variabila si o scazi si tot asa pana dai de limita inferioara si hopa, te pomenesti cu numere din capatul superior.

 

Un loc unde puteti experimenta online (acesta este C pur) este aici: http://www.tutorialspoint.com/compile_c_online.php

 

Va urma (am obosit de scris :( )

 

LE: Astept corecturi, imbunatatiri, adaugari de informatie.

Editat de mars01
Link spre comentariu

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 ?

 

e cam vechi, dar se mai găsesc destule proiecte interesante cu el pe net.va trebui mai întâi să ai un programator, ca să poţi "turna" hexul în el, şi un montaj de test, de preferinţă cu soclu, ca să vezi concret cum merge.

 

ia datasheetul lui de pe situl microchip, şi compară cu datasheetul picului folosit de mars în tutorialul lui, şi vezi care sunt asemănările şi deosebirile...

 

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""

 

e prea complicat pentru primul proiect! :d

lcd-ul are minimum 4 linii de date, şi 3 de control, iar tu va trebui să înveţi să le controlezi pe toate 7 odată, plus încă minimum 2 linii configurate ca intrare, şi alea controlate "automat", de un generator de tact şi un etaj de intrare, nu de un simplu comutator.

 

nu e mai simplu să înveţi mai întâi cum controlezi un singur pin? ceilalţi se controlează exact la fel, cu excepţia pinilor multifuncţionali, şi cam toţi pinii sunt multifuncţionali la picurile cu număr mic de pini...

 

am mai dat odată linkul ăsta, de fapt, de mai multe ori.nu îl dau că am io pitici pe creier, sau că am chef "să-i tai macaroana" lui mars, ci pentru că ăsta e cam singurul tutorial de picuri (şi ce zice acolo se "pupă" şi cu atmelurile) într-o limbă "omenească", şi care este încă free. de asemenea, indică şi cum puteţi să vă faceţi singuri plăci de test refolosibile.

iată linkul: http://www.winpicprog.co.uk/pic_tutorial.htm

Link spre comentariu

nu îl dau că am io pitici pe creier, sau că am chef "să-i tai macaroana" lui mars

Nu-i nici-o problema Mifty, interesul meu aici nu este sa "ma dau rotund" (ca nici nu am cu ce, ca veni vorba) ci este exact ce as fi vrut si eu sa gasesc acum cativa ani.

 

In alta ordine de idei, inteleg ca acel tutorial este foarte bun pentru cei care doresc sa invete limbajul de asamblare (o sa trec si eu prin el zilele acestea, ca si chestie informativa), dar poate ar fi bine daca ai face un topic in care sa pui in mod distilat (regurgitat) :) felul inca ai inteles tu programarea in limbaj de asamblare.

 

Tuturor ne prinde bine flexibilitatea. Stiu ca timpul e pretios (eu zilele acestea am avut timpi morti la servici asa ca ...am scris) dar poate reusesti sa postezi si tu ceva din experienta ta.

 

LE: Oricum m-am cam plictisit cu teoria si cred ca si voi, asa ca o sa facem in urmatorul post un program care sa citeasca starea unui buton si sa aprinda apoi un LED, in mod temporizat. 

Adica apesi pe buton, se aprinde LED-ul si sta aprins xxx secunde.

 

Ar putea fi util pentru ca in loc de buton se poate pune un senzor de prezenta PIR si in loc de LED un MOSFET care sa aprinda o banda de LED-uri plasata sa zicem pe hol. Va plimbati pe hol, senzorul va detecteaza, se aprinde lumina si va sta aprinsa pentru sa zicem 10 minute si apoi se opreste.

 

O chestie foarte simpla de facut ca sa va ajute sa va "dezmortiti" :)

Editat de mars01
Link spre comentariu

pentru moment, mi-au venit usbaspurile din china, şi win7-le meu a ajuns ca în 3 ani să aibă pitici pe creier la drivere şi alte alea, iar placa de pickit2 avansează piano-piano, mai ales pentru că nu am faimoasa bobină... şi să bobinez eu ceva acolo parcă nu-mi vine. oricum, nici n-am cu ce măsura bobina aia!...

 

deocamdată, am în plan să reinstalez winul, să mă joc un pic cu atmeles... mai degrabă cu arduino, că tot am inflamat nervu' fanilor :rade: , şi, poate pun mâna pe o bobină potrivită pentru pic... asta e, vreau sau nu, trebuie să trec obligatoriu la programatoarele pe usb, că nu mai ţine...

 

şi cum feciorul meu e "student" la cercul de robotică de la palatul "pionierilor", loco, o să mă cam ţină în priză cu trebile astea... nu că mie nu mi-ar place, dimpotrivă! :d

 

"experienţa" mea se limitează, deocamdată la ce-am făcut în regim de amator, pe-acasă, ce-am făcut pentru alţii se cam ţine mucles... ratza ştie cam ce-aş vrea să spun, pentru că are şi el în contract acele linii pe care le-am avut şi eu cândva, cu "confidenţialitatea"... :)şi cum doi ani am fost nevoit să las deoparte letconul şi microcontrollerele... lucrurile s-au mai schimbat "un pic" :)

cum spuneam, însă, să rezolv întâi cu windowsul, apoi cu programatorul, şi mă distrez eu şi cu picurile... am deja 2 bucăţi de 509, f690, şi câteva bucăţi de f627 sau 628, parcă... 877 nu am, dar mă gândesc să iau ceva din seria aia, pentru că mi-ar pofti inima la două proiecte drăguţe care folosesc aşa ceva...

Link spre comentariu

 

RA0 arata ca ................................................ 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.

 

Nu inteleg afirmatia de mai sus legata de registrul PORTA si ma gandesc ca poate e o greseala de exprimare.  PORTA este si el un registru ( eu am inteles ca nu) sau el este format ( printre altele) si din registrii?

Link spre comentariu

PORTA e un nume. In functie de utilizari, are diverse semnificatii.

1. Hardware:

a. numele unuia din "grupurile de pini" ale microcontrollerului, cu tot ce reprezinta pinii astia - tranzistori, latchuri, rezistente pull-up.

b. cine a fost atent la explicatiile lui core, s-a prins ca PORTA  e si numele unei locatii speciale din memoria picului (un registru), aflata la adresa 5, locatie care, impreuna cu cea numita TRISA, contoleaza comportamentul "grupului de pini".

2. Software. Cand vrem sa aflam sau sa modificam comportamentul unei anumite bucati de hardware, nu facem decat sa citim sau sa scriem registrul/registrii corespunzator/i. Acest lucru il putem face folosind adresele lor, dar  ca sa ne fie mai usor aceste adrese au primit cate un nume. *) Si logica ne zice ca cel mai bine e ca in program sa dam adreselor acelasi nume pe care il au in hardware.

In xc8, pentru 16F877A PORTA e definit ca

// Register: PORTAextern volatile unsigned char           PORTA               @ 0x005;

Adica o variabila pozitiva, pe 8 biti, aflata la adresa 5.

 

De aia eu am tot sustinut ca "saritul peste etape" nu e cea mai buna solutie pentru invatat programare. Daca ati fi avut notiuni de baza despre C, ati fi inteles probabil direct despre ce e vorba.

 

*) E ca IP-urile la internet. Putem folosi cifre cu puncte, sau ne bucuram ca s-au inventat serverele DN ca sa folosim nume usor de retinut si cu semnificatie.

Editat de Liviu M
Link spre comentariu

@riciu

Explicatiile lui Liviu completeaza ceea ce eu am vrut sa explic anterior cand am facut referire la conceptul de registru.

 

Din pacate nu pot sa fiu atat de precis in tot ceea ce explic. Motivul este ca eu incerc sa condensez o gramada de informatie in cateva fraze, timpul este limitat. Ce scriu aici, ce scriu altii aici nu va face decat sa va dea o idee de ansamblu. Sa va dea curajul sa studiati materiale adevarate, cursuri foarte bune care exista deja (din pacate numai in limba engleza, nu si in lb romana).

 

Adevarata problema cand incerci sa faci ceva nou este ca totul este atat de diferit incat nu poti sa intelegi nimic. Orice ai incerca totul pare de neinteles, incomprehensibil. 

Ceea ce am scris pe aici, ceea ce poate si altii vor scrie aici, nu va va invata sa fiti programatori dar eu sper,chiar si numai mimetic, sa puteti sa incepeti sa va faceti programe simple.

Dupa ce veti vedea ca se poate, veti avea curajul (si ceva informatii) astfel incat sa plecati mai departe pe picioarele voastre.

 

Liviu are dreptate cand spune ca exista o ordine cand treci prin informatii.

Dar ceea ce nu se intelege este ca pentru ca sa ajungi in punctul in care sa poti trece printr-un curs in mod organizat ai nevoie de o introducere, ai nevoie de elementele de baza.

 

Exista un pericol foarte mare aici. Eu explic poate nu in modul cel mai corect, poate nici cel mai coerent. Pericolul este sa va formati conceptii gresite.

Din aceasta cauza am avertizat ca pot fi greseli. Pentru ca sa va dati seamna de greseli trebuie sa studiati si din alte surse.

 

Luati totul cu un gram de sare si cercetati pornind de la subiectele prezentate.

 

Trecand la subiect, @riciu, am sa incerc sa iti dau si eu un raspuns.

 

Un controler are un numar de pini. Mai multi, mai putini nu are importanta. Aproape toti acei pini sunt grupati in asa numitele porturi (unii pini nu fac parte din porturi, cum sunt cei de alimentare, oscilator).

Gruparea aceasta nu este doar la nivel de: " hai sa iau pinii astia 8 si ii botez pe toti portul B". Gruparea acestor pini se face pornind chiar de la nivelul hardware, modul cum sunt ei construiti.

La pagina 7 din datasheet avem figura:

 

Posted Image

 

Observati cum porturile aduna mai multi pini impreuna. In figura, porturile sunt scrise cu litere mari si aceasta poate genera confuzia intre portul format din pini, cum ar fi portul A si registrul PORTx asociat acelui port I/O de pini hardware, in cazul portului A confuzia se refera la registrul PORTA.

 

Numim port I/O (input/output) un grup de pini care pot fi setati ca si intrari sau iesiri.

Acum. Fiecare asemenea port hardware, grupare de pini au atribuiti un numar de registri, registri care sunt scrisi cu litere mari. Cum spuneam printre registrii asociati porturilor exista si registrul PORTx.

 

Asadar o sa intalnesti referiri la portul A (uneori ca sa avem confuzie si mai mare se scrie chiar PORTA) cand se face referire la gruparea de pini hardware. Iar alteori o sa intalnesti referiri la registrul PORTA care este doar o "unealta" care permite sa ii faci ceva portului hardware, cel format din pini.

Editat de mars01
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