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
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
1. napiš zadání
2. přidej kód, který jsi udělala
3. napiš, s čím je problém
hu
To si nemyslím, že by učitel měl problém s tím, že někdo poradil, co dělat
hu
#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
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
Po úpravě pro použitý překladač (Assembler EW8051, IAR Systems) kód otestován na AT89C51ED2, je funkční.
hu
#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
#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.
#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
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
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.
#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.
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
#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
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
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
#24 hlucheucho
Tohlek otmu jen mam
#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)
#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á.
#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
#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.
#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
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
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
#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.
#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
#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..
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
#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 ...
#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
#46 hlucheucho
našel jsem datasheet 347
http://www.datasheetarchive.de/dlmain/33547b989f992e9876c6484cfb3b041e3c532f/M/E347D
strana 22 - má tam některá písmena jiná a umí pomlčku - tedy spíš podtržítko
tak nevím asi ne jsou to debilové maj stejnou kodovací tabulku, ale vedle kde by měl bejt zobrazenej znak mají jiné znaky
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..
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
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
Tak by byl platný kód např B3719
PINB:db 42h, 33h, 37h, 31h, 39h
a porovnáš to úplně stejně s PINB.
hu
Ú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
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
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
Když se stiskne B tak to má dělat co?
hu
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
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
#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.
#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
#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.
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.
#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.
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
#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,
#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.
#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.
#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.
#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
#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
#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.
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
#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
#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.
#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.
#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.
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku