Sari la conținut

Despre programarea microcontrolere Atmel AVR - intrebari si raspunsuri


Postări Recomandate

Ciro,

 

deoarece de fiecare data cand se apasa o tasta: k = key [1];, deci se va suprascrie permanent acelasi registru si nu se va putea memora toate apasarile anterioare

 

eu nu am sustinut ca, codul asta va memora toate apasarile de la 1900 incoace, ci ultimele doua. Din cerintele lui Dan am inteles ca vrea sa afiseze in grupuri de 2 (xy) deci va trebui sa memoreze minim doua, daca vrea mai multe nu are decat sa faca buffer-ul mai mare. (bufferul e un shift register, nu se suprascrie nimic in el daca te uiti mai atent)

poate imi explici ce nu e in regula cu codul ala ca nu mi-e clar (babeste ca sa inteleg si eu) sunt numai doua linii de cod.

 

ceva e putred cu cnt, pleaca de la 0, iese din primul else cu valoarea 1, iar la urmatoarea trecere nu se mai incrementeaza, pentru ca cnt==1 e true, si nu-l mai incrementeaza nimeni. (deci al doilea if cnt==2 nu va fi niciodata true)

RR

Editat de roadrunner
  • Răspunsuri 163
  • Created
  • Ultimul Răspuns

Top Posters In This Topic

Top Posters In This Topic

Posted Images

cnt se va opri la 3 sau 4 cel mult, deoarece daca te uiti la tipul de variabila declarata pentru kp = 0...255. Cum 255 e format din trei cifre, atunci e suficient cnt = 3 sau am putea alege si cnt = 4 daca dorim sa afisam o eroare atunci cand se tasteaza, spre exemplu, 355 la tastatura (se depaseste max.255). Deci, nu trebuie sa foloseasca 200 if else, ci e suficient numai 4 instructiuni de genul asta.

Dar, trebuie intai testat codul meu si apoi vazut ce mai trebuie sau daca mai trebuie ceva.

cnt nu are cum sa se incrementeze mai mult de 1 (asa cum e scris codul tau)

RR

 

PS - ai uitat sa-mi explici de ce nu functioneaza

key[1]=key[0]; //salvezi tastarea anterioara
key[0]= k; //citesti ultima valoare de la tastatura

 

care e un shift register, daca sustii ca nu functioneaza trebuie sa aduci argumente, ca eu dupa 25 de ani de programare nu o sa te cred pe cuvant.

RR

Editat de roadrunner

while(4) e la fel cu while(2) si cu while(1) si e TRUE prin definitie.

RR

 

PS - asa cum e codul scris de tine "cnt" nu se incrementeaza mai mult de 1.

Editat de roadrunner

Ciro,

 

sincer, nu am inteles care e rostul lui cnt (deci habar n-am cum trebuia sa fie)

pentru ce mentii cnt? ca sa poti determina adresa unde le pui in eeprom? (ca pentru asta nu ai nevoie de toate if-urile alea o poti calcula on-the-fly fara if-urile alea)

RR

Editat de roadrunner

roadrunner, cum pot sa scriu ciclic in adresee EEPROM variabilele alea: key[0], key[1], key[2] ?

Se poate sa folosesc codul asta scris de tine mai devreme:

static char  offset= 0; //definesti o varibila 

write_eeprom( 0x200 + (offset & 0x03),k)
offset++;

} while(1);  //bucla while principala

unde sa inlocuiesc k cu key[1] s.a.m.d. ?

Si eu nu am vazut adresa 0x201 in atmega32, ci doar 0x200, 0x210, 0x220 s.a.m.d. Adica, codul tau de mai sus, la urmatoarea adresa daca scrie in 0x201, inseamna ca va scrie in 0x210 sau..?

 

stima

dan

Intreb aici, ca sa nu deschid alt topic, pentru ca am vazut ca se discuta despre bucle do while. In plus, am vazut un cod asemanator cu ce ma intereseaza pe mine.

Am urmatorul cod:

do {
// Prima bucla do while
do { variabila a } while(!a);
// A doua bucla do while
do { variabila b } while(!b);
// A treia bucla do while
do { variabila c } while(!c);
} while(1)

As vrea dupa ce se executa prima bucla do while, codul sa treaca la urmatoarea bucla do while s.a.m.d. Initial ma gandeam sa folosesc instructiunea continue si/sau break dar nu stiu cum! :music_guitarred: Poate cineva sa ma lamureasca. Raman dator cu o bere sau mai multe! :juggle:

Editat de ionut90

Dan,

 

hai sa lamurim odata pentru totdeuna adresele astea de eeprom

prima locatie este adresa 0x0000 iar ultima 0x03FF (la atmega32 are 1K de eeprom sau 0x400h) - lucrurile astea sunt scrise negru pe alb in datasheet.

roadrunner, se pare ca stii cum incepe si cu ce adresa se termina EEPROMul lu Atmega32 dar nu stii adresele intermediare. Uite, de asta imi place mie compilatorul mikroC, pentru ca iti arata asta (vezi mai jos):

post-3561-082477400 1297529103_thumb.jpg

 

ionut, chiar m-ar interesa si pe mine un raspuns la chestiunea ta.

 

stima

dan

roadrunner, se pare ca stii cum incepe si cu ce adresa se termina EEPROMul lu Atmega32 dar nu stii adresele intermediare.

 

se pare c-ai descoperit tu gaura de la macaroana, toate adresele din spatiul 0x000 - 0x03FF sunt la fel de "intermediare".

RR

 

Ionut,

cand conditia din paranteza rotunda de la while e TRUE atunci trece cu executia ma departe, ce e asa greu de priceput.

do
{


} while (a==2)

 

s-ar traduce in romaneste

 

fa
{


} pana_cand(a==2)

 

 

cand "a" va lua valoarea 2 iese din bucla.

(eu tot nu inteleg de c e nu cititi despre limbajul C, homework, homework)

RR

Editat de roadrunner

de citit, am citit multe despre limbajul C dar nu ca sa programez microcontrolere. Apoi, compilatorul mikroC nu seamana 100% cu ce am invatat eu si am mai observat ceva: compilez programul in mikroC, totul e OK, dar cand il incarc in uC programul nu functioneaza corect. De ce?

 

p.s. recunoaste ca nu stiai denumirea adreselor intermediare! Fii Fair Play!

 

stima

dan

Editat de dan_e

Dan,

 

ce vrei sa spui cu adrese intermediare, toate adresele sunt intermediare, spatiul de eeprom e liniar nu sunt unele adrese mai importante decat altele. (sunt ca numerele de la case pe o strada)

cand scrii/sau citesti o adresa de memorie e exact acelasi mecanism nu e mai greu sa scrii la adresa 0x200 decat la adresa 0x007 sau 0x3FF e exact la fel, deci ce numesti tu adrese intermediare? si ce trebuia sa stiu (sau sa stim) si nu stiam ca nu am inteles, programez de 25 de ani, dar e posibil sa-mi fi scapat ceva important toti anii astia.

RR

Editat de roadrunner

Cand ti-am spus mai sus adrese intermediare, ma refeream la adresele EEPROM cuprinse intre adresa de inceput si cea de sfarsit. Cu alte cuvinte, ma refeream la denumirea acelor adrese. Daca te uiti in imaginea postata de mine mai sus ai sa vezi ca adresele sunt denumite (un ex.): 0200, 0210, 0220 si nu cum mi-ai spus tu 0200, 0201, 0202 in postul nr.40 din acest subiect. Asta vroiam sa-ti spun. Asa ca, fii fair play!

 

Oricum, nu asta e important in toata chestiunea asta discutata. Mersi inca o data de raspunsuri, au fost foarte valoroase. Mai raman multe lucruri de clarificat la care sper sa-mi dai cateva raspunsuri. Legat de denumirea adreseelor EEPROM, ai scris in postul nr.40 urmatorul cod:

static char  offset= 0; //definesti o varibila 

write_eeprom( 0x200 + (offset & 0x03),k)
offset++;

} while(1);  //bucla while principala

intrebarea mea e: urmatoarea adresa eeprom calculata de codul de mai sus este 0201 sau 0210 cum ar trebui ? Sau nu conteaza asta, deoarece softul va scrie automat in urmatoarea adresa dupa adresa 0200?

Asta nu prea am inteles eu!

 

stima

dan

Editat de dan_e

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