2016-12-12 1 views
1

Я установил свой Atmel ATMega32U4 с помощью реле (используя транзистор NPN для управления питанием 5 В на реле, а не с прямым приводом с микроконтроллером). Я хочу использовать PD4 как цифровой выход для управления состоянием реле. Поскольку я буду использовать USB-связь позже, у меня есть внешний кварцевый генератор, поэтому я установил соответствующий предохранитель и оставил остальные по умолчанию.Осциллирующий сигнал на цифровом выходе AVR ATmega32U4

Когда я запускаю очень простую программу, подобную приведенной ниже, которая должна просто включать реле один раз, вместо этого я слышу, что реле включается и выключается быстро примерно на 10 Гц.

#include <avr/io.h> 

int main(void) 
{ 
    // toggle PD4 as an output 
    DDRD |= _BV(4); 

    // set output high 
    PORTD |= _BV(4); 
} 

я заметил, что закомментировать PORTD |= _BV(4); линии останавливает колебания, но, конечно, не решить мою проблему. Во всяком случае, похоже, эта линия создает проблему.

Я использую Atmel Studio 6.2, программируя JTAG с помощью программатора Atmel-ICE.

Принимая дикий удар в темноте, я предполагаю, что это, возможно, придется что-то делать с альтернативной функцией PD4 в качестве ICP1/ADC8, как показано в (раздел 10.3.3, P78) datasheet, но я не знаю, как отключить эту функцию функциональность.

Есть ли у кого-нибудь идеи, в которых я ошибаюсь?

+0

Вы не указали ссылку на таблицу, в которой указаны альтернативные функции. Для PD4 нет альтернативных выходных функций, это либо вход АЦП, либо вход триггера таймера, поэтому, возможно, чип будет сброшен, что отключит реле, так как PORTD переходит в тристат. Что происходит после выхода main()? Вы пробовали положить время (1); цикл после установки PORTD, поэтому main() не выходит, посмотрите, стабилен ли результат? Вы пытались управлять реле с булавки на другом порту? У вас есть последовательный резистор, управляющий базой транзистора, диодом через катушку реле? – barny

+0

@barny, я пробовал некоторое время (1) и получил те же результаты. Когда вы упоминаете, реле управляется резистором и диодом. Я не пробовал другой порт, потому что это на печатной плате, которую я печатал, но я могу взломать что-то вместе, если ничего не работает. Знаете ли вы, можно ли отключить функцию tristate этого порта? – Sean

+0

Когда процессор сбрасывает порты по умолчанию по умолчанию на входы, то есть высокий импеданс, который отключит ваше реле. Вы не можете и не хотите изменять это поведение. У вас есть осциллограф или другой способ взглянуть на сигнал на порту? У вас нет ничего похожего на аппаратный сторожевой таймер в цепи, который бы сбросил CPU? – barny

ответ

1

Проблема заключалась в таймер сторожевого таймера. Установка WDTON (сторожевого таймера всегда включена) плавкий предохранитель на ложь не помогла с проблемой колебаний. Я полагаю, что установка ложного значения гарантирует, что это не всегда на, но не обязательно, что это определенно выключено. Собираем следующую строку в main() сделал:

MCUSR &= ~(1 << WDRF); 

Кроме того, необходимо импортировать заголовок сторожевого таймера avr/wdt.h в верхней части вашего скрипта, или в файле заголовка:

#include <avr/wdt.h> 

Так что теперь код читает :

#include <avr/io.h> 
#include <avr/wdt.h> 

int main(void) 
{ 
    // turn off watchdog 
    MCUSR &= ~(1 << WDRF); 

    // toggle PD4 as an output 
    DDRD |= _BV(4); 

    // set output high 
    PORTD |= _BV(4); 

    // wait 
    while(1) 
    { 
     // do nothing 
    } 
} 
+1

@BenceKaulics, я сделаю, как только мне позволено (придется ждать 20 часов)! – Sean

Смежные вопросы