Современная электроника №1/2022

ПРОЕКТИРОВАНИЕ И МОДЕЛИРОВАНИЕ 40 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 1 2022 SPCR=0b01000000; // установка битов регистра SPCR ведомого микро- контроллера Передача данных осуществляет- ся следующим образом. При записи в регистр данных SPI ведущего микро- контроллера запускается генератор тактового сигнала модуля SPI. Дан- ные начинают побитно выдаваться на вывод MOSI устройства Master и, соот- ветственно, поступать на вывод MOSI устройства Slave. Порядок передачи битов данных определяется состоя- нием пятого бита регистра SPCR. Если бит установлен в 1, первым передаётся младший бит байта, если же сброшен в 0 – старший бит. Частота тактового сигнала SCK и соответственно скорость передачи данных по интерфейсу определя- ются состоянием первого и нулево- го битов (SPR1:SPR0) регистра SPCR и нулевого бита (SPI2X) регистра SPSR ведущего микроконтроллера, так как именно он является источником так- тового сигнала. Для ведомого микро- контроллера состояние этих битов не имеет значения. Программно частоту тактового сигнала ведущего микро- контроллера можно задать следую- щим образом: SPCR=0b01010011; SPSR=0b00000000; Здесь мы установили первый и нуле- вой бит регистра SPCR в единицу и нулевой бит регистра SPSR в ноль, что приведёт к установке следующей часто- ты сигнала SCK: fCLK/128, где fCLK – тактовая частота микроконтроллера. Напишем на языке программирова- ния С следующий код программы ини- циализации для ведущего микрокон- троллера: #include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> #include <util/delay.h> int main() { PORTB=0b00000000; // инициализа- ция порта PB микросхемы DD1 DDRB=0b10110000; // указываем направление передачи информации по линиям порта // линии SS, MOSI, SCK установ- лены как выходы SPCR=0b01010011; // инициализа- ция SPI SPSR=0b00000000; SPDR=0b11111110; // отсылаем кодовую комбинацию для ведомого микроконтроллера return 0; } Для ведомого микроконтроллера был написан следующий код программы инициализации: #include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> #include <util/delay.h> int main() { PORTB=0b00000000; // инициализа- ция порта PB микросхемы DD2 DDRB=0b00000000; // линии порта PB работают как входы PORTD=0b00000000; // инициализа- ция порта PD DDRD=0b11111111; // линии порта PD работают как выходы SPCR=0b01000011; // инициализа- ция SPI while (1) // бесконечный цикл { if (SPDR!=0b11111110) // если кодовая комбинация не получена PORTD=0b00000000; // посылаем на все линии порта PD - 0 else if (SPDR==0b11111110) // если кодовая комбинация получена {PORTD=0b00000001; // включить светодиод D1 _delay_ms(1000); // задержка в 1 секунду PORTD=0b10000000; // погасить светодиод D1 и включить светоди- од D2 _delay_ms(1000); } // задержка в 1 секунду }} После того как в рабочей области проекта собрана схема, а на вкладке Source Code для каждого микрокон- троллера (ведомого и ведущего) вве- дён код программы, кнопкой Run the simulation можно запускать модели- рование (см. рис. 19). В результате, в том случае, если компилятор не обна- ружит ошибок в программе, на диске компьютера в рабочей папке проек- та будут созданы файлы *.elf , *.hex и *.c. Для компиляции кода программы, написанного на языке программиро- вания С, в Proteus применяется компи- лятор WinAVR. Проанализируем работу демонстра- ционной схемы, представленной на рис. 19. На вкладке Source Code про- граммным образом были даны ука- зания ведущему микроконтролле- ру через интерфейс SPI отправить ведомому микроконтроллеру кодо- вую комбинацию. Программа ведо- мого микроконтроллера выводит на линии порта PD все нули, в результате чего два подключённых к порту све- тодиода будут погашены. Как только по интерфейсу SPI получена кодовая комбинация от ведущего микрокон- троллера, запускается подпрограм- ма, которая даёт команду ведомому микроконтроллеру вывести на линии PD0 и PD7 значения логической 1 и 0 соответственно, которые удержи- ваются на этих линиях при помощи команды задержки. Затем на линии PD0 и PD7 выводятся значения логи- ческого 0 и 1 соответственно, после чего (после задержки) выполнение этого фрагмента программы повто- ряется. После запуска моделирова- ния при помощи двух светодиодов, подключённых к линиям PD0 и PD7, мы можем проверить правильность работы программы – светодиоды под- свечиваются и гаснут поочерёдно (см. рис. 19). Рис. 19. Процесс моделирования проекта передачи данных между двумя микроконтроллерами ATmega16 через интерфейс SPI в программной среде Proteus

RkJQdWJsaXNoZXIy MTQ4NjUy