ATTiny13A - Assembler

Odpovědět
LadaS
Příspěvky: 3
Registrován: 27 dub 2018, 18:48

ATTiny13A - Assembler

Příspěvek od LadaS » 27 dub 2018, 23:32

zdravím,
mám jeden problém a budu rád, pokud se najde dobrá duše a poradí:
ATTiny13A, programováno v assembleru a nefunguje externí INT
v příloze je zdroják programu (po všech možných neúspěšných pokusech je dost neuspořádyný...)
Na začátku je inicializace externího INT (povolení, definice pinu pro INT0 a nastavení zda bude na hranu nebo úroveň). Požadavek je, aby INT byl vyvolán sestupnou hranou. Přes veškerou snahu a pokusy je INT vyvolán oběma hranami (vzestupnou i sestupnou - registr MCUCR na sestupnou hranu je 00000010 )
pro objasnění co všechno jsem zkusil:
zkoušel jsem různé zdroje signálu na INT pin,
také nezáleží který pin je použit na INT,
je lhostejné zda daný pin je definován jako vstup nebo výstup,
inicializační instrukce jsem dával do hlavního programu, do rutiny INT, všechno zcela zbytečně. INT se stále generuje na obě hrany vstupního signálu
dost možná se ten registr někde přepisuje, nevím, nemám dostatečné prostředky to zjistit
možná to vyžaduje ještě něco, nemám tušení co
je tam možná nějaká jednoduchá blbost, kterou přehlížím a už nejsem schopen ji najít
Koncove_svetlo_INT.pdf
(35.75 KiB) Staženo 13 x

Vladimir66
Příspěvky: 188
Registrován: 02 dub 2014, 15:30

Re: ATTiny13A - Assembler

Příspěvek od Vladimir66 » 28 dub 2018, 09:30

Ahoj,

jak vyvolavas ten interrupt ?
pokud tam mas tlacitko bez osetreni zakmitu (debouncing) , tak budes generovat x-krat preruseni pri sepnuti i rozepnuti tlacitka.

zkus si odladit tu detekci - posli tam programove puls sbi --> cbi a v ISR bych rozsvitil led a STOP
pri cbi --> sbi by se nemela ISR spustit
pokud toto bude fungovat, tak bych pridaval dalsi kod.

nastavovani bitů v ridicich registrech je lepe delat pres masku. posilani nul na "zbyle pozice" nemusi byt idealni.

-V66

LadaS
Příspěvky: 3
Registrován: 27 dub 2018, 18:48

Re: ATTiny13A - Assembler

Příspěvek od LadaS » 28 dub 2018, 18:20

Jako zdroj pro vyvolani int jsem pouzil v obou pripadech zdroje obdelniku. Ve druhem pripade to byl normalne vyrabeny generator co pouzivame v laborce.... Taze zadne zakmity a podobne veci.

Uživatelský avatar
gilhad
Příspěvky: 150
Registrován: 29 kvě 2015, 00:36

Re: ATTiny13A - Assembler

Příspěvek od gilhad » 29 dub 2018, 13:22

Pokud je mozne si precist, jak je nastaveny ten registr doopravdy, tak by to mozna stalo za to, pokud ho neco prenastavi, tak se to aspon dozvis.

pgerla
Příspěvky: 322
Registrován: 11 dub 2013, 00:17

Re: ATTiny13A - Assembler

Příspěvek od pgerla » 29 dub 2018, 14:18

LadaS píše:
28 dub 2018, 18:20
Jako zdroj pro vyvolani int jsem pouzil ...
Zběžně jsem mrkl a nemáš zaměněn hardwarový INT0 za PCINT0 ?

u definice INT0 vracíš RETI ;)

DavidO
Příspěvky: 478
Registrován: 01 kvě 2013, 21:27

Re: ATTiny13A - Assembler

Příspěvek od DavidO » 29 dub 2018, 14:47

pgerla píše:
29 dub 2018, 14:18
Zběžně jsem mrkl a nemáš zaměněn hardwarový INT0 za PCINT0 ?
Ano, vypadá to tak - u přerušení INT0 se dá nastavit, jestli reaguje na náběžnou, sestupnou hranu nebo úroveň pinu INT0 (na nožičce PB1), viz kap. 9.3.2 datasheetu, popis bitu 6 INT0:
The Interrupt Sense Control0 bits 1/0 (ISC01 and ISC00) in the MCU Control Register (MCUCR) define whether the external interrupt is activated on rising and/or falling edge of the INT0 pin or level sensed.
Oproti tomu přerušení PCINT reaguje na jakoukoli změnu pinů zvolených maskou (všechny nožičky kromě napájení), viz kap. 9.3.2 datasheetu, popis bitu 5 PCIE:
When the PCIE bit is set (one) and the I-bit in the Status Register (SREG) is set (one), pin change interrupt is enabled. Any change on any enabled PCINT[5:0] pin will cause an interrupt.
a to, jaká to byla změna, je potřeba zjistit v programu "ručně".

V tom PDF s kódem je rutina DCC pověšená na přerušení č.3 na adrese 2, tedy PCINT0, takže se volá při každé změně bez ohledu na nastavení ISC01:00 v MCUCR, které se vztahuje jen pro obsluhu přerušení č.2 na adrese 1, tedy INT0. Bohužel INT0 nemůže být "přemapován" na jinou nožičku než PB1. Pokud to musí být na nožičce PB4, tak to přes INT0 nepůjde.
pgerla píše:
29 dub 2018, 14:18
u definice INT0 vracíš RETI ;)
To je OK, to je standardní návrat z přerušení, kromě návratu (RET) to nahodí i příznak I v SREG (jakoby SEI) čímž globálně povolí interrupty.
Edit: resp. v tomto případě to znamená, že se INT0 neobsluhuje (pardon, prve jsem zřejmě poznámku nepochopil správně).

LadaS
Příspěvky: 3
Registrován: 27 dub 2018, 18:48

Re: ATTiny13A - Assembler

Příspěvek od LadaS » 30 dub 2018, 09:17

děkuji všem zúčastněným za dobré rady,
skutečně jsem v zápalu boje a myšlenkami nad dalšími algoritmy prohodil oba INT a bylo o zábavu postaráno....
Takže nyní už to běhá jak má a ještě jednou děkuji...

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 0 hostů