Показать сообщение отдельно
Старый 23.12.2018, 18:09   #5
T_r_D
Старший Пользователь
 
Регистрация: 03.07.2015
Регион: 77, 97, 99, 177
Сообщений: 372
T_r_D is a jewel in the roughT_r_D is a jewel in the roughT_r_D is a jewel in the rough
По умолчанию

Как я выше и написал уже- код работает на любой атмеге.
Просто надо переконфигурировать порты/ноги.
Нужно знать только на какой ноге ЮАРТ и SPI в другой атмеге.
Тут это надо переправить:
DDRB |= (1 << DDB3) | (1 << DDB5) | (1 << DDB2) | (1 << DDB1) | ( 1 << DDB0);

PORTB |= ( 0 << PINB0);
PORTB |= ( 1 << PINB2);
SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPOL) | (1 << CPHA);
byte clr = SPSR;
clr = SPDR;
(void)clr;

DDRB настройка порта B
PORTB доконфигурирование отдельных ног порта.

SPCR настраивает режим SPI.
как настроить ссылка:
http://www.gaw.ru/html.cgi/txt/doc/m...mega103_49.htm

Как настраиваются ноги порта:
http://easyelectronics.ru/avr-uchebn...da-vyvoda.html

А дальше стоит прерывание реагирующие на появление данных в SPI порту.
Так что это код работает на любой меге, просто надо сконфигурировать под неё порты.

А вот тут мы это получаем из прирывания (точнее буфера):
while (1)
{
if( !error) {

button = register_get( GETMAIL( 1));
wheel = register_get( GETMAIL( 2));

if( wheel > oldwheel || wuloop != ( button & ( 1 << WUP))) {
wuloop = ( button & ( 1 << WUP));
oldwheel = wheel;
PORTB |= ( 1 << PINB0);
execCmd( tup);
PORTB &= ~( 1 << PINB0);
}
else if( wheel < oldwheel || wdwnloop != ( button & ( 1 << WDWN))) {
wdwnloop = ( button & ( 1 << WDWN));
oldwheel = wheel;
PORTB |= ( 1 << PINB0);
execCmd( tdwn);
PORTB &= ~( 1 << PINB0);
}
else if ( button & ( 1 << SRC)) {
execCmd( source);
}

PORTB |= ( 1 << PINB0);
и
PORTB &= ~( 1 << PINB0);
Это мигание светодиодом как я понимаю

execCmd( tdwn); это отправка в UART.
Вместо отправки в UART можно делать что угодно.
Ну условия все эти проверяют что пришло в посылке SPI.

PS. Про RD3 почитал. Там действительно нет КАН походу...
У RD4 Уже есть...
T_r_D вне форума   Ответить с цитированием