При программировании моего Atmega644 MCU. Почему PORTD | = 0b00100000 работает, но не PORTD | = (PD5 << 1)? - PullRequest
0 голосов
/ 16 апреля 2019

Я пытался понять, почему линия

 PORTD |= 0b00100000;

работает, но не

PORTD |= (PD5 <<1);

У меня есть светодиод, подключенный к PD5, который загорается только для первой команды. Должен ли я определить, что такое «PD5»? Мне никогда не приходилось делать это на моем Atmega328P, но теперь на Atmega644 это не работает?

Вот библиотеки, которые я включаю

  #define F_CPU 1000000UL  // 1MHz internal clock
  #include <avr/io.h>
  #include <util/delay.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <avr/interrupt.h>
  #include "lcd.h"

Не уверен, что что-то может вызвать проблемы? Я что-то упустил здесь?

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

PORTD | = (PD5 << 1); </p>

PD5 определяется как число 5. Сдвиг влево на один бит дает 10, что не имеет никакого отношенияк желаемому значению.

1 << PD5, с другой стороны, даст вам результат сдвига влево на 1 бит 5, что равно 0b00100000 - именно то, что вы ищете.

0 голосов
/ 16 апреля 2019

Назначения отличаются.

PORTD |= 0b00100000;

устанавливает бит 5 ПОРТА D на 1

тогда

PORTD |= (PD5 <<1);

установите биты 1 и 2 в PORTD на 1 (как PD5 == 5 и PD5 << 1 == 10 (0x0A), т.е. 1010 двоичных данных) </p>

Определите некоторые макросы для включения или выключения светодиода, чтобы не приходилось каждый раз устанавливать «биты»

#define LEDON PORTD |= 0b00100000
#define LEDOFF PORTD &= ~0b00100000

Пример использования

if ( put_led_on )
    LEDON;
else
    LEDOFF;

Или благодаря вашему собственному исследованию

PORTD |= (1<<PD5);

, который установит бит 5 в 1

...