Assembler-komentari/pitanja

Rasprava o AVR mikrokontrolerima, AVR projekti i drugo vezano za AVR...

Moderators: pedja089, stojke369, trax, InTheStillOfTheNight

Post Reply
Maki
Odlično uznapredovao
Odlično uznapredovao
Posts: 766
Joined: 02-07-2012, 12:54

Assembler-komentari/pitanja

Post by Maki »

Evo otvaram ovaj topic kao bih/bi mogli postavljati pitanja ili komentirati temu " Programiranje u Assembleru " od kolege @buco-1.
Malo sam uplovio u te vode te imam nekoliko pitanja pa ako netko ima vremena i volje mi malo to pojasnit.

1.) Malo me bune opči registri R0-R31, oni su locirani u SRAM-u, jel tako ? R26 do R31 mogu imati istu namjenu kao i ovi prije, ali imaju još jednu, a to je omogučuju indirektno adresiranje (mogu biti u paru i činiti 16 bitni registar za lociranje neke adrese u SRAM-u) ? Jel onda sve jedno u kojeg zapisujem sadržaj nekog registra ? Npr. želim zapisati sadržaj I/O registra PORTC u jedan od njih.

2.)Stog ? Koliko sam shvatio, njega se ograničava tako da mu se na početku zada početna adresa, npr. 0x77, a on si poslje rezervira od 0x60 do npr. 0x77 u SRAM-u ?

3.) Probao sam napisati jedan program, trenutno ga nemam mogučnosti isprobati u praksi. Zanjima me, bi li to radilo ?
Program bi trebao raditi sljedeće: kad se dogodi interrupt INT0 (rastuči brid) da led na portd.2 = 1 zasvijetli, a interrupt INT1 (isto rastuči brid) da ugasi led portd.2 = 0. U glavnoj petlji mcu trenutno samo zuji :oops:

Code: Select all

 
 .org $001 rjmp Vanjski_INT0
 .org $002 rjmp Vanjski_INT1

 Inicijalizacija:
 in r16, MCUCR //Ucitam MCUCR u registar r16
 ori r16, 15 //postavim zadnja 4 bita u 0, time sam postaio INT0 i INT1 da okida na rastući brid
 out MCUCR, r16 //to natrag upisem u MCUCR
 in r16, GICR // Učitam registar GICR
 ori r16, 192 //Između učitane vrijednosti i broja 192 (binearno 11000000) odradim ILI
 out GICR, r16 //Tu vrijednost upišem natrag u registar GICR time sam omogučio INT0 i INT1
 in r16, DDRD //Ucitam vrijednost registra DDRD
 ori r16, 6 // 2. i 3. bit postavim u 1
 out DDRD,r16 //Pinovi portd.2 i portd.3 su izlazni
 sei //Postavljen 7 bit u SREG-u, omogučeni interrupte
  
 Glavna:
 nop //Trenutno nista pametnog ne radi u glavnoj petlji, osim sto malo trati vrijeme...
 nop 
 nop
 rjmp glavna

 Vanjski_INT0:
 sbi PORTD, 2
 reti

 Vanjski_INT1:
 cbi PORTD, 2
 reti
Maki
Odlično uznapredovao
Odlično uznapredovao
Posts: 766
Joined: 02-07-2012, 12:54

Re: Assembler-komentari/pitanja

Post by Maki »

Ustanovio sam da postoji jedna greška u kodu. Krive bitove sam definirao kao izalzne :oops:
Evo, prepravljeno:

Code: Select all


.org $001 rjmp Vanjski_INT0
.org $002 rjmp Vanjski_INT1

Inicijalizacija:
in r16, MCUCR //Ucitam MCUCR u registar r16
ori r16, 15 //postavim prva 4 bita u 1, time sam postaio INT0 i INT1 da okida na rastući brid
out MCUCR, r16 //to natrag upisem u MCUCR
in r16, GICR // Učitam registar GICR
ori r16, 192 //Između učitane vrijednosti i broja 192 (binearno 11000000) odradim ILI
out GICR, r16 //Tu vrijednost upišem natrag u registar GICR time sam omogučio INT0 i INT1
in r16, DDRD //Ucitam vrijednost registra DDRD
ori r16, 3// 0. i 1. bit postavim u 1
out DDRD,r16 //Pinovi portd.0 i portd.0 su izlazni
sei //Postavljen 7 bit u SREG-u, omogučeni interrupti
  
Glavna:
nop //Trenutno nista pametnog ne radi u glavnoj petlji, osim sto malo trati vrijeme...
nop 
nop
rjmp glavna

Vanjski_INT0:
sbi PORTD, 0
reti

Vanjski_INT1:
cbi PORTD, 0
reti

buco-1
Napredujem
Napredujem
Posts: 105
Joined: 24-10-2010, 21:22

Re: Assembler-komentari/pitanja

Post by buco-1 »

Prosao sam forumom i vidio ovaj topic. Imam malo vremena, zaista, za internet. Osim za posao. Hvala sto si pokrenuo topic!
Odgovoriti cu ti na prvi post; ono oko registara avr jezgre.

Registri r26--r31 su zapravo namjenjeni da se koriste kao indeksni brojaci. Funkcije Z registara (ZH,ZL), mislim da su r30 i r31, su i registri sa posebnim funkcijama, adresni brojaci, za neke od naredbi: lpm, elpm, upis i citanje int. eeproma, samoprogramiranje flasha ili njegovo citanje kao i brojaci apsolutne adrese icall i ijmp naredbi.

Mislio sam obraditi i tu temu u onoj prici o asemblerru. Indeksno adresiranje i neke specijalne funkcije, ali...

"Jel onda sve jedno u kojeg zapisujem sadržaj nekog registra ?"

Da, oni su ionako podskup srama od adrese 0-->1F. Svaki od njih je i zaseban 8 bitni registar. No nema potrebe za tim jer su korisniji kao indeksni brojaci (definira se najprije apsolutna adresa ciljane zone srama ( moze i eeproma ili flash memorije kod ZH:ZL para) ili se koriste kao 16 bitni counteri. Naravno govorimo o assembleru u kojemu mozete gotovo sve redefinirati.

"Stog ?"
Hm. Push i pop naredbe, poziv na stog, su gotovo nepotrebne u assembleru. Zaista je izuzetno rijetko da one trebaju, cak i kod vrlo slozenih struktura programa.
Ja tako sto nisam vidio u hobby programiranju,slozene strukture. U profesionalnom su strukture programa daleko slozenije, cak i poprilino slozene no zaista je rijetko potebno pozivati push i pop naredbe. I tad obicno idu jedan ili dva registra u stog. To zahtijeva da se na assembler ne gleda kao na C ili paskal, basic... Tu ljudi obicno i naprave gresku jer sve predefinicije ostave kao da pisu program za vise programske jezike.

Sto se tice pocetne korisnicke adrese srama (npr. 0x60) ona nije predefinuirana nicim, to je stvar programera. Kod mnogih procesora je stog dio memorije u koji programer ionako nemoze uci, osim na propisani nacin, a dubina i tip stoga su unaprijed definirani od proizvodjatja. U AVRa je stog fifo tipa a sram nema, naravno, nikakav tip: mozes ga citat i upisivat na koje god nacine zelis, kao i sve staticke memorije.

Ako mislis na virtualni stog (nazovimo to tako), npr. kao neko polje za pohranu rezultata u sramu, to je nesto drugo.

Pozdrav.
Today's scientists have substituted mathematics for experiments, and they wander off through equation after equation, and eventually build a structure which has no relation to reality.
- Nikola Tesla
Maki
Odlično uznapredovao
Odlično uznapredovao
Posts: 766
Joined: 02-07-2012, 12:54

Re: Assembler-komentari/pitanja

Post by Maki »

Zahvaljujem se na odgovoru i izdvojenom vremenu.

Trenutno još nisam nabavio mega8, ali razmišljam da si nabavim mega16 8)
Uglavnom, nadam se da ću uskoro nešto uspijet ispitati i u praksi. Naravno onda izbaciti i koji projektić koji će biti realiziran sa assemblerom :wink:
Maki
Odlično uznapredovao
Odlično uznapredovao
Posts: 766
Joined: 02-07-2012, 12:54

Re: Assembler-komentari/pitanja

Post by Maki »

Na kraju sam nabavio ATmega328. Nažalost, ne stojim baš sa vremenom, ali za sad se to vrti u mojoj glavni, negdije u "pozadini".
Razmišljajući o brojni stvarima, naišao sam na jedno pitanjce. Naime, radi se USART modulu unutar mege8 ili mege328p. Pretpostavljam da postoji neka manja razlika izmeđeu ta dva modula, ali trenutno mi to nije bitno. Pitanje je, prima li općenito USART modul u svoj registar sadržaj dok mcu nešto radi ? Odnosno, ja mogu zbrajati i oduzimati, a da mi pritom pristiže informacija sa npr. PC-a ? Kad pristigne aktivira neku zastavicu koja signalizira primljenu informaciju ? Ili baš moram čekat dok informacija ne pistigne ?
Ne znam je ste li shvatili pitanje, ako treba ponovno ću ga formulirat, ali drugačije.

Unaprijed zahvaljujem na odgovoru ! :)
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1724
Joined: 28-03-2012, 18:01
Location: Split

Re: Assembler-komentari/pitanja

Post by Kukinjos »

Dobro misliš, to je hw shift registar, i on puni buffer bez obzira s čim se trenutno kontroler bavi, nakon čega se postavi zastavica da je primljen byte.
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
Maki
Odlično uznapredovao
Odlično uznapredovao
Posts: 766
Joined: 02-07-2012, 12:54

Re: Assembler-komentari/pitanja

Post by Maki »

O, to je lijepo znati :)
Jedva čekam da se dočepam malo više vremena pa da se poigram sa mikrokontrolerima. Poslije probat iskombinirat sa nekom vanjskom elektronikom (projektirat nešto svoje) i složit neki dobar projekat (ima se u planu nekoliko njih, a vjerovatno će prevagnut onaj jeftiniji :lol:)
Hvala na odgovoru :)
Post Reply