Sari la conținut

Despre programarea microcontrolere Atmel AVR - intrebari si raspunsuri


Postări Recomandate

FF inseamna 0 logic, adica 0 volti pe pinii portului. Daca scrii 00 in loc de FF vei avea 1 logic, adica 5V pe toti cei 8 pinii a portului.

oare?

daca te uiti in datasheet, IO-urile la MCU sunt push pull (doua tranzistoare CMOS) daca scri 1 logic la port, intra in conductie tranzistorul de sus, si IO-ul face source curent (adica 1 logic, adica VCC pe pinul ala) si daca scri 0 la bitul respectiv intra in conductie tranzistorul de jos si face sink, adica zero logic, adica pe dos fata de cum explici tu. (eu zic sa fi mai rezervat)

RR

Editat de roadrunner
Link spre post
Distribuie pe alte site-uri
  • Răspunsuri 163
  • Created
  • Ultimul Răspuns

Top Posters In This Topic

Top Posters In This Topic

Posted Images

Scuze, dar mi se pare mie sau am vorbit amandoi despre acelasi lucru: PORT A = 0x00 inseamna 5V pe fiecare pin a portului, adica 1 logic, cum am mai spus si ai spus si tu privind totul dinspre interiorul microcontrolerului. hei, eu am privit totul din exteriorul microcontrolerului, adica la iesire acei 1 logic, ca inauntru scrii 0 - ma refer la intrarea tranzistoarelor alea de care spui - e alta mancare de peste. Dar, pana la urma tot aia vorbim dar nu mai inteles pentru ca eu sunt obisnuit sa lucrez cu alt compilator ca tine.

 

:thumbup3:

Link spre post
Distribuie pe alte site-uri

trebuie sa scrii PORTA=0xFF ca sa ai 1 logic pe toti bitii portului A (la pini)

compilatorul nu are nici o relevanta.

RR

 

 

PS -

"pentru ca eu sunt obisnuit sa lucrez cu alt compilator ca tine."

de unde sti ce compilator folosesc eu? sau esti mama omida?

Editat de roadrunner
Link spre post
Distribuie pe alte site-uri

mersi tuturor

 

O chestie nu am inteles eu. Am inteles treaba cu numarele binare dar in program (eu folosesc C) ce numere trebuie sa folosesc, ca sa adun si sa scad numere: binare, hexa sau decimale.

Am gasit instructiuni intr-un manual de utilizare de genul:

for ( s = 0, i = 0; i < n; i++ ) s += a * b;

a si b din produsul de mai sus, de care numere trebuie sa fie?

 

stima

dan

Link spre post
Distribuie pe alte site-uri

Dan,

 

numerele sunt repreznentate intern (in MCU) binar, dar aici te ajuta limbajul C, si iti da posibilitatea sa manipulezi (sa reprezinti) in ce forma it place mai mult.

reprezentarea interna, adica numarul de biti, semn, zecimale depind de tipul variabilei, compilatorul face asta pentru tine nu-ti bate capul cu asta, tu le reprezinti in programul sursa cum iti place tie mai mult.

 

a doua intrebare: in limbajul C trebuie sa definesti tipul variabilelor, deci in functie de cum au fost declarate. (pot sa fie unul din tipurile: char, int, float)

tipul va restrictiona marimea numarului cat si reprezentarea interna.

nu vei putea declara un numar intreg si unsigned si sa-i atribui valoarea -123.45.

dar astea-s intrebari de C nu de microcontrolere.

RR

Link spre post
Distribuie pe alte site-uri

mersi de raspuns, dar ce nu am inteles eu, de ieri si pana azi, studiind mai atent problema, daca in codul cu instructiunea for de mai sus, numerele a sau b le pot trimite direct in EEPROM sau trebuie sa apelez la vreo conversie in hexa sau face compilatorul automat asta? Uite, sa presupunem ca a si b sunt 25 si 65, doua numere, cum le scriu intr-o anumita adresa din EEPROM?

 

deja topicul asta, cred ca ar trebui redenumit: intrebari de incepator in programarea microcontrolelor sau ceva aproximativ.

 

stima

dan

Link spre post
Distribuie pe alte site-uri

compilatorul face asta pentru tine automat. (dar cum am spus mai sus exista restrictii date de tipul lui a,b)

un exemplu:

a= 128;

a=0x80;

vor face acelsi lucru cand sunt compilate daca "a" este de tipul char.

RR

 

PS Deschide alt topic daca vrei.

Editat de roadrunner
Link spre post
Distribuie pe alte site-uri

Am folosit char si a mers. Multumesc foarte mult de raspunsuri.

 

O sa am mai multe chestiuni de intrebat pe masura ce invat microcontrolere Atmel, asa ca va rog sa nu va suparati ca intreb anumite chestiuni care poate nu au tangenta unele altele. Din aceasta cauza am propus modificarea titlului topicului ca sa nu deschid o suta de topice.

 

Urmatoarea chestiune pe care vreau sa o implementez in soft e de genul asta. Sunt trei instructiuni if:

if (conditie 1)
......
if (conditie 2)
......
if (conditie 3)
......
else else else

Programul vreau sa functioneze asa: se executa prima instructiune if. Urmatoarea conditie (nr.2) se executa dupa un anumit timp (ex.2..10 secunde). Ma gandeam sa folosesc un delay dar nu stiu exact intervalul de timp. Daca dupa intervalul asta de timp nu se executa conditia nr.2, programul sa treaca la instructiunea else corespunzatoare si sa afiseze pe ecranul unui LCD o eroare.Daca intr-un interval de timp (sa presupunem mai mic de 10 sec) se executa conditia nr.2 atunci se executa urmatorul if s.a.m.d.

Deci, nu stiu eu sa fac programul sa astepte un timp. Daca delay-ul e prea mare si conditia nr.2 se executa imediat dupa o secunda dupa conditia nr.1, atunci se mai executa conditia nr.2 ?

 

stima

dan

Editat de dan_e
Link spre post
Distribuie pe alte site-uri

nu am inteles mare lucru din descriere, ar fi mai simplu sa faci o diagrama cu flow-ul. (flow chart) ca sa ma prind ce vrei.

pentru intarzieri sunt mai multe metode unele mai eficiente decat altele, cea mai simpla este delay_ms(x) si delay_us(x) care sunt de tipul blocking adica programul nu va executa nimic in intervalul de asteptare, va fi "blocat". (delay_ms este o bucla blocking de x milisecunde, iar delay_us este o bucla de x microsecunde) - au precizie destul de buna cu conditia sa nu vrei valori sub 20 us.

o alta metoda e sa programezi un timer cu perioada dorita si cand expira sa genereze un event (o interupere) iar programul sa-si vada de treaba pana expira timerul. (ca si cand pui ceasul sa sune)

 

legat de if/else

daca conditiile sunt asemanatoare (au aceeasi variabila testata) cel mai eficient e sa folosesti "switch" (google " C language switch")

RR

Editat de roadrunner
Link spre post
Distribuie pe alte site-uri

Nu m-am exprimat foarte bine. Sa rescriu.

 

Deci, urmatoare conditie (nr.2) se executa dupa ce primeste pe un alt pin microcontrolerul un semnal 1 logic. Semnalul asta il primeste dupa 2...10 secunde (deci nu dupa o perioada fixa de timp). Vreau ca in acest timp programul sa nu treaca la ELSE si sa afiseze eroarea. Ma gandeam sa introduc un delay de 10 secunde dar daca semnalul il primeste la 3 secunde, il mai vede microcontrolerul ca sa treaca la urmatoarea instructiune if ?

Conditiile nr.2 si 3 au aceeasi variabila testata.

 

stima

dan

Link spre post
Distribuie pe alte site-uri
Semnalul asta il primeste dupa 2...10 secunde (deci nu dupa o perioada fixa de timp). Vreau ca in acest timp programul sa nu treaca la ELSE si sa afiseze eroarea.

 

sper sa fi inteles bine

vrei sa testezi timp de 10 s starea unui pin, daca in intervalul de 10s pinul a devenit HIGH treci imediat mai departe daca s-au scurs 10 secunde si pinul a ramas LOW afisezi eroare. (in exemplu am ales pinul PA0 - msb din portul A)

 

 

secunde =10;
do {
if ((PORTA & 0x01) ==1) break;  //daca pinul PA0 = 1 iesi din bucla while
delay_ms(1000); //asteapta 1 s
secunde--;  //decrementeaza secundele 
} while (secunde == 0);   //daca nu s-au scurs 10 s reia bucla
if (secunde ==0) printf ("Error");

 

cred ca ai nevoie sa inveti programare C (lasa microcontrolerele deocamdata)

programarea nu se invata pe forumuri, exista carti.

Cel mai eficient e sa-ti pui compilatorul "gcc" (Gnu C Compiler) pe PC si sa scrii programe simple ca cel mai de sus. (in loc sa testezi un pin, testezi o tasta apasata)

E mult mai eficient sa inveti pe PC pentru ca elimini pasi inutili, programare MCU, cabluri, etc. care te incetinesc la invatat. Cand stapanesti bine tehnicile programarii o sa-ti fie mult mai usor, la MCU. Asa inveti la gramada si cand gresesti ceva nu esti sigur ce-ai gresit. Elimina din variabile.

RR

Editat de roadrunner
Link spre post
Distribuie pe alte site-uri

Multumesc inca o data pentru raspunsuri.

As mai avea o problema. Am mai studiat eu C/C++, dar nu pentru microcontrolere, de asta va intreb, ca sa ma obsinuiesc cu noul compilator ales mikroC.

Initial, am facut diverse programe mici cu butoane si acum as vrea sa incerc ceva cu un keypad 4x4. Intrebarea mea este:

roadrunner, as putea, in acelasi cod al tau de mai sus, sa folosesc in locul (PORTA & 0x01) ==1 un cod care sa detecteze daca e apasata oricare tasta de la keypad 4x4 ? Si cum pot sa scriu asta sau cum este mai simplu?

 

mersi donpetru pentru ca ai schimbat denumirea topicului.

 

stima,

dan

Link spre post
Distribuie pe alte site-uri

Dan

 

cei de la mikroC au niste placi de dezvoltare ca schema de mai jos

http://www.mikroe.co...ematic_v101.pdf

pe pagina a doua a schemei e legata si o tastatura 4x4, si sunt sigur ca daca te uiti in exemplele de pe pagina lor, au si exemple pentru tastatura.

deci homework.

RR

Editat de roadrunner
Link spre post
Distribuie pe alte site-uri

Dan,

de curiozitate care e motivul pentru care ai ales mikroC? (care dupa mine e un compilator obscur si mai e si cu bani)

gcc-avr e free, e popular, e stabil (toti programatorii de linux din lume-l folosesc) si mai mult gasesti milioane de exemple de cod gata scris (cu bibliotecile aferente, care sunt testate pe milioane de produse)

RR

Editat de roadrunner
Link spre post
Distribuie pe alte site-uri

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
  • Navigare recentă   0 membri

    Nici un utilizator înregistrat nu vede această pagină.




×
×
  • Creează nouă...

Informații Importante

Folosim cookie-uri și tehnologii asemănătoare pentru a-ți îmbunătăți experiența pe acest website, pentru a-ți oferi conținut și reclame personalizate și pentru a analiza traficul și audiența website-ului. Înainte de a continua navigarea pe www.tehnium-azi.ro te rugăm să fii de acord cu: Termeni de Utilizare.

ATENTIE !!! Functionarea Tehnium Azi depinde de afisarea de reclame.

Pentru a putea accesa in continuoare site-ul web www.tehnium-azi.ro, va rugam sa dezactivati extensia ad block din browser-ul web al vostru. Dupa ce ati dezactivat extensia ad block din browser dati clic pe butonul de mai jos.

Multumim.

Apasa acest buton dupa dezactivarea extensiei Adblock