Mala škola 8051 mikrokontrolera

poruka: 47
|
čitano: 30.158
|
moderatori: DrNasty, pirat, XXX-Man, Lazarus Long, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
16 godina
neaktivan
offline
Mala škola 8051 mikrokontrolera

 

 

Velik je broj tema na forumu vezanih uz elektroniku, ali pored teme o Arduinu i Raspberry Pi-u gotovo da i nema teme vezane za programiranje Atmelovih serija 89 i AVR, te Microchip PIC mikrokontrolera. Vrijeme je da se to promijeni, bar kad je 89 serija u pitanju.

 

Atmel 89x mikrokontroleri

Atmelova 89 serija mikrokontrolera temeljena je na Intel 8051 obitelji 8-bitnih mikrokontrolera i u potpunosti podržava 8051 set instrukcija. Pojedine verzije Atmelovih 89 mikrokontrolera proširuju osnovne mogućnosti serije s integriranim USB, I2C, SPI kontrolerom i hardverskim PWM-om.

Da ne kompliciramo, najbolje je započeti s mikrokontrolerima koji su nam pristupačni i dostupni u lokalnim dućanima el.opreme. Pa evo neki od njihovih karakteristika.

89c2051/89c4051 – 2kB/4kB programske memorije, 128B RAM, 20pin, dva 8-bitna porta (P1 i P3), od kojih je fizički dostupno 15 I/O linija.

89c51/89s51 – 4kB prog.mem, 128B RAM, 40pin, četiri 8-bitna porta (P0-P3), 32 vanjske I/O linije

                         (s51 verzija podržava SPI što nam olakšava samo fizičko programiranje mikrokontrolera)

89c52/89s52 – 8kB prog.mem, 256B RAM, ostalo kao c51/s51.

 

Programiranje i programatori

Velika prednost „s“ verzija je upravo mogućnost programiranja putem SPI sučelja, a koje ne zahtjeva povišeni napon kako bi se programiranje izvelo, pa je najbolje da za početak i vježbe nabavite 89s52. Osim toga, programiranje je moguće izvršiti i unutar samog sustava gdje se mikrokontroler koristi (ISP ili In System Programming). Kako bi .hex file mogli „upisati“ u sam mikrokontroler, u slučaju 89s52 će biti dovoljan jeftini USBasp programator, koji se može, baš kao i sami mikrokontroleri jako povoljno nabaviti preko ebay-a.

Ovom prilikom se još jednom želim zahvaliti forumašu Dava na donaciji USBasp i JDM programatora.

Inace, kod nabavke USBasp jedino bi trebalo pripaziti da seller navodi da isti podržava programiranje 89s serije, poput ovoga , jer inače USBasp programator služi za programiranje AVR serije Atmelovih mikrokontrolera.

Ukoliko se odlučite na programiranje „c“ verzija, bit će nužan tzv. paralelni programator, a koji programiranje konkretnih mikrokontrolera vrši naponom od 12V. To značajno komplicira programiranje, jer isto ovisi o pinoutu mikrokontrolera, pa je algoritam programiranja različit za 20 i 40pin izvedenice mikrokontrolera. To ipak nije problem ukoliko se kupuje gotovi programator, ali cijene su za njih nešto više.

 

Simulator

Ipak, kako nebi ostali zakinuti za programiranje čak i ako trenutno nemate dostupan mikrokontroler, tu je jedan jako moćan, a besplatan komad softvera pod nazivom MCU 8051 IDE, kojeg možete pronaći na http://mcu8051ide.sourceforge.net/ . Isti možemo koristiti kao razvojno sučelje i simulator, a podržava i dosta virtualnog hardvera pomoću kojeg je moguće donekle testirati program koji ste napisali. Ujedno u njemu možemo pronaći .hex i/ili .bin datoteke potrebne za programiranje mikrokontrolera.

Da bi uopće mogli početi programirati potrebno je upoznati se s mogućnostima mikrokontrolera, kao i setom instrukcija s kojima isti raspolaže. Google tu uvijek pomaže, ali evo ako moram izabrati, onda zbog primjera primjene instrukcija bi izdvojia stranice keil.com http://www.keil.com/support/man/docs/is51/is51_instructions.htm .

 

Zasučimo rukave

Za početak, da ne ubijen sve s pustom teorijom, idemo kreirati ekvivalent „Hello world“ programa, ali za mikrokontrolere. Na jednom od pinova mikrokontrolera ćemo treptati LED.

Pokrenemo MCU 8051 IDE, u meniju Project odabrati New pa odabrati naziv projekta, folder u kojem će se nalaziti i jako bitno, mikrokontroler kojeg ćemo koristiti. U našem slučaju to ce biti 89s52.

 

 
 

U editoru ćemo za početak napisati "org 000h", a zatim ćemo na ikonu „rakete“ pokrenuti, a zatim zaustaviti simulator. Isto je moguće tipkom F2 ili iz menija Simulator. Prvi put kada ga pokrenemo, a upravo zato to i radimo, otvorit će nam se prozor gdje ćemo unijeti naziv .asm datoteke koju ćemo kreirati.

 

 
 
 
 

Da bi uopce mogli „vidjeli“što se događa, iz menija Virtual HW ćemo odabrati LED Panel. To je niz od 8 LED kojeg je moguće spojiti na portove mikrokontrolera. Mi ćemo odabrati da je prva (lijeva) LED na portu 1.7, a zadnja (desna) na portu 1.0. LEDice u LED Panel-u „gore“ kada im se dovede logička 0, a ugašene su za logičku 1. To je tzv. negativna logika. Takvo što nam u potpunosti i odgovara, pošto po resetu mikrokontrolera svi portovi sadrže log.1 na svim pinovima porta.

 

 

A sad sam program koji će treptati LED na P1.7 i raditi „bolje“ na sporijim računalima, ali samo zato što nismo ubacili kašnjenja i zbog same „sporosti“ simulacije. Kada bi ovakav program neizmjenjen ubacili u mikrokontroler brzina izmjena ON/OFF za LED bi bila prevelika da bi to oko moglo uočiti, ali za ovu primjenu sasvim u redu.

 

                               ; točka-zarez označava početak komentara u jednoj liniji

org 000h                       ; naredba koja slijedi biti će stavljena na adresu 000h u programskoj memoriji

start:                         ; labela se označava dvotočkom iza „proizvoljne“ dopuštene riječi

                               ; poistovjećuje naredbu koja slijedi s mnemoničkom oznakom

                clr p1.7       ; postavlja pin 1.7 u log.0 i time „pali“ LED

                setb p1.7      ; postavlja pin 1.7 u log.1 i time „gasi“ LED

                ajmp start     ; skače na labelu start, efektivno program vrti u krug pali-gasi

end                            ; kraj programa

 

Kad smo program upisali, porebno je ponovo pokrenuti simulator (F2 ili raketa), a zatim (Animate, F6, ili Play botun). Ukoliko želimo, izvođenje programa možemo promatrati korak po korak (Step, F7 ili botun Koraci).

Uz malo modifikacija program može treptati svim LED na portu 1. Prvo moramo zaustaviti prethodnu simulaciju (F2), a onda modificiramo program.

 

org 000h

start:

                mov p1,#000h    ; postavlja svih 8 pinova porta 1 u log.0

                mov p1,#0ffh    ; postavlja svih 8 pinova porta 1 u log.1

                ajmp start

end

 

Malo pojašnjenje naredbi:

Naredbe clr i setb su tzv. bit-naredbe, odnosno utječu na stanje pojedinog bita, konkretno clr ga „briše“ tj. postavlja u log.0, a setb „postavlja“, tj. postavlja u log.1.

Naredba ajmp služi za bezuvjetni skok unutar 2KB memorijskog bloka, i bila bi nekakav ekvivalent naredbe goto iz viših programskih jezika, npr. basica.

Naredba mov je u pravilu (s jednom iznimkom) byte-naredba, odnosno utječe na stanje čitavog bytea.

p1 označava port (byte) koji mijenjamo, # označava immediate ili neposredno adresiranje (u prijevodu, broj koji slijedi je operand), a h iza broja označava heksadecimalni broj. Osim njega moguće je koristiti b za binarne brojeve i ništa za dekadske. Nekome možda upadne u oko da pišemo tri hex znamenke, od kojih je prva uvijek nula, a to je zbog pravilnog prepoznavanja hex brojeva koji započinju slovom.

 

Malo o binarnim i hex brojevima

Iz drugog je primjera vidljivo kako „brojevima“ možemo upravljati paljenjem i gašenjem LED na portu. Ali da ipak malo objasnim za one koji se tek s time susreću i još im nije jasno kako.

Svaki port mikrokontrolera sastoji se (u pravilu) od 8 bitova i označeni brojkama npr. P1.7 do P1.0 gdje broj 1 označava broj porta, a brojke 7 do 0 sami pin. Pri tome je pin 7 tzv. MSB (Most significant bit) ili bit najveće težine, a pin 0 tzv. LSB (Least significant bit) ili bit najmanje težine. Tih 8 bitova zajedno predstavljaju 1 byte.

 

1 byte odnosno 8 bitova omogućuju predstavljanje ukupno 2^8 ili 256 brojeva, konkretno brojke u dekadskom sustavu od 0 do 255. U binarnom sustavu to su brojke 00000000 do 11111111. U heksadecimalnom sustavu to je 00 do FF. Ukoliko bude potrebno, objasnit ću i kako se vrše pretvorbe iz sustava u sustav, ali za prvu ruku, samo da spomenem bitno, a to je da svakoj heksadecimalnoj znamenci odgovaraju 4 bita u binarnom sustavu.

 

Podsjetimo se da je za paljenje LED potrebno na pojedini pin dovesti 0, a za gašenje 1, pa možemo na 8 pinova porta 1 dovesti kombinaciju kakvu želimo da nam se odgovarajuće ledice upale.

P1.7  1.6  1.5  1.4  1.3  1.2  1.1  1.0

 0      1      1      1      1     1     1     1

 8      4      2      1      8     4     2     1

 0+4+2+1                 8+4+2+1

         7                            F

 

Ako bi sada pisali prvi program koristeći byte naredbe drugog, dobili bi

org 000h

start:

                mov p1,#07Fh       ; na port 1 postavlja kombinaciju 01111111 (gori LED na P1.7)

                mov p1,#0FFh       ; na port 1 postavlja kombinaciju 11111111 (ne gore LED)

                ajmp start

end

 

Malo vježbe do slijedećeg puta. Napisati program pomoću kojeg će se LED kretati s lijeva na desno, od P1.7 prema P1.0 (trčeće svjetlo) koristeći prethodni primjer. Bit će vam potrebno ukupno 8 mov naredbi.

 

Ukoliko i u ovoj početnoj fazi imate pitanja, prijedloge, komentare, slobodno nabacite...

 

Poruka je uređivana zadnji put uto 1.1.2013 13:56 (wifi).
 
15 0 hvala 19
12 godina
neaktivan
offline
Re: Mala škola 8051 mikrokontrolera

Hvala druže velika. Zadnji mjesec učim assembly i mikrokontrolere jer mi je to struka (elektrotehnička, ali još nisamo došli do mikroelektronike) pa mi ovaj tutorial dobro dođe...

16 godina
neaktivan
offline
Re: Mala škola 8051 mikrokontrolera

Nastojaću redovito obnavljat ovaj tutorial, pa da se tijekom praznika nauči nešto novo... Znam da 89 serija mikrokontrolera nije bas u cvijetu mladosti, ali je za skolske primjere i ucenje asemblera vrlo zgodna.

11 godina
neaktivan
offline
Mala škola 8051 mikrokontrolera

Bok !

Svaka cast na trudu !

{#}

Odlicna ideja sto si zapoceo sa asamblerski jezikom. Meni recimo fali asamblerski jezik za programiranje PIC-ova al sad ga proucavam, barem osnove...

 
0 0 hvala 0
12 godina
neaktivan
offline
Mala škola 8051 mikrokontrolera

Profesore, uradio sam zadaću. :D Da nije 9 mov naredbi?
org 000h
start:
    mov p1, #01111111b
    mov p1, #10111111b
    mov p1, #11011111b
    mov p1, #11101111b
    mov p1, #11110111b
    mov p1, #11111011b
    mov p1, #11111101b
    mov p1, #11111110b
    mov p1, #11111111b
    ajmp start
end

 
1 0 hvala 0
16 godina
neaktivan
offline
Re: Mala škola 8051 mikrokontrolera
Maki.el kaže...

Bok !

Svaka cast na trudu !

{#}

Odlicna ideja sto si zapoceo sa asamblerski jezikom. Meni recimo fali asamblerski jezik za programiranje PIC-ova al sad ga proucavam, barem osnove...

PIC-evi su vjerojatno na redu nakon 8051 ako ova skola bude ok prihvacena, princip je isti, ali set instrukcija nesto drukciji...

royalhero kaže...

Profesore, uradio sam zadaću. :D Da nije 9 mov naredbi?
org 000h
start:
    mov p1, #01111111b
    mov p1, #10111111b
    mov p1, #11011111b
    mov p1, #11101111b
    mov p1, #11110111b
    mov p1, #11111011b
    mov p1, #11111101b
    mov p1, #11111110b
    mov p1, #11111111b
    ajmp start
end

very nice... ipak nije potrebno 9 naredbi, jer ona zadnja gasi sve led prije nego se upali prva lijeva...

isto je bilo moguce napisati u hex obliku

org 000h
start:
       mov p1,#07Fh
       mov p1,#0BFh
       mov p1,#0DFh
       mov p1,#0EFh
       mov p1,#0F7h
       mov p1,#0FBh
       mov p1,#0FDh
       mov p1,#0FEh
       ajmp start
end

ili za ovu specifičnu primjenu u upola manje naredbi - a kako, neka to ostane za koji drugi dan kad malo više prođemo... prije toga treba sažvakat više "dosadne" teorije...

 

16 godina
neaktivan
offline
Mala škola 8051 mikrokontrolera

Prošli put smo tek zagrebali po površini 89x serije mikrokontrolera, konkretno 89s52, i iskoristili ga da bi s ferrarijem otišli do prvog kafića udaljenog 100m.

 

Jedan od razloga zbog kojih mnogi zaziru od pisanja koda u asembleru je što isti kod nije primjenjiv na mikrokontrolerima drugih serija, pa čak ni na svim mikrokontrolerima iz iste serije. Upravo zbog tog razloga, za razliku od pisanja klasičnih programa u višim programskim jezicima gdje nas zapravo i ne zanima niti trebamo znat na kakvom uređaju, konfiguraciji, pa čak i OS-u (Java) se program izvodi, kod asemblera je nužno ne samo dobro poznavati konkretni model mikrokontrolera kojeg ćemo koristiti, već i elektromehaničke karakteristike sklopova koji se na njega spajaju, a i fizikalna ograničenja čovjeka (npr. tromost oka, raspon slušnih frekvencija i sl.).

 

89s52, ali i svi mikrokontroleri koji su temeljeni na 8051 arhitekturi imaju neke zajedničke karakteristike:

- max. podržana količina programske (flash) memorije (unutarnje/vanjske) iznosi 64kB, i ograničena je 16-bitnim PC (programsko brojilo).

  U praksi su ti iznosi, bar za internu flash memoriju samog kontrolera znatno manji, i kreću se od 1-16kB ovisno o modelu.

- originalna 8051 arhitektura podržava ukupno 128 byteova (128B) interne RAM memorije, koja se nalazi na adresama 00-7Fh.

  89s52 podržava dodatnih 128B RAM-a, ali njima je moguće pristupiti isključivo putem indirektnog adresiranja, a nalaze se na adresama 80-FFh.

  Isto tako moguće je koristiti ukupno 64kB vanjske RAM memorije, a koja je ograničena ovaj put 16-bitnim DP (brojilo podataka).

- originalna 8051 arhitektura na adresama 80-FFh podržava niz registara (SFR – Special Function Registers) pomoću kojih se upravlja radom mikrokontrolera.

  89s52 proširuje taj broj registara s obzirom da podržava neke dodatne funkcionalnosti u odnosu na 8051.

 

Na slici je prikazana organizacija memorije 8051 mikrokontrolera.

Organizacija memorije Organizacija memorije
 

 

Banke registara

Na adresama 00-07h nalaze se registri R0-R7, registri opće namjene, koji predstavljaju banku registara 0.

Od 08h-0Fh su reg. R0-R7, ali banke 1, od 10h-17h, banka 2 i od 18h-1Fh banka 3.

 

Ok, wtf? Kakve sad banke registara? I kako R0-R7 četiri puta?

Stvar je u tome da su R0 do R7 mnemoničke oznake registara, ali one vrijedi samo za jednu „odabranu“ banku registara. Prilikom reseta mikrokontrolera, to je banka 0.

 

Recimo da u registar R4 želimo spremiti broj 8. Tada to možemo učiniti na dva načina.

MOV R4,#008h      ; u registar R4 spremi vrijednost koja slijedi iza #, u ovom slučaju 8

MOV 04h,#008h    ; na adresu 04h u RAM-u (koja po resetu odgovara R4) spremi 8.

 

!Napomena! Kada smo pisali 04h, vidimo da ne koristimo # jer to nije broj, 04h je ADRESA! To je tzv. direktno adresiranje.

 

Promijenimo li sada aktivnu banku registara u neku drugu, tada prethodne dvije naredbe nisu istovjetne.

Registre koristimo za privremeno spremanje varijabli koje koristimo, i iako postoje određena ograničenja, vrlo su fleksibilni.

 

 

 

Bit-adresabilno područje

 

Na adresama 20h do 2Fh nalazi se tzv. bit-adresabilno područje. To je područje u radnoj memoriji gdje je osim pojedinog byte-a, moguće vlastitom adresom adresirati i svaki pojedini bit. Takvo što može biti zgodno ukoliko imate za potrebu koristiti čitav niz „zastavica“ da bi označili stanje/stanja od interesa. Ukupno na raspolaganju u ovom području imamo 16 byte x 8 bitova, odnosno 128 individualno adresabilnih bitova s rasponom adresa od 00h do 7Fh.

 

!Napomena! Potrebno je razlikovati bit od byte adrese, a to je najlakše prema naredbi koja im prethodi.

Bit i Byte adrese je moguće međusobno „pronaći“, a za to sam osmislia step-by-step postupak:

 

Pretvorba iz byte u bit adresu:

 

Byte raspon 20h-2fh, bit raspon 00h-7Fh

Sad stvarno triba ić sve naopako, byte 20h je dolje desno, do njega ulijevo je 21h do 27h. Iznad 20h je 28h, a lijevo od njega 29h do 2Fh.

Ovo je bitno zbog samih bitova, jer ce onih ici istim redoslijedom od 00h ulijevo prema 0Fh, a iznad 00h je 10h pa ulijevo sve do 1Fh

Sad kad je sam izgled više-manje jasan, sama pretvorba.

 

Recimo da želimo znati bit-adresu bita 5 (0-7) u byte-u 2Bh

- Krećemo od 2B i 2 odmah odbacujemo jer nam nije potreban.

- Zatim gledamo znamenku koja slijedi (B u ovom slučaju). Ukoliko je znamenka parna tada za raspon bitova uzimamo 0-7, a ukoliko je neparna uzimamo 8-F. U našem slučaju B=11, pa se zadnja znamenka naše bit adrese nalazi u rasponu 8-F.

- Sada gledamo čemu bi odgovara bit 5 (kronološki šesti) u dobivenom rasponu. U našem slučaju, u rasponu 8-F, to bi odgovaralo slovu D (13), i to je naša zadnja znamenka.

- Sada trebamo naći prvu znamenku, a nju dobijemo tako da cjelobrojno podijelimo zadnju znamenku byte adrese s 2. U našem slučaju to je B=11, a kad podijelimo 11/2 dobijemo 5 i ostatak 1. Upravo broj 5 tada predstavlja prvu znamenku naše bit adrese.

 

Dakle, za primjer byte adrese 2B i bita 5, imamo da je njegova bit adresa 5Dh.

 

 

Pretvorba iz bit u byte adresu:

 

Recimo da želimo vidjeti kojoj byte adresi i bitu odgovara bit adresa 42h.

- Prvo gledamo zadnju znamenku bit adrese i provjeravamo u kojem rasponu se ona nalazi.

- Ukoliko je u rasponu 0-7, tada je riječ o parnoj byte adresi, a ukoliko je 8-F riječ je o neparnoj byte adresi. U našem slučaju, pošto je zadnja znamenka 2, radi se parnoj byte adresi.

Ujedno možemo odma vidjeti da je riječ o kronološki trećem bitu, pa je to bit 2.

- Sada uzimamo prvu znamenku, pa je množimo s 2. Ukoliko smo prethodno izračunali da je riječ o parnoj byte adresi, tada taj umnožak odgovara zadnjoj znamenci byte adrese. Ukoliko je riječ o neparnoj byte adresi, tada tom umnošku moramo dodati 1 da bi dobili zadnju znamenku byte adrese.

- Prva znemenka byte adrese u bit adresabilnom području je vijek 2 pa kao riješenje za naš primjer imamo:

bit adresa 42h – (zbog 2 unutar 0-7 – parna byte adresa, i isto tako to je bit 2)

4 x 2 = 8 – (zbog parne byte adrese, konačni rezultat je byte adresa 28h, bit 2)

 

Primjena:

Ukoliko želimo direktno manipulirat bitovima u bit-adresabilnom području tada možemo koristiti bit naredbe poznate od prije.

setb 5Dh             ; postavlja bit 5 na byte adresi 2Bh (log 1)

clr 42h                  ; briše bit 2 na byte adresi 28h (log 0)

 

Nekoliko je načina na koji prethodne naredbe možemo izvesti putem byte naredbi, ali redom:

 

setb 5Dh

mov 2Bh, #0010000b     ; na byte adresu 2Bh upiši navedenu kombinaciju bitova

ova naredba ima jedan veliki nedostatak, a to je što bezuvjetno briše sve bitove osim bit 5 kojeg postavlja.

 

clr 42h

mov 28h,#00000000b    ; na byte adresu 28h upiši nulu.

vrijedi ista napomena kao i za prethodni slučaj, a to je gubitak informacija ukoliko su neki od bitova osim bita 2 bili različiti od nule.

 

 

Maskiranje

 

Što ukoliko želimo promijeniti jedan bit u byte-u, koristeći byte naredbe, a da se pri tome ostali bitovi ne promijene. Odgovor se nalazi u logičkim operacijama AND (log I) i OR (log ILI). Naredbe koje možemo koristiti su anl i orl.

 

Ukoliko želimo postaviti bit bez da mijenjamo ostale bitove u byte-u, tada koristimo orl.

      X X X X X X X X

OR 0 0 1 0 0 0 0 0

=   X X 1 X X X X X

Vidimo da se promijenio samo bit 5. Možemo pisati:

orl 2Bh,#020h                   ; bit maska 00100000 odgovara 020h. izvrši log. ILI između sadržaja adrese 2Bh i broja 20h i rezultat spremi natrag na adresu 2Bh

 

Ukoliko želimo izbrisati bit bez mijenjanja ostalih bitova u byte-u, tada koristimo anl.

        X X X X X X X X

AND 1 1 1 1 1 0 1 1

=     X X X X X 0 X X

Vidimo da se promijenio samo bit 2. Možemo pisati:

anl 28h,#0FBh                   ; bit maska 11111011 odgovara 0FBh. izvrši log. I između sadržaja adrese 28h i broja FBh i rezultat spremi natrag na adresu 28h.

 

 

Toliko za sada, nastavak slijedi uskoro. Do tada, isto jedan zadatak za vježbu.

Pronađi bit adresu bita 4 na byte adresi 2Dh, a zatim ga komplementiraj bez utjecaja na ostale bitove byte-a: a) koristeći bit naredbu cpl, b) koristeći byte naredbu xrl

 

EDIT: nema odgovora? ok... rjesenje je bit adresa 6Ch

a) cpl 6Ch

b) xrl 2Dh,#00010000b

 

 

Slobodni RAM

Dio RAMa koji ne karakteriziraju posebne odlike, već se koristi kao opći RAM nalazi se na adresama 30h do 7Fh

 

SFR (Special Function Registers)

Registri posebne namjene su posebno važni za pravilno funkcioniranje mikrokontrolera i priča su za sebe. Od ukupno 128 mogućih adresa, originalna 8051 arhitektura koristi tek dio njih.

Pri tome je prvi stupac SFR-a specifičan po tome sto je baš kao i područje RAM-a od 20h-2Fh bit adresabilan. I ovdje postoji "pravilo", pa su tako bit-adresabilni svi registri u SFR na adresama od 80h do FFh čija adresa završava na 0h ili 8h. To su portovi P0-P3, TCON (timer control), SCON (serial control), IE (interrupt enable), IP (interrupt priority), PSW (program status word - registar zastavica stanja), A (ACC ili akumulator) i B (pomoćni akumulator). Ostali registri nisu bit adresabilni, a njih u originalnom 8051 čine SP (kazalo stoga), DPL i DPH (niži i viši byte brojila podataka), PCON (power control), TMOD (timer mod rada), TL0, TL1, TH0, TH1 (niži i viši byte timera 0 i 1), SBUF (serial buffer).

89s52 proširuje postojeće registre registrima timera 2, watchdog timera, i dodatnim brojilom podataka, što je vidljivo sa 7. strane datasheet-a za 89s52 http://www.atmel.com/Images/doc1919.pdf

 

Prošireni RAM (89s52)

Na adresama 80h do FFh, dakle u području gdje se nalaze registri SFRa, nalazi se ujedno i dodatnih 128B RAMa koje npr. možemo pronaći kod 89s52 mikrokontrolera. Ovih dodatnih 128B nisu dio originalne specifikacije 8051 mikrokontrolera, pa se do njih ne može doći direktnim adresiranjem.

 

Ako ponovo bacimo oko na tablicu SFR, vidimo da se npr. port1 nalazi a adresi 90h.

Ukoliko želimo na pinove mikrokontrolera porta 1 dovesti odgovarajuću kombinaciju nula i jedinica, to možemo učiniti putem mnemoničke oznake ili adrese, npr.

 

mov p1,#01010101b    ; na p1 stavi kombinaciju 01010101ili

mov 90h,#01010101b   ; na adresu 90h u SFR-u što odgovara portu p1 stavi kombinaciju 01010101

 

Međutim, ukoliko želimo istu tu kombinaciju upisati u RAM, na memorijsku lokaciju 90h, tada moramo koristiti tzv. indirektno adresiranje. Prvo kod, onda objašnjenje...

 

mov r0,#090h         ; u registar r0 (ili r1) spremi vrijednost adrese na koju je potrebno upisati kombinaciju
mov @r0,#01010101b   ; na adresu koja je sadržana u registru r0 upiši kombinaciju 01010101

 

Na RAM lokaciju 90h ne možemo direktno upisati vrijednost 01010101. To se mora obaviti okolnim putem tako da prvo u registar R0 ili R1 (samo ta dva su dozvoljena!!!!) upiše vrijednost adrese na koju želimo nešto upisati. Tada se koristi indirektno adresiranje koje je moguće prepoznati zbog @ znaka, da bi na adresu koja je upisana u registar R0 upisali vrijednost 01010101. Koncept koji se ovdje koristi praktički se ne razlikuje od pointera (pokazivača) u C++. U ovom slučaju bi R0 ili R1 predstavljali pokazivače na varijablu.

 

int a;       //naša varijabla koja se u mikrokontroleru nalazi na RAM adresi 90h
int *pa=&a;  //naš pokazivač na varijablu a koji je u mikrokontroleru npr.r0... ekvivalent mov r0,#090h
*pa=85;      //na adresu na koju pokazuje pokazivač pa spremi broj 85 dekadski (01010101b)... ekvivalent mov @r0,#01010101b

 

Nadam se da je je ovaj koncept već jasan otprije, bar onima koji su se bavili programiranjem u C++.

 

 

 

Takt, ciklus, kašnjenje

 

Svaki (ili gotovo svaki) mikrokontroler svoj rad zasniva na signalu takta koji je moguće "dovesti" na više načina: interni generator (pogodan za mikrokontrolere s malim brojem pinova, relativno loša preciznost), vanjski oscilator (gdje signal dovodimo na OSC pin mikrokontrolera, preciznost ovisi o vanjskom generatoru) i kristal (rezonator) (na pinove OSC1/2 spajamo kristal i dva kond. prema masi, a sam mikrokontroler odrađuje ostatak posla).

U praksi ćemo najčešće imati posljednji slučaj, a za 89s52 koristit ćemo najčešće dva kristala, 12MHz i 11,059200MHz. Prvi nam omogućava dobijanje vremena ciklusa od 1us (mikrosekunda), dok se drugi koristi ukoliko imamo u planu koristiti integrirani serijski kontroler jer se "pravilno" skalira na odgovajući baud-rate (9600bps, 19200bps, itd.)

 

8051 serija mikrokontrolera za izvršenje jedne naredbe treba barem 12 taktova oscilatora. Tih 12 taktova predstavlja 1 ciklus. To nam za kristal od 12MHz daje ravnih milijun ciklusa mikrokontrolera, i to je maksimalni broj jednociklusnih :-) instrukcija koje može izvesti u jednoj sekundi. To u praksi znači da će pojedina instrukcija trajati 1, 2, eventualno 3 us, i da ponavljanjem instrukcija možemo postići duža kašnjenja. U kasnijim primjenama vidjet ćemo da se timeri mikrokontrolera povećavaju za 1 svakim ciklusom pa to možemo iskoristiti za mjerenje proteklog vremena i slične primjene.

 

Za početak ću pokazat jedan "odokativan"primjer kako postići kašnjenje...

                               ; podprogram tajmer
tajmer:     mov r7,#004h       ; #XX
lab2:       mov r6,#00Ah       ; #YY
lab1:       mov r5,#005h       ; #ZZ
lab0:       djnz r5,lab0       ; 2us x ZZ x YY x XX
            djnz r6,lab1       ; YY x XX
            djnz r7,lab2       ; XX
            ret

 

Svaka od naredbi ima svoje vrijeme izvršavanja, npr. mov (u ovom slučaju) 1us, a djnz 2us. Posto je naredba djnz dominantna u ponavljanju, ukupno kašnjenje koje će proizvesti ovaj podprogram će biti približno 2us x ZZ x YY x XX gdje Z,Y i X odgovaraju vrijednostima upisanima u r5, r6 i r7.

Npr. ukoliko želimo kašnjenje od 1 sekunde, tada bi upisali 1000000=2x50x100x100. Jedino o čemu moramo voditi računa je da broj koji se upisuje ne smije biti van raspona 0-255 (00h-FFh).

Kako sam podprogram radi.

U registre r7, r6 i r5 se upisuju odabrane vrijednosti, a zatim dolazimo do prve naredbe djnz. Djnz dolazi od Decrement and Jump if Not Zero, što bi u slobodnom prijevodu bilo Dekrementiraj (što? - registar), provjeri jeli sada registar = 0, i ukoliko nije skoči na labelu.

Efektivno u primjeru bi za naredbu djnz r5, lab0 imali (5-1=4, 4!=0, lab0; 4-1=3, 3!=0, lab0; 3-1=2, 2!=0, lab0; 2-1=1, 1!=0, lab0; 1-1=0, 0=0, nastavi dalje na djnz r6,lab1).

 

Kada bi primjer u asembleru isli fiktivno napisat u C++, to bi izgledalo nešto poput ugnježđenih for petlji.

for (x=0; x<4; x++)
   for (y=0; y<10; y++)
      for (z=0; z<5; z++)
         kasni2us();      //ukupno bi kasnili 2us x Z x Y x X

 

Posto smo napisali podprogram, još je potrebno i vidit kako ga pozvati... poslužit ću se primjerom s treptanjem LED.

org 000h

start:

      mov p1,#07Fh
      call tajmer          ;poziv podprograma
      mov p1,#0FFh
      call tajmer          ;poziv podprograma
      ajmp start

tajmer:     mov r7,#004h      
lab2:       mov r6,#00Ah      
lab1:       mov r5,#005h      
lab0:       djnz r5,lab0      
            djnz r6,lab1      
            djnz r7,lab2      
            ret            ;return ili povratak iz podprograma

end

 

Pokušajte izvest program u simulatoru s različitim vrijednostima X, Y i Z, pa javite rezultate kad X, Y i Z stavite u 000h.

 

 

 

Poruka je uređivana zadnji put čet 3.1.2013 12:10 (wifi).
 
4 0 hvala 6
16 godina
neaktivan
offline
Mala škola 8051 mikrokontrolera

Sad kad smo "svladali" korištenje portova da bi uključili pojedine LED-ice, mislim da je vrijeme da se upoznamo s jednim često korištenim elementom, a to je 7 segmentni displej.

7 segmentni displej 7 segmentni displej
Zapravo se radi o nizu od 8 individualnih LED-ica koje su oblikovane tako da čine broj 8 i decimalnu točku. Segmenti su označeni slovima A-G, a točka je DP ili H.

Dvije su varijante ovih displeja, a to su oni sa zajedničkom anodom i varijanta sa zajedničkom katodom, a samo ime govori koja je "elektroda" svake pojedine LED u tom nizu zajednička i spojena svima u jednu točku.

Zajednička katoda/anoda Zajednička katoda/anoda
Na slici lijevo prikazana je varijanta sa zajedničkom katodom, a desno sa zajedničkom anodom.

Koju varijantu ćete koristiti ovisi o shemi po kojoj radite sklop, i u tom slučaju one NISU međusobno izmjenjive, tj. bez izmjena u shemi ne možete koristiti drukčiji tip LED displeja. Ako pak sami razvijate shemu, ili modificirate postojeću, tada je moguće prilagoditi sklop, a i program na način da koristitite varijantu kakvu imate pri ruci.

 

Ukoliko pokušavate 7 segmentni displej spojiti "direktno" (ili bolje reći pasivno) na nožice mikrokontrolera, moja preporuka bi bilo korištenje varijante sa zajedničkom anodom. Razlog je što velika većina el. čipova može dopustiti veću struju kada je propuštamo prema masi (log.0), (eng. sink current), nego kada je sam čip "izvor" struje (log.1), (eng. source current). Dakle, u slučaju ZA (zajedničke anode), nju ćemo spojiti na +5V, a pojedine elemente (a-h) displeja preko otpornika od 330R-680R spojiti na nožice mikrokontrolera, u pravilu jedan od portova.

 

Ukoliko koristimo simulator, iz menija VirtualHW, odabrat ćemo LED Display. Pojavit će nam se displej na slici kojeg možemo konfigurirati da bude ZA ili ZK (odabran je ZA), a zatim ćemo pospojit pinove mikrokontrolera na port 1 prema prikazanoj slici.

 

7 segment displej u simulatoru 7 segment displej u simulatoru
Ukoliko želimo prikazati nekakav broj na displeju, pošto je ovo displej sa zajedničkom anodom, na segmente koji trebaju biti upaljeni trebat će dovesti log.0, a segmenti koji ostaju izgašeni trebaju ostati u log.1.

Idemo napraviti primjer za broj 0

0 - gore segmenti a,b,c,d,e,f (log.0), ne gore segmenti g,h(DP) (log.1)

BROJ     H     G     F     E  |  D     C     B     A      HEX

PORT1. 7      6     5     4  |  3     2     1     0

0           1     1     0     0  |  0     0     0     0

             8+4+0+0=12    |  0+0+0+0=0

0                    C                           0                   C0

 

Dakle, da bi na displeju ZA prikazali broj 0, potrebno je na njega dovesti kombinaciju C0h.

Ukoliko bi koristili ZK displej, trebali bi dovest komplement, odnosno kombinaciju 3Fh.

 

Idemo napisati program koji će ispisati broje od 0 do 9 i prikazati ih na displeju.

 

org 000h
 
start:
        mov p1,#0C0h     ; broj 0 ZA
        call tajmer      ; proizvoljna vremenska pauza određena podprogramom tajmer
        mov p1,#0F9h     ; broj 1
        call tajmer      ; pauza
        mov p1,#0A4h     ; broj 2
        call tajmer      ; pauza
        mov p1,#0B0h     ; broj 3
        call tajmer      ; pauza
        mov p1,#099h     ; broj 4
        call tajmer      ; pauza
        mov p1,#092h     ; broj 5
        call tajmer      ; pauza
        mov p1,#082h     ; broj 6
        call tajmer      ; pauza
        mov p1,#0F8h     ; broj 7
        call tajmer      ; pauza
        mov p1,#080h     ; broj 8
        call tajmer      ; pauza
        mov p1,#090h     ; broj 9
        call tajmer      ; pauza
        ajmp start

tajmer:
        copy paste od prije


end

 

Ukoliko želite prišparat pokoji pin mikrokontrolera, i sebi malo kodiranja, tada možete koristiti vanjske logičke sklopove (tzv. bcd to 7 segment decoder) kojim ćete za 4 ulazna pina iz hex vrijednosti na izlazu dobiti odgovarajuću kombinaciju kojom pogonite pojedini displej. Primjeri takvih čipova su 7447 (za ZA) i 4511 (za ZK).

 

Malo feedbacka bi mi dobro doslo... Jel se netko vec susreta s mikrokontrolerima? U skoli, u svojim projektima? Jeli ovo prejednostavno? Ima li pitanja u stilu "kako napraviti to i to s mikrokontrolerom?"

 
5 0 hvala 7
16 godina
neaktivan
offline
Mala škola 8051 mikrokontrolera

Ulazi

 

Dosad smo se bavili isključivo izlaznim mogućnostima mikrokontrolera i za to koristili LED spojen na prikladni port. Sad je red da vidimo koje su ulazne mogućnosti mikrokontrolera i na što moramo pritom pripaziti.

 

Svi portovi 89s52, a isto tako i kompletne 8051 arhitekture su bidirekcionalni, što u pravilu znači da mogu poslužiti kao izlazni ili kao ulazni pin/port. Ukoliko se isti koriste kao izlazni pinovi, tada stanje koji je upisano u SFR registre portova 0-3 odgovara stanju na pinovima uz malu napomenu - samo na pinovima koristimo negativnu logiku za vanjski sklop (npr. LED se pali ako je na pinu log.0). Ovo je jos jedan WTF trenutak, pa cu malo objasnit zbog cega je to tako, zasto nije uvijek tako, i kako cemo znat jeli je ili nije (ovo sam namjerno zamrsia {#}).

 

Za konkretne primjere cu uzeti dva mikrokontrolera, 89s52 i 89c4051 i onda vas uputit na stranu 4 (odnosno 3) datasheetova. Tamo se nalazi opis pojedinih pinova.

U slučaju 89s52 želim skrenuti pažnju na port 0 za koji je navedeno da je to open-drain port. Efektivno to znači da je takav port u stanju doista na svom pinu imati log.0 (0V), ali bez vanjskih sklopova nije u mogućnosti dati log.1(5V), već kada za pojedini pin upisemo log.1, pin je efektivno u stanju visoke impedancije (highZ). Da bi ga mogli koristiti poput ostalih portova, njemu je na pinove potrebno spojiti vanjske pull-up otpornike. Za one koji se prvi put susrecu s ovim terminom, rijec je o otpornicima koji pojedini pin "povlace" prema Vcc, log.1 ili npr. +5V (može biti i znatno više). Ono po čemu se portovi P1-P3 razlikuju od P0 je postojanje internih (u samom mikrokontroleru integriranih) pull-up otpornika, a koji omogućavaju da LED u pozitivnoj logici zasvjetli čak i kada je direktno spojite na pin bez ikakvih vanjskih elemenata.

U slučaju 89c4051 imamo još specifičniji slučaj. Pošto se radi o mikrokontroleru sa samo 20pinova, isti ima na raspolaganju sveukupno 15 (da, 15, a ne 16) vanjskih pinova za portove P1 i P3. Ako pogledamo na str.2 njegovog datasheeta, vidimo da su fizički prisutni pinovi 0-7 porta 1, te 0-5 i 7 porta 3, dok je pin6 porta 3 izveden interno kao izlaz iz analognog komparatora čiji su ulazi pin0 i pin1 porta 1. Upravo zbog te specifičnosti, nužno je da pinovi 0 i 1 porta 1 ostaju plutajući (floating), naravno ukoliko planiramo koristiti komparator. Ako ga ne koristimo, tada je ta dva pina potrebno vanjskim pull-up otpornicima povući prema Vcc.

OPĆENITO, dobra je praksa UVIJEK pogledati datasheet mikrokontrolera koji koristite i ukoliko razvijate sklop (shemu) upravo na ovim stvarima poput pull-up otpornicima i specifičnostima pojedinog mikrokontrolera može zapeti praktična izvedba, a sam sklop možda nikad ne proradi. Breadboard to the rescue...

 

 

Tipkala i prekidači

 

Jedan od najčešćih ulaznih "sklopova" koje spajamo na mikrokontroler su prekidači i tipkala. U simulatoru ih se može pronaći u meniju VirtualHW, i to u dvije varijante: Simple Keypad kojem su svi prekidači/tipkala povučeni prema masi (pritiskom na tipkalo, isto daje log.0, otpuštanjem highZ-efektivno log.1); Matrix Keypad koji predstavlja "telefonsku tipkovnicu" sa ukupno 16 tipkala, ali ništa nas ne sprječava da koristimo samo dio njih, makar 1, ukoliko sami želimo upravljati prekidačem i stanjima na njegovim kontaktima.

 

Simple Keypad Simple Keypad
 
Matrix Keypad Matrix Keypad
 

 

Za sada ću se zadržati na Simple Keypad i prvo što se može primjeti je da isti efektivno rade isto po negativnoj logici, tj. za pritisak daju log.0, a otpuštanjem log.1 (highZ). Da vidimo sada kako programski možemo testirat pojedini pin.

 

org 000h
                                ; LED spojene na P1, tipkalo (Simple Keypad) spojeno na pin P3.7
postavke:
            mov p1,#0ffh        ; trenutno gasimo sve LED na port 1
            mov p3,#0ffh        ; da bi pojedini pin mogao "očitati" stanje na svom ulazu, potrebno je na pripadajući pin "upisati" log.1
                                ; ovdje je to učinjeno za cijeli port 3 odjednom
start:
       jb p3.7,preskoci    ; ukoliko je pin P3.7=1 (otpušteno tipkalo) idi na preskoci, inače slijedeća naredba
            xrl p1,#0ffh        ; komplementiranje čitavog porta 1 pomoću ekskluzivnog ILI (cpl radi samo na jednom pinu ili akumulatoru)
            call tajmer         ; rudimentalna zaštita od istitravanja tipkala
            jnb p3.7,$          ; ukoliko je pin P3.7=0 ponavljaj ovu naredbu dok korisnik ne otpusti tipkalo (da nebi imali treptanje).
preskoci:   ajmp start

tajmer:     ...                 ; c/p od prije, uz izračun za 30ms
            ret

end

 

Gore napisani program će pritiskom na tipkalo spojeno na P3.7 naizmjence paliti/gasiti sve LED na portu 1.

Da bi testirali stanje pojedinog pina (P3.7) koristimo naredbe JB (Jump if Bit - skoči na labelu ukoliko je bit/pin postavljen-log.1) i JNB (Jump if Not Bit - skoči na labelu ukoliko je bit/pin obrisan-log.0).

Prvo smo port 3 postavili u log.1 iako smo mogli i samo pin P3.7 postaviti u log.1. Efektivno smo time omogućili "čitanje" stanja pina.

Zatim provjeravamo je li korisnik pritisnuo tipkalo. Dok god je tipkalo otpušteno, program vrti start-jb-preskoci. Kad se pritisne tipkalo, ono će na pin dovesti log.0 zbog čega će se nakon naredbe jb izvesti naredba xrl koja će uz vrijednost FF komplementirati čitavi port 1. Time bi u simulatoru program mogao završiti, ali u praksi se pokazuje jedna "neugodna" osobina svih prekidaca i tipkala, a to je istitravanje. Pritiskom i otpuštanjem tipkala, isto se ne zaustavlja odmah u stanju 0 ili 1, vec provodi određeno vrijeme titrajući između ta dva stanja (nešto poput amortizera i opruga na automobilu kada se prijeđe preko ležečih). Kako je mikrokontroler ZNATNO brži od čovjeka i tipkala, tako bi sve te oscilacije i titranja bili evidentirani kada nebi napravili nešto da takvo ponašanje spriječimo. Tema je široka, a krije se pod eng. nazivom debouncing, a može biti izveden hardverski, softverski ili kombinacijom, a hardverske izvedbe variraju od jednostavnih RC krugova, preko posebnih integriranih krugova koji služe isključivo debouncingu. Softverskih algoritama je također mnoštvo, a u programu je primjenjen jednostavni i fiksni delay od 30ms koji se ovisno o tipu prekidaca/tipkala može smanjiti ili povećati. Ovo nije nužno "dobar" način debouncinga jer stvara tzv. "blocking" program, ali za primjer će poslužiti.

Uglavnom, sad kad ste me pogubili u ovom romanu, upravo ovaj poziv tajmera od 30ms služi da bi se stanje tipkala stabiliziralo.

Kako čovjek ima određeno vrijeme reakcije, tako bi nam LED zatreptale približno 30 puta u jednoj sekundi kada nebi bilo sljedeće naredbe - JNB, a koja sada testira jeli tipkalo pritisnuto i ponavlja taj test sve dok korisnik ne otpusti tipkalo. Time se spriječava izmjena stanja ukoliko ne otpustimo i ponovo pritisnemo tipkalo.

 

 

Uvjetno i bezuvjetno grananje

 

Kad već spominjemo naredbe JB i JNB red je spomenuti i grananje.

Neka od grananja u asembleru smo vec prošli, a riječ je o bezuvjetnom grananju: naredbe SJMP, AJMP i LJMP su tri varijante bezuvjetno grananja na labelu/adresu koja je navedena iza naredbe. U višim jezicima možemo je poistovjetiti s naredbom goto

Uvjetno pak grananje nam daje znatno više slobode, i generalno u asembleru možemo testirati bit i byte uvjete, i na osnovu njih se granati na odgovarajucu labelu/adresu.

Primjeri takvih naredbi su: JB, JNB, JC, JBC, JNC, JZ, JNZ, CJNE i DJNZ. Pomocu njih efektivno možemo kreirati gotovo sve petlje poznate iz viših prog.jezika, npr. if-else, do-while, for.

 

 

Uzorkovanje

 

Osim prekidača, ulazni pinovi mikrokontrolera mogu poslužiti i za uzorkovanje ostalih "generiranih" signala koji ne pate od bouncinga. Tako možemo mikrokontroler iskoristiti da bi izmjerili frekvenciju određenog signala. Npr. ukoliko želimo napraviti digitalni obrtomjer, tada signale prema bobini možemo vanjskim sklopom filtrirati da dobijemo niz pravokutnih impulsa čiju učestalost ćemo pretvoriti u broj okr/min. Isto vrijedi i za druge primjere, međutim treba napomenuti da uvijek postoji ono ograničenje maksimalne ulazne frekvencije, a koja u teoriji MORA biti barem dvostruko manja od radne frekvencije (efektivno frekvencije ciklusa) mikrokontrolera. Ako uzmemo za primjer 12MHz kristal, naš mikrokontroler će radit brzinom od 1 milijun jednociklusnih instrukcija u sekundi, što već u teoriji ograničava maksimalnu frekvenciju ulaznog signala na 500kHz. U praksi je taj broj još i manji, a može pored same radne frekvencije ovisiti i o konkretno napisanom programu (ipak treba ulazni signal obraditi, što opet zahtjeva vrijeme).

 

 

 
1 0 hvala 5
12 godina
neaktivan
offline
Re: Mala škola 8051 mikrokontrolera

Već sam se pitao da nisi odustao. :D

 

Zadnja dva nisam stigao pročitati, osim ovo vezano za 7-segmentni displej, jer mi je bitan za neki projekt.

Hvala druže velika! {#}

16 godina
neaktivan
offline
Re: Mala škola 8051 mikrokontrolera

Dobro i kazes... tim vise sto ne vidim nikakav feedback, pa je i meni palo napamet... Mislim da cu se ipak samo zadrzat na najosnovnijim stvarima, a ako bude interesa i pitanja procu tajmere, prekide, serijski port, bit banging nekih protokola, LCD, pwm... uf, ima tema napretek, samo sve ovisi o interesu...

 

btw, koji projekt radis? nesto vec gotovo ili sam razvijas?

12 godina
neaktivan
offline
Re: Mala škola 8051 mikrokontrolera
wifi kaže...

btw, koji projekt radis? nesto vec gotovo ili sam razvijas?

Iz predmeta elektroenergetika je profesor uzeo nekoliko nas da radimo nešto na temu obnovljivih izvora energije, ali nešto konkretno. Pa ćemo raditi brojač prometa i tablu sa cijenama goriva za benzinske stanice. Isprogramirati ne bi bilo problem koliko je problem dobiti napon sa solarnih panela, a za drugi projekt posebno, gdje nakon što nema napona sa panela, treba sam prebaciti na mrežu ili akumulator koji se napunio ako je bilo "viška" sunčeve energije... Za pojačanje displeju ćemo vjerovatno napraviti pojačavač pomoću tranzistora u spoju sa zajedničkim emiterom. Ugl. tvoja škola mikrokontrolera mi je došla kao naručena, jer trenutno nemam vremena čitati knjige o mikrokontrolerima.

PS. Nemoj odustajati, siguran sam da ima još ljudi kojima ovo pomaže. :D

16 godina
neaktivan
offline
Re: Mala škola 8051 mikrokontrolera
royalhero kaže...

Iz predmeta elektroenergetika je profesor uzeo nekoliko nas da radimo nešto na temu obnovljivih izvora energije, ali nešto konkretno. Pa ćemo raditi brojač prometa i tablu sa cijenama goriva za benzinske stanice. Isprogramirati ne bi bilo problem koliko je problem dobiti napon sa solarnih panela, a za drugi projekt posebno, gdje nakon što nema napona sa panela, treba sam prebaciti na mrežu ili akumulator koji se napunio ako je bilo "viška" sunčeve energije... Za pojačanje displeju ćemo vjerovatno napraviti pojačavač pomoću tranzistora u spoju sa zajedničkim emiterom. Ugl. tvoja škola mikrokontrolera mi je došla kao naručena, jer trenutno nemam vremena čitati knjige o mikrokontrolerima.

PS. Nemoj odustajati, siguran sam da ima još ljudi kojima ovo pomaže. :D

racunam da ti triba minimalno 4 displeja, mozda i vise, u svakom slučaju prouci malo ULN2003 ako mislis koristiti ZK 7 seg. takodjer ces tribat vremenski multipleksirat displej (osim ako ne koristis npr. 74ls573 pa "latchas" prikaz nekog broja. Multipleksiranje bi moga recimo sljedeci put obradit. Za zajednicku elektrodu u svakom slucaju mozes iskoristit neki jaci tranzistor. Jeste vec poceli slagat kakvu shemu?

Sto se tice 89c4051, tamo vec imas analogni komparator, pa bi njega moga interno iskoristit da ti prati trenutak kada napon solarne celije padne ispod neke referentne vrijednosti (zener+trimer da mozes podesit). 89s52 ti to nema, pa ti triba neko vanjsko op.pojacalo.

 

nadam se da necu odustat, bar dok ne sredimo sve osnove... {#}

12 godina
neaktivan
offline
Re: Mala škola 8051 mikrokontrolera

Sa konkretnim radom krećemo u II polugodištu.

Pa za brojac prometa mi trebaju dva displeja, jedan za ukupno stanje brojača, a drugi za sedmični prosjek. Za tablu cijena je već druga priča, ovisi koliko budemo panela imali ;-) Škola nema love za te "gluposti".

Nismo mislili zenerkom no vidiš razmislit ćemo i o temo, kada krenemo sa radom onda ću se zamarati time. :D

Samo ti piši, ne bitno šta, samo možemo nešto novo naučiti.

16 godina
neaktivan
offline
Re: Mala škola 8051 mikrokontrolera

ovaj displej za tjedni prosjek moze bit relativno malen (ovisno za koju cestu je namjenjen), ali ukupni brojac se stalno povecava pa i tu tribas imat nekakav limit. jesi razmislja da serijskim portom saljete podatke na pc i vode logovi...

 

a sto se tice cijena, racunaj ES95, ES98, Diesel, LPG, Loža... barem jedno 5-6 displeja po 4 znamenke.

 

ne mora bit zener, bitno da je stabilni referentni izvor napona u odnosu na koji ces usporedjivat trenutni "output" solarne ploce.

 

skolama sad definitivno nije lako... procedura za nabavu BILO CEGA ti se svodi na hrpu papira i ponuda, iako sama vrijednost nabave moze iznosit 10kn... prije je bilo lakse jer su se manji gotovinski iznosi bez problema mogli kupovat, sto sad nije moguce...

 

do kraja ovog tjedna ce jos ic s mini skolom, a od ponediljka mislim da ce bit manje vrimena za to, eventualno vikendom... {#}

15 godina
neaktivan
offline
Re: Mala škola 8051 mikrokontrolera
wifi kaže...
Sto se tice 89c4051, tamo vec imas analogni komparator, pa bi njega moga interno iskoristit da ti prati trenutak kada napon solarne celije padne ispod neke referentne vrijednosti (zener+trimer da mozes podesit). 89s52 ti to nema, pa ti triba neko vanjsko op.pojacalo.

Njemu bi trebao analogni ulaz, pa da može pratiti vrijednosti napona. Ako mcu nema analogni ulaz - ad konvertor, a ima analogni komparator, tada je pametnije riješiti to na drugi način, umjesto da gađaš referentnu vrijednost i imaš samo šturu informaciju. Obzirom da pin može biti samo hi ili low, ima - nema, na prvi pogled si ograničen. To se jednostavno riješi s jednim kondenzatorom, kojem mijeriš vrijeme punjenja/pražnjenja. Tj, kondenzator pražnjenjem okida pin na 1, a ti mjeriš frekvenciju i imaš podatak napona - a/d konverter. Proguglaj malo, ima više gotovih primjera shema/koda..

 

16 godina
neaktivan
offline
Re: Mala škola 8051 mikrokontrolera
bed kaže...

Njemu bi trebao analogni ulaz, pa da može pratiti vrijednosti napona. Ako mcu nema analogni ulaz - ad konvertor, a ima analogni komparator, tada je pametnije riješiti to na drugi način, umjesto da gađaš referentnu vrijednost i imaš samo šturu informaciju. Obzirom da pin može biti samo hi ili low, ima - nema, na prvi pogled si ograničen. To se jednostavno riješi s jednim kondenzatorom, kojem mijeriš vrijeme punjenja/pražnjenja. Tj, kondenzator pražnjenjem okida pin na 1, a ti mjeriš frekvenciju i imaš podatak napona - a/d konverter. Proguglaj malo, ima više gotovih primjera shema/koda..

 

8051 serija u pravilu nema analogne ulaze, tako da ako misli koristit bilo sto osim analognog komparatora koji je prisutan kod nekih varijanti, doista ce morat ic na vanjske elemente. Ipak, ako mu samo triba signal on/off za prijelaz na bateriju/mrezu, onda dalje od komparatora ne treba gledat... ako pak zeli prikazivat trenutni napon baterije, to je vec druga stvar, a u tom slucaju bolje da se prebaci na AVR seriju ili PIC. Cijene mikrokontrolera su vrlo slicne, a usteda na PCB-u znatna...

11 godina
offline
Re: Mala škola 8051 mikrokontrolera
wifi kaže...

8051 serija u pravilu nema analogne ulaze, tako da ako misli koristit bilo sto osim analognog komparatora koji je prisutan kod nekih varijanti, doista ce morat ic na vanjske elemente.

A/D konverteri uglavnom nisu dostupni na onima koji dolaze u PDIP kućištu (čitaj - na onima koji se najviše koriste za amaterske projekte).

Npr. Atmelov 89C5115 ima A/D konverter (i to 8-kanalni), kao podosta NXP-ovih, SiLabs-ovih...

 

Također, neki imaju ugrađene i D/A konvertere, neki se mogu spojiti na Ethernet PHY, neki rade na 100MHz, neki mogu pričati preko CAN bus-a, neki preko USB-a...

 

Kod opisa jezgre, imaš podatke o 12 ciklusa clocka po instrukciji. NXP i Atmel već godinama imaju jezgre koje koriste 6 ciklusa. Uz to NXP ima modele koji rade u 2 ciklusa, a koliko vidim, Atmel se hvali da ima "single cycle core".

OK, kod tog rješenja postoje kompromisi oko performansi analogne periferije (manja rezolucija A/D i D/A), no efektivno instrukcije se izvršavaju u manjem broju ciklusa.

Dobro, ako ćemo cjepidlačiti, neki od ovih spadaju pod 8051 kompatibilne arhitekture a ne pod čisti 8051.

 

Uglavnom se sve za sada vrti oko nekoliko proizvođača:

http://www.atmel.com/products/microcontrollers/8051architecture/default.aspx

http://www.nxp.com/products/microcontrollers/8_16_bit_legacy/

http://www.infineon.com/cms/en/product/microcontrollers/8051-compatible-8-bit-microcontrollers/channel.html?channel=ff80808112ab681d0112ab6b7661083f

http://www.silabs.com/products/mcu/Pages/8-Bit-Microcontrollers.aspx

 

 

11 godina
offline
Re: Mala škola 8051 mikrokontrolera
royalhero kaže...

Sa konkretnim radom krećemo u II polugodištu.

Pa za brojac prometa mi trebaju dva displeja, jedan za ukupno stanje brojača, a drugi za sedmični prosjek. Za tablu cijena je već druga priča, ovisi koliko budemo panela imali ;-) Škola nema love za te "gluposti".

Nismo mislili zenerkom no vidiš razmislit ćemo i o temo, kada krenemo sa radom onda ću se zamarati time. :D

Samo ti piši, ne bitno šta, samo možemo nešto novo naučiti.

 

Ako trebaš A/D konverter i ako ćete raditi sastavljanje ručno (od izrade štampe do lemljenja) tu nema puno razmišljanja - uzmeš neki Atmel AVR ili neki Microchipov PIC.

Kod njih bi trebalo biti modela koji u PDIP kućištu dolaze sa A/D koverterima i analognim komparatorima.

Kod ovih 8051 modeli koji dolaze sa analognom periferijom su u pravilu skuplji i kod nas teže dostupni (čitaj - mora se naručivati).

16 godina
neaktivan
offline
Re: Mala škola 8051 mikrokontrolera
Potpuno se slazem... Avr i pic imaju hrpu cijenom i dostupnoscu pristupacnih mikrokontrolera s kojim je vrlo lako koristit i usb i analogne ulaze i masu preostalih fja ovisno o modelu. Kod 8051 je stvar bitno drukcija i dosta skuplja/nedostupna pa je to razlog zbog kojeg se u ovoj skoli zadrzavam tipicno na dva jeftina i dostupna,takorekuc skolska primjerka 8051 mikrokontrolera - 89s52 i 89c4051. Cijenom i "jednostavnoscu" su prilagodjeni bas pocetnicima,a dostupni su i u domacim ducanima
11 godina
neaktivan
offline
Re: Mala škola 8051 mikrokontrolera

svaka čast na tutorialu odlično je samo tako nastavi;)

 

inače u svemu ovome sam dosta nov, pa ima puno nejasnoća i pitanja, naprimjer radim neki projekt i trenutno me muci sto ako na 8051 spajamo vanjski RAM, koji adresira 2na12 adresnih lokacija, znaci trebati ce nam 12 izlaza iz mikrokontrolera samo za lokaciju i jos plus 8 izlaza za podatak. Sad gledam ima neki sklop koji pamti nižih 8 bitova adrese pa onda se na to nadoda jos ovih visih 8 bitova, tako da ugl nam treba 16, a ne 24 izlaza. Jel znas nesto vise o tom sklopu kojim slucajem? ili neki drugi nacin kako ekonomicnije ovo pospajati da ne trosim puno izlaza samo na RAM jer treba jos za LCD i tipkovnicu i druge stvari.

11 godina
offline
Re: Mala škola 8051 mikrokontrolera

Zašto ne staviš taj I/O u adresni prostor,  tada mu možeš pristupati kao da se radi o eksternoj memoriji. Ako nema puno toga za dodati tada nema velikih problema oko dodatnog hardvera (doslovno par kuna više), a u slučaju da toga ima podosta, koristi se nekakav adresni dekoder (najbolje GAL ili slične PLD igračke).

 

Na gugletu potraži:

"8051 memory mapping devices" ili "8051 memory mapped devices"

16 godina
neaktivan
offline
Re: Mala škola 8051 mikrokontrolera
stretch kaže...

svaka čast na tutorialu odlično je samo tako nastavi;)

 

inače u svemu ovome sam dosta nov, pa ima puno nejasnoća i pitanja, naprimjer radim neki projekt i trenutno me muci sto ako na 8051 spajamo vanjski RAM, koji adresira 2na12 adresnih lokacija, znaci trebati ce nam 12 izlaza iz mikrokontrolera samo za lokaciju i jos plus 8 izlaza za podatak. Sad gledam ima neki sklop koji pamti nižih 8 bitova adrese pa onda se na to nadoda jos ovih visih 8 bitova, tako da ugl nam treba 16, a ne 24 izlaza. Jel znas nesto vise o tom sklopu kojim slucajem? ili neki drugi nacin kako ekonomicnije ovo pospajati da ne trosim puno izlaza samo na RAM jer treba jos za LCD i tipkovnicu i druge stvari.

sorry na maloj pauzi, neki drugi prioriteti su u igri ove dane, ali uskoro idem dalje sa skolom...

 

mozes koristit 74ls573 da ti privremeno pamti A0-A7 (spojeni na port 0 uC), njegov LE (Latch Enable) spajas na pin ALE (Address Latch Enable) uC-a. Port 0 ujedno direktno spajas na D0-D7 same memorije.Adrese A8-A15 s porta 2 uC spajas direktno na memoriju (A8-An). Sa pina WR uC-a spajas se na WE (Write Enable), a sa pina RD uC-a na OE (Output Enable). Na ovaj nacin mozes koristit mogucnosti samog mikrokontrolera za pristup vanjskim adresabilnim elementima, jedini je preduvjet da se radi o uC-u s portom 0 i 2, u pravilu 40pinski. 

 

Istu stvar mozes uz malo programiranja (posto su ti adrese 12bitne) izvest i na 20pinskom 89C4051 i dva 74ls573, s tim da P1 iskoristis za adrese A0-A7 (LE1), A8-A15 (LE2) i podatke D0-D7, a od porta P3 iskoristis npr. 3.2-3.5 za LE1, LE2, WR i RD. Ostaje ti na raspolaganju npr. 3.0 i 3.1 ako zelis serijskim portom ostvarit kakvu komunikaciju i 3.7, dakle 3 pina za slobodno koristenje...

 

jesi razmislja o koristenju serijskih SPI RAM memorija pa bit bangat SPI protokol. Usteda na pinovima je ogromna...

Poruka je uređivana zadnji put pet 18.1.2013 22:48 (wifi).
11 godina
neaktivan
offline
Re: Mala škola 8051 mikrokontrolera

zahvaljujem, al mislim da ću ipak bez vanjske memorije, ima dovoljno memorije za ovakve potrebe i u internoj memoriji, samo bi bilo dobro proci za vjezbu ta rukovanja sa vanjskom memorijom al bit ce vremen {#}

12 godina
neaktivan
offline
Mala škola 8051 mikrokontrolera

HITNO :!d

Sad sam u skoli pisem zadatak 8(kratak je ) ali mi ga neznamo

Ako ko moze napisat do 1:25 program koji 

ima 2 gumba

pritiskom 1. gumba led displej broji za  + broj od ( 0 do 9 , na devetci kada stisnemo plus ostaje 9 )

pritiskom 2.gumba sve isto samo broji za - 1 broj :D 

HVALa

Suba
Moj PC  
0 0 hvala 0
12 godina
neaktivan
offline
Re: Mala škola 8051 mikrokontrolera
Treba mi neko ko zna radit u ovome da mi napravi program PLACAM ... Hitnoooo
Suba
9 godina
offline
Re: Mala škola 8051 mikrokontrolera
Pozdrav... Bumpam malo staru temu, al treba mi jedan odgovor...

U školi radimo, evo druga godina, mikrokontrolere. Programiramo ih u programu Bascom (u nekoj besplatnoj verziji). Točnije, Atmelov 89c2051.

Pošto me to baš zanima, a nešto sam se isprakso na školskima, mislio sam si nabavit neki...

Pa pitam za preporuku... Koji uzeti a da ga mogu programirati u Bascomu poput ovog (89c2051)...

Uz to mi treba kompletno sve, znači pločica za spajanje ona, ispravljač, programator, sve za kontroler (kvarc kristal, kondenzatori, otpornic, diode, žice itd.)...
Sve ukratko.

Sad... Na kompu imam samo usb. Nemam com port. Mogo bi samo prek njega.

Što mi predlažete? 89c2051 ili 4051? Jel zna ta razlika u memoriji biti presudna? U cijeni nije neka...
Ili ipak neki iz 89s serije? Zašto? Jel se isplate i mogu naprogramirat u Bascomu ko i ovi?

Jesu početnička pitanja, a nije cijena da će mi bit žao ak fulam al ipak bi htio neku informaciju iz prve ruke :/

Hvala :D
Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
Re: Mala škola 8051 mikrokontrolera

glavni problem koji ces imat ukoliko se odlucis na bilo koju C verziju ce bit nabavit programator koji ce ti radit s windows 7, 8, 10, pa cak i sa starim XP-om... u praksi, neces ga nac. 

kad si to rijesia, mozes koristit bilo koju varijantu koja ima S u sebi jer ce ti nudit SPI programiranje. samim time rijesia si problem jer mozes kupit jeftine usbasp programatore s ebaya za 2-3$. Primjer imas u prvom postu. Inace ne radim s bascomom vec s asemblerom, ali i bascom bi treba u svom folderu projekta kao izlaznu datoteku dati .hex koji ti onda sluzi za samo programiranje cipa. 

s obzirom na obilje pinova i pristupacnost, preporucia bi ti 89s52 koji mozes kupit i kod nas, ali kad vec narucujes programator s ebaya, onda naruci i cip(ove) i ostatak stvari. 

Od stvari za pocet ide ti sljedece: breadboard (830), dupont zice (65pcs breadboard wire), i ovako jedan dev board http://www.ebay.com/itm/C51-AVR-MCU-development-board-DIY-learning-board-kit-Parts-and-components-/281794267830?hash=item419c3f4ab6:g:6DwAAOSwwE5WU~9h tako da vec u startu mozes radit, 89s52, usbasp. 

 

sto god te zanima slobodno pitaj... 

9 godina
offline
Re: Mala škola 8051 mikrokontrolera
Taj ima 40 pinova, kolko sam vidio... Vidit ću i kolko dođe pa budem vidio. Dok radim u Bascomu (demo verzija), u šk imamo .hex file, znam, al bascom demo može radit s max 4kB pa dok ne naučim neš drugo bar, više mi ni ne treba... Vidit ću :D

A imam pitanje, kvarc kristal isto 16MHz (valjda) na xtal1, xtal2 jel?
Dalje, na to 33pF i na RST 100nF (smo mi stavljali pa eto)... Di bi mogo nabavit te kondenzatore i oscilator?

Ove diode, otpornike i to mogu kupit brdo, al tog mi ne treba.

Uz to, on radi na 5V jel? I kolka mu je log. 1? Oscilira ili je konstantna? :D

Hvala na odgovoru :D
Moj PC  
0 0 hvala 0
9 godina
offline
Re: Mala škola 8051 mikrokontrolera
Sad sam se sjetio, ispravljač za breadboard (za ona 5V na ploči), gdje to da nabavim i kakav?

Također, za Lcd, neki 16x2 recimo il sl...

Koji mi preporučaš i gdje da nabavim kabel onaj s kojim ga povezujem s čipom?
Moj PC  
0 0 hvala 0
Nova poruka
E-mail:
Lozinka:
 
vrh stranice