Avatar
Dxiare
Člen
Avatar
Dxiare:

Dobrý den potřeboval bych poradit s tímto programem pro postupné rozsvícení dvojic diod na 2 portech - celkem 16 diod. Děkuji

 
Odpovědět 9.11.2015 20:16
Avatar
Odpovídá na Dxiare
Michal Žůrek (misaz):

tak si je seřadíš, tak aby odpovídaly "indexy" na portu a pak to nastavíš obou portům stejné.

// u atmelu např.
PORTA = PORTB = b00000001;

P.S vycházím že porty jsou osmibitové.

Nahoru Odpovědět 9.11.2015 20:24
Nesnáším {}, proto se jim vyhýbám.
Avatar
Michal Žůrek (misaz):

nebo pokud máš nějaké šestnáctibitové porty tak to můžeš udělat rovnou. To postupné problikávání pak asi nejjednodušeji vyřeší ROLem (rotate left) (na x86 by to mělo být SHL; shift left).

Nahoru Odpovědět 9.11.2015 20:25
Nesnáším {}, proto se jim vyhýbám.
Avatar
Dxiare
Člen
Avatar
Dxiare:

Šlo by to i nějak takto ?

.INCLUDE "m8def.inc"

.CSEG
.DEF REG=R16
.EQU DDR=DDRD
.EQU PORT=PORTD

LDI REG,$FF
OUT DDR,REG
LDI REG,LOW(RAMEND)
OUT SPL,REG
LDI REG,HIGH(RAMEND)
OUT SPH,REG
CLC ;0 do D
LDI REG,0b111111111

LOOP:

OUT PORT,REG
RCALL DLY1
ROL REG

RJMP LOOP

DLY1:
LDI R17,14
LDI R18,0
LDI R19,0

DLY2:
DEC R19
BRNE LOOP
DEC R18
BRNE LOOP
DEC R17
BRNE LOOP
RET

 
Nahoru Odpovědět 9.11.2015 20:43
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Dxiare
Martin Dráb:
LDI REG,0b111111111

Tady máš jaksi devět jedniček, max. půjde osm. Také si nejsem jistý, zda-li správná syntax toho čísla není 11111111b. Instrukce ROL navíc rotuje přes příznak carry, takže během čekání bys neměl hodnotu tohoto příznaku.

V kódu nevidím pokus o zápis hodnot na nějaký jiný port než PORTD, takže na dvou portech fungovat nebude. Také jsi nespecifkoval, jakým způsobem chceš ty dvě diody rozsvěcovat (vůči sobě).

Co se týče

DLY2:
DEC R19
BRNE LOOP
DEC R18
BRNE LOOP
DEC R17
BRNE LOOP
RET

měl bys skákat na DLY2, ne na LOOP, protože jinak provádíš nekonečnou smyčku a bude docházet k přetečení zásobníku. I když to opravíš na LOOP, nejsem si jistý, zda-li taková procedura bude čekat dostatečně dlouho, aby to bylo pozorovatelné lidským okem.

Nahoru Odpovědět  +1 9.11.2015 21:14
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Martin Dráb
Michal Žůrek (misaz):

zápis čísla má správně, ale má tam jednu jedničku navíc, no.

Nahoru Odpovědět 9.11.2015 21:41
Nesnáším {}, proto se jim vyhýbám.
Avatar
Dxiare
Člen
Avatar
Dxiare:

Mohl by jste mi to někdo upravit aby to fungovalo na 2 portech :) (světelný had) dík

 
Nahoru Odpovědět 9.11.2015 21:46
Avatar
Odpovídá na Dxiare
Michal Žůrek (misaz):

to je nějaký úkol do školy?

Nahoru Odpovědět 9.11.2015 21:47
Nesnáším {}, proto se jim vyhýbám.
Avatar
Dxiare
Člen
Avatar
Dxiare:

Trochu jo no :)

 
Nahoru Odpovědět 9.11.2015 21:52
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Martin Dráb:

No, jestli chce rozsvítit jen jednu diodu v každém okamžiku, tak by tam neměl psát samé jedničky podle mě.

Nahoru Odpovědět  +2 9.11.2015 21:55
2 + 2 = 5 for extremely large values of 2
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Dxiare
Martin Dráb:

No, jestli to teda dobře chápu, tak potřebuješ mít vždy rozsvícenou jednu diodu a "posouvat" ji přes dva porty (tedy přes 16 pozic). Což můžeš řešit tak, že si uděláš cyklus, který projde jednou tou diodou po jednom portu a pro druhý port jej prostě zopakuješ. Něco na tento způsob:

  LDI r18, 1
LOOP:
  OUT, PORTD, r18 ; Zapis r18 na port (rozsviti diodu a zhasne predchozi)
  (R)CALL DELAYX ; Cekej
  LSL r18 ; Posun r18 o bit doleva (nova pozice diody)
  BRNE LOOP ; Pokud r18 = 0, znamena to, ze jsme dorazili na konec portu

  OUT PORTD, r1 ; V r1 predpokladame nulovou hodnotu

Konvence Cčkových překladačů je v r1 držet vždy nulu a je dobré se toho držet i v Assembleru, protože nula se vždycky hodí. Tudíž si ji tam můžeš někde na začátku kódu nastavit. Můj kód také předpokládá, že procedura DELAYX nezmění hodnotu r18.

Editováno 9.11.2015 22:17
Nahoru Odpovědět 9.11.2015 22:16
2 + 2 = 5 for extremely large values of 2
Avatar
Dxiare
Člen
Avatar
Dxiare:

Myslel jsem to spíš tak že budou souběžně rozsvícené vždy 2 diody (řada 8 a 8 diod) :)

 
Nahoru Odpovědět 9.11.2015 22:24
Avatar
Odpovídá na Dxiare
Michal Žůrek (misaz):

hm a není tedy problém vyřešit elektronicky? Sériovým/paralelním zapojením diod?

Nahoru Odpovědět 9.11.2015 22:29
Nesnáším {}, proto se jim vyhýbám.
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Martin Dráb
Martin Dráb:

V takovém případě by mohlo za instrukci

OUT PORTD, r18

zapsat instrukci zapisující r18 na jiný tebou vybraný port. Pak to bude splňovat tvé zadání, jestli jej dobře chápu. Samozřejmě je třeba dodělat nějakou tu inicializaci.

Nahoru Odpovědět  +1 9.11.2015 22:35
2 + 2 = 5 for extremely large values of 2
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Martin Dráb:

elektronicky

To by určitě šlo, ale myslím, že to není způsob, kterým by se měl ten domácí úkol řešit :-).

Nahoru Odpovědět  +1 9.11.2015 22:35
2 + 2 = 5 for extremely large values of 2
Avatar
Dxiare
Člen
Avatar
Dxiare:

ok

Editováno 9.11.2015 22:40
 
Nahoru Odpovědět 9.11.2015 22:39
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 16 zpráv z 16.