Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Assembler

Dobrý den, potřebuju pomoct s programovanim v Assembleru, programuji pro ATTINY 2313 od firmy Atmel. Mám do školy zadání viz obrázek (nastenka) ale pořád mi to nejede, pomohl by mi nekdo prosím? Zdrojový kód co jsem napsal prikladam:
/*
* Uloha1.asm
*
* Created: 7.11.2012 8:47:01
* Author: zak
*/
.DEF REG=R16
LDI REG, 0b11111011
OUT DDRB,REG
LDI REG,RAMEND //nastavení zásobníku
OUT SPL,REG //uložení do zásobníku
CLC
LDI REG,0b11111011

SBI PORTD, 2 //NASTAVENÍ BITU PORTU D

LDI R18,0b11111111
OUT DDRB,R18
LDI R18,RAMEND
OUT SPL,R18
LDI R18,RAMEND
CLC
LDI R18,0b11111111
RCALL ZPET
; RJMP ZNOVU

ZNOVU:OUT PORTB,R18
ROL R18
RCALL CEKEJ
RCALL SPOZDENI
RJMP ZNOVU
CEKEJ:LDI R19,20
LDI R20,0
RET
SPOZDENI: DEC R21
BRNE SPOZDENI
DEC R20
BRNE SPOZDENI
LDI R21,0
RET

ZPET:
IN R17,PORTD // NAČTENÍ PORTU D
CPI REG,0b11111011 //TEST JE-LI ZMACKNUTO TLACITKO
BREQ NULA //SKOK PŘI SHODE, TESTUJE SE HODNOA BITU Z SE STAVEM TLACITKA
BRNE JEDNA //SKOK JE-LI VYSLEDEK NESHODNÝ

NULA: ANDI REG,0b11111011 //LOGICKY SOUCIN
CPI REG,0b11111011 //TEST JE-LI ZMACKNUTO TLACITKO
BREQ SPANI //SKOK PŘI SHODE NA PODPROGRAM SPANI(REZIM POWER-DOWN)
BRNE ZPET //SKOK PRI NESHODE NA ZACATEK PROGRAMU

JEDNA: ANDI REG,0b11111011 //LOGICKY SOUCIN
CPI REG,0b11111011 //TEST JE-LI ZMACKNUTO TLACITKO
BREQ SPANI //SKOK PRI SHODE NA PODPROGRAM SPANI(REZIM POWER-DOWN)
BRNE ZPET //SKOK PRI NESHODE NA ZACATEK PROGRAMU

SPANI: SLEEP //UVEDENI PROCESORU DO REZIMU POWER-DOWN
RETI //UKONCENI PODPROGRAMU PRERUSENI A NASTAVENI BITU I

Předmět Autor Datum
Mohol by si napisat, co konkretne ti nejde, lebo luskat to tu bude asi malokto. Naviac obrazok hore…
nl12345 25.11.2012 20:53
nl12345
Sorry za ten obrazek, problem je takovy ze diody blikaji cili had je funkcni ale na ty tlacitka to n…
On 25.11.2012 20:55
On
to si ale budes muset precitat datasheet toho atmelu ze ktory bit ktoreho registra nastavi dany pin…
MM.. 26.11.2012 00:53
MM..
No, trochu jsem to predelal, co myslite pojedeto? /* * Uloha.asm * * Created: 28.11.2012 18:18:36 *… nový
On 28.11.2012 18:59
On
Mne sa nechce teraz lustit cudzi kod, tak si to snad odsimuluj alebo vyskusaj. Si si isty ze IRQ vek… nový
MM.. 28.11.2012 19:04
MM..
Zákmity tlacitek neres, jsou hardwarove osetrene a ta adresa je dobre. Takze snad to pojede :D nový
On 28.11.2012 19:16
On
Ja si ale nie som isty ci to ORG pracuje s bajtami alebo s wordami. Je mozne ze to mas OK (mozes si… nový
MM.. 28.11.2012 19:41
MM..
Radsi ho mazu, prece jenom jsu zacatecnik tak nevym. Ale diky za radu. nový
On 28.11.2012 20:27
On
no to vidim, teraz uz ale vys :) Register ma vzdy nejaku hodnotu, hodnota 0 je uplne rovnocenna s ak… poslední
MM.. 28.11.2012 20:34
MM..

Sorry za ten obrazek, problem je takovy ze diody blikaji cili had je funkcni ale na ty tlacitka to nereaguje. Ucitel rikal neco o zapnuti bitu I, nastaveni preruseni INT0 a rozclenit pomoci direktiva ORG ale nevim jak na to, jinak bych to udelal sam.

to si ale budes muset precitat datasheet toho atmelu ze ktory bit ktoreho registra nastavi dany pin ako prerusenie INT0. Nasledne si v datasheete najddes nejaku sekciu o preruseniach a najdes si tam ze na aky offset to skace ked nastane prerusenie int0, ten offset si zadas ako ORG offset, pred kod ktory sa ma vykonat ked bude aktivny ten pin.

No, trochu jsem to predelal, co myslite pojedeto?

/*
* Uloha.asm
*
* Created: 28.11.2012 18:18:36
* Author: Predator
*/
.DEF REG=R16
.ORG 0
RJMP ZACATEK
.ORG 0001
RJMP ZPET

ZACATEK:
SBI PORTD, 2 //NASTAVENI BITU PORTU D
LDI REG, 0b01000000 //ULOZENI HODNOTY DO REGISTRU R16->NASTAVENI BITU I
OUT SREG, REG //NASTAVENI BITU I, ABYCH MOHL DELAT PRERUSENI
CLR REG //VYMAZANI REGISTRU R16,ABY BYL VOLNY PRO DALSI POUZITI

LDI REG, 0b00111000 //ULOZENI HODNOTY DO REGISTRU R16->NASTAVENI BITU SM1/0 SE
OUT MCUCR, REG //ZAPNUTI REZIMU POWER-DOWN, NASTAVENI PRERUSENI
CLR REG //VYMAZANI REGISTRU R16,ABY BYL VOLNY PRO DALSI POUZITI

LDI REG, 0b00100000 //ULOZENI HODNOTY DO REGISTRU R16->NASTAVENI PRERUSENI INT0
OUT GIMSK, REG //NASTAVENI PRERUSENI INT0
CLR REG //VYMAZANI REGISTRU R16,ABY BYL VOLNY PRO DALSI POUZITI

HAD:
LDI REG, RAMEND //NASTAVENI ZASOBNIKU
OUT SPL, REG

RCALL ZHASNI //ZAVOLANI PODPROGRAMU PRO ZHASNUTI LED
ROR REG //BEHANI HADA
RCALL DELAY //ZAVOLANI PODPROGRAMU PRO ZPOZDENI

DELAY:
LDI R29, 0 //ULOZENI HODNOTY DO REGISTRU PRO NASLEDNE POUZITI
LDI R30, 0 //ULOZENI HODNOTY DO REGISTRU PRO NASLEDNE POUZITI
LDI R31, 0x50 //ULOZENI HODNOTY DO REGISTRU PRO NASLEDNE POUZITI

DAL:
DEC R29 //REALIZOVANI SMYCKY
BRNE DAL
DEC R30
BRNE DAL
DEC R31
BRNE DAL
RET

ZHASNI:
LDI REG, 0b11111111 //ZHASNUTI LED
OUT DDRB, REG
OUT PORTB, REG
RET

ZPET:
IN R17, PORTD // NAČTENÍ PORTU D, ABY BYLO JASNE JESTLI JE ZMACKNUTO TLACITKO
CPI R17, 0b11111011 //TEST JE-LI ZMACKNUTO TLACITKO
BREQ NULA //SKOK PŘI SHODE, TESTUJE SE HODNOA BITU Z SE STAVEM TLACITKA
BRNE JEDNA //SKOK JE-LI VYSLEDEK NESHODNÝ

NULA:
SLEEP //UVEDENI DO REZIMU POWER-DOWN
RETI

JEDNA:
BRNE ZPET //SKOK NA ZACATEK PROGRAMU

Mne sa nechce teraz lustit cudzi kod, tak si to snad odsimuluj alebo vyskusaj. Si si isty ze IRQ vektor je na offsete 0001? Sa mi nezda

Inac co sa tyka mechanickych tlacitok - kazde tlacitko po stlaceni par ms kmita. Takze NEmozes to robit tak ze ked pride prerusenie tak si pozres level na pine, ptz ten level moze byt zrovna kmit na 0, ale zvycajne sa to robi tak ze ak prislo prerusenie tak vies ze to stlacil, pockas 10ms nech dokmita, otocis si polaritu IRQ pinu, a cakas na dalsie IRQ az pride dalsie IRQ pozres si polaritu pinu a vies ci to zrovna stlacil alebo pustil.
Druha moznost je elektrionicky debounce filter (zvycajne ako R-C clanok v kombinacii s schmitt trigger vstupom), niektore controllery maju moznost zapnut debounce na niektorych vstupoch, viz datasheet (tvoj atmel zhlavy nepoznam)

Ja si ale nie som isty ci to ORG pracuje s bajtami alebo s wordami. Je mozne ze to mas OK (mozes si preistotu najst symbol "INT0addr" v nejakom dodanom .inc, to je symbol ktory sa pouziva u ORG.
Len tak mimochodom ten REG nemusis furt mazat, ked tam nacitas nove data tak sa stare premazu predsa.

no to vidim, teraz uz ale vys :) Register ma vzdy nejaku hodnotu, hodnota 0 je uplne rovnocenna s akoukolvek inou hodnotou. Neexistuje ziadne "mazanie". CLR pouzijes vtedy ak v tom registri POTREBUJES mat nulu kvoli naslednej OR instrukcii apod (a ak potrebujes aj nastavit flag bity, LDI nenastavuje flag bity).

Zpět do poradny Odpovědět na původní otázku Nahoru