Встроенный светодиод на светодиодах на Arduino Mega - PullRequest
0 голосов
/ 06 октября 2019

Я написал код на студии atmel для мигания светодиода на контакте 13. После загрузки кода с помощью встроенного светодиода xloader mega мигает. Я загрузил код затухания на свой мега и встроенный светодиод мигает вместо светодиода. Что я должен делать? Я использую Arduino Mega 2560.

int main(void)
{
    DDRB=0b00000000;  
    while (1)   
    {
     PORTB=0b10000000;
     _delay_ms(1000);
     PORTB=0b00000000;
    }
}

Ответы [ 3 ]

0 голосов
/ 06 октября 2019

Зачем вам использовать Arduino и пытаться программировать его без традиционных макросов и функций?

Если вы пытаетесь мигнуть светодиодом или перевести дыхание, тогда используйте IDE Arduino и его встроенные функции analogWrite() для генерации импульса ШИМ для вашего светодиода или любого светодиода на подходящих выводах, которые поддерживают analogwrite (). Вы не должны пытаться делать какие-либо прямые изменения в регистрах, если у вас нет подходящих знаний, потому что вы рискуете разрушить ваш комплект разработки и, возможно, сжечь другие вещи вокруг. Пожалуйста, используйте схемы вашего комплекта, чтобы определить контакты, которые поддерживают analogwrite (), а затем используйте код в примерах.

Таким образом, вы достигнете своей цели быстрее и без проблем.

0 голосов
/ 07 октября 2019

TL / DR: вам нужно установить 7-й бит в DDRB на один.

В AVR порты конфигурируются битами в двух регистрах: DDRx и PORTx.

* 1007. * Когда соответствующий бит в регистре DDRx установлен в единицу, порт конфигурируется как выходной. И соответствующий бит в регистре PORTx выбирает, какой электрический уровень выводится на вывод. Если он равен 0, то внутренний полевой МОП-транзистор замыкает контакт на линию «заземления» и отводит ток от внешнего источника. Когда бит PORTx равен единице, тогда вывод подключен к «VCC», что приводит к выделению большого количества тока, достаточного для того, чтобы загорелся светодиод.

Но если вывод подключен к чему-то, что потребляет слишком много тока, или контакт закорочен на GND или VCC (скажем, у вас есть кнопка, подключенная и нажатая), то выходные МОП-транзисторы могут быть перегружены иповрежден.

Если бит в DDRx установлен на ноль, то вывод настроен как вход. Если соответствующий бит в PORTx равен нулю, то вывод не имеет внутреннего соединения с линиями электропередачи, это называется состоянием "высокого импеданса" или три-состоянием. Он не искажает и не поглощает ток. Таким образом, если внешний источник тока не подключен, то уровень на контакте является плавающим, под влиянием электрических помех. Логический уровень не обнаруживается и может время от времени меняться. Если вы хотите подключить, например, кнопку (между контактом и GND), то логический уровень будет определяться только при нажатии кнопки. Когда он будет выпущен, логический уровень будет неопределенным.

Но! Если бит в PORTx установлен в единицу, то внутренний полевой МОП-транзистор соединяет контакт через резистор (около 35 кОм) с линией VCC. Это делает вывод для небольшого количества тока, устанавливая высокий логический уровень. Поэтому, если кнопка подключена, когда она отпущена, тогда пин будет иметь высокий уровень. Это называется «подтягивающий резистор». Когда кнопка нажата, она не закоротит и не повредит MCU, потому что ток, протекающий через кнопку, ограничен резистором, но логический уровень будет определен как низкий.

Что если вместо кнопки у вас есть светодиодподключен к контакту? Через светодиод протекает очень небольшое количество тока, и он едва светится.

Подробнее в таблице (глава 13. Порты ввода / вывода )

0 голосов
/ 06 октября 2019

Что делать? Прочтите руководство.

Пожалуйста, обратитесь к https://ww1.microchip.com/downloads/en/devicedoc/atmel-2549-8-bit-avr-microcontroller-atmega640-1280-1281-2560-2561_datasheet.pdf

Глава 13.2.

Бит DDxn в регистре DDRx выбирает направление этого вывода. Если DDxn записан логической единицей, Pxn конфигурируется как выходной контакт. Если DDxn записывается как логический ноль, Pxn настраивается как входной вывод.

Работа с регистрами не имеет смысла, если вы не знаете, что они делают.

DDRB=0b00000000;     

Предоставляет вам только входные данные.

...