2017-01-09 10 views
1

Я использую микро ATmega128 и иметь все мой штифт inits набора для вывода и установить на низкий при моей основной части коды:ATMega128 Выход мерцает Запуск

PORTB=0x00; 
DDRB=0xFF; 

Однако при запуске, выход, связанной при этом PORTB.0 показывает максимум на долю секунды (я поймал его в области), и, похоже, другие выходы делают то же самое. Похоже, он идет LOW-HIGH-LOW. Я сделал некоторые чтения, что это может быть вызвано три-состояния для вывода переключателя во время запуска, поэтому я установил регистр PUD на 1 до ввода вывода, а затем вернулся к 0 после и все равно не повезло. Есть ли у кого-нибудь какие-либо идеи, чтобы сохранить этот выход во время запуска? Это не всегда происходит, и это то, что меня озадачило.

+0

У вас есть резисторы смещения? –

+0

Хорошо сделано, по крайней мере, для записи данных порта перед настройкой в ​​качестве вывода. –

+0

Это почти наверняка аппаратный вопрос, а не проблема с программным обеспечением, и вы должны опубликовать его на http://electronics.stackexchange.com/. GPIO - высокоимпедансные входы при сбросе, а уровень, измеренный с помощью области действия, будет зависеть от схемы, подключенной к штырю. Если это проблема, и вам нужен определенный уровень при запуске, используйте подтягивающий или выпадающий резистор, то есть уровень должен быть извне, потому что вход не будет управлять им - он плавает. – Clifford

ответ

4

Основная проблема - проблема аппаратного обеспечения - отсутствие отказоустойчивого резистора на GPIO, так что он плавает, когда находится в состоянии с высоким полным сопротивлением сброса по умолчанию.

Лучшее, что вы можете сделать в программном обеспечении, - это инициализировать GPIO при первой же возможности сразу после сброса. Для этого в CodeVisionAVR вам нужно использовать настроенную startup.asm в проекте, как описано в разделе 4.18 руководства CoadeVisionAVR компилятора:

enter image description here ...

Где я предлагаю вам инициализирует PORTB и DDRB следующим :

   LDI R16, 0x00  
      OUT PORTB, R16 
      LDI R16, 0xFF  
      OUT DDRB, R16 

непосредственно перед шагом 2, т.е. первые четыре инструкции. Количество времени, в течение которого GPIO останется плавающим, может быть слишком малым, чтобы реле реагировало, если это механическое реле. У вас может быть проблема с твердотельным реле. Длительность любого импульса может зависеть от времени нарастания мощности; если он медленный, вы можете получить более длительный импульс.

+0

Я сделал это, и все кажется хорошим. Я действительно сделал это сам прошлой ночью и не успел проверить здесь, но это то, что сработало. Еще раз спасибо всем за помощь! –

+0

@ wgdvs: Прохладный; мой ответ использовал информацию, которую вы сейчас предоставляете только в комментариях; если бы вы могли обновить вопрос, это сделало бы его более согласованным и полезным для сообщества SO. – Clifford

+0

сделаю. И на самом деле это помогло, но, подключив его к велосипедисту, я все еще рассматривал проблему примерно в 1 из каждых 80 попыток ... Я сказал своему боссу, что действительно только хорошее исправление заключается в том, чтобы поместить этот штифт в GND. Он согласился и одобрил изменения. Он не должен воздействовать ни на один из наших продуктов, поскольку этот контакт контролирует только это реле во всех случаях. –

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

  • Нет связанных вопросов^_^