Ha szívesen korrepetálnál, hozd létre magántanár profilodat itt.
Ha diák vagy és korrepetálásra van szükséged, akkor regisztrálj be és írd meg itt, hogy milyen tantárgyban!
Valaki tudna segíteni?
elektronika95{ Elismert } kérdése
544
Assembly programozásból van 2 feladat, amit nem nagyon értek:
1. feladat:
Készítsen programot, amely „futófényt” állít elő a következőképpen!
A bal szélső és a jobb szélső LED világít kezdetben, majd 1 helyiértékkel léptetünk mindig balra.
A késleltetést a TIMER1 segítségével „szoftveresen” oldja meg!
Ha a nyomógombot lenyomja, akkor álljon meg a fény! Mindaddig álljon a fény, amíg nyomva tartja a nyomógombot. Ha a nyomógombot elengedi, akkor induljon tovább a fény! A nyomógombot „szoftveresen” kezelje!
2.feladat:
Adott egy 10 elemű tömb a memóriában adattáblában tárolva.
Töltse át az adattábla tartalmát egy másik adatmemória területre!
Alakítsa át úgy a tömbelemeket, hogy minden tömbelem páros legyen!
Az átalakított tömbelemeket írja ki a LED sorra!
A feladatmegoldás során indirekt címzéssel dolgozzon!
Jelenleg 1 felhasználó nézi ezt a kérdést.
0
Felsőoktatás / Egyéb
Válaszok
1
AlBundy{ Polihisztor }
válasza
Hát ez a kérdés így nagyon lóg a levegőben... Milyen mikrokontrollerről van szó? Az oké, hogy Assemblyben kell dolgozni, de azért nagyon nem mindegy, hogy x86 vagy valami 8 bites RISC architektúra. Ez azért is fontos, mert a TIMER1 perifériát is ennek megfelelően kell inicializálni. Ráadásul a feladat LED-ekről és nyomógombokról beszél, tehát nem csak a mikrokontrollert kellene ismerni, hanem annak környezetét is. Legalább azt, hogy melyik lábakra vannak kötve a LED-ek és a gombok, illetve hogy hogyan (high/low active?).
Az 1. feladathoz először inicializálni kell a timert, ezt általában memóriába ágyazott regisztereken keresztül lehet megtenni. Illetve ki kell tenni a LED-ekre az 100...001 mintát. A feladat azt mondja, hogy szoftveresen kell megoldani a késleltetést, tehát szerintem megszakítást nem használhatsz. Szóval beállítod megfelelően a timert, majd végtelen ciklusban lekérdezgeted az overflow flaget. Ha bebillent, akkor egy feltételes ugró utasítással mész a léptetést végző címhez. Ott először törlöd az overflow flaget, majd megnézed, hogy nyomják-e a gombot. Ha nem, akkor lehet léptetni. Neked itt egy olyan balra léptető utasítás kell, ami a fent kieső bitet alulról belépteti. Vagy ha ilyen nincs, akkor nyilván több utasításból kell megcsinálni (pl. aritmetikai shift balra, és a régi MSB-vel összevagyolni az új LSB-t).
A 2. feladatban az adatok átmozgatása gondolom triviális. Azt nem részletezte a feladat, hogy pontosan mit kellene csinálni a páratlan számokkal, úgyhogy én egyszerűen azt csinálnám, hogy az összes számot összeéselném az 111...1110 bitmintával. Ez a páros számokat (LSB=0) nem változtatja meg, a páratlanoknak pedig törli az LSB-jét, vagyis kivon belőlük 1-et. Az sem világos, hogy milyen formában kellene kiírni a számokat a LED-ekre (gondolom a 10 szám több bitet tartalmaz, mint ahány LED van). Esetleg a nyomógombokkal ki lehet választani, hogy melyik számot szeretnénk látni, vagy az 1. feladathoz hasonlóan egy timert használva lehet pl. másodpercenként más-más számot mutatni. Az indirekt címzés pedig azt jelenti, hogy az opkód által hivatkozott regiszterben/címen nem maga az adat található, hanem a memóriacíme (kb. mint a magas szintű nyelvekben a pointer). De hogy a Te mikrokontrollered pontosan milyen címzési módokat támogat, ahhoz megint csak tudni kellene a típust.