Простая AVR-программа ведет себя странно "иногда" - PullRequest
0 голосов
/ 28 января 2012

Я новичок в AVR, но я программировал PIC раньше, только в этот раз я тоже все делаю в Linux, так что вы догадаетесь, что я использую avrdude ...

Моя цель для этого проектазаключается в изменении цвета двухцветного светодиода в зависимости от определенного состояния.

По умолчанию светодиод является КРАСНЫМ (если вы выполняете правильные подключения), тогда я хочу, чтобы он перешел на желтый (это быстрое переключение между зеленым и красным), пока пользователь удерживает кнопку нажатой, затем при отпускании она переходит в зеленый цвет, а затем в следующий раз выключается.

Итак, подведем итог,

Светодиод красный

Пока я удерживаю кнопку нажатой, она будет желтой

Когда я отпущу, она будет зеленый

Пока я удерживаю кнопку снова, она будет желтой

Когда я отпущу, она будет выключена

Пока я снова удерживаю кнопку, она будет желтой

Когда я отпущу, она будет красной (и так далее ...)

В моем реальном коде иногда все работает очень хорошо, но иногда светодиод застревает на желтом, и я понятия не имею, почему

Есть идеи?

Код на ideone: http://ideone.com/LI9gH

Спасибо

Ответы [ 2 ]

1 голос
/ 28 января 2012

Я предполагаю, что вы просто видите, как генератор случайных чисел пропускает изменения кнопки примерно в 1/3 времени, потому что дебасинг слегка отключен. Рассмотрим время, проведенное в разных штатах:

check button
wait 10ms
check button again
if button values differ, update state
if yellow
  shine red for 1ms
  shine green for 4ms then leave green on
otherwise
  set current color

Это твой основной цикл. Как вы можете видеть, он проверяет кнопку в течение двух мгновений в течение примерно 15 мсек; и он не сравнивается с последним значением, для которого он обновил состояние, только со значением 10 мс до. Отпустите кнопку в течение 5 мсек «желтого», и allumerAmbre не будет сброшен до следующего выпуска, который случится в 10 мсек. Кроме того, желтый получил 1/15 красного, возможно, не тот микс, который вы хотели.

1 голос
/ 28 января 2012

Я не знаю, где проблема, но я могу предложить альтернативный подход, если это поможет. : -)

Поскольку вы циклически проходите последовательность состояний светодиодов, вы можете просто перечислить их в массиве и пройти по нему (переходя по кругу, когда вы достигнете конца), обновляя светодиод каждый раз, когда изменяется состояние кнопки.

EDIT:

Вот альтернатива:

colours = [red, yellow, green, yellow, off, yellow]
current button = released
state = 0
repeat
    check button
    if button != current button
        current button = button
        state += 1
        if state >= len(colours)
            state = 0
    // showing the colour sets the LED and includes a delay
    show colours[state]
...