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

Assembler 8051 – Assembler – Fórum – Programujte.comAssembler 8051 – Assembler – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
lucie
~ Anonymní uživatel
33 příspěvků
17. 5. 2017   #1
-
0
-

Dobrý den,

pomohl by mi někdo s ukolem. Něco už mam naprogramované, ale bohuzel neumim si uz pomoc s tím kodem.

Mam doma i HW, tak že neníproblem odzkoušet. Prosím..

Pokud by nekdo mohl. napiste mi na email:

lucikondickova@seznam.cz

Nahlásit jako SPAM
IP: 217.197.144.–
Reklama
Reklama
hlucheucho+13
Posthunter
17. 5. 2017   #2
-
0
-

1. napiš zadání
2. přidej kód, který jsi udělala
3. napiš, s čím je problém

hu

Nahlásit jako SPAM
IP: 195.178.67.–
lucie
~ Anonymní uživatel
33 příspěvků
17. 5. 2017   #3
-
0
-

#2 hlucheucho
Nemužu jsem poslat zadaní ani kod, aby náhodou to nenašel učitel. Prosím ozvete se na email

Nahlásit jako SPAM
IP: 217.197.144.–
hlucheucho+13
Posthunter
17. 5. 2017   #4
-
0
-

To si nemyslím, že by učitel měl problém s tím, že někdo poradil, co dělat

hu

Nahlásit jako SPAM
IP: 195.178.67.–
lucie
~ Anonymní uživatel
33 příspěvků
19. 5. 2017   #5
-
0
-

#4 hlucheucho
Tak to můžeme nějak rozčtvrtit :D

Tenhle ten kód má blikat desetiná čárka, psali jsmesi to i do sešitu..Ale jako vždy u mně se nestala chyba a nejde to..

ORG 0
JMP START
ORG 0BH
JMP BLIK
Pocit    equ    3fh
dot    bit    p0.3
blank    bit    p0.5


org    30h

start:     CLR    BLANK
    MOV    POCIT,#1
    MOV    TMOD,#01H
    setb ET0
    SETB EA
    setb TR0
    jmp $

blik:    xch a,pocit
    djnz    acc,bl1
    cpl    dot
    mov a,#5

bl1:    xch a,pocit
    reti
    end

Nahlásit jako SPAM
IP: 217.197.144.–
hlucheucho+13
Posthunter
19. 5. 2017   #6
-
0
-

Co se rozumí chybou? Nejde zkompilovat nebo po naprogramování MCU nefunguje? Pozor na některé simulátory, neumí dobře simulovat přerušení a pak i funkční kód se jeví jako nefunkční.

Příšerně napsaný kód. Takovýhle guláš je pro čitelnost kódu to nejhorší, co může být. Navíc překladač může rozlišovat malá a velká písmena. Osobně se držím konvence návěští (label), instrukci a operandy psát velkými písmeny a komentáře malými. Dále existují drobné odchylky mezi překladači, a tak se ti může stát, že místo SETB ET0 musíš napsat SETB IE_ET0, podobně někdy je ACC neznámý symbol, jindy je přípustné A i ACC. Rozhodně bych to nemíchal v jednom programu, spíš kvůli štábní kultuře.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MilanL+1
Super člen
19. 5. 2017   #7
-
0
-

#5 lucie
Ten kód je opravdu trošku zmatečnej, jak psal HU.

Hm není chyba v definici Pocit , equ by měla být konstanta pro překladač a ne paměťové místo pro proměnnou. Pro proměnou by mělo být DB.

Nahlásit jako SPAM
IP: 91.139.9.–
hlucheucho+13
Posthunter
19. 5. 2017   #8
-
0
-

Po úpravě pro použitý překladač (Assembler EW8051, IAR Systems) kód otestován na AT89C51ED2, je funkční.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
lusie0
Newbie
19. 5. 2017   #9
-
0
-

#8 hlucheucho
Mno já to zrovna posílám na HW ... a prostě nebllika když má.. Má blikat desetiná čárka, ale nevím proč to nejde.. 

Nahlásit jako SPAM
IP: 217.197.144.–
lusie0
Newbie
19. 5. 2017   #10
-
0
-

#6 hlucheucho
Já to zkusím přepsat a pak když tak písnu :) Mně je to taky divné, že to ve škole šlo ale doma ne ... 

Nahlásit jako SPAM
IP: 217.197.144.–
hlucheucho+13
Posthunter
19. 5. 2017   #11
-
0
-

#10 lusie
ono záleží na tom, na čem to zkoušíš. Můj test proběhl na skutečném procesoru s krystalem 4 MHz a výstup P0.3 byl sledován digitálním paměťovým osciloskopem. Impuls i mezera měly šířku asi 1s což odpovídá:
na vstup časovače je přiveden signál z oscilátoru dělený 12, což znamená, že se stav časovače změní o 1 každé 3 mikrosekundy. K přetečení časovače dojde každých 65536 x 3 .... (asi 200 ms, se mi to nechce počítat). Ke změně stavu portu dojde jen při každé páté obsluze přerušení.

Důležité je nezapomenout na vlastnosti portů. Osciloskop jsem měl připojen mezi +5V a port, jinak bych nic nenaměřil (nemám tam žádný pull-up).

Pokud to zkoušíš na simulátoru, musí umět simulovat přerušení od časovačů. Dále musíš simulátor nastavit tak, aby simuloval časovače. U některých je to peklo a je snažší to testnout na skutečném procesoru.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Jerry
~ Anonymní uživatel
116 příspěvků
19. 5. 2017   #12
-
0
-

#1 lucie
1/

hele a nechybí ti náhodou něco v tom nastavení - v inicializaci ?

a nebikáš náhodou tak moc rychle že to nevidíš ? ono totiž 16bit časovač přeteče docela rychle pokud máš třeba 24MHz krystal a pak to samozřejmě NEJDE vidět. Ono totiž při krystalu 24Mhz ten Timer přeteče 366x za sekundu a to asi těžko budeš vidět že ? Člověk zvládne rozeznat mah 16Hz. Co zkusit Osciloskop co je na výstupu ??? Potřebuješ osciloskop do 100MHz nebo logický analyzátor.

Jinak správné nastavení Timeru0 je takto - viz níže, musí se nastavit samoplnění aby když přeteče aby se zase nastavil na začátek a začal čítat odzačátku.

;TMOD-citac 0 v rezimu 16 bit citace vzestupne THL
;IE-povoleno celkove EA a jednotlive pro preteceni od TIM-0
;IP-nejvyssi priorita pro TIMER-0
MOV TCON,#00000000B ;ridici registr citace/casovace
MOV TMOD,#00000001B ;registr rezimu cit./cas.
MOV IE, #10000010B ;reg povoleni preruseni
MOV IP, #00000010B ;priorita pro preruseni
SETB ET0 ;povol TIMER0
SETB EA ;povol globalne INT
CLR TR0 ;zastav casovac 0
CLR TF0 ;clear bitu preruseni ot TIM-0

2/ zkusila si udělat program co jenom diodu rozsvíti a pak už jen JMP $ ? a pak program co jenom diodu zhasne ? a pak už jen JMP $ ? Jde o to, jestli ta adresa diody bit    p0.3 je správně že.

3/ zkusila si to udělat bez TIMERu ?  Cyklickým voláním CALL BlinkT_000 blikáš diodou pomocí pauzy. Takže

Cyklus:

CALL BlinkT_000

JMP Cyklus

************************************************************
; BLINK TERMINAL LED-diode SUBROUTINNE
;************************************************************
;
BlinkT_000:
MOV R1,#255D ;priprav pauzu a problikni
MOV R2,#045D ;diodu asi 45ms při 24MHz krystalu pro 51'
CLR P0.3
CALL WaitCycle_000
SETB P0.3
BlinkT_999:
RET
;************************************************************
; END OF BLINK TERMINAL LED-diode SUBROUTINN

;;
************************************************************
; WAIT CYCLE SUBROUTINNE
;************************************************************
;;
cekaci pauza pro blikani diody
WaitCycle_000:
MOV R6,A
MOV R1, wd_DATA_1
MOV R2, wd_DATA_2
WaitCycle_006:
MOV A, #0000H
ORL A, R1
ORL A, R2
CJNE A, #0000H, WaitCycle_008
JMP WaitCycle_999
WaitCycle_008:
MOV A, #0FFH
ADD A, R1
MOV R1, A
MOV A, #0FFH
ADDC A, R2
MOV R2, A
JMP WaitCycle_006
WaitCycle_999:
MOV A,R6
RET
;************************************************************
; END OF WAIT CYCLE
;************************************************************

Hele on ti pan učitel neřek co máte dělat ? A ty máš doma veškerý HW ? a to ti škola pučila ? Ono to neni levná záležitost že. To je zajímavý. Asi nějaká bohatá škola .... Kelnerovy Děti ne ? Já myslim, že to spíš bude nějakej Ftipálek :) kterej je současně pěknej trouba co si neumí přečíst manuál.

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:d597:...–
hlucheucho+13
Posthunter
19. 5. 2017   #13
-
0
-

#12 Jerry
Nechybí ji tam nic, s tím časovačem to počítáš divně. V základní 8051 (nepočítám jednocyklové jádro) je oscilátor nejdříve dělen 12. To by na časovač přišly 2 MHz. Časovač má 16 bitů, bez nastavování přeteče každých 65536 taktů časovače (2 na 16). Takže 65536 x 0,5 = 32 768 mikrosekund. Každých 5 přetečení časovače se změní stav portu, neboli LED svítí po dobu asi 164 ms a stejnou dobu nesvítí. To odpovídá frekvenci blikání asi 3 Hz. Bez problémů viditelné. Spíš jde o to, na čem testuje. U simulátoru je potřeba správně nastavit simulátor a někdy ani to nepomůže, u HW je potřeba respektovat jeho základní vlastnosti jako třeba nutnost používat pull-up odpor, pro LED budící tranzistor apod.

Jen si nemyslím, že testuje na procesoru nebo emulátoru. Nejspíš má nějaký simulátor ( = aplikaci v PC) a neumí ho správně nastavit aby simuloval časovače a jimi vyvolané přerušení. Pokud přecejen používá procesor, možná se jí nepodařilo do něj nahrát její software.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
hlucheucho+13
Posthunter
19. 5. 2017   #14
-
0
-

Pro ukázku trošku učesaný kód a upravený pro EW8051 (IAR Systems): 


Pocit   EQU 03Fh


#include <io51.h>

#define Dot     P0.3
#define Blank   P0.5

        NAME    blikac
        RSEG    RCODE
    
        ORG     00h
        JMP     start
        
        ORG     0Bh
        JMP     blik

        ORG     030h
start   CLR     Blank
        MOV     Pocit,#1
        MOV     TMOD,#01h
        SETB    IE_ET0
        SETB    IE_EA
        SETB    TCON_TR0
        jmp $


blik    XCH     A, Pocit
        DJNZ    ACC, bl1
        CPL     Dot
        MOV     A, #5

bl1     XCH     A, Pocit
        RETI

        END

hu

Nahlásit jako SPAM
IP: 195.178.67.–
peter
~ Anonymní uživatel
2871 příspěvků
19. 5. 2017   #15
-
0
-

Pro nas mene premyslive
sviti 164 ms, nesviti 164 ms
cela vlna = sviti + nesviti, t = 164 * 2 = 0.328 s
f = 1/t = 1/0.328 = 3.05 Hz
Kolikrat za sekundu to blikne? 3x

A nad tim ostatnim se mi nechce premyslet, urcite to tak nejak je s temi cisly.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:d972:c2...–
Jerry
~ Anonymní uživatel
116 příspěvků
21. 5. 2017   #16
-
0
-

#1 lucie

Ještě několik takových drobností k tomu co děláš. Pokud zkoumáš Timer jenom v softwarovým simulátoru, tak
je docela dost možný, že to nebude fungovat až tak jak čekáš. Možná by si měl investovat cca 200
a postavit si vývojovou desku. Viz obrázek níže. To je ze střední :) a pak z vš roky 1989-1993-1994. Tehdy tady Atmel začínal. Potřebuješ k tomu zásufkovej zdroj 3-5-9-12 Voltů a lepší je trafovej ne ten pulsní. Když budeš mít to nekonečný štěstí a budeš to chvíli dělat v zaměstnání tak si možná uděláš i větší desku - viz taky obrázky níže. Jinak ty vývojový desky se dneska už běžně prodávaj. Tehdy to neexistovalo. Kablíky sou typu "Belden-9976-009-WHT" a další podle barev a maj pruměr
0.3-0.35mm a NENI to lanko. Je to drát. seženeš je  třeba v (lankomat cz). Jinak nepotřebuješ klasickou desku plošných spoju a stačí ti tvrdší karton ze zadní strany trhacího bloku. Místo obvodu MAX232 dáš FTDI-FT232 abys to moch používat pod windows.

S původní řadou procesorů 51 je problém v tom, že oni se jaksi programovali poměrně složitě. Musíš procesor z patice vyndat dát ho do programátoru pak naprogramovat a pak zase vrátit. Taky programátory na starý 51 sou dost drahý. Kdyby sis vybral řadu AVR což sice neni procesor typu CISC ale naopak RISC tak bys měl všechno mnohem jednodušší. Taky škála výběru je výrazně širší. Oni maj režim ISP - In-System-Programmable a tak nemusíš procesor vyndavat stačí připojit programátor k vývojový desce. A taky cena programátoru je výrazně někde jinde - cca 100Kč.
A navíc některý z nich spolupracujou s AVRStudiem. Např. zde:  http://www.dx.com/cs/s/AVR+ISP
Pokud chceš plně pracovat i s debuggerem potřebuješ tohle:
http://www.dx.com/…ucent-200082#…
Jinak co třeba tohle
http://www.jayconsystems.com/…mel-avr.html
nebo tohle
http://www.fischl.de/usbasp/


Ty taky píšeš že používáš 8052. To je větší jednočip a má tzv. minimální softwarovou a hardwarovou
spouštěcí konfiguraci. Pokud ji nedodržíš, tak se procesor nespustí nebo se spustí v továrnímtestovacím nebo programovacím režimu. HW konfigurace znamená, že musíš mít určitý min. počet externích součástek a propojení. Mám pocit, že některý druhy simulátorů vyžadují přesnou specifikaci této spouštěcí konfigurace jinak simulátor nefunguje. To možná bude i tvuj problem.

Nastavování Timerů a ostatní výpočty časování jsou uvedeny v publikacích

1/ Konstrukční katalog - číslicové integrované obvody, Tesla Eltos, 1990, ISBN 80-7102-029-X
2/ Milan Babák, Ladislav Chládek, Architektura a technické vlastnosti jednočipových mikrořadičů 8051, Tesla Eltos, 1987
3/ manuál procesoru od výrobce.

a bylo by asi dobré je mít :) jinak asi těžko budeš něco nastavovat. Bez manuálu se blbě dělá.
Nicémě tohle všechno ti měl říct váš pan učitel na SŠ :) asi to je pěknej mamlas.


Připojen obrázek.

Připojen obrázek.

Připojen obrázek.

Připojen obrázek.

Připojen obrázek.

Připojen obrázek.

Připojen obrázek.

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:e4ee:...–
hlucheucho+13
Posthunter
22. 5. 2017   #17
-
0
-

1. podle přezdívky lucie si myslím, že je to žena

2. Kdyby... na kdyby se v životě nehraje. Celé to vypadá jako školní úloha a tam si vybírat nelze. Splním, dostanu známku, možná i výbornou, nesplním, dostanu nedostatečnou. Spolu s tím je nesmysl dělat si vývojovou desku

3. programování 8051 už dávno není problém. Většina současných derivátů s flash pamětí programu podporují ISP, většinou je přes SPI - vyžaduje mít programátor (prakticky ten samý, co pro AVR), který je pro školní úlohu drahý, jeho koupě má smysl teprve když by se tím chtěla zabývat byť třeba jen jako koníček. Některé deriváty 8051 se programují přes UART, stačí mít převodník s MAX232 a jde programovat z COMu, který ale dnes už nebývá k dispozici a tak je potřeba do USB převodník. Lze si s FT232 udělat převodník USB - UART. Ty "nejmocnější" 8051 mají USB a taky se přes něj programují. Ty pak stojí řádově stokoruny a že jsou SMD, bez nějaké zkušební desky se to neobejde. Vše jsou investice, které kvůli pár školním úlohám nemá smysl dělat.

4. O potížích se simulátory jsem už psal. Je zajímavé, že stařičký "DOSový" simulátor 8051 časovače simuloval správně zatímco i velice komplexní IDE se na to musí velice komplikovaně naprogramovat. Zkusil jsem to i s CodeMaster-52, časovače vůbec nesimuloval, nad nastavováním jsem nebádal, jeho hlavní úloha je práce s emulátorem kde je skutečný hardware. Že mám jeden 8051 zrovna na stole a dělám na něm jednoduchou aplikaci, testoval jsem přímo na konkrétním hardware.

5. 8052 je plně zpětně kompatibilní s 8051. Na rozdíl od 8051 má větší vnitřní RAM - celkem 256 Byte. Přidaných 128 Byte paměti sdílí adresy se SFR, ale je jen nepřímo adresovatelných. Pokud tedy spustím program pro 8051 na procesoru 8052, poběží zcela normálně. Nemají na to vliv ani další přidané periferie. Co se týče další vlastností jako jsou X2, Dual DPTR a podobně, ty jsou v defaultním nastavení vypnuté aby se procesor choval jako standartní 8051. Totéž platí pro procesory s ISP, defaultně spouštějí uživatelský program, pro spuštění bootloaderu je potřeba dodržet HW podmínky. Jiná situace je u "jednocyklových" 8051, tam běží na frekvenci oscilátoru (tj. bez dělení 12) i časovače. I tak lze program odladit na standartní 8051 a pak ho přenést (s úpravou nastavení časovačů).

6. Pro nastavování časovačů stačí mít datasheet a chápat jak to funguje. Kromě toho Atmel měl pomůcku v Excelu (půjde stáhnout? viz níže bod 7). Jinak potřebné informace najde Google za pár minut, není potřeba si shánět nějaké publikace.

7. Atmel už není, koupil to Microchip. Moje oblíbené "přečti si Application Notes" docela utrpělo. Na každou, co jsem kliknul jsem dostal "stránka neexistuje". Je otázka, zda pochybil webmaster nebo zda je cíl pohřbít vše, co Atmel dělal vč. AVR. Co bude dál ukáže až čas. Za těchto okolností bych AVR až tak vroucně nedoporučoval ačkoliv to jsou (byly?) "schopné" procesory.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Jerry
~ Anonymní uživatel
116 příspěvků
22. 5. 2017   #18
-
0
-

#17 hlucheucho
ta nedostupnost manuálu a aplikačních zpráv u Microchip + Atmel obvodu je jenom dočasná. ptal sem se a oni předělávaj web stránky. AVR řada ani 51 řada v žádném případě NEPADNE !!!

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:acc6:...–
hlucheucho+13
Posthunter
22. 5. 2017   #19
-
0
-

#18 Jerry
Ke slibům jsem nedůvěřivý, počkám na skutečnost. Každopádně o 8051 a ARM strach nemám, jsou i další výrobci. U AVR je to horší, myslím, že Atmel byl jediný. Snad nezvolí "českou" cestu

hu

Nahlásit jako SPAM
IP: 195.178.67.–
peter
~ Anonymní uživatel
2871 příspěvků
23. 5. 2017   #20
-
0
-

Tak, se divim, ze kdyz predelavaji stranky, ze neponechaji funkcni verzi, treba i jako virtual, nez to budou mit hotove :)

Nahlásit jako SPAM
IP: 2001:718:2601:26c:dde3:2b...–
hlucheucho+13
Posthunter
23. 5. 2017   #21
-
0
-

#20 peter
Nedivím se. Manažeři Microchipu zadali nesmyslný termín, obchodníci dodavatele webu řekli, že jen stačí upravit layout a že to není problém a pak programátoři a kodéři několik nocí nespali a stejně se to nestihlo. A tak se udělala potěmkinova vesnice aby se to předalo včas a inkasovalo. Teď se křičí na programátory a kodéry, že něco nejede, berou se jim prémie, vyhazují se z práce ... a manažeři a obchodníci, kteří to zavinili si vypíšou tučnou odměnu a užívají si dovolenou bůhvíkde ....

Jen ukázka možného scénáře, co se dělo v zákulisí.

Včera jsem to namátkou zkoušel a vypadalo to, že App. Notes u 8051 fungují, pro AVR je vše mrtvý.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
lusie0
Newbie
23. 5. 2017   #22
-
0
-

Tak ze za  a) ano máme  to do školy a nevímsi s tim rady a je to jedna vec z xx veci co si nevim rady

b) mám HW pujceny od školy a když ho nekdo potrebuje musim ho vrátit do školy, tak že není muj ( není to bohata skola ba naopak.. mam to zatím jen ja protože tomu vubec nechapu ale snazim se )))

c ) dekuji hu za napovedy :) skoda ze Vas nejde zkontaktovat konkretne 

Nahlásit jako SPAM
IP: 217.197.144.–
lusie0
Newbie
23. 5. 2017   #23
-
0
-

#15 peter
NWM.. protoze se mi nechce rozsvitit tohle... ale kdyz to mam jen na ledce tak to blika porad jelikoz je nekonecna smycka ...Ja si myslim jestli to nebude jen na portu

Nahlásit jako SPAM
IP: 217.197.144.–
hlucheucho+13
Posthunter
23. 5. 2017   #24
-
0
-

Pomoc zde na fóru najdeš, tím spíš že se snažíš a půjčila sis kvůli tomu HW. Fórum má výhodu, že lidí ochotných poradit je zde více. Pokud nerozumíš dalším věcem, ptej se. 

protoze se mi nechce rozsvitit tohle

chtělo by to specifikovat přesně, co máš na mysli. Není někde schéma požitého HW? (asi tu učební pomůcku někdo vyrobil a napsal k ní manuál) Bez toho je těžké určit, proč LED bliká a "tohle" ne.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
lusie0
Newbie
23. 5. 2017   #25
-
0
-
Nahlásit jako SPAM
IP: 217.197.144.–
MilanL+1
Super člen
23. 5. 2017   #26
-
0
-

#25 lusie
no podle schématu by ti měla blikat tečka u té druhé číslice, jiné nejsou zapojené. a Blank by měl být v Log 1.

Nahlásit jako SPAM
IP: 185.112.167.–
lusie0
Newbie
23. 5. 2017   #27
-
0
-

#26 MilanL
Ano měla.. ale neblika.. tak uz nwm jak to mam tam napsat .. jako kdyz to dam na ledky ok ale tady diota ne

Nahlásit jako SPAM
IP: 217.197.144.–
lusie0
Newbie
23. 5. 2017   #28
-
0
-

#26 MilanL
tak že mě jeste napadlo ze by to byla chyba hw

Nahlásit jako SPAM
IP: 217.197.144.–
MilanL+1
Super člen
23. 5. 2017   #29
-
0
-

#27 lusie
ty segmentovky mají společnou anodu +5V přes tranzistor a signál Blank, který na začátku nuluješ a již nevidím, že bys ho nastavovala, tzn bez signálu Blank = 1 není aktivní obvod displeje

Nahlásit jako SPAM
IP: 185.112.167.–
lusie0
Newbie
23. 5. 2017   #30
-
0
-

#29 MilanL
Ahaa.. Dobře kolem na to kuknu :) 

A může mi někdo vysvětlit ještě bunky... Mam jeste v prikladu co tak nevim jednu vec  a to.. ze mame dat na displej nejaky pismeno a to pismeno bude mit prirazeno cislo ktere musite zadat zase vy... jeden kamos to rikal pre registrovane bunky.. ale ja nwm jak to dat ... (např A = 19874)

Nahlásit jako SPAM
IP: 217.197.144.–
MilanL+1
Super člen
23. 5. 2017   #31
-
0
-

#30 lusie

tedy nevím, co myslí bunkama, nejspíš registrem adresovanou paměť ne?
U toho zadání je otázkou jak má být číslo v paměti uložené - rozsah, může být ve 2 bajtech tzn 0-65535, nebo ve 3-4 bajtech, kde můžeš mít na každý číslo 4 bity (BCD - počet míst čísla = počet bajtů x 2) nebo počet míst čísla = počet bajtů (v každém bajtu číslo 0-9) + ke všem variantám přiřazené písmeno.

Ještě drobnost k tomu displeji, otázkou je jak jsou ty signály generovaný na desce s procesorem, jestli tam ten Blank není negovanej. Ono není jednoduchý navrhovat program bez znalosti zapojení, ale jestli ti na tom procesorovým pinu funguje dioda, tak je to jediný co mě ze schematu napadá.

Nahlásit jako SPAM
IP: 185.112.167.–
lusie0
Newbie
23. 5. 2017   #32
-
0
-

#31 MilanL
A jak ho mam teda znegovat?

Nahlásit jako SPAM
IP: 217.197.144.–
hlucheucho+13
Posthunter
23. 5. 2017   #33
-
0
-

#26 MilanL
Naopak. Displej se spol. anodou a jeho anody spínají PNP tranzistory. Takže BLANC musí mít Log. 0 aby tranzistor byl vodivý. Pro DJ  = 0 pak des. tečka svítí. Může si to otestovat tak, že signál BLANC propojí na konektoru na GND a následně k němu na GND připojí i DJ. Myslím, že výstupy z procesoru negovaný nebudou.

hu

Nahlásit jako SPAM
IP: 193.86.81.–
hlucheucho+13
Posthunter
23. 5. 2017   #34
-
0
-

#30 lusie
zkus napsat přesně zadání.

hu

Nahlásit jako SPAM
IP: 193.86.81.–
MilanL+1
Super člen
23. 5. 2017   #35
-
0
-

#33 hlucheucho
hm  sakra v analogu jsem nebyl nikdy moc dobrej - jsem spíš digital, zmátlo mě asi zakreslení těch tranzostorů. no na to odzkoušení by bylo asi ideální zkusit tu diodu nebo měřák napojit na vývody tý 2. segmentovky (mezi anodu a Vývod tečky), pokud to nepůjde , tak by pak musela bejt chyba na cestě někde nějakej špatnej spoj/kontakt/součástka.

Nahlásit jako SPAM
IP: 185.112.167.–
lucie
~ Anonymní uživatel
33 příspěvků
30. 5. 2017   #36
-
0
-

#35 MilanL
to me taky napadlo :D ale asi jo protoze kdyz jsem to zkusila ve škole slo to ale doma ne...

Nahlásit jako SPAM
IP: 77.48.31.–
lucie
~ Anonymní uživatel
33 příspěvků
31. 5. 2017   #37
-
0
-

#34 hlucheucho

Poté osoba vloží pomocí číselné klávesnice
;svůj vstupní kód, přičemž má možnost v případě chyby smazat
;poslední vložený znak, resp. celý displej. Jestliže nebylo
;před vkládáním hesla stisknuto žádné písmeno, zámek nereaguje.
;Jestliže dojde k pokusu do již rozepsaného hesla vložit písmeno,
;je toto písmeno ignorováno.
;
;Vkládaná čísla se na displeji zobrazují pouze v podobě pomlček,
;aby nemohlo dojít k prozrazení vstupního kódu jiné neoprávněné
;osobě. Po vložení 1. čísla hesla se tedy na 1. pozici z leva
;zobrazí pomlčka a desetinná tečka přestane blikat.
;Vloží-li osoba neplatný kód, ozve se z reproduktoru přerušovaný

to je to zadani... nwm co s tim mam delat... potrebuji prosste nejak zadat kdyz adam pismeno A tak pak aby se potvrdilo to heslo

Nahlásit jako SPAM
IP: 79.127.207.–
hlucheucho+13
Posthunter
31. 5. 2017   #38
-
0
-

Potřebuješ mít kus paměti dost velký na to aby se vkládaný kód vešel. Např. písmeno a 4 čísla potřebuješ 5 Byte. Tuto paměť budeš adresovat nepřímo. K tomu použiješ registr R0 nebo R1 a instrukce obsahující ve svém zápisu @R0 nebo @R1.  Kousek paměti pak budeme v dalším textu nazývat pole, adresu prvního Byte bázovou adresou a registr budeme nazývat ukazatel.

Pro účely porovnání, zda je kód správný, potřebuješ ještě druhé pole, kde tento kód bude uložen.

Po resetu nastavíš ukazatel na začátek pole = do ukazatele zapíšeš bázovou adresu. Při stisku klávesy zjistíš, zda je znak platný a vložíš ho do pole s pomocí ukazatele (instrukce mov @R0, zdrojova_adresa), pak inkrementuješ ukazatel (instrukce inc je pro tento účel nejjednodušší). Při odstranění znaku dekrementuješ ukazatel ( na to je také instrukce, tuším dec). Vždy hlídáš, aby ukazatel ukazoval do pole. Počet znaků můžeš buď počítat z ukazatele jako rozdíl okamžité hodnoty ukazatele a bázové adresy nebo mít na to samostatné počitadlo. Po potvrzení zadaného kódu porovnáš obsah pole se správným kódem - obě to jsou pole, porovnáš je tak, že porovnáš první prvek s prvním atd. Při první neshodě je jasné, že kód je chybný. Pokud je zadaný kód správný, otevřeš zámek (na kterém portu je připojen a jakou má aktivní log. úroveň?). Po vypršení času otevření se vrátíš do výchozího stavu.

Platné a neplatné znaky: je důležité vědět, jaký kód pošle klávesnice a jaký znak tomu odpovídá. Pomocí instrukce CJNE lze vytvořit větvení programu typu je větší, je menší, je větší a rovno apod... Vypadá to, že první znak může být cokoliv a ostatní znaky musí být číslo. Při rozlišování, co je a není platný znak se tedy budu řídit počtem vložených znaků (více než jeden vložený znak =>mohu vložit jen číslo).

Tolik pomlček kolik je v poli vloženo znaků. Jestli se jedná o displej, ke kterému jsi dala schéma, tak se s ním komunikuje asi přes sériový port, možná SPI. V jádru lze použít tyto strategie:
1. probíhat displej pomocí dvou cyklů. Pošleš prvním cyklem opakovaně stejný byte (pomlčku) tolikrát kolik je zadaných znaků a pak druhým cyklem pošleš tolik byte pro nesvítící znak abys jimi naplnila zbytek displeje.
2. Obsah displeje si připravíš v paměti procesoru (opět jako pole) a odešleš ho na displej zaráz jedním cyklem

Problém je třeba rozebrat na dílčí úlohy a ty řešit samostatně a pak tu stavebnici šikovně poskládat. Hodilo by se vědět více o hardware, jak je připojená klávesnice, na kterém portu je displej....

hu

Nahlásit jako SPAM
IP: 195.178.67.–
hlucheucho+13
Posthunter
31. 5. 2017   #39
-
0
-

Jsem se ještě podíval na zapojení displeje. "Sype" se to do něj "od zadu". Je tedy potřeba na něj odesílat postupně poslední znak, předposlední znak, .... druhý znak, první znak. Tomu je potřeba přizpůsobit způsob odesílání.

Jestli je E347D stejný jako 7447, pak tu pomlčku nezobrazíš, neumí to.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MilanL+1
Super člen
31. 5. 2017   #40
-
0
-

#39 hlucheucho
řekl bych že druhé pole na zadávaný kod není potřeba, stačí udržovat counter, které číslo se zadává a stav jestli se již nevyskytla chyba resp 2 stavy vzhledem k tomu, že může smazat poslední zadané číslo, záleží na provedení programu.

Nahlásit jako SPAM
IP: 185.112.167.–
hlucheucho+13
Posthunter
31. 5. 2017   #41
-
0
-

#40 MilanL
Může se vzít z5 i více znaků. Takže by si musela pamatovat, na které pozici došlo k první chybě. Problém pak ale bude v případě, že by uživatelů a PINů bylo více tak, jak je to např u EZS. Pak je pamatování si zadaného a porovnání se všemi známými asi vhodnější. Nehledě na to, že algoritmus načítání PINu pro uložení uživatele a pro odemčení funkce je pak stejný.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MilanL+1
Super člen
31. 5. 2017   #42
-
0
-

#41 hlucheucho
přičemž má možnost v případě chyby smazat
;poslední vložený znak, resp. celý displej - no já rozuměl smazání posledního nebo celého

jinak

Jestliže nebylo před vkládáním hesla stisknuto žádné písmeno, zámek nereaguje - tohle chápu jako isentifikaci uživatele, tzn pin musí odpovídat danému písmenu..

Nahlásit jako SPAM
IP: 185.112.167.–
hlucheucho+13
Posthunter
1. 6. 2017   #43
-
0
-

A nebo PIN obsahuje povinně písmeno na prvním místě. Pak ještě písmeno může znamenat volbu funkce, nebyla zvolena funkce, neví co s tím PINem má udělat a tak neudělá nic.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MilanL+1
Super člen
1. 6. 2017   #44
-
0
-

#43 hlucheucho
no já to bral jako pokračování od tohohle

#30 lusie
Mam jeste v prikladu co tak nevim jednu vec  a to.. ze mame dat na displej nejaky pismeno a to pismeno bude mit prirazeno cislo ktere musite zadat zase vy...

Nahlásit jako SPAM
IP: 185.112.167.–
Jerry
~ Anonymní uživatel
116 příspěvků
1. 6. 2017   #45
-
0
-

#37 lucie
To tvoje zadání je nějak chaotický. Můžeš sem napsat CELY zadání od začátku ??? Ona totiž věta "....Poté osoba vloží pomocí číselné ....." nedává smysl. Máš problém psát na klávesnici ? Ty k tomu děláš i hardware ? nebo to jenom programuješ ? A v čem to programuješ ? Jaký máš konkrétní typ programátoru ?? Prostě to co tu píšeš je na hlavu. Dej sem CELY kompletní zadání. Možná by bylo dobrý říct co a kde studuješ na SŠ ? na VŠ ? Děláš elektronickej zámek s procesorem ? Pájíš tam něco ? ..... z tebe to leze jak z chlupatý deky nebo to děláš schválně .. je už 1. června. Škola končí a budou prázdniny ...

Nahlásit jako SPAM
IP: 2a00:1028:83be:235a:d1ae:...–
hlucheucho+13
Posthunter
1. 6. 2017   #46
-
0
-

#45 Jerry
HW má půjčený od školy - to si vykládám tak, že někde (nějaký výrobce) udělali HW jako učební pomůcku. Jeho specifikace je spíše záhadou. Dala schéma zapojení displeje, ale na něm nejdou zobrazovat pomlčky a písmena. Teda pokud E347D nemá jinou pravdivostní tabulku než 7447.

Zadání vypadá jak zkopírované z asm souboru - jsou tam nepochopitelné středníky. Možná zkopírováno neúplné. Jen hádám: má si procvičit nepřímé adresování paměti (možná mylný výklad "buněk")

Budou prázdniny... To sice jo, ale pak se jde zas do školy. Kdo ví, co bude v dalším ročníku potřebovat. A třeba má z toho koníčka na celý život...

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MilanL+1
Super člen
1. 6. 2017   #47
-
0
-
Nahlásit jako SPAM
IP: 185.112.167.–
lusie
~ Anonymní uživatel
14 příspěvků
2. 6. 2017   #48
-
0
-

JJá mam naprogramovanou klavesnici tak aby ukazovala pismenacisla pomlcky atd..  ale nwm si rady skrz jak mam k pismenu priradit nejaky cislo a pak aby seto kontrolovalo... A po několikate tu pisu ze cely zdai tu nemuzu dat..Uz skrz to ze jsme na forum davalacely zadani propadam diky nepotrebuji propadnout..

Nahlásit jako SPAM
IP: 217.197.144.–
hlucheucho+13
Posthunter
2. 6. 2017   #49
-
0
-

Prostě si to můžu pamatovat jako jeden kód: A8429, B1856 atd. Pak jen načtu z klávesnice a porovnám s platnými kódy. Pokud nechceš vymýšlet svoje vlastní kódování, můžeš použít ASCII. Platný kód v paměti programu pak může vypadat takto: 

PINA:db 41h, 38h, 34h, 32h, 39h ;A8429

Zadání z klávesnice načteš do paměti a porovnáš způsobem, který jsem popsal. 

Pro zápis znaků do paměti lze použít i zásobník a instrukce PUSH, pro čtení POP. Je třeba si uvědomit, že instrukcemi POP čteš zadanou sekvenci od zadu. V takovém případě je dobré si "muster kód" napsat také pozpátku. I u zásobníku si musíš hlídat, zda se pohybuješ v sekvenci Bytů kterou jsi tam vložila. Dále je třeba mít na paměti, že při volání podprogramu instrukcí CALL a při volání obsluhy přerušení je na vrchol zásobníku automaticky uložena návratová adresa která je pak odebrána instrukcí RET (u CALL) nebo RETI (obsluha přerušení).

hu

Nahlásit jako SPAM
IP: 195.178.67.–
hlucheucho+13
Posthunter
2. 6. 2017   #50
-
0
-

   

VSTUP	DATA	30h	;bazova adresa zadaneho kodu ve tvaru C8756, ASCII

PINA:db 41h, 38h, 34h, 32h, 39h ;A8429 platny kod

	MOV	R0, #VSTUP	;nastavi ukazatel na prvni zadany znak
	MOV	DPTR, #PINA	;nastavi DPTR na prvni znak platneho kodu PINA
	MOV	R7, 00h		;bude se pouzivat jako offset pro praci s PINA a pocitadlo

comp:	MOV	A, R7
	MOVC	A, @A+DPTR	;precte znak z PINA
	XRL	A, @R0		;porovna se zadanym znakem, pri shode je A = 0
	JNZ	err		;zadany se neshoduje s platnym => skok na ERR
	INC	R0		;posune ukazatel na dalsi znak
	INC	R7		;a inkrementuje pocitadlo
	CJNE	R7, #05h, comp	;pokud neporovnal vsechny znaky, provede dalsi iteraci cyklu

;sem se dostane pokud byl zadan platny kod

err:	;sem se dostane pokud nebyl zadan platny kod

porovnání zadaného kódu uloženým v 5 Bytech počínaje adresou 30h s kódem uloženým v paměti programu. Lze to modifikovat na práci s více platnými kódy v paměti programu nebo v paměti dat.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
lucie
~ Anonymní uživatel
33 příspěvků
7. 6. 2017   #51
-
0
-

#50 hlucheucho
dobre ale jak mam pak udelat kdyz nezmnacku treba prvni A ale treba prvni B??

Nahlásit jako SPAM
IP: 77.48.31.–
hlucheucho+13
Posthunter
7. 6. 2017   #52
-
0
-

Tak by byl platný kód např B3719 

PINB:db 42h, 33h, 37h, 31h, 39h

a porovnáš to úplně stejně s PINB.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
lucie
~ Anonymní uživatel
33 příspěvků
7. 6. 2017   #53
-
0
-

tak ze i kdyz zmacknu jine tlacitko pujde to jo ?

Nahlásit jako SPAM
IP: 77.48.31.–
hlucheucho+13
Posthunter
7. 6. 2017   #54
-
0
-

Ústřední myšlenka navrženého řešení je první písmeno jako součást kódu. Záleží na "mustru" jaké písmeno obsahuje.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
lucie
~ Anonymní uživatel
33 příspěvků
7. 6. 2017   #55
-
0
-

#54 hlucheucho
ok tak a ted to zkusit jen hodit nejak do programu-,- zase boj

Nahlásit jako SPAM
IP: 77.48.31.–
hlucheucho+13
Posthunter
7. 6. 2017   #56
-
0
-

Boj? Porovnání je hotové, psalas že načítání z klávesnice máš. Akorát je třeba aby z klávesnice chodily znaky podle ASCII tabulky, u druhého až pátého znaku aby to bylo číslo a uložily se jako sekvence bytu v paměti adresou 30h počínaje. Lze zvolit i jiné umístění v paměti, vždy to je úsek dlouhý 5 Bytů.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
lucie
~ Anonymní uživatel
33 příspěvků
7. 6. 2017   #57
-
0
-

Mno pro mně je boj cele tohle :D

Nahlásit jako SPAM
IP: 77.48.31.–
lucie
~ Anonymní uživatel
33 příspěvků
7. 6. 2017   #58
-
-1
-
Mimo téma

LAV    EQU    P2    ;port s klávesnicí
DISP    EQU    P0    ;port s displejem
MARK    EQU    6CH    ;ukazatel videoRAM
JED    EQU    35H    ;registr jednotek
DES    EQU    34H    ;registr desítek
STO    EQU    33H    ;registr stovek
TIS    EQU    32H    ;registr tisíců
DIS    EQU    31H    ;registr desítek tisíc
STD    EQU    30H
DAT    EQU    DISP.0    ;data pro displej
CLK    EQU    DISP.1    ;hodiny pro displej
BLANK    EQU    DISP.2    ;strobovací pulzy pro displej
STISK    BIT    6CH    ;byl zachycen stisk
IDENT    BIT    6EH    ;klávesa byla rozpoznána
POCET    EQU    36H
VSTUP    DATA    30H


;Nulování VIDEORAM

ZAC:    MOV JED,#0
    MOV DES,#0
    MOV STO,#0
    MOV TIS,#0
    MOV DIS,#0

    JMP HLAVNI
start_pismeno: call hlavni
        jmp start_cislo
start_cislo: call start
JMP_HLAVNI
HLAVNI:    CALL TEST    ;test klávesnice
    JNB STISK,HLAVNI;nebyl-li stisk, opakuj test
    CALL DEKOD_pismena    ;dekódování SCAN kódu
    JNB IDENT,HLAVNI;kontrola
    ORL A,#10H    ;aktivizace znaku (v 5. bitu H)
    MOV STD,A    ;znak na pozici jednotek
    CALL DISPLEJ    ;zobrazení znaku
    CALL DELAY    ;podržení znaku na displeji
    CLR STISK
    JMP HLAVNI1
    
HLAVNI1:CALL TEST    ;test klávesnice
    JNB STISK,HLAVNI1;nebyl-li stisk, opakuj test
    CALL DEKOD_pismena    ;dekódování SCAN kódu
    JNB IDENT,HLAVNI1;kontrola
    ORL A,#10H    ;aktivizace znaku (v 5. bitu H)
    MOV DIS,A    ;znak na pozici desítek
    CALL DISPLEJ    ;zobrazení znaku
    CALL DELAY    ;podržení znaku na displeji
    CLR STISK

    JMP start_cislo
;------------------------------------------------------------pismeno-----------------
start:    CALL TEST    ;test klávesnice
    JNB STISK,start;nebyl-li stisk, opakuj test
    CALL DEKOD    ;dekódování SCAN kódu
    JNB IDENT,start;kontrola
    ORL A,#10H    ;aktivizace znaku (v 5. bitu H)
    MOV STD,A    ;znak na pozici jednotek
    CALL DISPLEJ    ;zobrazení znaku
    CALL DELAY    ;podržení znaku na displeji
    CLR STISK
    JMP HLAVNI0

HLAVNI0:CALL TEST    ;test klávesnice
    JNB STISK,HLAVNI0;nebyl-li stisk, opakuj test
    CALL DEKOD    ;dekódování SCAN kódu
    JNB IDENT,HLAVNI0;kontrola
    ORL A,#10H    ;aktivizace znaku (v 5. bitu H)
    MOV DIS,A    ;znak na pozici desítek
    CALL DISPLEJ    ;zobrazení znaku
    CALL DELAY    ;podržení znaku na displeji
    CLR STISK
    JMP HLAVNI2

HLAVNI2:CALL TEST    ;test klávesnice
    JNB STISK,HLAVNI2;nebyl-li stisk, opakuj test
    CALL DEKOD    ;dekódování SCAN kódu
    JNB IDENT,HLAVNI2;kontrola
    ORL A,#10H    ;aktivizace znaku (v 5. bitu H)
    MOV TIS,A    ;znak na pozici stovek
    CALL DISPLEJ    ;zobrazení znaku
    CALL DELAY    ;podržení znaku na displeji
    CLR STISK
    JMP HLAVNI3

HLAVNI3:CALL TEST    ;test klávesnice
    JNB STISK,HLAVNI3;nebyl-li stisk, opakuj test
    CALL DEKOD    ;dekódování SCAN kódu
    JNB IDENT,HLAVNI3;kontrola
    ORL A,#10H    ;aktivizace znaku (v 5. bitu H)
    MOV STO,A    ;znak na pozici tisíc
    CALL DISPLEJ    ;zobrazení znaku
    CALL DELAY    ;podržení znaku na displeji
    CLR STISK
    JMP HLAVNI4

HLAVNI4:CALL TEST    ;test klávesnice
    JNB STISK,HLAVNI4;nebyl-li stisk, opakuj test
    CALL DEKOD    ;dekódování SCAN kódu
    JNB IDENT,HLAVNI4;kontrola
    ORL A,#10H    ;aktivizace znaku (v 5. bitu H)
    MOV DES,A    ;znak na pozici deset tisíc
    CALL DISPLEJ    ;zobrazení znaku
    CALL DELAY    ;podržení znaku na displeji
    CLR STISK
    JMP HLAVNI5
    
HLAVNI5:CALL TEST    ;test klávesnice
    JNB STISK,HLAVNI5;nebyl-li stisk, opakuj test
    CALL DEKOD    ;dekódování SCAN kódu
    JNB IDENT,HLAVNI5;kontrola
    ORL A,#10H    ;aktivizace znaku (v 5. bitu H)
    MOV JED,A    ;znak na pozici deset tisíc
    CALL DISPLEJ    ;zobrazení znaku
    CALL DELAY    ;podržení znaku na displeji
    CLR STISK
    JMP start
;----------------------cisla---------------
TEST:    MOV R7,#4    ;počet rotací
    MOV A,#0F7H    ;příprava testovacího slova (11110111)
KL2:    MOV KLAV,A    ;pro 1. sloupec
KL5:    CJNE A,KLAV,KL3    ;byl zachycen stisk, sejmi SCAN a konec
    DJNZ R7,KL1    ;byly otestovány všechny sloupce?
    CLR STISK    ;vynulování příznakového bitu - nebyl stisk
    JMP KL4        ;byly otestovány všechny sloupce - konec testu
KL1:    RR A        ;pochodující 0 na další sloupec
    JMP KL2        ;test dalšího sloupce
KL3:    MOV A,KLAV    ;sejmutí SCAN kódu
    SETB STISK    ;nastavení příznakového bitu - byl stisk
KL4:    RET
;-----------------------------------------kontrola----------------------------

DEKod_pismena: CJNE A,#0E7H,DEK13
    MOV A,#12    ;stisknuta A (displej U)
    JMP DEK_EN
DEK13:    CJNE A,#0D7H,DEK14
    MOV A,#13    ;stisknuta B (displej d)
    JMP DEK_END
DEK14:    CJNE A,#0B7H,DEK15
    MOV A,#14    ;stisknuta C (displej c)
    JMP DEK_EN
DEK15:    CJNE A,#77H,DEK_16
    MOV A,#15    ;stisknuta D (displej A)
    JMP DEK_EN
DEK_16:    CLR IDENT    ;chyby nalezeny, klávesnice neidentifikována
        JMP DEK_17
DEK_EN:SETB IDENT    ;klávesnice byly úspěšně identifikovány
DEK_17: RET
;--------------doked pismena-------------------------
DEKOD:    CJNE A,#7DH,DEK1
    MOV A,#0    ;stisknuta 0
    JMP DEK_END    ;konec analýzy
DEK1:    CJNE A,#0EEH,DEK2
    MOV A,#1    ;stisknuta 1
    JMP DEK_END
DEK2:    CJNE A,#0EDH,DEK3
    MOV A,#2    ;stisknuta 2
    JMP DEK_END
DEK3:    CJNE A,#0EBH,DEK4
    MOV A,#3    ;stisknuta 3
    JMP DEK_END
DEK4:    CJNE A,#0DEH,DEK5
    MOV A,#4    ;stisknuta 4
    JMP DEK_END
DEK5:    CJNE A,#0DDH,DEK6
    MOV A,#5    ;stisknuta 5
    JMP DEK_END
DEK6:    CJNE A,#0DBH,DEK7
    MOV A,#6    ;stisknuta 6
    JMP DEK_END
DEK7:    CJNE A,#0BEH,DEK8
    MOV A,#7    ;stisknuta 7
    JMP DEK_END
DEK8:    CJNE A,#0BDH,DEK9
    MOV A,#8    ;stisknuta 8
    JMP DEK_END
DEK9:    CJNE A,#0BBH,DEK_20
    MOV A,#9    ;stisknuta 9
    JMP DEK_END
DEK_20:    CLR IDENT    ;chyby nalezeny, klávesnice neidentifikována
        JMP DEK_21
DEK_END:SETB IDENT    ;klávesnice byly úspěšně identifikovány
DEK_21: RET
;------------dekod cisla---------------------------
DISPLEJ:CLR CLK        ;CLK
    SETB BLANK    ;zablokování anod
    MOV R6,#5    ;počet míst displeje

    MOV R0,#JED    ;ukazatel videopaměti
DIS4:    MOV A,@R0    ;číslo do ACC
    MOV R7,#5    ;počet rotací (posuvný registr displeje je 5bitový)
DIS1:    RRC A        ;rotace přes CARRY
    MOV DAT,C    ;bit na port
    SETB CLK    ;čele posunovacího pulzu
    CLR CLK        ;týl posunovacího pulzu
    DJNZ R7,DIS1    ;kontrola počtu rotací
    DJNZ R6,DIS2    ;kontrola počtu odeslaných znaků
    CLR BLANK    ;odblokování anod
    JMP DIS3
DIS2:    DEC R0        ;posuv ukazatele na další znak
    JMP DIS4
DIS3:    RET

;------------- Zpoždění -----------------------------

;Podprogram DELAY má zpoždění asi 65 ms (pro f = 12 MHz)

DELAY:    MOV R0,#255
DEL1:    MOV R1,#255
    DJNZ R1,$
    DJNZ R0,DEL1
    RET
        BACK:     MOV A,POCET


    END

ALE NWM KAm to zaradit

Nahlásit jako SPAM
IP: 77.48.31.–
lucie
~ Anonymní uživatel
33 příspěvků
7. 6. 2017   #59
-
0
-


#56 hlucheucho
my jsme se asi nepochopili.. protoze ja potrebuji dat prvni pismeno a pak abyto skocilo na cisla a tech musi byt 5 tak ze ne zeby ro zaCINALO A5897 treba ale aby se stiknulo A apak aby si napsalo toheslo

Nahlásit jako SPAM
IP: 77.48.31.–
hlucheucho+13
Posthunter
7. 6. 2017   #60
-
0
-

Když se stiskne B tak to má dělat co?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
lucie
~ Anonymní uživatel
33 příspěvků
7. 6. 2017   #61
-
0
-

tak jinak :D

proste kdyz zmacknu a tak se ma zadat heslo 5 mistne (maji se uakzovat jen pomlcky ale to se doladi)

tak ze kdyz zapojim program zmacknu (treba) A a pak to to po mne bude chtit heslo (treba 58963) a pak to zablika za houka ( to houkani neresim) a pokud to heslo bude spatny nezablika to a jen dlouze za houka

tak že ja jednoduse potrebuji abych mohla dat heslo na A

Nahlásit jako SPAM
IP: 77.48.31.–
hlucheucho+13
Posthunter
7. 6. 2017   #62
-
0
-

a když na jiným písmenu nemám jinou funkci, tak to A může být součást kódu. 

Pokud jsou A, B, C, D ... funkční klávesy a oprávnění k funkci se potvrzuje PINem bude záležet na tom, jak složitý je systém řízení oprávnění. V případě, že PIN může spustit kteroukoliv funkci, pak se to načte do paměti jako 6 znaků, 1 - 5 znak je PIN - ten se porovná již popsaným způsobem a v případě platného PINu se podle prvního znaku určí funkce, která se má spustit. V případě, že každá funkce má samostatně svůj PIN, pak je strategie "kód funkční klávesy je součástí PINu" na místě. Alternativní postup je pro funkční klávesu vybírat muster pro platný PIN např. tak, že se pomocí několika instrukcí CJNE zjistí, která funkční klávesa byla stisknuta. Pokud některé funkce PIN nevyžadují, pak je třeba nejdřív rozpoznat zvolenou funkci a podle toho zvolit další postup.

Vhodná strategie by vyplynula z úplného zadání. Stavový automat který přijímá vstup od uživatele může být různě složitý. Zvolil jsem jednoduchou ukázku, jak by to mohlo vypadat.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
peter
~ Anonymní uživatel
2871 příspěvků
7. 6. 2017   #63
-
0
-

#60 hlucheucho
'Když se stiskne B tak to má dělat co?'
';před vkládáním hesla stisknuto žádné písmeno, zámek nereaguje.' ...

Chapu to tak, ze kod vypada
jakekoliv pismeno + cisla
jakekoliv pismeno = start zadavani hesla
cisla bez pismene ignorace
pismeno + cisla prerusena pismenem, ignorace pismen pri zadavani cisel

Co by bylo super zpestreni, kdyby se reklo, ze 1. a 4. (01234) te cislo (z peti cisel) bude seed, nahodne nebo 1 - narustajici, 4 - klesajici. Takze by to treba ignorovalo predesly kod.
31227 - prvni kod
3x22y - x+1, y-1, 32226 novy platny kod
Pripadne by se odvijela rotace od nejakeho cisla na obrazovce, pro jistotu, kdybys omylem zadal kod.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:bcde:c4...–
MilanL+1
Super člen
7. 6. 2017   #64
-
0
-

#62 hlucheucho
HU - co použít offsety?

šlo by to třeba nějak takhle?

KODA:
  db C1,C2,C3,C4,C5	//Pin A
  db OkA		//výpočtem relativní skok na obsluhu správného kodu A
  db ErrA		//výpočtem relativní skok na obsluhu chyby A
  db 00                 //doplnění na 8
KODB:
  db C1,C2,C3,C4,C5	//Pin B	
  db OkB
  db ErrB	
  db 00
KODC: - // -
KODD: - // -	

..

Test:
   MOV  R0, #Vstup	//přečtě první znak - Písmeno A..D
   MOV  DPTR, #KODA	//začátek tabulky PINu, KODA jako první
   SUBB A, #kodznaku A  //kod znaku 11-15 viz kod detekce kláves převede na 0-4
   RL   A
   RL   A               // A*8, získání offsetu v tabulce kodu
   MOV  R1, A		// Offset dle Písmena
   MOV  R7, 00          // Offset na data PINu
   INC  R0

comp:
   MOV  A, R1		// A=Offset dle Písmena
   ADD  A, R7           // + Offset dle pořadí čísel
   MOVC	A, @A+DPTR      // načte kod z tabulky
   XRL  A, @R0          // porovná s načteným kodem
   JNZ  Chyba	
   INC  R0
   INC  R7
   CJNE	R7, #05h, comp  // opakuj comp dokud nezkontrojuješ všechny čísla PINu  
   MOV  A, R1		// A=Offset dle Písmena
   ADD  A, R7           // + Offset OK
   MOVC	A, @A+DPTR      // načte offset skoku z tabulky
   JMP  @A+DPTR
Chyba:
   INC  R7
   CJNE	R7, #06h, comp  // přeskoč zbytek kodu a offset OK  
   MOV  A, R1		// A=Offset dle Písmena
   ADD  A, R7           // + Offset Chyba
   MOVC	A, @A+DPTR      // načte offset skoku z tabulky
   JMP  @A+DPTR  
Nahlásit jako SPAM
IP: 185.112.167.–
lucie
~ Anonymní uživatel
33 příspěvků
8. 6. 2017   #65
-
0
-

#65 MilanL
:O vyzkousim:) alejak jste na to tak prisel ?

Nahlásit jako SPAM
IP: 77.48.31.–
MilanL+1
Super člen
8. 6. 2017   #66
-
0
-

#66 lucie
Pozor abys to správně pochopila:

1) mov R0, #Vstup  - mělo by ukazovat do paměti, kde je již uložená celá zadávaná sekvence, na zadání si musíš udělat vlastní funkci, šlo by to udělat i dynamicky kontrolovat každý stisk kláves, ale přešlo by to na chybu hned v okamžiku výskytu, tzn nešlo by opravovat vstup.

2) v ErrX a OkX by se měl nacházet relativní posun obslužné funkce vůči adrese KODX, vzhledem k rozsahu Byte by měl li být ty chybové a OK funkce hned za tabulkou nebo za tabulkou kodů mít druhou tabulku jumpů a v ErrX a OkX mít pořadí skoku.

Vzhledem k tomu že nevím zda tvůj překladač umí vypočítat rozdíl adres v 8-bitovém kodu, EQU je podle toho co jsem našel 16 nebo 32 bitový, tak ten můj kod je spíš pro druhou variantu.

Pro první první variantu s 16bit EQU, nebo jumpinstrukcí by byl třeba 1 byte navíc v záznamu a jeden Inc R7 u chyby,  aby to přeskočilo 2Byty OK adresy.

Ten můj kod upravím na ty skoky po 15h až dojdu domů z práce ted na to nemám dost klidu.

Nahlásit jako SPAM
IP: 91.139.9.–
MilanL+1
Super člen
8. 6. 2017   #67
-
0
-

tak jsem přišel na to jak použít EQU 

VSTUP	DATA	30h         //Místo pro uložení vstupu z klávesnice v RAM

OFFSETOkA:   equ OkA-KODA
OFFSETErrA:  equ ErrA-KODA
OFFSETOkB:   equ OkA-KODB   //provede stejnou funkci jako pro kod A -je třeba zkrátit offset
OFFSETErrB:  equ ErrB-KODB

KODA:
  db C1,C2,C3,C4,C5	//Pin A
  db low(OFFSETOkA)	//výpočtem relativní skok na obsluhu správného kodu A
  db low(OFFSETErrA)	//výpočtem relativní skok na obsluhu chyby A
  db 00                 //doplnění na 8
KODB:
  db C1,C2,C3,C4,C5	//Pin B	
  db low(OFFSETOkB)
  db low(OFFSETErrB)	// možná by šlo i přímo low(ErrB-KODB)
  db 00
KODC: - // -
KODD: - // -	

OkA: 			// místo v programu kam skočí A i B při PIN OK
   ACALL Zablikej
ErrA:			// místo v programu kam skočí při A+chybný PIN
   ACALL Pípni
   RET			// návrat do Main smyčky
ErrB:			// místo v programu kam skočí při B+chybný PIN
   ACALL Sirena
   RET
..
 
// zbytek bez změny

Test:
   MOV  R0, #Vstup	//přečtě první znak - Písmeno A..D
   MOV  DPTR, #KODA	//začátek tabulky PINu, KODA jako první
   SUBB A, #kodznaku A  //kod znaku 11-15 viz kod detekce kláves převede na 0-4
   RL   A
   RL   A               // A*8, získání offsetu v tabulce kodu
   MOV  R1, A		// Offset dle Písmena
   MOV  R7, 00          // Offset na data PINu
   INC  R0

comp:
   MOV  A, R1		// A=Offset dle Písmena
   ADD  A, R7           // + Offset dle pořadí čísel
   MOVC	A, @A+DPTR      // načte kod z tabulky
   XRL  A, @R0          // porovná s načteným kodem
   JNZ  Chyba	
   INC  R0
   INC  R7
   CJNE	R7, #05h, comp  // opakuj comp dokud nezkontrojuješ všechny čísla PINu  
   MOV  A, R1		// A=Offset dle Písmena
   ADD  A, R7           // + Offset OK
   MOVC	A, @A+DPTR      // načte offset skoku z tabulky
   JMP  @A+DPTR
Chyba:
   INC  R7
   CJNE	R7, #06h, chyba // přeskoč zbytek kodu a offset OK  
   MOV  A, R1		// A=Offset dle Písmena
   ADD  A, R7           // + Offset Chyba
   MOVC	A, @A+DPTR      // načte offset skoku z tabulky
   JMP  @A+DPTR  

důležité také je zkusit pochopit to fungování

pozor zjistil jsem, že v původním kodu byla chyba, v 2 řádce pod návěštím Chyba, neměl být skok na comp, ale na Chyba, aby jen ukazatel v R7 došel na položku s offsetem na ERR, chybka vznikla zkopírováním.

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Super člen
8. 6. 2017   #68
-
0
-

#68 MilanL
ještě by šla udělat menší optimalizace části za cjne jsou stejné, tak po jednom by šlo dát návěští a po druhém na něj skočit je tam jen rozdíl v hodnotě R7 při OK bude 5 a při chyba dojde na 6 (od místa v pinu, kde vznikla chyba to v tom chyba cyklu posune ukazatel až na místo s Err). 

   CJNE	R7, #05h, comp  // opakuj comp dokud nezkontrojuješ všechny čísla PINu  
   SJMP TestEnd
Chyba:
   INC  R7
   CJNE	R7, #06h, chyba // přeskoč zbytek kodu a offset OK  
TestEnd:
   MOV  A, R1		// A=Offset dle Písmena
   ADD  A, R7           // + Offset Chyba
   MOVC	A, @A+DPTR      // načte offset skoku z tabulky
   JMP  @A+DPTR  

HEH na to že s MCU nedělám, se mi to myslím celkem povedlo.

Nahlásit jako SPAM
IP: 185.112.167.–
lucie
~ Anonymní uživatel
33 příspěvků
8. 6. 2017   #69
-
0
-

#67 MilanL

To je jeste tezsi nez mi rikali nez pres nejake registrove banky :) ale zkusim to tam dat... musi  se tam jeste neco upracvit ?

Nahlásit jako SPAM
IP: 77.48.31.–
lucie
~ Anonymní uživatel
33 příspěvků
8. 6. 2017   #70
-
0
-

Ale ja ten kod nedam do tohodle ne ?

KLAV    EQU    P2    ;port s klávesnicí
DISP    EQU    P0    ;port s displejem
MARK    EQU    6CH    ;ukazatel videoRAM
JED    EQU    35H    ;registr jednotek
DES    EQU    34H    ;registr desítek
STO    EQU    33H    ;registr stovek
TIS    EQU    32H    ;registr tisíců
DIS    EQU    31H    ;registr desítek tisíc

DAT    EQU    DISP.0    ;data pro displej
CLK    EQU    DISP.1    ;hodiny pro displej
BLANK    EQU    DISP.2    ;strobovací pulzy pro displej
STISK    BIT    6CH    ;byl zachycen stisk
IDENT    BIT    6EH    ;klávesa byla rozpoznána
POCET    EQU    36H
VSTUP    DATA    30H


;Nulování VIDEORAM

ZAC:    MOV JED,#0
    MOV DES,#0
    MOV STO,#0
    MOV TIS,#0
    MOV DIS,#0

    JMP HLAVNI1
start_pismeno: jmp hlavni1
        jmp start_cislo
start_cislo: jmp hlavni0
    jmp start_cislo


    
HLAVNI1:CALL TEST    ;test klávesnice
    JNB STISK,HLAVNI1;nebyl-li stisk, opakuj test
    CALL DEKOD_pismena    ;dekódování SCAN kódu
    JNB IDENT,HLAVNI1;kontrola
    ORL A,#10H    ;aktivizace znaku (v 5. bitu H)
    MOV DIS,A    ;znak na pozici desítek
    CALL DISPLEJ    ;zobrazení znaku
    CALL DELAY    ;podržení znaku na displeji
    CLR STISK

    JMP start_cislo
;------------------------------------------------------------pismeno-----------------

HLAVNI0:CALL TEST    ;test klávesnice
    JNB STISK,HLAVNI0;nebyl-li stisk, opakuj test
    CALL DEKOD    ;dekódování SCAN kódu
    JNB IDENT,HLAVNI0;kontrola
    ORL A,#10H    ;aktivizace znaku (v 5. bitu H)
    MOV DIS,A    ;znak na pozici desítek
    CALL DISPLEJ    ;zobrazení znaku
    CALL DELAY    ;podržení znaku na displeji
    CLR STISK


HLAVNI2:CALL TEST    ;test klávesnice
    JNB STISK,HLAVNI2;nebyl-li stisk, opakuj test
    CALL DEKOD    ;dekódování SCAN kódu
    JNB IDENT,HLAVNI2;kontrola
    ORL A,#10H    ;aktivizace znaku (v 5. bitu H)
    MOV TIS,A    ;znak na pozici stovek
    CALL DISPLEJ    ;zobrazení znaku
    CALL DELAY    ;podržení znaku na displeji
    CLR STISK

HLAVNI3:CALL TEST    ;test klávesnice
    JNB STISK,HLAVNI3;nebyl-li stisk, opakuj test
    CALL DEKOD    ;dekódování SCAN kódu
    JNB IDENT,HLAVNI3;kontrola
    ORL A,#10H    ;aktivizace znaku (v 5. bitu H)
    MOV STO,A    ;znak na pozici tisíc
    CALL DISPLEJ    ;zobrazení znaku
    CALL DELAY    ;podržení znaku na displeji
    CLR STISK


HLAVNI4:CALL TEST    ;test klávesnice
    JNB STISK,HLAVNI4;nebyl-li stisk, opakuj test
    CALL DEKOD    ;dekódování SCAN kódu
    JNB IDENT,HLAVNI4;kontrola
    ORL A,#10H    ;aktivizace znaku (v 5. bitu H)
    MOV DES,A    ;znak na pozici deset tisíc
    CALL DISPLEJ    ;zobrazení znaku
    CALL DELAY    ;podržení znaku na displeji
    CLR STISK

    
HLAVNI5:CALL TEST    ;test klávesnice
    JNB STISK,HLAVNI5;nebyl-li stisk, opakuj test
    CALL DEKOD    ;dekódování SCAN kódu
    JNB IDENT,HLAVNI5;kontrola
    ORL A,#10H    ;aktivizace znaku (v 5. bitu H)
    MOV JED,A    ;znak na pozici deset tisíc
    CALL DISPLEJ    ;zobrazení znaku
    CALL DELAY    ;podržení znaku na displeji
    CLR STISK
    JMP hlavni0
;----------------------cisla---------------
TEST:    MOV R7,#4    ;počet rotací
    MOV A,#0F7H    ;příprava testovacího slova (11110111)
KL2:    MOV KLAV,A    ;pro 1. sloupec
KL5:    CJNE A,KLAV,KL3    ;byl zachycen stisk, sejmi SCAN a konec
    DJNZ R7,KL1    ;byly otestovány všechny sloupce?
    CLR STISK    ;vynulování příznakového bitu - nebyl stisk
    JMP KL4        ;byly otestovány všechny sloupce - konec testu
KL1:    RR A        ;pochodující 0 na další sloupec
    JMP KL2        ;test dalšího sloupce
KL3:    MOV A,KLAV    ;sejmutí SCAN kódu
    SETB STISK    ;nastavení příznakového bitu - byl stisk
KL4:    RET
;-----------------------------------------kontrola----------------------------

DEKod_pismena: CJNE A,#0E7H,DEK13
    MOV A,#12    ;stisknuta A (displej U)
    JMP DEK_EN
DEK13:    CJNE A,#0D7H,DEK14
    MOV A,#13    ;stisknuta B (displej d)
    JMP DEK_END
DEK14:    CJNE A,#0B7H,DEK15
    MOV A,#14    ;stisknuta C (displej c)
    JMP DEK_EN
DEK15:    CJNE A,#77H,DEK_16
    MOV A,#15    ;stisknuta D (displej A)
    JMP DEK_EN
DEK_16:    CLR IDENT    ;chyby nalezeny, klávesnice neidentifikována
        JMP DEK_17
DEK_EN:SETB IDENT    ;klávesnice byly úspěšně identifikovány
DEK_17: RET
;--------------doked pismena-------------------------
DEKOD:    CJNE A,#7DH,DEK1
    MOV A,#0    ;stisknuta 0
    JMP DEK_END    ;konec analýzy
DEK1:    CJNE A,#0EEH,DEK2
    MOV A,#1    ;stisknuta 1
    JMP DEK_END
DEK2:    CJNE A,#0EDH,DEK3
    MOV A,#2    ;stisknuta 2
    JMP DEK_END
DEK3:    CJNE A,#0EBH,DEK4
    MOV A,#3    ;stisknuta 3
    JMP DEK_END
DEK4:    CJNE A,#0DEH,DEK5
    MOV A,#4    ;stisknuta 4
    JMP DEK_END
DEK5:    CJNE A,#0DDH,DEK6
    MOV A,#5    ;stisknuta 5
    JMP DEK_END
DEK6:    CJNE A,#0DBH,DEK7
    MOV A,#6    ;stisknuta 6
    JMP DEK_END
DEK7:    CJNE A,#0BEH,DEK8
    MOV A,#7    ;stisknuta 7
    JMP DEK_END
DEK8:    CJNE A,#0BDH,DEK9
    MOV A,#8    ;stisknuta 8
    JMP DEK_END
DEK9:    CJNE A,#0BBH,DEK_20
    MOV A,#9    ;stisknuta 9
    JMP DEK_END
DEK_20:    CLR IDENT    ;chyby nalezeny, klávesnice neidentifikována
        JMP DEK_21
DEK_END:SETB IDENT    ;klávesnice byly úspěšně identifikovány
DEK_21: RET
;------------dekod cisla---------------------------
DISPLEJ:CLR CLK        ;CLK
    SETB BLANK    ;zablokování anod
    MOV R6,#5    ;počet míst displeje

    MOV R0,#JED    ;ukazatel videopaměti
DIS4:    MOV A,@R0    ;číslo do ACC
    MOV R7,#5    ;počet rotací (posuvný registr displeje je 5bitový)
DIS1:    RRC A        ;rotace přes CARRY
    MOV DAT,C    ;bit na port
    SETB CLK    ;čele posunovacího pulzu
    CLR CLK        ;týl posunovacího pulzu
    DJNZ R7,DIS1    ;kontrola počtu rotací
    DJNZ R6,DIS2    ;kontrola počtu odeslaných znaků
    CLR BLANK    ;odblokování anod
    JMP DIS3
DIS2:    DEC R0        ;posuv ukazatele na další znak
    JMP DIS4
DIS3:    RET

;------------- Zpoždění -----------------------------

;Podprogram DELAY má zpoždění asi 65 ms (pro f = 12 MHz)

DELAY:    MOV R0,#255
DEL1:    MOV R1,#255
    DJNZ R1,$
    DJNZ R0,DEL1
    RET
        BACK:     MOV A,POCET


    END

Nahlásit jako SPAM
IP: 77.48.31.–
MilanL+1
Super člen
8. 6. 2017   #71
-
0
-

#70 lucie
ten kod testu je celý a měl by fungovat, třeba je dodělat podle vzoru tu tabulku a doplnit případně ty funkce po správném a chybném zadání PINu.

Kdyby to blblo tak mám ještě 2 další varianty jádro bude stejné, jen minimální rozdíly v kodu funkce Test 3-4 řádky navíc a trošku pozměněná ta řídící tabulka.

To použití registrových bank máš v zadání nebo ti to jen někdo radil? Tam Jde jen o to, že 8051.. mají 4 registrové banky po 8 registrech R0-7, přepínají se přes bity 3 a 4 registru PSW, přes to bych to neřešil to se hodí spíš pro situace kdy potřebuješ zachovat nějaký stavy v registrech pro použití např v jiné části programu,


Nahlásit jako SPAM
IP: 185.112.167.–
lucie
~ Anonymní uživatel
33 příspěvků
8. 6. 2017   #72
-
0
-

#72 MilanL
Nekdo mi to radil..

Jaka tabulka ??

Nahlásit jako SPAM
IP: 77.48.31.–
MilanL+1
Super člen
8. 6. 2017   #73
-
0
-

#72 MilanL
koukal jsem na to zadání, tohle by se tam ještě v té první části mělo otestovat.

Jestliže nebylo před vkládáním hesla stisknuto žádné písmeno, zámek nereaguje.

Na vložení do toho tvého pouze názvy labelů, aby se ti neopakovali.

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Super člen
8. 6. 2017   #74
-
0
-

navíc ten tvůj kod je pěknej maglajz, až na 2 drobnosti které se dají ošetřit tam máš 6x stejnej kod všechny labely HLAVNIx a dekodování kláves by se taky dalo nejspíš optimalizovat.

Do kdy to máš odevzdat?

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Super člen
8. 6. 2017   #75
-
0
-

#75 MilanL
opraveno odladěno, bylo tam pár věcí co nefungovali a asi 2 chybky bo jsem pro 8051 zatím nikdy nic nedělal a tak jsem nevěděl jaké používá typové konvence. 

Odladěno v simulátoru, procedura Napln je pouze na testování funkčnosti, naplní nějaká data, odhalil jsem tím např, že jsem ten ukazatel na písmena násobil jen 4 místo 8 a také, že kvůli DPTR=KODA musí být ty Offsety relativních adres skoků na funkce při OK a chybě počítány k té adrese KODA

VSTUP DATA 30h         ;Místo pro uložení vstupu z klávesnice v RAM

ZnA      EQU 12H

  AJMP START
ORG  40H
START:
  ACALL Napln
  ACALL PINtest
  RET $

; TABULKA  PINu a relativních skoků, všechny skoky jsou třeba počítat relativne vuci KODA (v DPTR)
KODA:
  db 1,1,1,1,1 ;Pin A = 11111
  db OkA-KODA
  db ErrA-KODA
  db 00
KODB:
  db 1,2,3,4,5 ;Pin B = 12345
  db OkA-KODA            ;pin B = OK volá stejný kod jako u A
  db ErrB-KODA 
  db 00
;KODC: - ; -
;KODD: - ; - 

OkA:    ; místo v programu kam skočí A i B při PIN OK
   ACALL Zablikej
ErrA:   ; místo v programu kam skočí při A+chybný PIN
   ACALL Pipni
   RET   ; návrat do Main smyčky
ErrB:   ; místo v programu kam skočí při B+chybný PIN
   ACALL Sirena
   RET

Zablikej:
Pipni:
Sirena:
   RET
;..
 
; zbytek bez změny

Napln:
   MOV  R0, #Vstup
   MOV  @R0, #13H
   INC  R0
   MOV  @R0, #1
   INC  R0
   MOV  @R0, #2
   INC  R0
   MOV  @R0, #1
   INC  R0
   MOV  @R0, #1
   INC  R0
   MOV  @R0, #1
   RET

PINTest:
   MOV  R0, #Vstup ;nastaví R0 jako ukazatel na načtená data
   MOV  DPTR, #KODA ;začátek tabulky PINu, KODA jako první
   MOV  A,@R0      ;načte první znak z načtených dat   SUBB A, #ZnA ;kod znaku 11-15 viz kod detekce kláves převede na 0-4
   RL   A
   RL   A
   RL   A               ; A*8, získání offsetu v tabulce kodu
   MOV  R1, A  ; Offset dle Písmena
   MOV  R7, #0          ; Offset na data PINu
   INC  R0

PINcomp:
   MOV  A, R1  ; A=Offset dle Písmena
   ADD  A, R7           ; + Offset dle pořadí čísel
   MOVC A, @A+DPTR      ; načte kod z tabulky
   XRL  A, @R0          ; porovná s načteným kodem
   JNZ  PINchyba 
   INC  R0
   INC  R7
   CJNE R7, #05h, PINcomp  ; opakuj comp dokud nezkontrojuješ všechny čísla PINu
   SJMP PINend 
PINchyba:
   INC  R7
   CJNE R7, #06h, PINchyba ; přeskoč zbytek kodu a offset OK
PINend:  
   MOV  A, R1  ; A=Offset dle Písmena
   ADD  A, R7           ; + Offset Chyba nebo OK
   MOVC A, @A+DPTR      ; načte offset skoku z tabulky
   JMP  @A+DPTR

pozor na tu vzdálenost těch obsluh OK a CHYBA kod musí být minimalizován rozdíl nesmí překročit 255 bajtů kodu, tzn radši udělat krátkej kod s CALLy nebo JUMPy pokud by to mělo výrazně narůst.

v podstatě by to mělo jít přidat do toho tvého Programu pokud ti funguje to zadávání kodu jen vyhod Jump na START  a subrutiny Start a Napln, a do toho tvého kodu  do hlavní smyčky nebo na konec vstupní procedury dej skok na PINtest.

Předpokládám, že doplnění funkcí pro správné kody a chyby už si nějak uděláš a to samé podle vzoru pro další písmena (tam hlavně stejná struktura 5 bytů pin, pak po 1 bytu pro 2 offsety na jumpy a 1 byte zarovnání na 8, kvůli výpočtu offsetu podle písmene)

DPTR KODA

načtený znak- znak A => 0-3 * 8 => (0,8,16,24) =>OFFset v tAbulce podle písmene k tomu pak offset pořadí , je to vidět v kodu viz komentáře v kodu.

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Super člen
8. 6. 2017   #76
-
0
-

#76 MilanL

do té první části testu, po načtení 1. znaku ze vstupu (3řádek) tak je tam třeba udělat test zda je to písmeno kod by měl být v rozsahu 12H(písm.A)-15H(písm.D).

Škoda že to nemáš v tom dekodování přiřazený v desítkový, 12D-15D by se odhalilo snadněji tam by stačil AND 12D bo to je dvojkově ve 4bitech 1100 a 13-15 mění ty zbylé 2 bity, takže čísla 12D až15D AND 12D = 12D

Hlavně si to prostuduj at víš co se v tom programu, kdy dělá jakou má každá část a registr funkci, kdyby po tobě chtěl prófa vysvětlení.

podívám se ti ještě na dekodování tý klávesnice, nemyslím že by to bylo stavěný aby to bylo tak složitý. přinejhorším by to šlo také pomocí tabulky.

Nahlásit jako SPAM
IP: 185.112.167.–
lucie
~ Anonymní uživatel
33 příspěvků
8. 6. 2017   #77
-
0
-

mno jasny ja vbychazim ztoho co jsme programovali :) zitra vyzjkousim :)

Nahlásit jako SPAM
IP: 77.48.31.–
MilanL+1
Super člen
8. 6. 2017   #78
-
0
-

#78 lucie
koukal jsem na tu klávesnici detekce písmena čísla je jednoduchá bit 3 počítáno od 0 pokud je 1 je to číslo pokud je 0  je to písmeno.blbý je, že mě z toho binárního vyjádření kodů kláves nenapadá výpočet (sekvence operací) na přiřazení hodnoty, takže nejjednodušší by bylo použít tabulku s kody.kláves, připravím a testnu rutinu, až bude fungovat postnu abych zas X krát nepředělával a neopravoval.

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Super člen
8. 6. 2017   #79
-
0
-

#78 lucie
rutina dekoduj klávesu (kody A-D 12-15 desítkově 0C-0F Hexa (0000 1100-0000 1111)  - pro snadnější pozdější identifikaci a rozpoznání písmene.

TABKEYS:
  db 07DH, 0EEH, 0EDH, 0EBH     ; klávesy 0-3
  db 0DEH, 0DDH, 0DBH, 0BEH     ; 4-7
  db 0BDH, 0BBH, 000H, 000H      ; 8-9, prázdné pozice 10,11 - lze využít pro kody dalších tlačítek
  db 0E7H, 0D7H, 0B7H, 077H      ; pozize 12-15 písmena A-D - pro jednodušší test zda je písmeno

Dekod_key:                   ; v A vstupuje kod klávesy
  MOV  R7, A                 ; uložení kodu klávesy do R7 bo s A se bude pracovat 
  MOV  DPTR,#TABKEYS
  MOV  R6, #0                ; R6 slouží jako offsetový ukazatel pozice v TABKEYS
Dekod_repeat:
  MOV  A, R6                 ; Relativní ukazatel do A
  MOVC A, @A+DPTR            ; načti kod znaku z relativní pozice
  XRL  A, R7                 ; porovnej s kodem vstupu
  JZ   Dekod_ident           ; skok na obsluhu nalezení kodu
  INC  R6                    ; posun offset ukazatel další kod v tabulce
  CJNE R6,#10H, Dekod_repeat    ; pokud nejsi na konci tabulky opakuj cyklus
  CLR  IDENT                    ; Klávesa nerozpoznána
  MOV  A, R7                    ; vrat do A kod Klávesy
  RET
Dekod_ident:
  SETB IDENT
  MOV A, R6        ; relativní pozice kodu znaku v tabulce urcuje návratovou hodnotu "0"=0, "9"=9, "A"=12,"D"=15 desítkove
  RET
Nahlásit jako SPAM
IP: 185.112.167.–
hlucheucho+13
Posthunter
9. 6. 2017   #80
-
0
-

#79 MilanL
Dát jí hotový kód má jednu chybu. Až ji pan učitel bude zkoušet, nebude vědět, která bije. Pak i s funkčním kódem dostane nedostatečnou. Osobně si myslím, že zkopírovat sem zadání by na nedostatečnou nebylo, ale opsat hotové řešení bez pochopení věci ano.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
MilanL+1
Super člen
9. 6. 2017   #81
-
0
-

#81 hlucheucho
já vím několikrát jsem jí psal, aby si ten kod podrobně prozkoumala.

stejně by mě zajímalo co je to za školu, že jim jde tolik o programování v ASM, ikdyž jsem ze školy pár let, takovéhle projekty jsme za mých časů obvykle dělali ve dvojicích nebo trojicích, jsem dělal před 30 lety spojařinu, měli jsme programování a mikroprocesorovou techniku, ale nebylo to tak přísný, přeci jen se obvykle používá spíš C. U ASM šlo spíš o pochopení jak pracuje procesor (registry, pamět, periferie, zpracování kodu v něm).

Mě to kamarád na začátku učil jako, že registry a pamět jsou v podstatě šuplíky s 1 místem a když do něj něco dáš to původní se ztratí, takže pro zachování je třeba si to někam uložit.

Spíš se měla zeptat a nechat si to vysvětlit a poradit od spolužáků, ale ne rady typu použij registrové banky, když ani neví co to je, je vidět jaký jsou dnes vztahy mezi mladejma, za mých časů když mě spolužák požádal tak jsem si s ním na 2-3h sedl a radila vysvětloval, to se dnes už moc nevidí. Chybí hlavně ochota, vidím to na svých neteřích, když dělá mladší úkoly tak brácha musí tu starší skoro dokopat k tomu, aby jí pomohla, nebo jí pomoct sám.

Nahlásit jako SPAM
IP: 185.112.167.–
MilanL+1
Super člen
9. 6. 2017   #82
-
0
-

u programování ASM je třeba se jen přizpůsobit tomu, že je omezený počet registrů jejich možnosti a omezení , i když cca 90% věcí lze provádět se všemi registry, tak na některé věci je možno použít jen daný konkrétní registr,

#78 lucie
pokud tomu opravdu nebudeš rozumět, tak to můžu předělat hloupěji, bez těch relativních skoků a magie s kodem znaku, případně ti vedle můžu hodit jak by to vypadalo v jiném jazyce třeba C, pascal, java

Nahlásit jako SPAM
IP: 91.139.9.–
hlucheucho+13
Posthunter
9. 6. 2017   #83
-
0
-

#82 MilanL

Když si prostuduje hotový kód, bude si to pamatovat pár dnů. Když si na něčem vyláme zuby nebo nad něčím po dlouhé bitvě zvítězí, bude si to pamatovat do smrti. 

V prvé řadě je důležité začátečnikovi vysvětlit, že procesor je rychlý hloupý otrok bez vlastní intuice a inteligence, co se mu doslova neřekne, to neudělá. Vše bere doslova a tak je třeba to říci určitým způsobem. Je třeba vysvětlit a ukázat, jak úlohu rozebrat a sestavit algoritmus, ten pak "atomizovat". K tomu je třeba trochu rozvíjet fantazii (ono z těch několika desítek instrukcí jde udělat cokoliv, ale bez představivosti to nejde), umět si činnosti procesoru připodobnit k reálným situacím. 

Myslím, že v jejím případě veškerá magie a snaha o maximální efektivitu kódu je spíš na škodu. Je potřeba předložit kód, který byť "upachtěnou" cestou ale srozumitelněji dospěje k cíli. Kód, který vyloženě na první letmý pohled neříká, co dělá, může začátečníka spíše odradit.

Záleží na zaměření školy. Jestli jde o nějakou obecnou elektrotechniku nebo automatizaci, tak podrobná znalost assembleru k užitku není. Pokud je studovaný obor zaměřený na mikroprocesory, embedded  a/nebo real time aplikace, pak je podrobná znalost assembleru na místě. 

Další problém je způsob výuky. Hodin je málo, některým lidem těch 45 minut nestačí ani jako zahřívací kolo. Navíc nemají možnost si to pořádně  osahat. V tomto jsou ve výhodě koníčkáři kteří do toho investují nemalé peníze (nebo investují jejich rodiče) a hodně úsilí. Dále jsou lidé (např. já), kteří v "davovém" školení nefungují, ale při individuálním přístupu mají velmi dobré výsledky.

Dobré je, že si ten HW půjčila a chce se tomu více věnovat. Akorát by potřebovala někoho ve svém okolí, kdo by jí vedl. Pokud žádný spolužák nechce pomoci, možná by za to stálo poprosit pana učitele. Možná přišla sem, že ani učitel nechce pomoci.

Co se týče ochoty spolužáka vysvětlit jak to funguje: to souvisí s mezilidskými vztahy a atmosférou ve společnosti obecně. Ať si o 80 létech a komunismu můžeme myslet cokoliv, často mívám pocit, že lidé měli k sobě blíž, víc si pomáhali. Dnes je uštvaná doba kde "dolar je alfou i omegou".

hu

Nahlásit jako SPAM
IP: 195.178.67.–
lusie
~ Anonymní uživatel
14 příspěvků
9. 6. 2017   #84
-
0
-

#81 hlucheucho
Ja to prostuduji :) Tak ze nebude problem i kdyby z toho zkousel :) 

Nahlásit jako SPAM
IP: 217.197.144.–
MilanL+1
Super člen
9. 6. 2017   #85
-
0
-

#84 hlucheucho
Plně souhlasím, je to spíš moje chyba s tou snahou o efektivitu, chtělo by to jiný kontakt než forum, já jsem i ochotný pomoci přes FB, Skype chaty.

Nahlásit jako SPAM
IP: 91.139.9.–
lusie
~ Anonymní uživatel
14 příspěvků
9. 6. 2017   #86
-
0
-

#84 hlucheucho
Popravdě mate pravdu..  i pan ucitel nechce nebo spis nema cas. Byla jsem za nim nekolikrat a proste vzdy mi rekl ze mam tabulky.. Coz mi je docela k nicemu, protoze tomu moc nepobiram.. Ano ve škole nejsou vztahy jako na zakladce nebo tak , aby jsme si radili.. Spis kazdy se diva do mobilu a tak a nejak to neresi.. U nas jsou asik 4 lidi co to poradne pochopili ale i oni maji s tim to problem.. Nechapu proc nam ucitel dal tezky program kdyz to nikdo nepobral.. A ano ma pan Hlu pravdu protoze bych chtela pomoc i dale jeslti by mi to nekdo vysvetlil..I kdyz HW mam doma je mi to k nicemu kdyz na to hledim xx hodin a pak stejne neni zadny zaver ... Ale program prostuduji poradne ale bohuzem mam uz cas jen do 18.6. 

Nahlásit jako SPAM
IP: 217.197.144.–
lusie
~ Anonymní uživatel
14 příspěvků
9. 6. 2017   #87
-
0
-

#86 MilanL
Tak pokud chces muzeme fb i skype :) Ja jsem tu udavala email ale tam se neozval nikdo

Nahlásit jako SPAM
IP: 217.197.144.–
MilanL+1
Super člen
9. 6. 2017   #88
-
0
-

#85 lusie
no problém je v tom, že ti může dát jiné podobné zadání a bude zvědav jakým způsobem to budeš řešit.

Ono přeci jen to je už trošku vyšší úroveň.

V tom Dekodování znaku problém nevidím to je celkem primitivní procházení polem hodnot kláves a při nalezení vrátí pořadí v tabulce, které vlastně odpovídá té hodnotě znaku.

Nahlásit jako SPAM
IP: 91.139.9.–
hlucheucho+13
Posthunter
9. 6. 2017   #89
-
0
-

#88 lusie
Prozradím na sebe, že hlucheucho je jen jedno a má mail na seznamu, občas je na skype, častěji na xchatu.  A je kousek od Brna.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
lucie
~ Anonymní uživatel
33 příspěvků
10. 6. 2017   #90
-
0
-

#89 MilanL
jo dobre :)

Nahlásit jako SPAM
IP: 77.48.31.–
lucie
~ Anonymní uživatel
33 příspěvků
10. 6. 2017   #91
-
0
-

mam tak trochu zmatek v tech kodec -,- tak ktery mam ppouzit

Nahlásit jako SPAM
IP: 77.48.31.–
MilanL+1
Super člen
10. 6. 2017   #92
-
0
-

#92 lucie
#80 je zjednodušení dekodování kláves, pozor je tam menší změna písmena jsou 12-15 dekadicky kvůli jednodušímu převodu v tom testu pinu

pro test PIN ti to sem hodím znovu vyčištěný ještě s testem zda je na 1. místě opravdu kod písmene

VSTUP DATA 30h         ;Místo pro uložení vstupu z klávesnice v RAM

ZnA      EQU 12D       ; hodnota 12-15D pro písmena se lépe upraví a otestuje

ORG  40H

; TABULKA  PINu a relativních skoků, všechny skoky jsou třeba počítat relativne vuci KODA (v DPTR)
KODA:
  db 1,1,1,1,1 ;Pin A = 11111
  db OkA-KODA
  db ErrA-KODA
  db 00
KODB:
  db 1,2,3,4,5 ;Pin B = 12345
  db OkA-KODA            ;pin B = OK volá stejný kod jako u A
  db ErrB-KODA 
  db 00
;KODC: - ; -
;KODD: - ; - 

OkA:    ; místo v programu kam skočí A i B při PIN OK
   ACALL Zablikej
ErrA:   ; místo v programu kam skočí při A+chybný PIN
   ACALL Pipni
   RET   ; návrat do Main smyčky
ErrB:   ; místo v programu kam skočí při B+chybný PIN
   ACALL Sirena
   RET

Zablikej:
Pipni:
Sirena:
   RET


PINTest:
   MOV  R0, #Vstup ;nastaví R0 jako ukazatel na načtená data
   MOV  DPTR, #KODA ;začátek tabulky PINu, KODA jako první
   MOV  A,@R0      ;načte první znak z načtených dat

   ANL  A, #ZnA     ; 1.znak and 12 všechny 4 písmena mají 12D v binárním základu)
   CJNE A, #ZnA, KodNezacinaPismenem   ; skoč na ignoraci vstupu

   MOV  A,@R0      ;načte první znak z načtených dat
   SUBB A, #ZnA ;kod znaku 11-15 viz kod detekce kláves převede na 0-4
   RL   A
   RL   A
   RL   A               ; A*8, získání offsetu v tabulce kodu
   MOV  R1, A  ; Offset dle Písmena
   MOV  R7, #0          ; Offset na data PINu
   INC  R0              ; posun ukazatel vstupu na 1 číslo pinu
PINcomp:
   MOV  A, R1  ; A=Offset dle Písmena
   ADD  A, R7           ; + Offset dle pořadí čísel
   MOVC A, @A+DPTR      ; načte kod z tabulky
   XRL  A, @R0          ; porovná s načteným kodem
   JNZ  PINchyba 
   INC  R0              ; posun na další číslo pinu - Vstup
   INC  R7              ; posun na další číslo pinu - Tab.PINu
   CJNE R7, #05h, PINcomp  ; opakuj comp dokud nezkontrojuješ všechny čísla PINu
   SJMP PINend          ; R7 ukazuje na rel.skok OkX
PINchyba:
   INC  R7
   CJNE R7, #06h, PINchyba ; přeskoč zbytek kodu a offset OK
                        ; R7 ted ukazuje na rel.skok ErrX
PINend:  
   MOV  A, R1  ; A=Offset dle Písmena
   ADD  A, R7           ; + Offset Chyba nebo OK
   MOVC A, @A+DPTR      ; načte offset skoku z tabulky
   JMP  @A+DPTR         ; DPTR je adresa KODA
                        ; v A offset funkcí pro OK a ERR vůči KODA             

 


pokud použiješ ten svůj kod na dekodování kláves, tak si tam u písmen uprav ty hodnoty na 12D-15D, lepší by bylo si je nadefinovat na začátku jako mám ten ZnA EQU 12D, tak i další znaky a použít názvy v té dekodovací funkci.

Jinak posílal jsem ti meila, tak kdyby něco tak můžeš přes něj.

Nahlásit jako SPAM
IP: 185.112.167.–
lusie0
Newbie
10. 6. 2017   #93
-
0
-

#93 MilanL
Vím vím odpovídala jsem takkdzy tka tam

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

Přidej příspěvek

×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, 172 hostů

Podobná vlákna

8051 program — založil 01tom

8051 s IrDA — založil off01

8051 generování melodie — založil Johnny

 

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