[ CarGovedar @ 13.06.2004. 14:50 ] @
Zdravo,

meni treba hitno pomoc u ASM.

Sledeci problem:
U skoli ucimo ASM (to je ok). Nastavnik koji nam predaje ASM (necu da kazem da nezna ASM) vec neumije da objasnjava tako da u citavom razredu imaju 4 djaka koji imaju pozitivnu ocjenu a svi ostali imaju keca.
Da nam nebi zakljucio keca na zavrsnom mi smo se dogovorili sa njim da radimo projekat. Taj projekta smo poceli da radimo u janurau i imamo jos svega oko 4 sedmice a mi se jos nalazimo na samom pocetku naseg projekta.

Projekat:
Ima ulazna vrata od garaze koja se otvaraju tek kada vozac unese tacan Code. To jeste ima LCD-Display koji pokazuje:
Korisnicko Ime: Marko
Lozinka:
Lozinka treba da se unese. Unos Lozinke se vrsi preko Tastature (tastatura je kao u mobilnog). ako User triputa ne unese tacanu lozinku onda se username speruje i on mora da unese supercode da bi ga ponove aktivirao.

Mi jos programiramo tastaturu ali nam jos ne radi.
Radi toga bi vas zamolio da mi ako mozete pomognete da realiziram ovaj projekat. Ja cu vam se revansirati na slican nacin (C/C++, Phyton, PHP, MYSQL).

Hvala u naprijed!


pozdrav od Miladina.
[ lanik @ 13.06.2004. 16:30 ] @
Epa ovako mogu da ti dam par saveta mada si mogo malo detaljnije da opises taj uredjaj, makar si mogo da kazes koji mikrokontroler koristis. Reci cu ti par stvari vezano kako to da uradis sa PIC-om. 16F i 18F serije PIC mokrokontrolera imaju EEPROM memoriju sto znaci ako u nju zapatis lozinke, one ce ostati upisane u nju i u slucaju da dodje do nestanka napajanja. Sto se tice onoga da posle tri puta pogrsno unesene lozinke da trazi superkod mozes da resis tako sto ces jedan registar da inkrementujes 0-3 i time brojis koliko puta pokusao da unese lozinku. Kada naredni put inkrementujes taj registar i rezultat u njemu bude 4 onda tvoj programcic treba da skoci na potprogram i treba da se vrti u njemu dok ovaj ne unese tacan supercode. Sto se tice tastature mozes da koistis serijsku sa 12 tastera sto znaci 4 reda sa po 3 tastera (10 tastera za cifre od 0-9 i dva su obicno # i *), tastatura ima 7 pina, odnosno 4 da odaberes koji red tastera zelis i 3 da odaberes odredjen taster u tom redu, tako kombinacajima mozes da dobijes svih 12. Kod PIC-a taster je pritisnut kada je bit na ulaznom portu 0. Uglavnom ne mogu mnogo da ti pomognem jer u tvom postu ima vise teksta kako ces da dobijes keca, nego o uredjaju. Opisi malo detaljnije koji mikrokontroler koristis, kakav LCD, kakva ti je tastatura pa ces da dobijes i detaljnije odgovore.
[ CarGovedar @ 13.06.2004. 17:16 ] @
izvinjvam se na losim informacijama.

Detaljne informacije

Tastatura je standardna kao sto si je ti opisao 4 reda po tri taste
1 red:1,2,3
2 red:4,5,6
3 red:7,8,9
4 red:*,0,#

Mikrocontorla je SAB 80C517A.
(Evo sta pise o njemu na www.keil.com The Infineon SAB 80C517A is an 8051 based CMOS controller with 21ch PWM, 8 DPTRs, WDT, 12ch ADC/10, HW PWD, Mul./Div Unit, 68 I/O lines, 4 Timers/Counters, 17 Interrupts/4 priority levels ROM-less, 256 Bytes On-chip RAM + 2048 Bytes additional XRAM.)

A LCD-Display je obicni text-display

nadam se da je ovaj put bilo dovoljno informacija ako nije samo me pitajte odma odgovaram

hvala u naprijed
[ lanik @ 13.06.2004. 18:27 ] @
Kao prvo skines ovo sa neta:
http://www.amresearch.com/datasheets/d80517.pdf

to ti je datasheet za tvoj mikrokontroler pa pocnes da citas i tamo pise da on ima XRAM memoriju koja ti je ustvari isto sto i ona EEPROM sto sam ti ja u predhodnom postu gore opisao znaci sve sto upises u nju ne brise se nakon nestanka napajanja sto se tice procesa upisivanja i citanja instrukcije su ti date u datasheet-u. Sto se tice tastature ta 4 pina koja sluze da odaberes red tastera postavis na cetiri izlazna pina iz MCU, a ona tri za taster na tri ulazna. Zatim lepo konfigurises jedan timer koji ce da ima svoj interapt na svakih recimo 1/200 s. Recimo da ti je na ona tri ulazna pina 0 kada taster ne provodi struju. Onda mozes u jednom interaptu na jedan od ona 4 izlazna pina da posaljes signal, a na ova tri bita ulaznog porta ispitujes da li je neki od njih na 1, pa u narednom interaptu na drugi izlazni pin posaljes signal, a na ova tri opet ispitujes da li je neki 1 i sve tako.

Ako ti je LCD recimo 2x16 mozes lepo da pogledas ovamo kako je povezan da ne filozofiram sad ja tu mnogo:
http://www.mikroelektronika.co...easy/pdf/AVReasyusersguide.PDF
Kad povezes LCD skini datasheet za njega i tu ti lepo sve pise kako sta funkcionise, ne znam kakav ti je tacno LCD.
[ CarGovedar @ 13.06.2004. 19:30 ] @
kad mi to ovako pricas sve mi je jasno i kada bi to trebao da programiram u C odma bi uspeo, ali ja ne znam kako da programiram u ASM. Jeli mozes da mi das neki source code o tome.

hvala na trudu u naprijed

pozdrav Miladin

LCD-Display je kao sto si reko 2x16

[Ovu poruku je menjao CarGovedar dana 13.06.2004. u 21:33 GMT]
[ lanik @ 13.06.2004. 20:14 ] @
Pa znas kako svaki mikrokontroler ima svoje registre, a preko njih se sve konfigurise tako da ne mogu da ti dam konkretan kod jer ne poznajem dovoljno ovaj tvoj. Ako te interesuje mogu da ti dam kod nekog jednostavnijeg programcica na PIC-u i da ti malo objasnim na tom primeru sta se desava, cisto da vidis kako izgleda, inace ako ces bas taj MCU onda moras da proucis onaj datasheet za njega.
[ CarGovedar @ 13.06.2004. 20:31 ] @
To je isto OK kad bi postvaio od drugog control-a code i kad bi onda mogao da mi objasnis sta se tuj desava, tako da bi nesto svatio.
[ lanik @ 13.06.2004. 21:55 ] @
Ovaj primer mozes da nadjes svuda, ali evo cisto da vidis kako izgleda
Code:

#include <P16F870.INC>

BROJAC    equ    0x1F        ;

    org    00h        ;
Pocetak
    movlw    0        ;
    movwf    TRISB        ;
    clrf    BROJAC        ;
Petlja        
    btfss    PORTA,0                 ;
    goto    Inkrementovanje    ;
    btfss    PORTA,1                 ;
    goto    Reset
KrajPetlje
    goto    Petlja        ;
Inkrementovanje
    incf    BROJAC,1                 ;
    movf    BROJAC,W    ;
    movwf    PORTB                  ;
Otpustanje_tastera
    btfss    PORTA,0                 ;
    goto    Otpustanje_tastera    ;
    btfss    PORTA,1                             ;
    goto    Otpustanje_tastera    ;
Otpustanje_tastera_kraj
    goto    Otpustanje_tastera        
Reset
    clrf    BROJAC        ;
    movf    BROJAC,W    ;
    movwf    PORTB
    goto    Otpustanje_tastera    ;

    org    0x01FF        
    goto    Pocetak
    end



Epa ajde da pocnemo. Znaci imamo mikrokontroler koji ima 8 pina koji su definisani kao izlazni, a tih osma pina cine PORTB.Recimo da na PORTB imamo 8 LED dioda.
Nas program pocinje sa #include i tu ukljucujemo set instrukcija za PIC16F870,
zatim definisemo promenljivu (registar, promenljiva je velika samo 1 bajt) na nekoj lokaciji u sustini nije bitno na kojoj samo treba da pazis da se ta lokacija ne poklopi sa lokacijom nekog vec postojeceg registra. Nas program pocinje na lokaciji 00h. Instrukcija
movlw 0

movlw - move littreal to work register
ova instrukcija vrednost 0 smsta w registar. Inace work registar ti je regitar kroz koji uglavnom sve prolazi i pomocu njega se vrse sve operacije.Naredna instukcija

movwf TRISB ; move w register to file
smesta sadrzaj w registra u registar TRISB. TRISB registar je pomocu kog se definise PORTB ako se u w registar upise 0 svi pinovi su izlazni, ako se u njega upise b'11111111' sto znaci b - binarni broj, gde su svi bitovi 1 onda su sva 8 pina ulazna. Odnosno ako bi se u TRISB upisalo b'00011111' prva tri pina bi bila izlazna, a druga 5 ulazna...

clrf BROJAC; clear file
ona radi isto sto i ove dve prethodno zajedno znaci brise jedan registar (u ovom slucaju brojac i postavlja ga na 0, normalno svi bitovi su 0)

btfss PORTA,0 ;bit test in file skip if set
s obzirom da se bitovi broje od 0 do 7 ova instrukcija testira da li je 0-ti bit PORTA jedinica (svuda gde je set to znaci postavljanje na 1, a gde je clear postavljanje na 0) i ako jeste jedinica onda se preskace naredna instrukcija, a je 0 instrukcija se ne preskace. PORTA je definisan kao ulazni ( tj. svi portovi su na pocetku tako definisani ako ih ne definises drugacije) i na njegovom prvom i drugom pinu su dva tastera (jedan na PORTA,0 i drugi PORTA,1) ako je recimo vrednost prvog tastera 0 koji je na PORTA,0 onda je taj taster pritisnut a ako je 0 nije isto vazi za PORTA,1.
Pa znaci ako je taster pritisnut program ce otici na funkciju Inkrementovanje, a ako nije preskoci ce je i otici na btfss PORTA,1 sto znaci da ispituje sada da li je drugi taster pritisnut ako jeste ide na funkciju Reset, ako nije pritisnut preskace instrukciju i ide na kraj petlje i zatim se vrti u petlji sve dok neki taster ne bude pritisnut.

Naredna instrukcija je incf BROJAC,1 ; incerment file
ova funkcija inkrementuje registar BROJAC za jedan ali ova jednica ne znaci to nego ona predstavlja parametar koji oznacava ce rezultat nakon inkrementovanja biti smesten u registar BROJAC u slucaju da je 0 rezultat ce biti smesten u w
registar

nakon toga prebacujemo sadrzaj registra brojac u w registar(movf BROJAC; move file - uvek prebacuje sadrzaj nekog registra u w registar)
a zatim sadrzaj w registra prebacujemo u registar PORTB (movwf PORTB) sto zanci kada smo smestili vrednost u PORTB oni bitovi koji su 1 tu ce LED diode na koje zakacene na te pinove biti upaljene

b '1 0 1 0 0 0 1 1'
* 0 * 0 0 0 * * --- LED (*-upaljena, 0-ugasena)

Sada opet ispitujemo da li je taster pritisnut ili je otpusten ako je pritisnut onda vrti petlja sve dok nebe otpusten, jer u slucaju da ne ispitamo da li je otpusten ili ne moze da se desi registar BROJAC nekontrolisano inkrementuje, dok ovako znamo jedan pritisak tastera je jedan inkrement.
To se isto radi i za taster koji se nalazi na PORTA,1

Sada nam dolazi funkcija reset koja ima zadatak da izbrise registar BROJAC tj. postavi ga na nulu, a zatim taj sadrzaj posalje na PORTB tj. na LED diode. Reset se znaci poziva pritiskom tastera koji se nalazi na PORTA,1

clrf BROJAC ; postavljamo brojac na 0
movf BROJAC,W ; prebacujemo sadrzaj registra BROJAC u w registar
movwf PORTB ; prebacujemo sadrzaj w registra u PORTB
goto Otpustanje_tastera ; idemo na petlju Otpustanje_tastera

nakon zavrse ne reset funkcije nas program se vrti u petlju za otpustanje tastera i kada je taster otpusten on ide na glavnu petlju gde ceka da neki od tastera bude pritisnut

nas progrma se zavrsava na lokaciji 01FFh iako nije zauzeo toliko memorije kolika je razlika izmedju lokacija na kojoj pocinje i na kojoj se zavrsava
a zatim se vraca na pocetak. end oznacava kraj programa

do poslednjih tri linija koda program kad se izvrsava u principu nikad i ne dodje do njih jer se ili vrtu u glavnoj petlji ili u petlji za otpustanje tastera

Nadam se da ce ti ovo nesto razjasniti trudio sam se da sve bude detaljno objasnjeno.