Ръководство за микроконтролер

Команди за аритметични операции

Основните операции за всеки процесор са операциите по пренос на данни. В микроконтролерите 68HC05 прехвърлянето се извършва чрез зареждане на байт в регистър и след това съхраняването му на друго място в паметта. Основните инструкции за извършване на тези операции са LDA и STA, които зареждат данни от паметта в акумулатора и съответно съхраняват съдържанието му в паметта.

Напиши здравей: ; Показване на съобщение "Hello" на LCD CLRX; Задайте стойност на индекса на O WrileHello_l_oop: ; Преминете тук до извеждане LDA HelloTable, X ; Заредете елемента таблица в акумулатора; с текущ индекс JSR LCDOut ; Изходен знак INCX ; Увеличете индексния регистър с 1 CPX #5; Край на масата? BNE Write Hello_Loop ; Изходен следващ символ RTS ; Връщане към контролната точка на процедурата

Индексният регистър може да бъде директно достъпен с помощта на командите за зареждане и съхраняване (команди 20.3 и 20.4). Използването на командите TAX и THA (команди 20.5 и 20.6) ви позволява да използвате този регистър като регистър за временно съхранение на съдържанието на акумулатора. Както е показано в описанието на инструкцията MUL, индексният регистър не се използва само като указател.

Аритметичните операции събиране и изваждане (команди 20.7, 20.8, 20.9 и 20.10) са много лесни за използване. Инструкцията ADD добавя указаното число към съдържанието на акумулатора и съхранява резултата в акумулатора, а също така променя съдържанието на регистъра на условията. Инструкцията SUB изважда число от съдържанието на акумулатора и поставя резултата в акумулатора. Както бе споменато по-рано, флагът за пренасяне също е флаг за заемане и се задава, ако резултатътоперациите за изваждане са по-малки от нула.

Командите за събиране и изваждане, базирани на флага за пренасяне, улесняват извършването на сложни операции. Например изваждането на 16-битови числа (A = B - C) може да се реализира по следния начин:

LDA B+1; Извадете долните 8 бита SUB C+1 STA A+1 LDA B; Изваждане на високи 8 бита SBC C ; Извършете изваждане, като вземете предвид флага за пренасяне STA A

Ако сравните горния код с програма, която обработва 16-битови операнди на PIC или други процесори, които нямат инструкции за събиране или изваждане, ще видите, че използването на такива инструкции значително опростява разработката на програми. Този пример за изчисляване на разликата между 16-битовите операнди взема предвид, че данните се съхраняват във формат на Motorola, където старшият байт предшества младия байт.

Микроконтролерите 68HC05 имат бърза 8-битова операция за умножение (команда 20.11), резултатът от която е 16-битово число. Една от най-полезните функции на тази операция е възможността да се вземе частното от дадена стойност. Например, ако искате да намерите 1/10 от стойността на число, тогава може да се използва следният код:

LDX# 256 / 10; Заредете 1/10 от 256 LDA стойност; Стойността на натоварването трябва да бъде разделена на 10 MUL STX фракция; Съхранявайте частното на стойност, разделена на 10

Тъй като се използват само 8 бита, като умножите число по дроб от 256, вие делите на константа. Подобен метод на разделяне може да се използва в други процесори, описани в тази книга, дори ако те нямат инструкция за умножение.

Изчистването на регистри и байтове от паметта на данни може да се направи с инструкцията CLR (команда 20,15), която енай-простият начин за зареждане на нулева стойност в регистър.

Зареждането на номер в регистър или място в паметта може да се извърши по два начина. Ако е необходимо да се запише байт в програмната памет на EPROM, това може да се направи изрично по време на програмиране с помощта на директивата DR. Например, за да заредите съобщение в EPROM, което след това ще се покаже на екрана, можете да използвате следния код:

IntMsg db "Здравей",0 ; Екранно съобщение

LDA #integer ; Заредете специфична стойност в място в паметта STA регистър

Точно както CLR изчиства регистър, COM инструкцията (команда 20.16) изпълнява изключителна операция ИЛИ върху съдържанието на регистъра и SOFF номера, като по този начин реализира логическа инверсия. Имайте предвид, че това задава флага за пренасяне на 1. Това означава, че флагът за пренасяне не може да се използва от инструкцията след COM.

За промяна на знака на число се използва командата NEC (команда 20.17), която преобразува стойността на S-битово число в код на допълнение към две (комплемент от 2). Ако командата NEG не съществува, тогава ще трябва да се използва следната последователност от команди за промяна на знака на число:

LDA #0; Изчислете стойността на регистъра = 0 - регистър SUB регистър STA регистър

Тази трансформация изисква повече инструкции, което от своя страна води до увеличаване на броя на циклите за тяхното изпълнение и увеличаване на обема на използваната програмна памет.

Наборът от команди 6SHC05 също включва команди за увеличаване и намаляване (команди 20.18 и 20.19). Те се използват като лесен начин за увеличаване или намаляване с единица на стойността на 8-битово число. Когато разглеждаме други микроконтролери, е даден пример за прилагане на нарастване на 16-битово число с помощта на инструкцията за нарастване,което задава нулевия флаг на 1. За 6SHC05 намаляването на 16-битово число може да се извърши по същия начин, като се извади 1 от ниските 8 бита и след това се намалят високите 8 бита, ако флагът за пренос е зададен, въпреки че инструкцията DEC в 68HC05 засяга флага за отрицателен резултат.

LDA стойност-H ; Намалява стойността на ниския байт с 1 SUB #1 STA стойност+1 BCS dec16Skip ; Пропуснете намаляването на високия байт, ако ; флагът за пренасяне е изчистен до 0 DEC стойност dec16Skip:

DEC стойност+1; Намалява стойността на ниския байт с 1 BPL dec16Skip ; Ако резултатът не е отрицателен, пропуснете ; изпълнение на следната команда DEC value ; Намалете стойността на високия байт с 1 dec16Skip:

Все пак трябва да се отбележи, че в този случай флагът за отрицателен резултат в регистъра на CCR ще бъде зададен на I, ако резултатът от операцията "DEC value+1" попада в диапазона от $080 до SOFF, и това от своя страна ще намали високия байт. По този начин, когато се изпълнява такъв код, половината от всички операции за намаляване на 16-битово число ще бъдат извършени с намаляване на старшия байт, вместо намаляване на високия байт само веднъж на 256.

Микроконтролерите 6SHC05 имат редица команди за сравнение, които ви позволяват да тествате данните. Тези инструкции проверяват стойността на операнда и задават флаговете в CCR регистъра според стойността на стойността, която се тества. Най-често срещаният тест е да се провери дали операндът е нула (команда 20.20). Инструкцията TST задава нулевия и отрицателния флаг.

Инструкцията BIT (команда 20.21) изпълнява логическа операция И върху дадения операнд и съдържанието на акумулатора. След тази операция се задават флаговетенулев и отрицателен резултат.

Командите CMP и CMX (команди 20.22 и 20.23) изпълняват обичайните операции за сравнение. Инструкцията CM P сравнява операнда със съдържанието на акумулатора. Въз основа на резултатите от тази операция се задават флаговете за нула, отрицателен резултат, пренасяне и пренасяне между тетради. Инструкцията CMX се използва за сравняване на операнда със съдържанието на индексния регистър. По принцип тази команда се използва за определяне дали съдържанието на индексния регистър е извън границите, което е много важно при използване на езици от високо ниво, когато е необходимо да се провери за масив извън границите. Командата може да се използва и в случаите, когато се използва индексен регистър за временно съхраняване на стойност.

Преместването на 8-битови данни, разположени в регистър или място в паметта, може да се извърши по един от трите начина. Аритметичното изместване може да се разглежда като умножение или деление. Логическите смени са много подходящи за извличане на данни от регистър бит по бит и когато се извършва циклично изместване, битът, изместен извън регистъра, ще бъде поставен във флага за пренасяне. По принцип наличието на три режима на превключване е излишно. Например в PIC микроконтролера и трите метода се изпълняват с едно циклично преместване през флага за пренасяне.

Както беше посочено по-горе, аритметичното изместване е като умножаване или деление на допълващи се числа, където последният напреднал бит се поставя в флага за пренасяне на CCR (команди 20.24 и 20.25). Изпълнението на командите за аритметично изместване е показано на Фигура 20.3. Аритметичното отместване не променя знака на измествания операнд. Фиг.20.3. Изпълнение на команди за аритметично преместване в 68HC05.

При логическо изместване операндът просто се измества надясно или наляво седна позиция и стойността на избутвания бит ще бъде поставена в CCR регистъра като флаг за пренасяне (команди 20.24 и 20.26). Изпълнението на команди за логическо преместване е показано на фигура 20.4. Трябва да се отбележи, че логическото изместване наляво е идентично с аритметичното. Поради тази причина Motorola направи ASL и LSL командите еднакви и те са описани на едно и също място в книгата. Фиг.20.4. Изпълнение на команди за логическо преместване в 68HC05.

Последният тип операция на смяна се изпълнява от командите за циклично смяна (команди 20.27 и 20.28). Когато изпълнявате тези команди, данните се изместват през флага за пренасяне, както е показано на Фигура 20.5. Rns.20.5. Изпълнение на команди за циклично преместване в 68HC05.

Командите за завъртане са внедрени в повечето микроконтролери. Други видове смени могат лесно да бъдат емулирани с тези команди. Например, ако искате да емулирате аритметично изместване надясно на съдържанието на RAM байт с помощта на инструкцията ROR, можете да използвате следния код:

CLC ; Изчистване на флага за пренасяне BRCLR 7, Reg, NoCarrySet; Ако е зададен Reg бит 7, задайте SEC ; флаг за промяна на пипер NoCarrySet; Сега извършете правилната смяна Reg ROR Reg

Микроконтролерите 6SHC05 изпълняват доста различни аритметични операции. Това съответства на концепцията на CISC архитектурата, според която всяка възможна операция трябва да бъде достъпна за програмиста. В случая на 68HC05 внедряването на тази концепция допринася за създаването на по-ефективен код на приложението чрез минимизиране на разходите за време и памет, необходими за изпълнение на липсващите команди.

Екип 20.1. Екип на LDA в 68HC05. Отбор 20.Z. LDX екип в 68HC05.