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

ПРОЕКТИРОВАНИЕ И МОДЕЛИРОВАНИЕ 41 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 1 2022 Передача данных через интерфейс SPI между тремя микроконтроллерами AVR Рассмотрим процесс передачи данных через интерфейс SPI между несколькими микроконтроллерами ATmega16, для чего создадим новый схемный проект и добавим в рабочее поле три таких микросхемы, два све- тодиода, два резистора (100 Ом), два символа «земли». При этом микросхе- ма DD1 будет выполнять роль ведуще- го микроконтроллера, а микросхе- мы DD2 и DD3 – ведомых. Соединим компоненты, как показано на рис. 20, и напишем на языке программирова- ния С программный код управления передачей данных. Программа ини- циализации пишется как для ведуще- го, так и для обоих ведомых микро- контроллеров. Задача ведущего контроллера – послать управляющий сигнал (кодо- вую комбинацию) сначала первому ведомому, а затем – второму. Переклю- чение между ведомыми выполняется путём установки ведущим микрокон- троллером логического нуля на линии SS ведомых микроконтроллеров. При передаче данных по интерфейсу SPI между тремя микроконтроллерами в нашем примере этот сигнал выдаётся на линии PB0, PB1 порта PB ведуще- го микроконтроллера. Задача каждо- го ведомого – принять кодовую ком- бинацию, после чего запустить цикл, в котором выполняется последователь- ное включение и выключение свето- диода. Для удобства соединения в рабо- чей области проекта отразим по Рис. 20. Процесс моделирования проекта передачи данных между тремя микроконтроллерами ATmega16 через интерфейс SPI в программной среде Proteus Рис. 21. Настройка параметров микроконтроллера ATmega16 при передаче данных между тремя устройствами через интерфейс SPI горизонтали микросхему DD1. В окне настроек Edit Component для каждого микроконтроллера установим следующие параметры (см. рис. 21): ● поле CKOPT (Oscillator Options) – (1) Unprogrammed; ● поле BOOTRST (Select Reset Vector) – (1) Unprogrammed; ● поле CKSEL Fuses – (0001) Int.RC 1MHz; ● поле Boot Loader Size – (00) 1024 words. Starts at 0x1C00; ● поле SUT Fuses – (00); ● поле Advanced Properties – Clock Frequency (Default). Окно настроек открывают двой- ным щелчком левой кнопки мыши по выбранному на схеме микроконтрол- леру. Напишем на языке программирова- ния С следующий код программы ини- циализации для ведущего микрокон- троллера: #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=0b10100011; // указываем направление передачи информации по линиям порта // линии MOSI, SCK, PB0, PB1 уста- новлены как выходы SPCR=0b01010011; // инициализа- ция SPI SPSR=0b00000000; PORTB=0b00000010; // выбираем для передачи данных по SPI первый ведо- мый МК SPDR=0b11111110; // отсыла- ем кодовую комбинацию для первого ведомого МК _delay_ms(1000); // задержка PORTB=0b00000001; // выбираем для передачи данных по SPI второй ведо- мый МК SPDR=0b11111110; // отсыла- ем кодовую комбинацию для второго ведомого МК _delay_ms(1000); return 0; } Для ведомого микроконтроллера DD2 был написан следующий код програм- мы инициализации: #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 микросхемы DD2 DDRD=0b11111111; // линии порта PD работают как выходы SPCR=0b01000011; // инициализа- ция SPI while (1) // бесконечный цикл {

RkJQdWJsaXNoZXIy MTQ4NjUy