Pomoc- Assembler – Assembler – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pomoc- Assembler – Assembler – Fórum – Programujte.comPomoc- Assembler – Assembler – Fórum – Programujte.com

 

Martin
~ Anonymní uživatel
1600 příspěvků
18. 1. 2023   #1
-
0
-

Ahoj, nevím si s úkolem ze školy a nevím už jak na to, tak bych poprosil o pomoc.

Zde mám zadání úkolu:

V simulátoru 8051 vytvořte program, který bude ovládat dva moduly LED a to tak, že rozsvítíte na 1. modulu LED D7 a na 2. Modulu LED D0. Tyto dvě svítící diody budou postupně společně rotovat po modulech tak, aby vytvořily kolečko ve směru hodinových ručiček standardních hodin. Rotace bude v časovém intervalu 150 ms. Po provedení jedné rotace přidáte k LED D7 LED D6 a k LED D0 LED D1. Opět provedete jedno kolečko. Takto budete pokračovat až do úplného rozsvícení všech LED diod. Potom budete z opačné strany ubírat po každém kolečku jednu svítící diodu z každého LED modulu až do jedné svítící LED na každém modulu. 

A zde mám svůj program, který jsem vytvořil, ale nevím proč nefunguje:


ORG 0
MOV P1,#00000000B 
MOV P2,#00000000B ;
MOV R1,#00000001B 
MOV R2,#00000001B ;
LED_ROTACE:
    MOV P1,R1 ;rozsvítíLED D7 on P1
    MOV P2,R2 ; lrozsvítí LED D0 na P2
    ACALL DELAY ; čeká na 150ms
mov a,R1 ; rotace R1 doleva, přdávání LED
RLC a
mov R1,a 
mov a,R2
RRC a
mov R2,a
    CJNE R1,#10000000B,LED_ROTACE ; pokračuje když  R1 = #10000000B
    CJNE R2,#00000001B,LED_ROTACE ; pokračuje když R2 = #00000001B
    DJNZ R3,LED_ROTACE ; Pokračuje když R3 dosáhne 0
    RET
DELAY:
    MOV R3,#50 ; 150ms
    DJNZ R3,$ ; dekrementuje R3 a čeká na 0
    RET

end

Budu moc rád za pomoc

Nahlásit jako SPAM
IP: 89.176.25.–
18. 1. 2023   #2
-
0
-

1. hodilo by se schéma zapojení LED na porty
2. Je dobré vědět jaká je taktovací frekvence procesoru
3. pokud vezmu "obyčejnou" 8051 s rozsahem taktovacích frekvencí 3 - 12 MHz, subrutina DELAY určitě nevytvoří 150ms, skutečný čas bude nesrovnatelně kratší.

Je to podobné jako řídit krokový motor nebo 7-segmentovku. To dělám tak, že si udělám "tabulku" stavů portu/portů a tu pak jednoduchou inkrementací např. registru procházím a zapisuju na port. Tabulka vypadá takto: 

SMET:db	00h,80h,0C0h,0E0h,0F0h,0F8h,0FCh,0FEh

je uložena v paměti programu a čte se pomocí instrukce MOVC A, @DPTR+A. Do DPTR vložíš adresu SMET (to je jen jméno adresy, pojmenuješ si to podle sebe) a do A vložíš kolikátý prvek chceš - pozor, indexuje se od nuly (pro první prvek s hodnotou 00h vložíš do A 0, pro prvek s hodnotou 0C0h vložíš do A 2 atd).

Na generování časů se používají časovače, nevím, jestli vám ve vyučování řekli, jak je používat.

hu

Nahlásit jako SPAM
IP: 193.86.81.–
JerryM0
Věrný člen
18. 1. 2023   #3
-
0
-

jako obvykle se obávám, že tvuj program je blbě. a to uplně :)  a proto ti to nefunguje.

1/ řekni nám co používáš za simulátor ? a kdyžtak nám ho někde nahraj. To je simulátor pod windows ? Pod linux ? Pod DOS ? jiný ? 

2/ Jakej máš konkrétní typ procesoru ? a jakej používáš krystal ? Protože 150ms se nastavuje podle typu krystalu a typu procesoru ....

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:5937:ddff:dae8:14b0...–
Martin
~ Anonymní uživatel
1600 příspěvků
18. 1. 2023   #4
-
0
-

#3 JerryM
Woow, to jsem vůbec nevěděl, že program je blbě, proč jsem semka vlastně vůbec psal ????????

Nahlásit jako SPAM
IP: 89.176.25.–
gna
~ Anonymní uživatel
1853 příspěvků
18. 1. 2023   #5
-
0
-

RLC/RRC rotuje přes carry flag. Tzn. že jak se ty bity posunují, tak se ten jeden krajní vyšoupne do carry a ten na druhé straně zase doplní z předchozí hodnoty carry. To nechceš.

Zkrátka místo RLC/RRC použij RL/RR.

Jinak tam nic vyloženě špatně nevidím. Kromě toho, že to není dokončené.

Nahlásit jako SPAM
IP: 213.211.51.–
JerryM0
Věrný člen
18. 1. 2023   #6
-
0
-

#4 Martin
hm začínám mít pocit, že seš jenom provokatér, salámista, nemakačenko a pěknej mamalas ... a děláš si z náš prdel a asi tě brzo ze školy vyhodí... zapoměl si, že žiješ v brutálním americkém kapitalismu. člověk člověku je vlkem. chápeš jo ? Ale neboj, jako manuálně pracující na 12ti-hodinové směny se v pohodě uživíš. A kdyžtak si pořídíš dvě zaměstnání. Budeš chodit na 16-ky.

věta: "MOV P1,R1 ;rozsvítíLED D7 on P1" ... rozhodně LED D7 nerozsvítí jen D7. protože když zapíšeš do portu P1 hodnotu #00000001B  tak se rozvítí ledky na pinech D7, D6, D5,D4,D3,D2 a D1 a D0 zhasne. Asi si nepochopil že procesory řady u51 mají na výstupu otevřený kolektor takže když zapíšeš do pinu portu hodnotu 0 znamená to, že se stane zdrojem proudu. Takže LED dioda musí být zapojená na pin procesoru katodou a na anodě musí být odpor např. 330 Ohmů. Nebo 270 Ohmů. A když na daný pin zapíšeš 0 tak se LEDka rozvítí. Když zapíšeš 1, tak zhasne.

Bylo by dobrý, kdyby ses víc učil a nečakal, že za tebe někdo tvoji práci udělá. Tady sme od toho, aby sme ti poradilil, ale tohle funguje jen za předpokladu, že projevíš nějakou vlastní snahu.

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:5937:ddff:dae8:14b0...–
gna
~ Anonymní uživatel
1853 příspěvků
18. 1. 2023   #7
-
0
-

#6 JerryM
Provokatér jsi ty. Já jsem taky držka nevymáchaná, ale to, jak ty každého zjebeš dementní sáhodlouhou rozpravou k ničemu je fakt síla.

Nahlásit jako SPAM
IP: 213.211.51.–
JerryM0
Věrný člen
18. 1. 2023   #8
-
0
-

jo já vim, to je profesionální deformace, dělal jsem učitele na sš a zš a pořád chodim občas učit na zš ... asi nevíte jak to dneska na školách chodí ... možná by byl dobrej upgrade. Vlastní zkušenost. Pak byste změnili názor.

Sáhodlouhá rozprava je na místě ... ten učitel co jim to zadal jim to nejdřív musel nějak vysvětlit. Věta "dělám v simulátoru..." znamená co ???? v jakým simulátoru ? a pod čim ? Linux ? Windows ? Měto připadá jako rozprava s mrtvým.

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:5937:ddff:dae8:14b0...–
Martin
~ Anonymní uživatel
1600 příspěvků
18. 1. 2023   #9
-
0
-

#8 JerryM
Je mi jasný, že ses dopracoval jenom na učitele, na kterýho se dostane každý jak ty píšeš gramotně: "mamalas". 

Ta tvoje čeština a gramatika je k smíchu, ty by jsi dneska neudělal ani maturitu, lituju všechny studenty, co jsi kdy učil. Bolí mě z toho oči jaký nesmysly tady píšeš. Ostatní normální lidé se normálně vyjádřili až na tebe, kde asi bude problém. Napadne to každého "salámistu". A neboj se, manuální práce jsou teďka lépe placené jak nějaký učitel na základní škole, kde vezmou doslova každého. Nemluv o mojí budoucí práci, když víš doslova prd. Nechápu jak jsi mohl projít z češtiny, však gramatika se učí už aji na tý základní škole. ????????

Nahlásit jako SPAM
IP: 89.176.25.–
JerryM0
Věrný člen
18. 1. 2023   #10
-
0
-

no jo možná moje čeština tady neni ok, ale tobě ten program co máš udělat do školy nefunguje a mě jo :)

chápeš jo ? ... takže budeš muset spolupracovat jestli to má fungovat

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:5937:ddff:dae8:14b0...–
19. 1. 2023   #11
-
0
-

Při dalším čtení zadání mne napadlo, že že ledky na druhém modulu jsou o jednu posunuté oproti prvnímu modulu. Máš možnost to zadrátovat na jeden port nebo to musí být bezpodminečně na dva porty?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
19. 1. 2023   #12
-
0
-

Řízení časovačem by mohlo vypadat nějak takto (nezkoušel jsem to) 

$NOMOD51
$INCLUDE (mcu/89C52.mcu)

;definice konstant
MS10		EQU	55535	;Reload pro Timer0, interval 10 msec (standartní 8051, 12MHz krystal)
INTERVAL	EQU	15	;150 msec = 10 msec x 15

;misto v pameti pro odpocet casu
ODPOCET	DATA	40h


	ORG	RESET
	JMP	ZAC	

	ORG	TIMER0	;obsluha preruseni Timer 0
	JMP	TIM0

	

TIM0:	;obsluhuje casovac kazdych 10 msec
	MOV	TL0, #LOW(MS10)			;nastavi casovac znovu na 10 msec
	MOV	TH0, #HIGH(MS10)
	DJNZ	ODPOCET, TEND
	MOV	ODPOCET, #INTERVAL		;INTERVAL vyprsel, zacne novy odpocet
	CALL	AKCE				;pri kazdem vyprseni INTERVALu provede AKCE
TEND:	RETI


ZAC:	;tady zacina hlavni program
	MOV	ODPOCET, #INTERVAL
	MOV	TMOD, #01h			;MODE1 pro TIMER0 (16-bitovy Timer)
	MOV	TL0, #LOW(MS10)			;nastavi casovac na 10 msec
	MOV	TH0, #HIGH(MS10)
	SETB	ET0				;povoli preruseni od casovace
	SETB	EA				;globalni povoleni preruseni
	SETB	TR0				;spusti casovac 0
LOOP:	JMP	LOOP


AKCE:	;co ma udelat po vyprseni intervalu
	RET

END

Používám překladač ASEM5113. Pro jiný překladač to budeš muset možná upravit.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Martin
~ Anonymní uživatel
1600 příspěvků
19. 1. 2023   #13
-
0
-

#11 hlucheucho
Je jedno jestli to bude na jednom portu, nebo na dvou. Hlavní je, aby to fungovalo. My používáme překladač ASM8051.

Nahlásit jako SPAM
IP: 89.176.25.–
Martin
~ Anonymní uživatel
1600 příspěvků
19. 1. 2023   #14
-
0
-

#12 hlucheucho
Nesekne se program u té instrukce:

LOOP: JMP LOOP

To se bude asi furt do nekonečna opakovat . Ale jinak díky moc za pomoc.

Nahlásit jako SPAM
IP: 89.176.25.–
19. 1. 2023   #15
-
0
-

#14 Martin
program se nesekne, bude běhat v cyklu. Při každé žádosti o přerušení (pokud jsem to dobře spočítal každých 10 ms) skočí na vektor přerušení časovače - adresa TIMER0 (to je symbol pro konstantu 0Bh). Při obsluze přerušení provede odpočet, tj. sníží hodnotu "proměnné" INTERVAL o jedničku a zkontroluje, zda nedošel na nulu. Pokud ano, interval 150 ms vypršel, nastaví "proměnnou" INTERVAL na nový interval a provede subrutinu AKCE. Pak se vrátí do nekonečného cyklu LOOP, ve kterém bude běhat do dalšího přerušení (má nastat za 10 ms). Program současně ukazuje, jak softwarově prodloužit interval časovače, pokud ho časovač nemůže generovat přímo hardwarově.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
19. 1. 2023   #16
-
0
-

Ještě poznámka: některé simulátory neumí simulovat přerušení, pak se to chová jinak, než na skutečném procesoru.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
JerryM0
Věrný člen
19. 1. 2023   #17
-
0
-

pořád si nám neřekl jaký máš krystal ? 12HMz ? 6MHz ?

jinak první cyklus tvého programu by pro jedno kolečko měl vypadat nějak takhle - viz obrázek níže.

To orotuje jednu svítící LED diodu. Pak ve druhém kole místo PAT_01 použiješ PAT_02 #11111100B a opět uděláš to samé pro dvě LED diody atd. To zadání je poměrně nejednoznačný. Má se v druhém kole začít hned se dvěma rozsvícenejma LEDkama ??? nebo se ta druhá má přidat až ta první přejde z pozice D0 na pozici D1 ??? tohle je potřeba si vyjasnit. chápeš jo ? 

Seš si jistej, že si nám to zadání opsal zprávně ? Jinak abys byl schopen to naprogramovat potřebuješ manuál. Viz obrázek níže. To je originál k 8051/8052 procesoru. Bez manuálu to asi nenapíšeš.

Připojen obrázek.

Připojen obrázek.

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:f52d:9e23:e2ec:a234...–
19. 1. 2023   #18
-
0
-

#17 JerryM
Vše, co potřebuje, najde na internetu. Pokud by čas 150 ms nedělal časovačem, tak mu stačí instrukční set s popisem, co která instrukce dělá.

hu

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:c12d:4d7b:9ff1:5288...–
Martin
~ Anonymní uživatel
1600 příspěvků
19. 1. 2023   #19
-
0
-

#17 JerryM
Ano, zadání jsem opsal určitě správně, ta jedna LED dioda se má přidat jakože až oběhne celý kruh tak na začátku dalšího aby se hned zobrazily dvě. 

Připojen obrázek.

Připojen obrázek.

Nahlásit jako SPAM
IP: 89.176.25.–
JerryM0
Věrný člen
20. 1. 2023   #20
-
0
-

napadlo mě, :) že bys to mohl řešit poměrně snadno jenom vytvořením vzorů svícení LEDek a jejich zápisem na port P1,P2 v daných intervalech :)  ale problém je v tom, že na to bys potřeboval 512 Bytů RAM a to asi nemáš :) reverzně bys to pak jenom četl pozpátku a na ten druhý kruh by si jenom ozrcadlil bity s použitím instrukcí JB, JNB, CLR, SETB

chápeš jo ?

prostě:

LED_DATA  DB #11111110B, #11111101B, ... , #11111111B  ; 512 hodnot

celkem 512 hodnot

jde o to, že nikde v zadání neni napsáno, že to tak nemužeš dělat a ani body a.b.c. zadání tomu neodporujou :) akorát to má háček a že bys to musel nacvakat ručně a jde taky o to, jestli ta tvoje 8051 má tolik RAM paměti což asi nemá :) ale když bys to zapsal do externí 1KB RAM s připojením na SPI/SSI interfejs tak by to samozřejmě šlo

jinak sem si zkusil napsat řešení na to tvoje zadání na 1 kruh LEdek na všech 8 cyklů - výsledek je níže, takže to by ti mělo postupně rozvítit ledky na 1 kruhu podle zadání a pak udělat ten řetěz D7, D6 atd. Je to docela zajímavý. Psal sem to naslepo protože už nemám simulátor. Ale myslim že to asi funguje. Místo ;PAUSE dáš nějakej kod na čekání buď použiješ to co ti napsal hlucheucho nebo si napišeš svuj. Funguje to tak, že se rozvěcí jedna LEDka a za ní požadovaný počet dalších podle toho, ve kterém sem kole a to se zajistí kodem za návěstím L_022: a čítač kol je v CYCLE_CNT. Pokud by si chtěl rozvítit i druhí kolo LEDek musel bys za příkaz  MOV P3, PAT_RSLT dát nějakou sekvenci kodu co ti ozrcadlí bity v PAT_RSLT pomocí příkazů JB, JNB, SETB, CLR a pak je zapsat asi na port P2. No a reverzně to je potřeba celý program upravit a zapsat ho ještě jednou aby to dělal opačně, což je docela fuška. Celý program bude min. 3x delší než to co je níže.

Ty si v kterým ročníku ? 2 ? a na jaký střední škole ? To bude nějaká střední škola Harward Londýn co ? docela by mě to zajímalo. A to je ročníkový projekt ? Nebo to máš úkol na příští týden ???  :) :) :) :) :)


PAT_ORIG   DATA 20h
PAT_ACT    DATA 21h
PAT_RSLT   DATA 22h
CYCLE_CNT  DATA 23h
 
         ORG 0
S_01:
         MOV PAT_ORIG, #11111110B   
         MOV  CYCLE_CNT, 1
S_02:    
         MOV PAT_ACT, PAT_ORIG
         MOV R7, #01
         
S_03:    
         MOV A, PAT_ACT
         MOV PAT_RSLT, A

L_01:    
         MOV R4, CYCLE_CNT

L_021:  
         DJNZ  R4, L_022
         JMP L_03
 
L_022:
         RR A
         ANL A, PAT_ACT
         ANL A, PAT_RSLT
         MOV PAT_RSLT, A

         JMP L_021

L_03:
         MOV P3, PAT_RSLT

         MOV A, PAT_ACT
         RL A
         MOV PAT_ACT, A
 
         ;PAUSE

         INC R7
         CJNE R7, #8, S_03

         INC CYCLE_CNT

         MOV R4, CYCLE_CNT
         CJNE R4, #07, S_02
         
         END

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:f1d3:feed:430e:a665...–
JerryM0
Věrný člen
20. 1. 2023   #21
-
0
-

pardon drobná chybička se vloudila :) :) :) :)  ... těch 512 hodnot by mělo bejt napsaných takhle a dal bych to nakonec uplně programu

LED_DATA:  DB 11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B
                     DB 11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B
                     DB 11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B
                     DB 11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B

za označením musí bejt dvojtečka a čísla bez # a asi po jen 8 na řádek, takže celkem 64 řádků, direktiva DB  se smí použít jen v kodovem segmetu

ta původní 8051 měla 4KB ROM paměti takže 512 bytů by se tam vešlo

https://pdf1.alldatasheet.com/datasheet-pdf/view/107780/INTEL/8051.html

ale mužeš to řešit i přes externí paměť, asi seriovou EEPROM nebo něco podobnýho

novější typy jako třeba 89C51

https://pdf1.alldatasheet.com/datasheet-pdf/view/15904/PHILIPS/89C51.html

maj 4KB EPROM takže s tiom problem nebude

otázka je, jestli si to mužeš navolit v tom simulatoru, jakože konkrétní typ 8051. Máš tam 89C51 ?

a co třeba AT89S51 ? to by bylo ještě mnohem lepší

https://pdf1.alldatasheet.com/datasheet-pdf/view/77367/ATMEL/AT89S51.html

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:f1d3:feed:430e:a665...–
JerryM0
Věrný člen
21. 1. 2023   #22
-
0
-

a ještě drobná korekce :) takže jak vidíš zas tak jednoduchý to neni ...


         ORG 0

PAT_ORIG   DATA 20h
PAT_ACT    DATA 21h
PAT_RSLT   DATA 22h
CYCLE_CNT  DATA 23h
RX1        DATA 24h
RX2        DATA 25h

S_01:
         MOV PAT_ORIG, #11111110B   
         MOV CYCLE_CNT, 1
S_02:    
         MOV PAT_ACT, PAT_ORIG
         MOV R7, #01
         
S_03:    
         MOV A, PAT_ACT
         MOV PAT_RSLT, A

         MOV RX2, R7
L_01:    
         MOV RX1, CYCLE_CNT
L_021:  
         DJNZ  RX1, L_022
         JMP L_03
 L_022:
         DJNZ RX2, L_023
         JMP L_03          

L_023:
         RR A
         ANL A, PAT_ACT
         ANL A, PAT_RSLT
         MOV PAT_RSLT, A

         JMP L_021

L_03:
         MOV P3, PAT_RSLT

         MOV A, PAT_ACT
         RL A
         MOV PAT_ACT, A
 
         ;PAUSE

         INC R7
         CJNE R7, #8, S_03

         INC CYCLE_CNT

         MOV R4, CYCLE_CNT
         CJNE R4, #07, S_02


         END

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:a9d6:2e74:b20d:5e31...–
JerryM0
Věrný člen
21. 1. 2023   #23
-
0
-

já bych raději volil druhou variantu s daty v paměti kde tedy budou 4 bloky nazvané LED_DATA_01, LED_DATA_02, LED_DATA_03, LED_DATA_04 kde teda LED_DATA_01  je blok dat pro levý koelčko LED diodek, LED_DATA_02 pro pravý a LED_DATA_03 pro levý opacným směrem a LED_DATA_04 opačným směrem a tomě stačí načítat po bajtu z každý oblasti a dát tam pauzu. Je to nejjednodušší možná varianta...

pokud tedy máš 8 posuvů na 1 kolo a máš za první svítící LED diodou táhnout dalších 7 diod tak potřebuješ 8 čísel na řádku a tím pádem 8x8 = 64 bytů na jedno kolečko a máš 4 takže 4x64 = 256 bajtů by ti mělo stačit

bajty čteš po jednom takže čítač nastavíš na 64 a kod je níže :)  pro vytvoření jednoho kolečka a pro vytvoření dvou koleček najednou to buď zdvojíš a další adresu dáš do R2 nebo ozrcadlíš načtenou hodnotu z @R1 a zapíšeš ji na port P2 ... je to na tobě ... přiznám se, že bych si asi vybral tuhle druhou variantu z těch všech so sme tu probírali protože je jednoduchá z přímočará, a pokud použiješ variantu zrcadlení tak ušetříš 2x64 bytů takže budeš místo 256 potřebovat jen 128. Já bych si každopádně vybral tuhle druhou variantu. 

takže teď  už máš všechno co potřebuješ a mužeš to dodělat a odevzdat

         ORG 0

         MOV R7, 64

         MOV R1, #LED_DATA_01        ; adresa počátku bloku dat

L_01:

          MOV P1, @R1 ; to co je na adrese R1 přesuň na P1

          INC R1  ; zvyš ukazatel adresy

          ; PAUSE  150ms

         DJNZ R7, L_01  ; smyčka


LED_DATA_01:  DB 11111110B,11111101B,11111011B,11110111B,11101111B,11011111B,1011111B,01111111B
                           DB 11111110B,11111100B,11111001B,11111110B,11111110B,11111110B,11111110B,11111110B
                         DB 11111110B,11111100B,11111001B,11111110B,11111110B,11111110B,11111110B,11111110B
                         DB 11111110B,11111100B,11111001B,11111110B,11111110B,11111110B,11111110B,11111110B

                         DB 11111110B,11111100B,11111001B,11111110B,11111110B,11111110B,11111110B,11111110B

                         DB 11111110B,11111100B,11111001B,11111110B,11111110B,11111110B,11111110B,11111110B

                         DB 11111110B,11111100B,11111001B,11111110B,11111110B,11111110B,11111110B,11111110B

                         DB 11111110B,11111100B,11111001B,11111110B,11111110B,11111110B,11111110B,11111110B

LED_DATA_02:  DB 11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B
                           DB 11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B
                           DB 11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B
                          DB 11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B

LED_DATA_03:  DB 11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B
                           DB 11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B
                           DB 11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B
                          DB 11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B

LED_DATA_04:  DB 11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B
                           DB 11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B
                           DB 11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B
                          DB 11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B,11111110B

         END

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:a9d6:2e74:b20d:5e31...–
JerryM0
Věrný člen
21. 1. 2023   #24
-
0
-

ještě taková drobnost ty hodnoty LED_DATA_01 atd. sem si vymyslel takže ty tam budeš muset ručně dopsat správný hodnoty....

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:a9d6:2e74:b20d:5e31...–
21. 1. 2023   #25
-
0
-

#20 JerryM
Napadlo tě docela pozdě. O tabulce dat jsem už psal ve svém prvním příspěvku.

hu

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:3423:250b:3b9:db9e...–
JerryM0
Věrný člen
21. 1. 2023   #26
-
0
-

#25 hlucheucho
njn sem důchodce ... myslí mě to pomalu :)

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:a9d6:2e74:b20d:5e31...–
JerryM0
Věrný člen
21. 1. 2023   #27
-
0
-

jinak by bylo dobý přiadat k tomu kodu definicni soubor

https://www.keil.com/dd/docs/c51/reg51.h

aby to fungovalo

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:a9d6:2e74:b20d:5e31...–
JerryM0
Věrný člen
21. 1. 2023   #28
-
0
-

hele konečně sem našel ten správnej definicční soubor :)  ten předtim byl pro C51 :)

tenhle je pro ASM51

;   8051 processor definition file
;   ==============================

P0    DATA    080H
SP    DATA    081H
DPL    DATA    082H
DPH    DATA    083H
PCON    DATA    087H
TCON    DATA    088H
TMOD    DATA    089H
TL0    DATA    08AH
TL1    DATA    08BH
TH0    DATA    08CH
TH1    DATA    08DH
P1    DATA    090H
SCON    DATA    098H
SBUF    DATA    099H
P2    DATA    0A0H
IE    DATA    0A8H
P3    DATA    0B0H
IP    DATA    0B8H
PSW    DATA    0D0H
ACC    DATA    0E0H
B    DATA    0F0H

IT0    BIT    088H
IE0    BIT    089H
IT1    BIT    08AH
IE1    BIT    08BH
TR0    BIT    08CH
TF0    BIT    08DH
TR1    BIT    08EH
TF1    BIT    08FH
RI    BIT    098H
TI    BIT    099H
RB8    BIT    09AH
TB8    BIT    09BH
REN    BIT    09CH
SM2    BIT    09DH
SM1    BIT    09EH
SM0    BIT    09FH
EX0    BIT    0A8H
ET0    BIT    0A9H
EX1    BIT    0AAH
ET1    BIT    0ABH
ES    BIT    0ACH
EA    BIT    0AFH
RXD    BIT    0B0H
TXD    BIT    0B1H
INT0    BIT    0B2H
INT1    BIT    0B3H
T0    BIT    0B4H
T1    BIT    0B5H
WR    BIT    0B6H
RD    BIT    0B7H
PX0    BIT    0B8H
PT0    BIT    0B9H
PX1    BIT    0BAH
PT1    BIT    0BBH
PS    BIT    0BCH
P    BIT    0D0H
OV    BIT    0D2H
RS0    BIT    0D3H
RS1    BIT    0D4H
F0    BIT    0D5H
AC    BIT    0D6H
CY    BIT    0D7H

RESET    CODE    000H
EXTI0    CODE    003H
TIMER0    CODE    00BH
EXTI1    CODE    013H
TIMER1    CODE    01BH
SINT    CODE    023H

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:a9d6:2e74:b20d:5e31...–
JerryM0
Věrný člen
21. 1. 2023   #29
-
0
-

a hele našel sem ten manual na internetu :)

http://matlab.fei.tuke.sk/subjects/jmvr/subory/podklady/Programovac%C3%AD_jazyk_Asembler_8051.pdf

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:a9d6:2e74:b20d:5e31...–
21. 1. 2023   #30
-
0
-

Další kydání hnoje :(

hu

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:c892:efbc:265c:22ec...–
JerryM0
Věrný člen
21. 1. 2023   #31
-
0
-

nebuď depresivní

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:a9d6:2e74:b20d:5e31...–
Martin
~ Anonymní uživatel
1600 příspěvků
24. 1. 2023   #32
-
0
-

#31 JerryM
No děkuji moc za pomoc, mě to připadá nějak moc složité všechno jak jsi to tu napsal, ale díky

Nahlásit jako SPAM
IP: 89.176.25.–
Martin
~ Anonymní uživatel
1600 příspěvků
24. 1. 2023   #33
-
0
-

#30 hlucheucho
Tobě taky moc děkuju

Nahlásit jako SPAM
IP: 89.176.25.–
24. 1. 2023   #34
-
0
-

Trochu jsem si s tím pohrál: 

$NOMOD51
$INCLUDE (mcu/89C52.mcu)


;modul1 na P1, modul 2 na P2
;definice konstant
MS10		EQU	55535	;Reload pro Timer0, interval 10 msec (standartní 8051, 12MHz krystal)
INTERVAL	EQU	15	;150 msec = 10 msec x 15
KOLECEK		EQU	3	;pocet kolecek

;misto v pameti pro odpocet casu
ODPOCET		DATA	40h
MOVCOUNT	DATA	41h	;pocet posunuti behem kolecka
CYCCOUNT	DATA	42h	;pocet cyklu


	ORG	RESET
	JMP	ZAC	

	ORG	TIMER0	;obsluha preruseni Timer 0
	JMP	TIM0

	

TIM0:	;obsluhuje casovac kazdych 10 msec
	MOV	TL0, #LOW(MS10)			;nastavi casovac znovu na 10 msec
	MOV	TH0, #HIGH(MS10)
	DJNZ	ODPOCET, TEND
	MOV	ODPOCET, #INTERVAL		;INTERVAL vyprsel, zacne novy odpocet
	CALL	AKCE				;pri kazdem vyprseni INTERVALu provede AKCE
TEND:	RETI


ZAC:	;tady zacina hlavni program
	MOV	CYCCOUNT, #0			;nuluje pocitadlo kolecek
	MOV	MOVCOUNT, #0			;nuluje pocitadlo posunu
	MOV	DPTR, #INITSTATES		;pripravi DPTR pro cteni tabulky pocatecnich stavu obou portu
	CALL	SETPORTS			;nastavi pocatecni stav portu pred prvnim koleckem
	MOV	ODPOCET, #INTERVAL
	MOV	TMOD, #01h			;MODE1 pro TIMER0 (16-bitovy Timer)
	MOV	TL0, #LOW(MS10)			;nastavi casovac na 10 msec
	MOV	TH0, #HIGH(MS10)
	SETB	ET0				;povoli preruseni od casovace
	SETB	EA				;globalni povoleni preruseni
	SETB	TR0				;spusti casovac 0
LOOP:	JMP	LOOP


AKCE:	;co ma udelat po vyprseni intervalu
	MOV	A, MOVCOUNT			;dobehlo kolecko?
	CJNE	A, #8, LEDMOVE
	MOV	MOVCOUNT, #0			;dobehlo kolecko, zacne dalsi
	MOV	A, CYCCOUNT			;kolik bylo kolecek?
	CJNE	A, #KOLECEK, DALSI
	MOV	A, #0FFh			;vykonal vsechna kolecka, nuluje pocitadlo (0FFh spolu s nasledujicim INC = 0)
DALSI:	INC	A
	MOV	CYCCOUNT, A
	MOV	MOVCOUNT, #0
	CALL	SETPORTS			;nastavi porty na pocatecni stav dalsiho kolecka
	RET

LEDMOVE:	;neprovedl cele kolecko, posune LED o jeden krok
	INC	A				;nejdrive inkrementuje MOVCOUNT
	MOV	MOVCOUNT, A
	MOV	A, P2
	RL	A
	MOV	P2, A
	MOV	A, P1
	RL	A
	MOV	P1, A
	RET


SETPORTS:	;nastavuje stav portu na zacatku kolecka
	MOV	A, CYCCOUNT			;vybere stavy odpovidajici prislusnemu kolecku
	RL	A				;nasobeni dvema, stavy se v tabulce stridaji (pro P1, pro P2, pro P1, pro P2 ...)
	MOV	B, A				;odlozi si stav pro dalsi pouziti
	MOVC	A, @A+DPTR			;precte prvni pocatecni stav a zapise ho na P1
	MOV	P1, A
	MOV	A, B				;precte druhy pocatecni stav a zapise ho na P2
	INC	A
	MOVC	A, @A+DPTR
	MOV	P2, A
	RET

;stavy portu na zacatku kolecka v poradi P1, P2 prvni cyklus, P1, P2 druhy cyklus atd
;pro kazde kolecko je potreba mit 2 stavy
INITSTATES: db 80h, 01h, 0C0h, 03h, 0E0h, 07h

END

Je to jen pro 3 LEDky, ale vypadá to, že funkční. Vyzkoušeno na emulátoru AT89C5131 ve Standart Mode. Uvádí taktovací frekvenci 11,998MHz. Přerušení od časovače opakuje každých 10,013 ms. Pro všech 8 LED stačí upravit dvě věci:
1. tabulku dat - řádek s INITSTATES: db   kde jsou stavy portů na začátku kolečka vždy v pořadí P1, P2 (jako když jste se rozpočítávali v tělocviku první, druhý, první, druhý ... ). Hodnot je tedy dvojnásobek co koleček, tzn 16 hodnot. Jednička na portu znamená svítící diodu. Pro stručnost jsem stavy zapsal hex (binárně to vypadá jak zakódovaný román na pokračování, navíc se to špatně čte)

2. Konstantu KOLECEK na 8

Pokud by náhodou svítící LED znamenala 0, stačí buď upravit tabulku hodnot nebo subrutinu SETPORTS upravit tak, že po MOVC bude následovat CPL A a pak teprve zápis na port.

hu
 

Nahlásit jako SPAM
IP: 2001:af0:ffe4:85f4:c99:7b21:fc52:1cae...–
JerryM0
Věrný člen
25. 1. 2023   #35
-
0
-

já bych potřeboval zateplit tu naší malou pastoušku :) neměl by si o víkendu čas ? klidně si s tím budeš moct pohrát :) :) :) :) :) :) :) :) :) :) :) :) :) :)

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:859e:16b7:805c:6014...–
25. 1. 2023   #36
-
0
-

#35 JerryM
Zkus vítr :)

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Martin
~ Anonymní uživatel
1600 příspěvků
25. 1. 2023   #37
-
0
-

#35 JerryM
Tento program by myslím měl jít:



; LED Moduly na portech P1 a P2.
org 0000h
jmp start
org 0100h
start: mov p1,#11111111b ; prednastaveni
mov p2,#11111111b
mov a,#00000000b
mov r7,#3d
mov r0,#0d
mov r1,#0d
mov r6,#0d
mov r5,#0d
mov r2,#0d
clr tr0
mov tmod,#00010001b
mov tl0,#low -50000d
mov th0,#high -50000d
mov ie,#10001010b
mov ip,#00000000b
setb tr0
cisla: nop ; hlavni program
jmp cisla


org 000Bh ; prerusovaci program
djnz r7,dalsi
cjne r2,#0,odebirani ; rozhodnuti programu
; pokracuje SMER1 nebo SMER2
cjne r1,#0b,neskip
clr c ; pridavani ledek SMER1
mov a,p1
rrc a
mov p1,a
clr c
mov a,p2
rlc a
mov p2,a
mov r1,#16d
inc r6
cjne r6,#8d,skip
mov r2,#1b
mov r6,#0b
mov r0,#0b
jmp skip
neskip: mov a,p1 ; zobrazovani a rotovani na displejich SMER1
rr a
mov p1,a
mov a,p2
rl a
mov p2,a
dec r1
jmp skip


odebirani: cjne r0,#0b,neskip2
setb c ; odebirani ledek SMER2
mov a,p1
rlc a
mov p1,a
setb c
mov a,p2
rrc a
mov p2,a
mov r0,#16d
inc r5
cjne r5,#8d,skip
mov r2,#0b
mov r5,#0b
mov r1,#0b
jmp skip
neskip2: mov a,p1 ; zobrazovani a rotovani na displejich SMER2
rl a
mov p1,a
mov a,p2
rr a
mov p2,a
dec r0
skip: clr tr0 ; znovunastaveni citacich registru
mov r7,#3d
mov tl0,#low -50000d
mov th0,#high -50000d
setb tr0
dalsi: reti
end
 

Nahlásit jako SPAM
IP: 89.176.25.–
JerryM0
Věrný člen
25. 1. 2023   #38
-
0
-

#37 Martin

hm zajímavý, takhle jenom pohledem nezjistim jestli to funguje to by se muselo zkusit na simulátoru ale s tou tabulkou 4x64 bytů bys to měl podstatně jednodušší

jinak ty příkazy org 0000h a org 000bh to je dobře ??? určitě ??

a už si to zkoušel ? v simulátoru ?

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:859e:16b7:805c:6014...–
26. 1. 2023   #39
-
0
-

#38 JerryM

jinak ty příkazy org 0000h a org 000bh to je dobře ??? určitě ??

0000h je vektor pro RESET a 000bh je vektor pro TIMER0. Takže to má dobře. Problémy mohou nastat s pořadím ORG. Matně si vzpomínám, že jsem to kdysi zkoušel a muselo to být vzestupně.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
26. 1. 2023   #40
-
0
-

Z tvého kódu jsem si všiml, že LED jsou na porty "zadrátovány" katodou, což představuje "negativní" logiku. U mého kódu to vyřešíš jednoduše úpravou subrutiny: 

SETPORTS:	;nastavuje stav portu na zacatku kolecka
	MOV	A, CYCCOUNT			;vybere stavy odpovidajici prislusnemu kolecku
	RL	A				;nasobeni dvema, stavy se v tabulce stridaji (pro P1, pro P2, pro P1, pro P2 ...)
	MOV	B, A				;odlozi si stav pro dalsi pouziti
	MOVC	A, @A+DPTR			;precte prvni pocatecni stav a zapise ho na P1
	CPL	A
	MOV	P1, A
	MOV	A, B				;precte druhy pocatecni stav a zapise ho na P2
	INC	A
	MOVC	A, @A+DPTR
	CPL	A
	MOV	P2, A
	RET

Jinak fixní umístění do paměti kódu bych používal jen když je to vyloženě nutné, např. u vektorů přerušení.

Pukud pan učitel bude chtít jiný "efekt" nebo je dokonce přepínat např. stavem portu, budeš všechno dělat znovu. S tabulkou dat máš slušnou šanci, že jen přepíšeš tabulku dat, v některých případech změníš konstantu ...

hu

Nahlásit jako SPAM
IP: 195.178.67.–
JerryM0
Věrný člen
26. 1. 2023   #41
-
0
-

hm já si tejně nejswem jistej že to máš dobře :)

máš naprogramovat v ASM51 tohle:

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:c092:c0b4:c77a:3a48...–
JerryM0
Věrný člen
26. 1. 2023   #42
-
0
-

   


for (i = 0; i <= 7; i=i+1) {

    for (j = 0; j <= 7; j=j+1) {

        LED(ALL) = ZHASNOUT

        int m = j
        int n = 0 
        while ( m >= 0 and n <= i ) {

            LED(m) = ROZSVITIT m-tou LEDku ; pocitano 0..7

            m = m - 1
            n = n + 1

        }// while

        PAUSE 

    }// for j 

}// for i 
Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:c092:c0b4:c77a:3a48...–
JerryM0
Věrný člen
26. 1. 2023   #43
-
0
-

zkoušel sem to ještě přes malou tabulku a stejně to vychází dost složitě, myslim, že by sis měl vybrat tu variantu s tbulkou o velikosti 4x64 bytů:

P0	DATA	080H
SP	DATA	081H
DPL	DATA	082H
DPH	DATA	083H
PCON	DATA	087H
TCON	DATA	088H
TMOD	DATA	089H
TL0	DATA	08AH
TL1	DATA	08BH
TH0	DATA	08CH
TH1	DATA	08DH
P1	DATA	090H
SCON	DATA	098H
SBUF	DATA	099H
P2	DATA	0A0H
IE	DATA	0A8H
P3	DATA	0B0H
IP	DATA	0B8H
PSW	DATA	0D0H
ACC	DATA	0E0H
B	DATA	0F0H

IT0	BIT	088H
IE0	BIT	089H
IT1	BIT	08AH
IE1	BIT	08BH
TR0	BIT	08CH
TF0	BIT	08DH
TR1	BIT	08EH
TF1	BIT	08FH
RI	BIT	098H
TI	BIT	099H
RB8	BIT	09AH
TB8	BIT	09BH
REN	BIT	09CH
SM2	BIT	09DH
SM1	BIT	09EH
SM0	BIT	09FH
EX0	BIT	0A8H
ET0	BIT	0A9H
EX1	BIT	0AAH
ET1	BIT	0ABH
ES	BIT	0ACH
EA	BIT	0AFH
RXD	BIT	0B0H
TXD	BIT	0B1H
INT0	BIT	0B2H
INT1	BIT	0B3H
T0	BIT	0B4H
T1	BIT	0B5H
WR	BIT	0B6H
RD	BIT	0B7H
PX0	BIT	0B8H
PT0	BIT	0B9H
PX1	BIT	0BAH
PT1	BIT	0BBH
PS	BIT	0BCH
P	BIT	0D0H
OV	BIT	0D2H
RS0	BIT	0D3H
RS1	BIT	0D4H
F0	BIT	0D5H
AC	BIT	0D6H
CY	BIT	0D7H


PAT_RSLT   DATA 22h
RX1        DATA 24h
RX2        DATA 25h


        ORG 0

L_05:  
        MOV RX1, #00
        MOV DPTR, #LED_DATA 

L_10:  
        MOV R7, RX1
        CJNE R7, #08, L_20
        JMP L_80
 
L_20:   
             MOV RX2, #00
L_21:
             MOV R7, RX2
             CJNE R7, #08, L_30
             JMP L_70
     
L_30:  
                  MOV R3, RX2
                  MOV R4, #00
                  MOV PAT_RSLT, #0FFh

L_40:
                  CJNE R3, #0FFh, L_41   
                  JMP L_60
L_41:
                  MOV A, R4
                  CJNE A, RX1, L_42  ; nastavuje C=1 když R4<RX1, C=0 jinak
                  JMP L_50
L_42:                     
                  JC L_50   
                  JMP L_60
L_50:
                       MOV  A, R3
                       MOVC A, @A+DPTR
                       ANL  A, PAT_RSLT
                       MOV  PAT_RSLT, A

                       MOV P1, PAT_RSLT

                       DEC R3
                       INC R4

                  JMP L_40
 
L_60:
                  ;PAUSE 

                  INC RX2

             JMP L_21
L_70:

             INC RX1

        JMP L_10
L_80:



LED_DATA:  DB 11111110B, 11111101B, 11111011B, 11110111B 
           DB 11101111B, 11011111B, 10111111B, 01111111B


       END
Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:c092:c0b4:c77a:3a48...–
26. 1. 2023   #44
-
0
-

Tabulka 4x 64B? Datlit 1/4 KB tabulky je pracný. I jeho algoritmus se mi jeví efektivnější.

Cyklů je 16, každý má 2B počátečního stavu. Zbytek se snadno udělá rotací. Takže 32B. I to je docela dost na to aby v tom nasekal hromadu chyb (podle sebe soudím tebe).

Proč všichni tak úzkostlivě šetříte komentáři? Pak se v tom nedá vyznat. Komentáře píšu ikdyž mám na 8051 v Assembleru 20 let praxe.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
JerryM0
Věrný člen
26. 1. 2023   #45
-
0
-

a prozradíš nám konečně jakej používáš krystal ? 12MHz ? 1MHz ? jiný ? :)

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:c092:c0b4:c77a:3a48...–
26. 1. 2023   #46
-
0
-

   

mov tl0,#low -50000d
mov th0,#high -50000d

a R7 nastavuje na 3. V jeho případě časovač vyvolá přerušení každých 50 000 taktů. Jedna obsluha LED je tedy 150 000 taktů. Aby měl 150 ms tak jeden takt časovače je 1 mikrosec. Pro standartní 8051 pak výjde 12MHz.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
JerryM0
Věrný člen
26. 1. 2023   #47
-
0
-

tak narozdíl od vás tak nějak už doma nemám simulátor :( takže to píšu naslepo v notepadu ve windows

a nadatlovat tabulku neni az tak moc hrozný

ten poslední kod v ASM8051 co sem ted vložil odpovídá kodu v tom "pseudoC"

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:c092:c0b4:c77a:3a48...–
26. 1. 2023   #48
-
0
-

Mám pocit, že tento server nějak divně počítá čas. Svůj příspěvek #34 jsem vkládal v úterý večer. Snad si to dobře pamatuji.

1/4 kB je v tomto případě plýtvání úsilím a pamětí programu. Na tom prvním záleží mnohem víc, zejména u školní úlohy.

Pokud jeho program funguje a vymyslel ho sám, je lepší v tom, že ho dokáže panu učiteli vysvětlit.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
JerryM0
Věrný člen
26. 1. 2023   #49
-
0
-

jestli vám de jenom o ty data pro tu velkou tabulku tak to vypadá takhle:

DB 11111110B, 11111101B, 11111011B, 11110111B, 11101111B, 11011111B, 10111111B, 01111111B 
DB 11111110B, 11111100B, 11111001B, 11110011B, 11100111B, 11001111B, 10011111B, 00111111B 
DB 11111110B, 11111100B, 11111000B, 11110001B, 11100011B, 11000111B, 10001111B, 00011111B 
DB 11111110B, 11111100B, 11111000B, 11110000B, 11100001B, 11000011B, 10000111B, 00001111B 
DB 11111110B, 11111100B, 11111000B, 11110000B, 11100000B, 11000001B, 10000011B, 00000111B 
DB 11111110B, 11111100B, 11111000B, 11110000B, 11100000B, 11000000B, 10000001B, 00000011B 
DB 11111110B, 11111100B, 11111000B, 11110000B, 11100000B, 11000000B, 10000000B, 00000001B 
DB 11111110B, 11111100B, 11111000B, 11110000B, 11100000B, 11000000B, 10000000B, 00000000B 

a na druhej kotouček:

DB 01111111B, 10111111B, 11011111B, 11101111B, 11110111B, 11111011B, 11111101B, 11111110B
DB 01111111B, 00111111B, 10011111B, 11001111B, 11100111B, 11110011B, 11111001B, 11111100B
DB 01111111B, 00111111B, 00011111B, 10001111B, 11000111B, 11100011B, 11110001B, 11111000B
DB 01111111B, 00111111B, 00011111B, 00001111B, 10000111B, 11000011B, 11100001B, 11110000B
DB 01111111B, 00111111B, 00011111B, 00001111B, 00000111B, 10000011B, 11000001B, 11100000B
DB 01111111B, 00111111B, 00011111B, 00001111B, 00000111B, 00000011B, 10000001B, 11000000B
DB 01111111B, 00111111B, 00011111B, 00001111B, 00000111B, 00000011B, 00000001B, 10000000B
DB 01111111B, 00111111B, 00011111B, 00001111B, 00000111B, 00000011B, 00000001B, 00000000B

a reverzně se to prostě čte opačně  :)  od posledního prvku

já myslim že to neni zas tak hrozný a je to nejjednodušší ze všech vaiant co sme tu probírali

číst se to musí instrukcí
MOVC A, @A+DPTR
protože se čte blok programové paměti

a adresa prvního prvku se do DPTH vloží


MOV DPTR, #LED_DATA

a poslední prvek se zjistí přičtením hodnoty 64
 

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:c092:c0b4:c77a:3a48...–
Martin
~ Anonymní uživatel
1600 příspěvků
26. 1. 2023   #50
-
0
-

No, můj kód naštěstí funguje podle zadání, takže to mám podle učitele správně.

To jsem jenom dodělával starý úkol, teďka máme jiný a děláme už v Assembleru 8086 a ten je pro mne mnohem těžší, nepomohli byste mi spíš s tímto teďka, jestli budete tak hodní? 

Nahlásit jako SPAM
IP: 89.176.25.–
26. 1. 2023   #51
-
0
-

Založ na to nový vlákno. Co se týče 8086, Assembler neumím. Takže nebudu schopen pomoci.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
JerryM0
Věrný člen
26. 1. 2023   #52
-
0
-

podle mě je ta zadaná úloha stejně na žáka střední školy moc těžká ...

Nahlásit jako SPAM
IP: 2a00:1028:83bc:e52a:c092:c0b4:c77a:3a48...–
Martin
~ Anonymní uživatel
1600 příspěvků
26. 1. 2023   #53
-
0
-

#52 JerryM
Taky si myslím, ten náš učitel není v tomhle předmětu moc oblíbený a skoro nikdo tomu nerozumí, takže proto semka píšu, fakt si totiž nevím vůbec rady

Nahlásit jako SPAM
IP: 89.176.25.–
MilanL+1
Grafoman
16. 3. 2023   #54
-
0
-

Tedy vím že už je asi pozdě, ale co blázníte s bitovými poli a podobně, toto se dá řešit dvěmi instrukcemi :

Rotací a XORem

u jednoho portu rotace doleva  a XOR 1  

RL
XRL A,#1

a u druhého portu rotace doprava  a XOR 128

RR
XRL A,#128

Nahlásit jako SPAM
IP: 91.139.9.–
16. 3. 2023   #55
-
0
-

#54 MilanL
Předložil jsem univerzální řešení. Dá se tím blikat ledkama, řídit krokový motor. A snadno přizpůsobit "zadrátování" hardware na porty.

Zvolil jsem jednodušší způsob práce = použití již známého a osvědčeného algoritmu. Jako když matematik vaří čaj.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MilanL+1
Grafoman
16. 3. 2023   #56
-
0
-

#55 hlucheucho
Myslím, že jsou situace pro které se ten tvůj algoritmus hodí například jiné pro jiné různé kombinace než je toto postupné rozsvěcení a zhasínání, ale zrovna u tohoto zadaní se to dá řešit jednodušeji.

U té mojí varianty nemusí hlídat žádné cykly, jediné ošetření u změny stavů led je případ, kdy by zhasly všechny, což asi nechce 

;podprogram změny stavu portů
AKCE:
	MOV A, STAV1    ;aktuální stav 1.sady LED z paměťového místa nebo registru
	RL  A		;posuň stav doleva stav D7 do D0 
	XRL A,#1	;změň stav D0
	MOV STAV1, A	;ulož nový stav 1.sady LED
	MOV A, STAV2    ;aktuální stav 2.sady LED z paměťového místa nebo registru
	RR  A		;posuň stav doprava stav D0 do D7 
	XRL A,#128	;změň stav D7
	MOV STAV2, A	;ulož nový stav 2.sady LED

;---volitelná část test na zhasnutí stav $FF (oba ho mají ve stejném cyklu)
	INC A		;když je zhasnuto $FF, tak +1 znuluje A 
	JZ  AKCE	;opakuj posun aby se rozsvítily D0 a D7
	DEC A		;*1) vrácení stavu
;--- konec testu zhasnutí

	MOV P1, A	;*2) v A je stále STAV2 pošli na odpovídající PORT
	MOV A, STAV1	;*1)načti znovu STAV1 a pošli na odpovídající PORT
	MOV P0, A	;*2) a pošli na odpovídající PORT
	RET

;*1) při použití registrů pro stavy vynechat
;*2)   - - - / / - - - a na porty poslat přímo dané registry MOV PX, RX
Nahlásit jako SPAM
IP: 91.139.9.–
16. 3. 2023   #57
-
0
-

Pořád  je to rozdíl mezi vymysli algoritmus (hodně úsilí) a použij algoritmus (málo úsilí). Co se týče využití mého času, druhé je výhodnější postup. Co se týče využití paměti programu a strojového času je výhodnější tvůj přístup.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
16. 3. 2023   #58
-
0
-

Ještě něco z praxe: dobré řešení tě napadne většinou včas. Nejlepší řešení tě napadne až "s křížkem po funuse"

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MilanL+1
Grafoman
16. 3. 2023   #59
-
0
-

#58 hlucheucho
No mě to napadlo hned, ale poslední dobou sem koukám, tak jednou za 2-3 měsíce, když něco hledám, proto ta pozdní reakce.

Nahlásit jako SPAM
IP: 91.139.9.–
remmidemmi0
Věrný člen
30. 4. 2023   #60
-
0
-

#29 JerryM
Hele ten manuál http://matlab.fei.tuke.sk/…ler_8051.pdf

Dík za odkaz. To si pamatuju, tyhle manuály jsem prodával když jsem v roce 1988 dělal v Tesla Eltos u ing. Machačky. On měl na starosti psaní a prodej těhle knížek...  Tak to jsi mne potěšil :) 

Byly i jiné příručky, co pamatuju, třeba o 8048, ale nejpopulárnější byla červená o MS DOSu.

Nahlásit jako SPAM
IP: 37.48.48.–
MilanL+1
Grafoman
4. 5. 2023   #61
-
0
-

#60 remmidemmi
jo na tyhle si pamatuji, měl jsem  3 červené myslím že Základy DOSu, Služební programy a Základní instukční sada 8086, a v v práci i většinu ostatních včetně modré řady k CP/M

Nahlásit jako SPAM
IP: 91.139.9.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 12 hostů

Podobná vlákna

Pomoc s assembler 86 — založil firin

Assembler pomoc — založil pontiac

Assembler-pomoc — založil tichous

Assembler 8080 pomoc — založil bbeni

POmoc s assembler 8080 pls — založil firinko

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý