
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
Mohol by si napisat, co konkretne ti nejde, lebo luskat to tu bude asi malokto. Naviac obrazok hore nohami ako bonus...
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)
Zákmity tlacitek neres, jsou hardwarove osetrene a ta adresa je dobre. Takze snad to pojede :D
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.
Radsi ho mazu, prece jenom jsu zacatecnik tak nevym. Ale diky za radu.
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).