Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

mikrokontroleri od A do Sh

[es] :: Elektronika :: Mikrokontroleri :: mikrokontroleri od A do Sh
(TOP topic, by veselinovic)
Strane: < .. 1 2 3 4 5 6 7 8

[ Pregleda: 65368 | Odgovora: 150 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

stefic_kg
Kragujevac

Član broj: 119791
Poruke: 71
79.101.135.*



+2 Profil

icon Re: mikrokontroleri od A do Sh03.07.2008. u 12:31 - pre 146 meseci
Bojane,

"Koristiš blok za ulaz i izlaz da obeležiš labele." - Dobro ovo vidm da ne valja.

"Svaki put inicijalizuješ portove." ---> ??? ne razumem sta nije u redu osim da moze krace da si napise kao sto rece Slavenko)

"Samo kada je stop DA moguće je upaliti mašinu." (kada je bit 0=0 nastavi sa ispitivanjem START prekiraca)
"Kad je stop NE nakon pauze ideš na gašenje." ( zaso nakon pauze, kad on odmah vraca na Iskljucenje programa)

Code:

; ************************ testira START i STOP prekidac **************************************

Start
                        ; Testira STOP prekidac

        btfsc   PORTA,0        ; testiraj bit 0, registra PORTA, ako je bit 0 jednak 0 preskoci sledecu instrukciju
        goto    Iskljucenje    ; ako nije jednak 0 idi na Iskljucenje


                       ; Testira START prekidac,

    btfss      PORTA,1           ; testira bit 1, registra PORTA, ako je bit 1 jednak 1 preskoci sledecu instrukciju
    goto       Start             ; ako nije onda ide na labelu Start za ponovno testiranje START prekidaca


Na dnu, nakon UKLJUČI_MAŠINU račvaš tok u multitasking !? ---> ??? ne razumem, mozes malo da pojasnis.
 
Odgovor na temu

barum
Bojan Radosavljevic

Član broj: 52522
Poruke: 418
*.smin-1.sezampro.yu.



+1 Profil

icon Re: mikrokontroleri od A do Sh03.07.2008. u 21:35 - pre 146 meseci
Evo nešto opširnijeg objašnjenja.

Citat:
"Svaki put inicijalizuješ portove."


Potrebno je izdvojiti inicijalizaciju, deo koda gde se pinovi portova postavljaju kao ulazni ili izlazni, i to izvršiti samo na početku. Ovo kako radi nije potpuno pogrešno samo je po malo suvišno. U stvari, program lepo ima labelu Start nakon inicijalizacije ali ti za start ideš na početak algoritma. Trebalo bi da se one dve povratne putanje ulivaju nakon bloka inicijalizacije. I šta znači kad kažeš "rezerviše mesto u memoriji". Da li shvataš da bi to značilo da svakim prolazom rezervisanje bez oslobađanja na kraju pojede svu memoriju. Znam da nisi tako mislio ali moglo bi se tako protumačiti. Čak šta više deklaracije i definicije nemaju mesto u algoritmu. Algoritam bi trebao biti apstrakcija koju realizuje program bez suvišnih detalja kao recimo čitava gungula oko petlje za pauzu. Ona bi u algoritmu trebala da se apstrakuje sa par blokova od kojih jedan opisuje kako se meri period(umanjivanjem tri osmobitna brojača) i drugim koji pokazuje reakciju na izuzetak kad se pojavi slučaj pritisnutog tastera.



Citat:
"Samo kada je stop DA moguće je upaliti mašinu."
"Kad je stop NE nakon pauze ideš na gašenje."

Pogledaj crtež. Imaš testiranje za stop na dva mesta. Prva rečenica je za gornji druga za donji slučaj.
Za ova dva mislim da si samo zamenio oznake za DA i NE grane na nacrtanom algoritmu. U stvari sad sam ponovo gledao sliku i video kontradikciju između "testira STOP" i jednakosti ispod.
Tok NE zapravo znači "DA STOP" i istovremeno "NE, RA0 nije jednako 0". Znači potrebno je preformulisati izjave iznad i ispod crtice u bloku da budu u saglasnosti, tj. da kad se prati tok recimo NE to bude kada je NE odgovor na oba pitanja. Ili ostaviti samo RA0=0 a obrisati "testira STOP".




Citat:
Na dnu, nakon UKLJUČI_MAŠINU račvaš tok u multitasking !? ---> ??? ne razumem, mozes malo da pojasnis.

na dnu slike ti se tok račva i jedan kraj završava u KRAJ a drugi se vraća gore. Našalio sam se i to nazvao multitaskingom. Ovaj algoritam jednostavno ne bi trebao da ima specijalnu labelu KRAJ.




Nadam se da sam bar malo uspeo da dočaram čemu se teži u teoriji. U praksi se međutim sreće sve i svašta, algoritmi sa ezoteričnom notacijom, bezglavi i bezrepi kad se na brzinu rešava problem. Čak i neartikulisane žvrljotine sa nekoliko identifikatora i brojeva u nepoznatom zapisu koje i sam autor kad kasnije pogleda nema pojma šta su ali su jednom odradile posao. Samo dobar algoritam ima trajnu vrednost jer može da uštedi vreme potrebno za razumevanje. Loši algoritmi čak mogu da unesu dodatnu zabunu i prouzrokuju čistu štetu. Zato uvek treba težiti dobroj praksi a prezirati svaku aljkavost.



Pozdrav,
Bojan
 
Odgovor na temu

stefic_kg
Kragujevac

Član broj: 119791
Poruke: 71
93.86.71.*



+2 Profil

icon Re: mikrokontroleri od A do Sh04.07.2008. u 12:47 - pre 146 meseci
OK, sad mi je jasnije.

Evo ispravio sam prvi algoritam.

Nisam menjao ono kod taestiranja STOP, nego sam pored dodao objasnjenje za NE (STOP je pritisnut) i DA (STOP nije pritisnut).
Malo kontradiktorno ali mislim da je sad malo jasnije.

Labela KRAJ neka bude tu. Nista ne smeta.

pozz
Prikačeni fajlovi
 
Odgovor na temu

TRAJKO41
Msc Mechanical Engineer
Kragujevac

Član broj: 184547
Poruke: 32
147.91.202.*



+2 Profil

icon Re: mikrokontroleri od A do Sh01.09.2008. u 13:26 - pre 144 meseci
Da li moze neko da mi pomogne u resavanju zadatka.

Tekst zadatka glasi:



Napisati algoritam i program:
Pritiskom na tastere pomerati upaljenu Led diodu na izlazu. U zavisnosti od toga koji se taster pritisne pali se prva leva ili prva desna Led dioda do diode koja je upaljena. Dioda koja je bila upaljena gasi se. Pomeranje prve Led diode (PORTB,0) udesno pali poslednju Led diodu (PORTB,7). Pomeranje poslednje Led diode (PORTB,7) udesno pali prvu Led diodu (PORTB,0).. Zadatak realizovati pomoću mikrokontrolera PIC16F84 na asembleru.
PORTB Prikaz
PORTA.0 Pomeranje ulevo
PORTA.1 Pomeranje udesno

ja sam resavao i uradio sam nesto ali asistent kaze da to jos uvek nije to i da treba jos da se doradi

evo ii kod koji imam


#include p16f84.inc ;inicijalizacija procesora koji ce se koristiti
processor 16f84

; inicijalizacija
LED equ 0x0C ; Definisanje promenjive u kojoj se čuva podatak koja LED je uključena
org 5

bsf STATUS,RP0
movlw .3 ; Pinovi RA0 i RA1 su definisani kao ulazi a
movwf TRISA ; a ostali su konfigurisani kao izlazni
clrf TRISB ; Svi pinovi PORTB su konfigurisani kao izlazni

bcf STATUS,RP0

movlw B'00001000' ;Jedna dioda mora da bude uključena na početku programa da bi se
; vršilo pomeranje ja sam izabrao da to bude LED koja je priključena na RB3

movwf LED ; Dakle po uključenju programa dija LED na pinu RB3
movf LED,W
movwf PORTB

start
btfsc PORTA,0 ; Da li je uključen taster za pomeranje u LEVO ?
goto Levo ; Jeste, skoči na Labelu za pomeranje u levo !
btfss PORTA,1 ; Nije, a da li je uključen taster za pomeranje u DESNO ?

goto start ;Ponovno na testiranje dok nešto ne bude stisnuto od ova dva tastera !

rrf LED,f ; Uključen RA1 i pomera se trenutni sadržaj LED varijable u desno pamti novo stanje opet u

movf LED,W
movwf PORTB ; LED varijabli i sve to prikazuje na izlazu PORTB u smislu kretanja uključene diode u desno

goto start ; Posle pomeranja idi na početak da vidiš koji taster će sada biti aktiviran !

Levo
rlf LED,f ; Pomera sadržaj varijable LED u levo za jedno mesto pri tome gaseći prethodno stanje i
movf LED,W
movwf PORTB ; prikazuje njen sadržaj na PORTB

goto start ; Vraća se na početak programa za novo testiranje tastera !
; konfiguraciona rec
__config B'11111111110001' ; nema zastite koda, powerup dozvoljeno,
; wd iskljucen, xt oscilator


end ; kraj programa



treba mi i algoritam a nemam pjma kako se radi. Platicu ako treba samo ako program radi i ako je tacan algoritam.Hvala
 
Odgovor na temu

sander
Aleksandar Golovic
Beograd

Član broj: 21336
Poruke: 211
*.smin-1.sezampro.yu.



Profil

icon Re: mikrokontroleri od A do Sh01.09.2008. u 17:16 - pre 144 meseci
Mislim da nema potrebe da u promenljivoj cuvas polozaj LED koja je upaljena. Ako pri inicijalizaciji upalis diodu (PORTB=b'0001000') i kada ocitavanjem tastera ustanovis koji je taster pritisnut odradis samo :

za levo

RLF portb,f
BTFSC status,C
RLF portb,f

za desno

RRF portb,f
BTFSC status,C
RRF portb,f
 
Odgovor na temu

sander
Aleksandar Golovic
Beograd

Član broj: 21336
Poruke: 211
*.smin-1.sezampro.yu.



Profil

icon Re: mikrokontroleri od A do Sh12.09.2008. u 21:13 - pre 143 meseci
Da ne bi ova tema prerasla u resavanje zadataka ajde da je vratimo na pravi kolosek.

Malo sam uporodjivao instrukciski set AVR-a pa evo da iznesem neka zapazanja. Koliko mi se svidja ideja sa 32 radna registra toliko mi se ne svidja brzina rada sa SRAM-om i sa FLASH-om. Ako sam dobro shvatio, RAM-u se moze pristupiti direktno instrukcijama:

LDS Rd,adresa i STS adresa,Rr (trajanje 2 ckl.) bez obzira na velicinu implementiranog RAM-a.

e sad, dosta napadan koncept PIC mikrokontrolera RAM izdeljen u bankama (18F serija, 16F nije uporediva sa AVR-om) bi RAM-u pristupio:

movlb banka 1 cik.
movf adresa,w 1 cik.

znaci u najgorem slucaju pristup RAM-u je podjednako brz stim sto PIC to moze i krace ukoliko je dovoljno 384b RAM-a preko opcije access bank.

Drugo, za indirektni pristup RAM-u kod AVR-a su zaduzeni registarski parovi (X, Y i Z odnosno registri koji ih grade). To je OK ali mi se ne dopada sto indirektni pristup RAM-u traje 2 cik. Naprimer:

LDI Rd,K 1 cik.
LDI Rd+1,K 1 cik.
LD Rd,X 2 cik.

ukupno 4 cik.

Kod PIC-a za indirektno adresiranje se koriste registri FSR0, FSR1 i FSR2. Na primer:

LFSR FSR0,adresa 2 cik.
MOVF indf0,W 1 cik.

ukupno 3 cik.

To ne bi bilo nesto da se pristupa 1 mem.lokaciji sta ako je potrebno procitati neki string iz RAM-a i recimo ispisati na LCD. Za string od 16 karaktera 16 cik. Kad smo vec kod LCD-a za ispis 16 karaktera imacemo i dodatnih 32 cik. zbog sporije manipulaciju sa bitovima I/O registra dvociklusnog trajanja instrukcija SBI i CBI za setovanje ili resetovanje bitova.

SBI P,b 2 cik.

Kod PIC-a:

BSF PORTx,b 1 cik.

Nisam siguran kako bi setovao ili restovao bit u nekoj varijabli ali pretpostavljam ovako, neka me neko ispravi ako gresim:

LDS Rd,adresa 2 cik.
SBR Rd,bitovi 1 clk.
STS adresa,Rr 2 cik.

Kod PIC-a:

MOVLB banka 1 cik.
BSF adresa,b 1 cik.

ili samo:

BSF adresa,b,a 1 cik (koristeci access bank)


Sto se tice Flash-a situacija je slicna kao kod RAM-a. Primer:

LPM Rd,Z 3 cik. (adresa je u Z, 16-bitna, 64Kb)

Kod PIC-a:

TBLRD * 2 cik. (adresa je u registrima TABLAT ( 5 bit) i TBLPRT (16 bit), ukupno 21 bit, 2Mb).











[Ovu poruku je menjao sander dana 12.09.2008. u 23:43 GMT+1]
 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 563
*.dynamic.sbb.rs.



+7 Profil

icon Re: mikrokontroleri od A do Sh14.09.2008. u 17:11 - pre 143 meseci
@sander,

moja osnovna zamerka AVR-u nije brzina, vec potrosnja flash-a.

Inace, AVR je sampion u brzini ako je dovoljno 32 bajta za sve varijable programa.

Indirektno adresiranje moze biti sa ofsetom. Ako imas neki niz, od bajtova, sa adresom prvog elementa niza na adresi Niz, i zelis 20 element, onda ti treba:

ldi Ry, Niz.0; // visi bajt adrese niza, Ry i Ry+1 je Ry dvobajtni registar
ldi Ry+1, Niz.1; // nizi bajt vadrese niza
ldd Rn,Y+20; // gde je ofset = 20; 0 <= ofset <= 63

za ovo je potrebno 3 ciklusa.

Ako se kopiraju dva niza iste duzine:

ldi Ry, Niz1.0;
ldi Ry+1,Niz1.1;
ldi Rz, Niz2.0;
ldi Rz+1,Niz2.1;
ldi R16,SizeOf(Niz1); //trosi 10 bajta programa

Ponovo: //petlja trosi 7 ciklusa i 8 bajta programa
ld R17,Rz+;
st Y+,R17;
dec R16
brne Ponovo;

Ili ako oba niza pocinju na adresama manjim od 64:

ldi Ry,SizeOf(Niz1);
eor Ry+1,Ry+1; //Ry+1 je nula; trosi 4 bajta programa

Ponovo: //petlja trosi 7 ciklusa i 8 bajta programa
ldd R17,Y+Niz2-1;
std Y+Niz1-1,R17;
dec R17;
brne Ponovo;

Takodje je moguce prebaciti stek pointer u neki od indeksnih registara i tako praviti dinamicke lokalne varijable na steku. Ovo je vrlo zgodna stvar.

No, ostaje moja primedba da AVR trosi mnog flash-a, i pri tome ima mali ofset kod indirektnog indeksnog adresiranja.

Primera radi evo kako izgleda kopiranje nizova kod MC9S08.
Izvorni kod
Code:

  ldhx SizeOf(Niz1);
  repeat
    ldaa x[Niz1-1];
    staa x[Niz2-1];
  until decr(IndX) =0;


i prevod:
Code:

   $fa04 : $450064     ldhx     $0064
   $fa07 : $e654       ldaa   x[$54]
   $fa09 : $e7b8       staa   x[$b8]
   $fa0b : $5bfa       dbnzx    $fa07


Ovaj kod trosi 9 bajta memorije, a petlja traje 9 ciklusa. Ako su nizovi proizvoljno u memoriji, onda ce duzina koda biti 11 bajtova a trajanje petlje 11 ciklusa. Ovaj kod vazi za bilo gde smestene nizove (cak jedan moze biti i u flash-u a drugi bilo gde u RAM-u). Jedino ogranicenje je da je duzina niza manja od 257 bajtova, inace bi kod morao biti malo modifikovan. Obzirom na strukturu MC9S08 i takt CPU-a koji iznosu 50ns, trajanje petlje je 450ns odnosno 550ns.

Ako uzmemo u obzir da je malo verovatno da oba niza kod AVR-a pocnu na adresama manjim od 63, onda je prvi primer AVR-a uporediv sa primerom za MC9S08. Proizilazi:

AVR: 18 bajtova i trajanje petlje 7 ciklusa (700ns)
MC9S08: 11 bajtova i trajanje petlje 11 ciklusa (550ns)

U odnosu na AVR, sa MC9S08 se stedi 38.9% u duzini koda i 21.4% u trajanju petlje.

Ovi odnosi nisu presudni, oni to postaju kada je faktor odnosa 2:1 ili gori. Postoje mesta u programu gde AVR postize bolji rezultat pa se moze govoriti samo o razlikama u nijansama.

Voleo bih kada bi neko napravio slicnu analizu za PIC.

Pozdrav.


 
Odgovor na temu

sander
Aleksandar Golovic
Beograd

Član broj: 21336
Poruke: 211
*.adsl-4.sezampro.yu.



Profil

icon Re: mikrokontroleri od A do Sh14.09.2008. u 22:20 - pre 143 meseci
Ovaj deo koda:

ldi Ry, Niz.0; // visi bajt adrese niza, Ry i Ry+1 je Ry dvobajtni registar
ldi Ry+1, Niz.1; // nizi bajt vadrese niza
ldd Rn,Y+20; // gde je ofset = 20; 0 <= ofset <= 63

ako je po data sheet-u traje 4 cik. Kod PIc-a bi to bilo ovako:

LFSR FSR0,adresa 2 cik.
MOVLW 20 1 cik.
MOVF PLUSW0,W 1 cik.

nisam ranije pominjao ostale registre za indirektno adresiranje jer sam hteo da ih pomenem kod poredjenja vezanih za stack.
Dakle, pored FSR0, FSR1 i FSR2 registra koji sadrze adrese i njihovih pratecih registra INDF0, INDF1 i INDF2 postoje i dodatni registri:

POSTDEC - pristupa se lokaciji na koju pokazuje FSR pa se potom FSR umanjuje 1
POSTINC - isto to samo sa uvecanjem za 1
PREINC - prepristupa lokaciji na koju ukazuje FSR, FSR se uvecava za jedan pa se tek onda pristupa lokaciji
PLUSW - prvo se sadrzaj W registra doda FSR registru (-127 do 128) pa se tek onda pristupa lokaciji na koju pokazuje FSR

Dakle deo koda za copiranje dva niza bi bio:

LFSR FSR0,adresa1 2 cik, 2 byte
LFSR FSR1,adresa2 2 cik. 2b
MOVLW SizeOF(niz1) 1 cik. 1b
MOVWF brojac,a 1 cik. 1b
loop: MOVF POSTINC0,W,a 1 cik. 1b
MOVWF POSTINC1,a 1 cik. 1b
DECFSZ brojac,F,a 1 cik. 1b
GOTO loop 2 cik. 2b

Sto ce reci, inicijalizacija 6 cik i 6 byte, prolaz 5 cik. 5 byte. Maksimalna frekvencija instrukciskog takta kod 18F serije je 16Mhz mada su u najavi i nove verzije sa 20Mhz. Sto bi znacilo da:

AVR: 18 bajtova i trajanje petlje 7 ciklusa (700ns)
MC9S08: 11 bajtova i trajanje petlje 11 ciklusa (550ns)
PIC18F: 11 bajtova i trajanje petlje 5 ciklusa (313ns) za 16Mhz oscilator + 4xPLL ili 48Mhz oscilator bez PLL

Naravno, ovo poredjenje ne znaci nista jer je samo delic onoga sto MCU radi i verijujem da bi svaki od pomenutih u realnoj aplikaciji bili priblizne brzine ali izgleda da samo AVR ne bi bio slican po utrosku flash-a.

Vezano za stack. Stack kod 18F serije je velicine 32byte sto je konstatovano kao malo, ali ako se koriste registri za indirektno adresiranje moglo bi se reci da problem malog stack-a moze biti resen software-ski. Sad, PUSH i POP insktrukcije kod AVR-a takodje traju 2 cik., PUSH i POP instrukcije kod PIC-a traju 1 cik. kao i smestaj promenjlivih preko software-skog stack-a. Koja je onda tu upotrebna prednost AVR-a?
Dalje, kod AVR-a svaki interupt ima svoj vektor dok kod PIC-a postoje 2, sa nizim i visim prioritetom. Licno, mislim da je to dovoljno za gotovo sve aplikacije, malo je verovatno da je potrebno vise interapta koji moraju da se obrade sto je pre moguce. Takodje, inzinjeri Microchip-a su ubacili fast return stack koji sluzi za automatsko cuvanje sadrzaja STATUS, W i BSR registra (sto nije bi slucaj 10F, 12F i 16F kod kojih se to moralo rucno raditi) ako se na interapt rutinu skoci pomocu CALL adresa,s i vrati RETURN s komandom.

Jos jedno zapazanje, kod AVR-a od 135 instrukcija samo se 57 izvrsavaju iskljucivo u 1 cik.,24 u 1 ili vise cik, dok se ostale izvrsavaju u 2, 3 i cak 4 cik. Kod PIC-a od 75 instrukcija 41 se izvrsava iskljucivo u 1 cik., 18 u 1 ili vise cik, dok se ostale izvrsavaju u 2 cik.
 
Odgovor na temu

sander
Aleksandar Golovic
Beograd

Član broj: 21336
Poruke: 211
*.smin-1.sezampro.yu.



Profil

icon Re: mikrokontroleri od A do Sh15.09.2008. u 08:19 - pre 143 meseci
Desio se lapsus vezano za radni takt PIC18F serije.

18Fxxxx - max.40Mhz (ili 10+4xPLL) odnosno 10Mhz instrukciski takt (10Mips)
18FxxJxx - max.48Mhz (ili 12+4xPLL) odnosno 12Mhz instrukciski takt (12Mips)
18FxxKxx - max.64Mhz (ili 16+4xPLL) odnosno 16Mhz instrukciski takt (16Mips)

Sto se tice verzije sa instrukciskim taktom od 20Mhz (80Mhz oscilator ili 20Mhz+4xPLL), ranije je bilo nekih najava ali sada nisam mogao da nadjem nista o tome na Microchip-ovom sajtu, verovatno nece biti nista od toga bar u skorije vreme.
 
Odgovor na temu

barum
Bojan Radosavljevic

Član broj: 52522
Poruke: 418
77.105.0.*



+1 Profil

icon Re: mikrokontroleri od A do Sh15.09.2008. u 08:36 - pre 143 meseci
PIC18F4550 serija ima Fclk=48MHz pa se može reći da i obična PIC18F podfamilija ima Fcy do 12MHz.
 
Odgovor na temu

sander
Aleksandar Golovic
Beograd

Član broj: 21336
Poruke: 211
*.smin-1.sezampro.yu.



Profil

icon Re: mikrokontroleri od A do Sh15.09.2008. u 08:54 - pre 143 meseci
Da mislim da su svi USB PIC-ovi max. 48Mhz ako je u pitanju obicna 18F serija.
 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 563
*.dynamic.sbb.rs.



+7 Profil

icon Re: mikrokontroleri od A do Sh15.09.2008. u 12:33 - pre 143 meseci
@sander.
napisao si da instrukcije zauzimaju 1 ili 2 bajta, valjda si mislio na dvobajtne reci, sto znaci 2 ili 4 bajta.
Da li sam u pravu?

Pozdrav.
 
Odgovor na temu

sander
Aleksandar Golovic
Beograd

Član broj: 21336
Poruke: 211
*.smin-1.sezampro.yu.



Profil

icon Re: mikrokontroleri od A do Sh15.09.2008. u 13:42 - pre 143 meseci
Da greska, izvinjavam se, u pitanju je word (dvobajtna rec). Malo sam na brzinu pisao post a kako nisam ranije imao priliku da prebrojvam utrosenu memoriju a posto se pominjali bajtovi desio se lapsus.
 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 563
*.dynamic.sbb.rs.



+7 Profil

icon Re: mikrokontroleri od A do Sh15.09.2008. u 15:21 - pre 143 meseci
Da, predpostavio sam da je omaska.

ali ipak AVR trosi vise flash-a. Recimo za inkrementiranje jedne variijable u memoriji on ce za unos vrednosti te varijable u registar potrositi 4 bajta, za inkrementiranje 2 bajta i za vracanje u memoriju 4 bajta, sto je ukupno 10 bajtova. To je cesce njego kopiranje nizova, cak mnogo cesce. Dakle, kad god AVR radi sa memorijom, a to ce morati, cak i za programe srednje slozenosti, potrositi osetno vise flash-a od PIC-a.

Sto se brzine tice sva tri MCU-a koja smo pominjali su tu negde, cak i dovoljno brzi za vecinu aplikacija. Dakle ostaje, za mene vazan faktor potrosnja flash-a. To ce vaziti dok god radim sa 8-o bitnim mikrokontrolerima, mada i oni sada imaju i po 128KB flash-a.

Pozdrav.
 
Odgovor na temu

sander
Aleksandar Golovic
Beograd

Član broj: 21336
Poruke: 211
*.smin-1.sezampro.yu.



Profil

icon Re: mikrokontroleri od A do Sh15.09.2008. u 16:16 - pre 143 meseci
Ima jos jedna lepa stvar kod 18F serije koja se vrlo razlikuje od 16F serije, W registar je mapiran u RAM memoriji na lokaciji FE8h (WREG) tako da su neke instrukcije moguce sa W koje su ranije bile moguce samo sa SFR ili GFR registrima. Recimo pomenuti primer je moguce uraditi i:

LFSR FSR0,adresa1 2 cik, 4 byte
LFSR FSR1,adresa2 2 cik. 4b
MOVLW SizeOF(niz1) 1 cik. 2b
loop: MOVFF POSTINC0,POSTINC1 2cik. 4b
DECFSZ WREG,F,a 1 cik. 2b
BRA loop 2 cik. 2b

18b duzine i 5cik. prolaz

MOVFF instrukcija vrsi kopiranje sadrzaja sa jedne adrese na drugu (adresa je bilo koja u RAM-u 4Kb), adresa moze biti i bilo koji registar pa i POSTINC0 i POSTINC1 kao u ovom slucaju. Ogranicenje je da se ova instrukcija ne moze koristiti na PCL, TOSU, TOSH i TOSL registrima.
 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 563
*.dynamic.sbb.rs.



+7 Profil

icon Re: mikrokontroleri od A do Sh15.09.2008. u 18:06 - pre 143 meseci
Bas lepo.

Znaci FSR0 i FSR1 su dvobajtni registri, da naredba MOVFF sadrzaj sa adrese u FSR0 prebacuje u adresu koju sadrzi FSR1 i da ih inkrementira za 1.
Ako je tako, i uz ono sto sam primetio kao razliku izmedju 16-tice i 18-tice, nema razloga da bilo ko koji koristi PIC uopste razmislja o 16-tici. Ne treba ni pocetnike navoditi da sa 16-ticom pocinje. Pocetnik je pocetnik i jednako su mu nepoznata oba, pa je bolje odmah da radi sa onim sto vredi.

Kakva je situacija sa indirektnim indeksnim adresiranjem, kad je indeks konstanta i kad je indeks variijabla?

Pozdrav.
 
Odgovor na temu

sander
Aleksandar Golovic
Beograd

Član broj: 21336
Poruke: 211
*.adsl-1.sezampro.yu.



Profil

icon Re: mikrokontroleri od A do Sh15.09.2008. u 22:56 - pre 143 meseci
Jeste, FSR je dvobajtni i sadrzi adresu lokacije u RAM-u.

Citanjem sadrzaja INDF registra mi ustvari citamo memorisku lokaciju na koju pokazuje FSR bez promene FSR registra.
Citanjem sadrzaja POSTDEC registra takodje citamo sadrzaj mem.lokacije na koju pokazuje FSR ali se po citanju FSR umanjuje za 1
Citanjem sadrzaja POSTINC isto kao kod POSTDEC stim sto se po citanju FSR uvecava za jedan
Citanjem sadrzaja PREINC registra prvo se FSR uvecava za jedan pa se onda pristupa mem.lokaciji na koju pokazuje FSR
Citanjem sadrzaja PLUSW registra prvo se FSR dodaje vrednost u W reg (-127 do 128) pa se onda vrsi citanjem mem. lokacije u FSR reg.

Ovo sve vazi i za sve FSR registre i njihove pripadajuce INDF, POSTDEC, POSTINC, PREINC I PLUSW registre.

MOVFF instrukcija kopira sadrzaj bilo koje mem.lokacije u bilo koju mem.lokaciju u RAM-u. Kako su svi registri mapirani u RAM-u ako bi stavili:

MOVFF POSTINC0,POSTINC1

ustvari bi dobili da sadrzaj sa lokacije na koju pokazije FSR0 kopiramo na lokaciju na koju pokazuje FSR1 sa post incremnt-acijom i FSR0 i FSR1 registra.

Posto MOVFF instrukcija zauzuma 4b i izvrsava se 2 cik. to isto se moze uraditi sa

MOVF POSTINC0,W,0
MOVWF POSTINC1,0

koje ce takodje zauzeti 4b i izvrsiti se u 2 cik.

Osim standardnih 75 instrukcija neki mikrokontroleri 18F serije (18F8722), svi 18FxxJXX i 18FxxKxx serije imaju i prosiren instrukciski set za jos 8 novih instrukcija koje se mogu koristiti ako se konfiguraciski bit XINST setuje.
Nove instrukcije su:

ADDFSR f,k - dodaje vrednost k (0-63) vrednosti FSR-u f (0-2)
ADDULNK k - dodaje FSR2 registru k (0-63) zatim izvrsava RETURN puneci PC sadrzajem TOS-a.
CALLW - Poziva potprogram koristeci W registar
MOVSF [Zs],Fd - Sadrzaj lokacije FSR2+Zs(0-127) upisuje u registar Fd (12 bit adresa)
MOVSS [Zs],[Zd] - Sadrzaj sa lokacije FSR2+Zs(0-127) se upisuje u lokaciju na koji pokazuje FSR2+Zd(0-127)
PUSHL k - k (0-255) upisuje na lokaciju na koju pokazuje FSR2, zatim se FSR2 umanjuje za 1
SUBFSR f,k - Isto kao ADDFSR sem sto se umesto sabiranja vrsi oduzimanje
SUBULNK k - Isto kao ADDULNK samo sa oduzimanjem

Setovanjem ovog bita se i vecina standardnih instrukcija menja tako sto se koriscenjem access ram-a umesto pristupa adresi 0-5Fh ta vrednost tretira kao offset vrednosti pointera FSR2. Recimo:

BSF 90,2,0 - kod standardnog instrukciskog seta setovao bit 2 u registru na adresi 90 preko access ram-a
BSF [90],2 - kod prosirenog instrukciskog seta bi setovao bit 2 registru na koji pokazije FSR2 uvecan za 90

Prednost 18F serije u odnosu na 16F seriju u nekim stvarima su neverovatne. Recimo pomenuto kopiranje sadrzaja 1 niza u rugi bi potrajalo prilicno u odnosu na trajanje kod 18F serije. Treba imati na umu da kada se 16F serija pojavila ni zadatci koje je trebala da obavlja i nisu bili toliko zahtevni kao danas. Dobro se ta serija drzi i dan danas sa svim svojim nedostatcima. Tvoja konstatacija kod odabira koje mcu, koristiti 16F ili 18F je stvarno na mestu, ni po cemu nema razloga ne odabrati 18F pogotovu sto su prepravke programa sa 16F minimalne a i odrzana je pin kompatibilnost.
 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 563
*.dynamic.sbb.rs.



+7 Profil

icon Re: mikrokontroleri od A do Sh16.09.2008. u 11:20 - pre 143 meseci
Dakle, glupo je pocinnjati sa PIC-om a da to nije 18-tica.

Malo je neobicno da ofset, kod indirektnog indeksnog adresiranja, ide u opsegu -128..127. Mislim da negativni ofset (indeks) nece nikada da se koristi, ili bar ja ne vidim kada bi se koristio. Mozda je to zbog stranicenja memorije, pa indeks ne moze da bude veci od 127? Kako se ponasa MCU kada adresa (pocetak niza+indeks) predju granicu memorijske stranice, ja mislim da ce tro dobro raditi jer su u FSR registrima dvobajtne adrese. Ako je to tako, onda stvarno ne vidim razlog zasto indeks ne ide od 0..255.

Bilo bi lepo da za neki program duzine oko 3 do 5 KB das podatak koliko ima asemblerskih naredbi i koliko je bajta flash-a potroseno. Imacemo podatak koliko u proseku jedna asemblerska naredba 18-tice trosi flash. Ja sam to izmerio za MC908 i to je 1.95 sto se moze zaokruziti na 2. Malo mi je komplikovanije bilo da izracunam trajanje prosecne instrukcije, pa sam dobio vrednost oko 3 ciklusa. Za PIC ce to biti lakse, svaka 2 bajta traze 1 ciklus, osim naredbi skoka, i mozda jos nekih, ne znam.

Pozdrav.
 
Odgovor na temu

sander
Aleksandar Golovic
Beograd

Član broj: 21336
Poruke: 211
*.smin-1.sezampro.yu.



Profil

icon Re: mikrokontroleri od A do Sh20.09.2008. u 20:21 - pre 143 meseci
Izvinjavam se sto sam mozda dosadan sa ovim poredjenjima AVR i PIC mikrokontrolera, mozda nekima moze biti od koristi da izvuku nekave zakljucke.
Gledajuci ona pomenuta poredjenja mikrokontrolera sa http://www.freertos.org/PC/ probao sam da test sa sabiranjem dve 16 bitne varijable (1 test) izvedem u asembleru oba kontrolera pa evo zapazanja:

Zadatak testa je sabrati dva neoznacene 16 bitne varijable i rezultat smestiti u trecu 16 bitnu varijablu 20 puta:

Kod AVR-a u idealnom slucaju, sve varijable su u 32 registra u R0, R2 i R4 su nizi bajtovi dok su u R1, R3 i R5 visi bajtovi 16 bitnih brojeva:

LDI R6,20 1 cik.
loop: MOVW R5:4,R1:0 1 cik.
ADD R4,R2 1 cik.
ADC R5,R3 1 cik.
DEC R6 1 cik.
BRNE loop 2 cik.

sto ce reci da sabiranje traje 1+6x20 cik. sto sa oscilatorom od 8Mhz (inc.cik=125nS) iznosi 121 cik. x 125nS = 15,125uS.

Za slucajeve da se varijable nalaze u RAM-u vreme izvrsenja se drasticno menja:

LDI R6,20 1 cik.
loop: LDS R0,Broj1 2 cik.
LDS R1,Broj1+1 2 cik.
LDS R2,Broj2 2 cik.
LDS R3,Broj2+1 2 cik.
ADD R2,R0 1 cik.
ADC R3,R1 1 cik.
STS Broj3,R2 2 cik.
STS Broj3+1,R3 2 cik.
DEC R6 1 cik.
BRNE loop 2 cik.

sto daje 1+17x20 odnosno 341 x 125nS = 42,625uS. Ako uporedimo testove sa neta ispada da program u C-u sa dodatkom setovanja i resetovanja pina nekog porta radi brze nego deo prezentovanog asemblerskog koda, 40,4uS naspram 42,625uS. Kako?

Sad to isto kod PIC-a:

Opet najidealnija varijanta, sve varijable se nalaze u jednoj banci:

MOVLW 20 1 cik.
MOVWF brojac 1 cik.
loop: MOVF broj1,w 1 cik.
ADDWF broj2,w 1 cik.
MOVWF broj3 1 cik.
MOVF broj1+1,w 1 cik.
ADDWFC broj2,w 1 cik.
MOVWF broj3+1 1 cik.
DECFSZ brojac,f 1 cik.
BRA loop 2 cik.

sto iznosi 2+9x20 odnosno za 8Mhz instrukcijski takt 182x125nS=22,75uS u odnosu na 15,125uS kod AVR-a.

U najnepovoljnijem slucaju kada su varijable pobacane po razlicitim bankama program bi izgledao:

MOVLW 20 1 cik.
MOVWF brojac,a 1 cik.
loop: MOVLB banka_broja1 1 cik.
MOVF broj1,w 1 cik.
MOVLB banka_broja2 1 cik.
ADDWF broj2,w 1 cik.
MOVLB banka_broja3 1 cik.
MOVWF broj3 1 cik.
MOVLB banka_broja1 1 cik.
MOVF broj1+1,w 1 cik.
MOVLB banka_broja2 1 cik.
ADDWFC broj2+1,w 1 cik.
MOVLB banka_broja3 1 cik.
MOVWF broj3 1 cik.
DECFSZ brojac,f,a 1 cik.
BRA loop 2 cik.

sto iznosi 2+15x20 odnosno 302x125nS = 37,75uS u odnosu na 42,625uS kod AVR-a. Kako je malo verovatno da je 32 reg. dovoljna za smestaj varijabli dok sa druge strane je sasvim realno da varijable sa kojima se vrse aritmeticke operacije budu u jednoj banci ili ako je 384 bajta dovoljno za smestaj varijabli (max. ram kod 16F serije je bio 368b) onda o nekoj superiornosti AVR-a nema ni govora.

Mozda bi neko od kolega koji radi sa AVR-om mogao da proveri gore date primere, mozda sam negde pogresio, ne radim sa AVR-om, moze biti da sam neku instrukciju kod AVR-a prevideo.
 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 563
*.dynamic.sbb.rs.



+7 Profil

icon Re: mikrokontroleri od A do Sh21.09.2008. u 16:30 - pre 143 meseci
Uopste nisi dosada. Dosadne su prazne price bez cinjenica.

Nisi prebrojao bajtove koje zauzimaju ovi test programi u flash-u, sto je za mene vazan podatak. Isti test sam napravio za MC9S08 pa bi sve to tabelarno izgledalo:

Code:

--------------------------------------------------------------
            |         najbolji slucaj        |  najgori slucaj                 |
            -------------------------------------------------------------------
            |bajta | ciklusa | vreme     |bajta | ciklusa | vreme     | takt perioda |
---------------------------------------------------------------------------
AVR       | 6     |  121    | 15.125us | 34   |  341     | 42.625us |  125ns        |
PIC        | 20   |  182    | 22.75us   | 32   |  302     | 37.75us  |   125ns       |
MC9S08  | 16   |  422    | 21.1us    | 22   |  542     |  27.1us   |   50ns         |
----------------------------------------------------------------------------

Nisam siguran da li sam dobro izbrojao bajtove za AVR i PIC, pa neka me neko ispravi ako sam pogresio.

Nekako mi razlike ne izgledaju bas drasticne. Doduse ni primer nije reprezentativan za sticanje neke konacne slike o performansama.
Kod PIC-a, i ako se ne varam i kod AVR, masinski ciklus je 4-o fazni gde svaka faza, za ovu takt periodu, ima trajanje od 31.25ns. MC9S08 ima jednofazni masinski ciklus, ali naredbe se izvode u jednom ili vise masinskih ciklusa.

Pozdrav.

[Ovu poruku je menjao korak dana 22.09.2008. u 13:47 GMT+1]
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: mikrokontroleri od A do Sh
(TOP topic, by veselinovic)
Strane: < .. 1 2 3 4 5 6 7 8

[ Pregleda: 65368 | Odgovora: 150 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.