Electronics The King of Hobbies!
Here, the LED.1 will toggle on every timer interrupt. On every timer overflow (TAR), the timer interrupt flag (TAIFG) will set.. Since GIE and TAIE is enabled, on every timer overflow, a timer interrupt will occur. At this time, the program counter will be loaded with the address stored in the timer interrupt vector address 0xfff0.
.include "msp430g2x31.inc" org 0xf800 start: mov.w #(WDTPW|WDTHOLD), &WDTCTL mov.w #0x280, SP mov.b #255,&P1DIR mov.b #0,&P1OUT mov.w #(TASSEL_2|MC_1|ID_3), &TACTL mov.w #(CCIE), &TACCTL0 mov.w #50000, &TACCR0 eint gg: jmp gg isr: xor.b #1,&P1OUT ; toggle LED1 on interrupt reti org 0xfffe ;reset vector dw start org 0xfff2 dw isr
In this case, the interrupt occur when the timer value (TAR) matches the TACCR0 value.. Here the interrupt vector(0xfff2) is different from the previous example. Also, instead of TAIE , CCIE is enabled. We could set the value of TACCR0 to adjust the time period of the periodic interrupt. Here, the CCIFG is cleared automatically in the hardware.
.include "msp430g2x31.inc" org 0xf800 start: mov.w #(WDTPW|WDTHOLD), &WDTCTL mov.w #0x280, SP mov.b #255,&P1DIR mov #3323,R4 ;seed value in r4 loop1: mov.b r4, &P1OUT ;showing 8 bit of the shift register in port1 mov r4,r5 mov r4,r10 rra r5 rra r5 xor r5,r10 rra r5 xor r5,r10 rra r5 rra r5 xor r5,r10 rra r4 bit #1,r10 jnz aa bic #(1<<15),r4 jmp bb aa: bis #(1<<15),r4 bb: mov #30000,r6 cc: dec r6 jnz cc jmp loop1 org 0xfffe ;reset vector dw start
This is just a software implementation of a 16 bit fibonacci LFSR (in above figure)
Here, register r4 emulates the linear feedback shift register. Instruction rra is used to shift one position to right. 8 bits of r4 is moved to PORT1 to show the 8 least bits of the LFSR on LEDs connected to PORT1. Also, if we connect a single LED at any of the P1 bits, we could observe the streaming of 'pseudo' random sequence. It is called 'pseudo' just because it is not really a random sequence even though it seems to be a ramdom sequence.
LFSR have great practical importance, for example:
Direct-sequence spread spectrum radio, Generating an approximation of white noice ,Cryptography etc.
;--------------------------------------------------------- ;author :vinod s (vinodstanur@gmail.com) ;date : sat June 9, 11:42:51PM ;PROCESSOR : MSP430G2231 ;assembler : naken430asm ;development platform : linux ;NOTE: 32768Hz crystal must be soldered to the launchpad ; before doing this test program ;-------------------------------------------------------- .include "msp430g2x31.inc" org 0xf800 ;flash begins start: ;startup code which sets the stack pointer and disable WDT mov.w #(WDTPW|WDTHOLD), &WDTCTL ;disabling watch dog timer, otherwise it will reset on regular interval mov.w #0x27f, SP ;SETTING TOP OF THE STACK ON STACK POINTER call #main ; NOT NEEDED ANY WAY :-) main: mov.b #0, &P1OUT mov.b #1,&P1DIR ;setting port1 bit 0 as output mov.b #(XCAP_3), BCSCTL3 ;selecting internal capacitor value for crystal mov.w #32767, &TACCR0 ;seting the timer compare value for interrupt mov.w #CCIE, &TACCTL0 ;compare interrupt enable mov.w #(TASSEL_1|MC_1|TACLR), &TACTL ;setting the timer with ACLK clock eint ;general interrupt enable bis.b #(11011000b),SR ;entering LOW POWER MODE 3 ;WILL NEVER REACH HERE (CPU OFF , SMCLK OFF) isr: ;LED flashing routine which happens on every second mov.b #1, &P1OUT mov.w #10000, R10 small_delay_loop: dec.w R10 jnz small_delay_loop mov.b #0, &P1OUT reti ;VECTORS org 0xfffe ;reset vector dw start ;to write start address to 0xfffe on programming org 0xfff2 ;timer interrupt vector (CC) dw isr ;to write isr address to 0xfff2 on programming
Программирование msp430 на ассемблере
3.4 Набор команд
Полный набор команд семейства MSP430 содержит 27 команд ядра и 24 эмулированные команды. Команды ядра – это команды, имеющие уникальный код операции, декодируемый ЦПУ. Эмулированные команды представляют собой инструкции, облегчающие чтение и написание кода, но не имеющие собственного кода операции, поэтому ассемблер автоматически меняет их на эквивалентные команды ядра. Использование эмулированных команд не приводит к увеличению объема кода или снижению производительности.
Все команды с одним и двумя операндами могут быть командами для работы с байтами или командами для работы со словами, используя, соответственно, расширения «.B» или «.W». Байтовые команды используются для доступа к данным байта или к байту периферийного устройства. Команды-слова используются для доступа к данным слова или к слову периферийного устройства. Если никакое расширение не используется, команда является командой-словом.
Источник и получатель в команде определяются следующими полями:
src | Операнд источника определяется As и S-reg |
dst | Операнд получателя определяется Ad D-reg |
As | Адресные биты, задающие режим адресации, используемые для источника (src) |
S-reg | Рабочий регистр, используемый в качестве источника (src) |
Ad | Адресные биты, задающие режим адресации, используемые для получателя (dst) |
D-reg | Рабочий регистр, используемый в качестве получателя (dst) |
B/W | Операция с байтом или словом: 0: операция со словом 1: операция с байтом |
Примечание: адрес получателя Адрес получателя действителен в любом месте карты распределения памяти. Однако, при использовании команды, изменяющей содержимое получателя, пользователь должен быть уверен, что по адресу назначения можно производить запись. К примеру, маскированное ПЗУ имеет правильный адрес назначения, но его содержимое не может модифицироваться, поэтому команда изменения его содержимого не будет правильно выполнена. |
Примечание: использование меток EDE и TONI Везде в документации по семейству MSP430 используются универсальные метки EDE и TONI. Они являются только метками, не имеющими никакого специального назначения. |
3.4.1 Команды с двойным операндом (Формат I)
На рис.9 показана структура формата команды с двойным операндом.
В таблице 3.11 приведено описание и перечень команд с двойным операндом.
Таблица 3.11. Команды с двойным операндом
3.4.2 Команды с одним операндом (Формат II)
На рис.3.10 показана структура формата команды с одним операндом.
В таблице 3.12 приведено описание и перечень команд с одним операндом.
Для команды CALL возможны все способы адресации. Если используется символический режим (Адрес), прямой режим (#N), абсолютный режим (&EDE) или индексный режим x(RN), следующее за командой CALL слово должно содержать информацию об адресе.
На рис.3.11 показан формат команды условного перехода.
В таблице 3.13 приведено описание и перечень команд переходов.
Мнемоника | S-Reg, D-Reg | Операция |
JEQ/JZ | Метка | Переход к метке, если бит нуля (Z) установлен |
JNE/JNZ | Метка | Переход к метке, если бит нуля (Z) сброшен |
JC | Метка | Переход к метке, если бит переноса (C) установлен |
JNC | Метка | Переход к метке, если бит переноса (C) сброшен |
JN | Метка | Переход к метке, если бит отрицательного результата (N) установлен |
JGE | Метка | Переход к метке, если (N.XOR.V)=0 |
JL | Метка | Переход к метке, если (N.XOR.V)=1 |
JMP | Метка | Безусловный переход к метке |
Условные переходы обеспечивают ветвление программы относительно программного счетчика PC и не оказывают влияния на биты статуса. Возможный диапазон переходов с помощью команды перехода составляет от -511 до +512 слов относительно текущего значения PC. 10-разряное смещение программного счетчика обрабатывается как 10-разрядное значение со знаком: удваивается и складывается с содержимым программного счетчика:
PCnew=PCold + 2 + PCoffset x 2 | |
где: | PCnew – новое содержимое программного счетчика; PCold – исходное содержимое программного счетчика; PCoffset – 10-разрядная величина смещения программного счетчика. |
Легкий ассемблер для MSP430
Программы для MSP430 на языке С обычно пишутся на msp430-gcc. Но это как правило не крошечные программы размером от килобайта и более. Но если требуется написать очень маленькую программку или очень специфическую. Такую, что не желательно использовать С, а только ассемблер, то возникают затруднения с использованием msp430-gcc.
Во всяком случае я не смог продраться через задачу. Даже написанная на ассемблере прога требовала (помимо самого процесса ассемблирования) линковки с другими модулями. MSP430-gcc не предполагал создание крошечных проектов и предлагал сразу очень много возни для больших много-файловых проектов. Меня такой расклад дел не устраивал. Я хотел бы получать после ассемблирования единственного файла исходника уже готовый HEX-файл для заливки в проц. Пришлось гуглить.
Оказалось, что создание небольших ассемблерных проектов почти никого не волнует. В интернете почти нет обсуждений на эту тему. Я нагуглил только одно такое обсуждение, которое было аж в 2003 году.
Но Гугл мне подкинул еще одну ссылку на сайт, где Михаил Кон, предлагает свое решение проблемы. Он так же увяз в этой проблеме, но, в отличие от меня, он успешно продвинулся! Мишка предлагает свое решение — самопальный ассемблер.
А теперь, я попробую рассказать, что нужно сделать, чтобы легко «пройти в дамки».
1. Загружаем себе в комп архивный файл с исходными текстами Мишкиного ассемблера. На момент написания этого текста (28.07.2011) это был файл naken430asm-2011-07-05.tar.gz
2. Разархивируем его. Предварительно можно создать какой-нибудь директорий, но можно его распаковать непосредственно домашнем директории. Файл распакуется он грамотно — в свой директорий, который сам же и создаст. Команда для декомпрессии следующая:
$ tar -xzf naken430asm-2011-07-05.tar.gz
3. Теперь заходим в полученный директорий
4. Набираем команду для конфигурации проекта под наше конкретное железо
Менее чем через секунду конфигурация проекта будет готова.
В принципе, вы можете в этом месте задать свои уникальные параметры для сборки, например, такие как директорий, куда потом установить ассемблер. Но если вы еще не очень разбираетесь в этих вопросах, делайте все по умолчанию. Не ошибетесь!
5. Теперь нужно проект собрать. Набираем команду:
Это займет всего несколько секунд. (Мой компик старенький, компиляция на нем прошла за 5 с небольшим секунд.)
6. Проект собран. Сейчас нам нужно установить полученные программы проекта в нашу систему. В Мишкином проекте создается не только ассемблер, но еще и какая-то утилита. Что за утилита, пока не знаю. Не пробовал. Описание ее смотрел по диагонали. Кроме того, нужно в систему установить include-файлы, и может быть какие-то еще. Пока не разбирался.
Можно все это сделать руками (копирование файлов), но вообще-то для таких дел применяется команда:
Команда sudo нужна для того, чтобы разрешить копирование исполняемых файлов в директории, в которые простым юзерам запрещено что-либо писать. Так устроена система безопасности Линукса. Поэтому вирусов для Линукса не бывает. Линукс предполагает, что если у Вас есть доступ к системе (грубо, знаете пароль администратора), то Вы знаете, что Вы делаете. Если Вы четко понимаете и отдаете себе отчет, то Линукс не вмешивается в Ваши действия. В принципе, с правами рута Вы можете в системе сделать абсолютно все, Линукс и слова поперек не скажет. Прочим домохозяйкам пароль рута не положено иметь, поэтому они ничего и не могут поломать. Ну разве что стереть только свои фотки с последней пьянки. Я прошу прощения за небольшое лирическое отступление. Уровень статьи рассчитан на начинающих, а у них как раз возникают подобные вопросы.
Если вы более продвинутый пользователь, то вам удобнее все действия выполнить одним махом. Создайте файл с именем install-naken430 и запишите в него следующий текст:
#!/bin/bash # Установка ассемблера для MSP430 # http://www.mikekohn.net/micro/naken430asm_msp430_assembler.php mkdir build-naken430 cd !$ wget -c http://downloads.mikekohn.net/naken430asm/naken430asm-2011-10-30.tar.gz tar -xzf naken430asm-2011-10-30.tar.gz cd naken430asm-2011-10-30 ./configure make sudo make install cd ..
После этого вам остается только выполнить этот скрипт.
Так или иначе, но теперь у нас есть ассемблер, который позволит создавать HEX-файлы из наших ассемблерных исходников.
В следующей статье я планирую написать, как это сделать. Михаил на своем сайте обещает, что вроде как его ассемблер позволяет создавать коды размером до 50 килобайт. Иначе говоря размер HEX-кодов искусственно не ограничен и можно создавать не только крошечные программы.