Sari la conținut

Despre programarea microcontrolere Atmel AVR - intrebari si raspunsuri


dan_e

Postări Recomandate

MikroC for AVR mi s-a parut mult mai friendly decat AVR Studio. Si chiar este, are o interfata mult mai prietenoasa si un help foarte bine pus la punct.

GCC-AVR, din ce imi aduc aminte, este modulul de programare in C a microcontrolerelor din AVR Studio ? M-am jucat putin cu modul asta si mi s-a parut destul de amestecat, destul de greu de invatat.

 

stima

Link spre comentariu
Distribuie pe alte site-uri

  • Răspunsuri 163
  • Created
  • Ultimul Răspuns

Top Posters In This Topic

Top Posters In This Topic

Posted Images

GCC - (Gnu C Compliler) e cel mai popular compilator din lume, cu el s-au compilat toate linux-urile de pe planeta. (80% din serverele de web din lume sunt linux)

si culmea e free.(totusi marele avantaj din punctul meu de vedere e ca poate cross compila aproape orice acrhitectura cpu, de la Arm, PowerPC, MIPS, Alfa, INTEL, AMD, VIA si multe altele)

nu are nici o legatura cu AVR studio, decat la nivel de cod generat. (AVR Studio e facut de atmel si contine asamblorul fara de care nu functioneaza nici un compilator) iar GCC e open source, Exista tone de carti scrise despre GCC.

dar cum gusturile nu se discuta fiecare cu compilatorul lui.

RR

 

PS - uite aici mai multe depre GNU http://en.wikipedia....iki/GNU_Project

nu prea am inteles ce trebuie sa fie friendly la un compilator, ca ai nevoie de un editor de text si un terminal (minimum) sau poti sa folosesti o interfata grafica daca vrei apesi un buton in loc sa scrii "make all" in terminal.

Sunt sute de IDE-uri care se folosesc peste GCC (Eclipse fiind probabil cea mai populara) eu folosesc notepad2 sub windows, si emacs sub linux cand programez AVR-uri. Daca cumva te referi la debugger, are GNU si asta (GDB - GNU-debugger) care la fel poti sa-l folosesti in mod comand line sau cu GUI deasupra.

 

Incurajez pe cei care au de gand sa se apuce de programare embedded sa foloseasca GCC pentru ca le va fi mult mai usor sa sara de la un procesor la altul, sau la programare linux ca nu e nici o diferenta la nivel de compilator si toolchain. Adica nu ai de invatat 10 tool-uri diferite pentru 10 CPU diferite, inveti un tool si gata.

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

Ai dreptate intr-un fel, depinde cum privim problema. Spre exemplu, eu nu am vazut la AvrStudio, la modulul de programare C, un help asa bine pus la punct ca la mikroC. De fapt, inainte sa ma apuc de un compilator, am intrebat in stanga si in dreapta, inlusiv pe donpetru, si mi-a zis sa incep cu compilatorul asta (am testat si alte compilatoare pana sa ma hotarasc). Apoi, vreau sa-ti spun ca cu mikroC am invatat sa fac un program simplu pentru un microcontroler (sa se aprinda si sa se inchida un led) mai repede decat as fi stat o saptamana in fata calculatorului cu AVR Studio. Precum ti-am spus odata discutand pe privat, roadrunner, eu programez microcontrolere sau invat sa le programez mai mult din pasiune, nu e meseria mea (de fapt nici nu sunt electronist de meserie, dar am facut ceva practica, printre picaturi).

 

Acum sa revin la subiect. Mai aveam o intrebare, stiu eu cate ceva, dar m-am blocat la o bucla while de genul:

while (1)
{
...
}

sau

do
{
...
}
while (1);

Deci, pana la urma, ce semnificatie are cifra 1 din paranteza lui while? Ce vrea sa spuna?

 

Eram sa uit, mai aveam ceva de intrebat: poate un microcontroler Atmega32 sa faca un calcul de genul: k=100*m+50*n+g ?

 

stima

dan

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

1 din paranteza lui while inseamna ca bucla while se executa atat timp cat conditia evaluata in bucla nu este adevarata (1= true, 0=false). O bucla de genul asta while(1) se poate executa la infinit sau se poate bloca daca in bucla ai o instructiune de genul break sau chiar o alta bucla do while cu o alta variabila de intrare.

Microcontrolerele pot executa genul ala de operatii.

Link spre comentariu
Distribuie pe alte site-uri

Elco,

 

eu credeam ca bucla while se executa cat timp conditia este true (adica este adevarata) tu ai scris invers, ca bucla se executa cat conditia NU este adevarata.

do{
..
..
} while (TRUE)

 

dintr-un manual ce C

The while construct consists of a block of code and a condition. The condition is evaluated, and if the condition is true, the code within the block is executed.

 

RR

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

As vrea sa incerc sa fac un program care are structura asta:

unsigned short k;
char ii;
do { k = 0;
do {
    [b]Variabila k [/b]      
    } while (!k); // se incheie prima bucla while
Switch
{
case 1: k = 0; break
...
case 10: k = 40; break
}
-- aici trebuie sa introduc o instructiune care sa scrie in adresa EEPROM(0x200, k)
while (1) // se incheie a doua bucla while

Bun, sa-mi spuna cineva daca e gresit codul. Apoi, ce vreau sa fac: a doua bucla while se executa de cate ori variabila k are o valoare noua sau identica. Problema e si nu stiu cum sa fac asta e ca atunci cand a doua bucla while se executa a doua oara, variabila k sa nu mai fie scrisa la adresa 0x200 ci la urmatoarea adresa din EEPROM dupa 0x200?

Am uitat sa va zic: microcontrolerul e atmega32 care are in EEPROM: 0x200,0x210, 0x220...

 

stima

dan

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

Dan,

 

hai sa vedem daca am inteles ce vrei.

1. ai o bucla do/while care asteapta sa se introduca variabila K (butoane tastatura etc) - testul de iesire din bucla este K != 0.

 

2. ai un selector switch care testeaza variabila ???? (care) ca nu e clar, ... si schimba valoarea lui K ??? (nu sunt sigur ca am inteles bine care e rostul)

 

3. La fiecare variabila validata vrei sa scrii in eprom la adrese succesive? 200h 201h etc. valoarea K.

 

Astept sa-mi confirmi 1,2,3 ca sa nu-mi bat gura de pomana.

RR

 

PS - nu am inteles ce vrei sa spui cu

atmega32 care are in EEPROM: 0x200,0x210, 0x220...

poate clarifici un pic.

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

Da, ai expus bine altgoritmul 1, 2, 3.

As vrea sa mai fac o completare: eu vreau sa scrie ciclic in memoria EEPROM de trei ori si dupa aia sa o ia de la capat. Si da, k este o variabila citita de la o tastatura 0... 9 si *, #.

 

Era doar un exemplu cum are structurat EEPROMul atmega 32, adica dupa adresa 0x200 urmeaza 0x210 s.a.m.d.

 

stima si mersi de raspuns.

Link spre comentariu
Distribuie pe alte site-uri

la punctul 1. ai facut bine

 

 

do {
//citeste k
}
while( !k); 

 

 

punctul 2 - nu am inteles inca rostul

 

 

punctul 3.

 

static char  offset= 0; //definesti o varibila 

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

} while(1);  //bucla while principala

 

 

in cateva cuvinte cum functioneza codul de la punctul 3:

de cate ori va trece executia pe acolo, va scrie in eprom la adresa 0x200 + (offset & 0x03)

offset se va incrementa 0...255 si tot asa (ciclic) dar fiindca e AND logic cu 0x03 de fapt vei avea numere 0,1,2,3,0,1,2,3..... (practic numai doi biti LSB vor ramane din numarul ala)

deci vei scrie in EEPROM la 0x200, 0x201, 0x202, 0x203, 0x200,.... si tot asa.

 

RR

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

mersi dar nu prea am inteles codul asta:

offset & 0x03

De la ce vine 0x03 ?

 

Apoi, as vrea sa mai fac o completare la program: sa presupunem ca se apasa de doua ori aceesi tasta sau doua taste diferite de la tastatura, se scriu datele in EEPROM si as vrea sa le afisez pe ecranul unui lcd 1x16, dar sub forma xy, unde x e prima apasare de la tastatura si y a doua apasare (x, y insemnand una din cifrele 0..9). Eu nu vreau cand apas x sa se stearga x cand apas y. Ce trebuie sa fac in programul de mai sus?

 

Am uitat sa-ti zic, instructiunea switch identifica ce tasta de la tastatura se apasa.

 

stima

dan

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

Eu nu vreau cand apas x sa se stearga x cand apas y. Ce trebuie sa fac in programul de mai sus?

 

trebuie sa le memorezi intr-un buffer (un sir de lungimea care o vrei)

 

char key[2]={0,0};

do {
//citesti pe k de la tastatura
}
while (!k);
key[1]=key[0]; //salvezi tastarea anterioara
key[0]= k; //citesti ultima valoare de la tastatura

 

key[0] va contine tasta apasata currenta

key[1] va contine tasta apasata anterior

 

RR

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

mersi, am sa incerc azi solutia propusa si revin cu detalii.

 

e posibil ca un soft scris intr-un compilator, cu aceeasi fuse biti, daca e scris in uC cu un program (ex. PonyProg) sa se comporte diferit daca e scris cu un alt program (ex. AVR Studio)? Si daca se comporta diferit, de ce se comporta sau functioneaza diferit?

 

 

stima

dan

Link spre comentariu
Distribuie pe alte site-uri

trebuie sa le memorezi intr-un buffer (un sir de lungimea care o vrei)

 

char key[2]={0,0};

do {
//citesti pe k de la tastatura
}
while (!k);
key[1]=key[0]; //salvezi tastarea anterioara
key[0]= k; //citesti ultima valoare de la tastatura

 

key[0] va contine tasta apasata currenta

key[1] va contine tasta apasata anterior

 

RR

Nu are nicio logica codul:

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

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

 

Cred ca e mai bine daca se utilizeaza si un counter pe langa static char, counter care va numara de cate ori se apasa o tasta de la tastatura si la fiecare apasare va indexa variabila k intr-un nou registru static. Apoi din registru respectiv se pot transfera valorile intr-o anumita locatie din memoria EEPROM, cand counter = 2 se scrie in urmatoarea locatie s.a.m.d.

unsigned short k, cnt, oldstate = 0;
unsigned address1 = 0x200;
unsigned address2 = 0x220;
unsigned address3 = 0x240;
char a, b, c; // astea sunt variabile care vor citi adresele EEPROM de mai sus;
...
void main {
cnt = 0;
...alte conditii din program;
do {
k =0;
do {
se apasa o tasta;
while (!k);
switch (k) 
{
aici treci conditiile, asa cum ai spus, e o instructiune foarte importanta care ajuta la identificare tastei apasate. Apoi, in microcontrolere, tasta apasata, spre exemplu "2", are valoare DEC=50 (sau HEX=0x32) [b]si nu[/b] 2 asa cum sunt multi tentati sa creeada. Din acest motiv trebuie instructiunea switch, o instructiune foarte folosita mai ales daca vrem sa afisam valoarea tastei apasate pe un ecran LCD 2x16 sau 1x16; 
}

if(cnt == 1)
{
Lcd_Chr(1, 11, k);
EEPROM_Write(address1, k);
}
else
{
cnt++;
}

if(cnt == 2)
{
Lcd_Chr(1, 12, k);
EEPROM_Write(address2, k);
}
.....................
} while (1);
}

Mai sus am postat doar o idee cum ar trebui structurat programul si nu este singura optiune.

 

O sambata placuta tuturor.

Editat de ciro
Link spre comentariu
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