Читаем Микроконтроллеры AVR: от простого к сложному полностью

Материал взят из демонстрационной версии компилятора CodeVisionAVR С Compiler, автором которого является Pavel Haiduc, HP InfoTech S.R.L.

Текст программы:

// Определение функции на ассемблере. Эта функция возвращает а+Ь+с

#pragma warn- // Запретить предупреждения

int sum_abc(int a, int b, unsigned char с) {

#asm

    ldd r30, у+3;R30=LSB а

    Idd r31,у+4;R31=MSB а

    Idd r26,у+1;R26=LSB b

    Idd r27,у+2;R27=MSB b

    add r30,r26;(R31,R30)=a+b

    adc r31,r27

    Id r26,у;R26=c

    clr r27; Преобразование с типа unsigned char в тип int

    add r30,r26; (R31,R30)=(R31,R30)+C

    adc r31,r27

#endasm

}

#pragma warn+ // Разрешить предупреждения

void main(void) {

int r;

// Теперь вызовем функцию и сохраним результат в r

r=sum_abc(2,4,6);

}

Некоторые пояснения.

Компилятор передает параметры функции с помощью стека данных. Первым он передаст целый параметр а, затем b и в завершение с типа unsigned char. При каждой передаче регистровая пара Y увеличивается на размер параметра (4 для типа long, 2 для int, 1 для char).

В случае параметров, состоящих из нескольких байтов, первым передается старший байт. Как вы видите, стек растет вниз. После того как все параметры функции были записаны в стек (pushed), регистр Y указывает на последний параметр с, поэтому мы можем прочитать его значение в R26, воспользовавшись командой Id r26,у.

Параметр b был записан в стек перед с, поэтому он находится по более высокому адресу в стеке данных. Мы можем прочитать его значение, воспользовавшись командами ldd r27,у+2 (старший байт) и ldd r26,у+1 (младший байт).

Старший байт был записан в стек первым, поэтому он находится по более высокому адресу.

Параметр а был записан в стек перед Ь, поэтому он находится по более высокому адресу в стеке данных. Мы можем прочитать его значение, воспользовавшись командами ldd r27,у+4 (старший байт) и ldd r26,у+3 (младший байт).

Старший байт был записан в стек первым, поэтому он находится по более высокому адресу.

Функции возвращают свои значения в следующих регистрах:

R30 для типов char & unsigned char;

R30, R31 для типов int & unsigned int;

R30, R31, R22, R23 для типов long & unsigned long.

Поэтому наша функция должна вернуть ее результат в регистрах R30, R31.

После возвращения из функции компилятор автоматически генерирует код, освобождающий стек от параметров функции, поэтому можно не задумываться об этом.

Директива #pragma warn запрещает компилятору генерировать предупреждения о том, что функция не возвращает результат.

Это необходимо, потому что компилятору не известно, что мы делаем в нашей написанной на ассемблере функции.

Использование встроенного EEPROM

Материал взят из демонстрационной версии компилятора CodeVisionAVR С Compiler, автором которого является Pavel Haiduc, HP InfoTech S.R.L.

Текст программы:

// Контроллер: AT90S2313

// Модель памяти: TINY

// Размер стека данных: 64 bytes

flash char f[]="This is a test";

#pragma warn-

eeprom char e[16];

#pragma warn+

char r[16];

void main (void)

{

Char flash *ptr_to_flash;

char eeprom *ptr_to_eeprom;

char *ptr_to_ran;

// Копировать строку f из FLASH в

// Строку e в EEPROM

ptr_to_flash=f;

ptr_to_eeprom=e;

while (*ptr_to_flash)

     *ptr_to_eeprom++=*ptr_to_flash++;

// Копировать строку e из EEPROM в

// строку г в оперативной памяти

ptr_to_eeprom=e;

ptr_to_ram=r;

while (*ptr_to_eeprom)

     *ptr_to_ram++=* ptr_to_eeprom++;

// Стоп (бесконечный цикл)

while (1);

}

Работа с клавиатурой 4x4

Материал взят из демонстрационной версии компилятора CodeVisionAVR С Compiler, автором которого является Pavel Haiduc, HP InfoTech S.R.L.

Рис. 4.11.Схема соединения клавиатуры 4x4

Для индикации использован 2х16 алфавитно-цифровой ЖКИ, подсоединенный к порту PORTC следующим образом:

Текст программы:

Перейти на страницу:

Все книги серии Библиотека инженера

Похожие книги

Электроника для начинающих (2-е издание)
Электроника для начинающих (2-е издание)

В ходе практических экспериментов рассмотрены основы электроники и показано, как проектировать, отлаживать и изготавливать электронные устройства в домашних условиях. Материал излагается последовательно от простого к сложному, начиная с простых опытов с электрическим током и заканчивая созданием сложных устройств с использованием транзисторов и микроконтроллеров. Описаны основные законы электроники, а также принципы функционирования различных электронных компонентов. Показано, как изготовить охранную сигнализацию, елочные огни, электронные украшения, устройство преобразования звука, кодовый замок и др. Приведены пошаговые инструкции и более 500 наглядных рисунков и фотографий. Во втором издании существенно переработан текст книги, в экспериментах используются более доступные электронные компоненты, добавлены новые проекты, в том числе с контроллером Arduino.

Чарльз Платт

Радиоэлектроника / Технические науки
Электроника для начинающих
Электроника для начинающих

В ходе практических экспериментов рассмотрены основы электроники и показано, как проектировать, отлаживать и изготавливать электронные устройства в домашних условиях. Материал излагается последовательно от простого к сложному, начиная с простых опытов с электрическим током и заканчивая созданием сложных устройств с использованием транзисторов и микроконтроллеров. Описаны основные законы электроники, а также принципы функционирования различных электронных компонентов. Показано, как изготовить охранную сигнализацию для защиты от проникновения в дом, елочные огни, электронные украшения для одежды, устройство преобразования звука, кодовый замок, автономную роботизированную тележку и др. Приведены пошаговые инструкции и более 500 наглядных рисунков и фотографий.Для начинающих радиолюбителей

Паоло Аливерти , Чарльз Платт

Радиоэлектроника / Технические науки
Искусство схемотехники. Том 3 (Изд.4-е)
Искусство схемотехники. Том 3 (Изд.4-е)

Широко известная читателю по предыдущим изданиям монография известных американских специалистов посвящена быстро развивающимся областям электроники. В ней приведены наиболее интересные технические решения, а также анализируются ошибки разработчиков аппаратуры: внимание читателя сосредотачивается на тонких аспектах проектирования и применения электронных схем. На русском языке издается в трех томах. Том 3 содержит сведения о микропроцессорах, радиотехнических схемах, методах измерения и обработки сигналов, принципах конструирования аппаратуры и проектирования маломощных устройств, а также обширные приложения. Для специалистов в области электроники, автоматики, вычислительной техники, а также студентов соответствующих специальностей вузов и техникумов.

Пауль Хоровиц , Уинфилд Хилл

Техника / Радиоэлектроника