2012-01-28 2 views
0

Я новичок в AVR, но я запрограммировал ТОС раньше, только на этот раз я делаю все, что в Linux тоже, так что вы догадаетесь, что я использую AVRDUDE ...Простой АРН программа ведет себя странно «иногда»

Моя цель для этого проекта - изменить цвет биколорного светодиода в зависимости от определенного состояния.

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

Таким образом, чтобы резюмировать,

СИД красный

В то время как я держать кнопку вниз его Ассоль быть желтый

Когда я релиз будет зеленый

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

Когда я релиз будет от

В то время как я удерживать кнопку еще раз, что это собиралось быть желтый

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

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

Любые идеи?

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

Благодаря

ответ

1

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

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 красного цвета, возможно, не на той смеси, которую вы намеревались.

+0

Спасибо, это очень поучительно. Итак, если я понял правильно, вы говорите, что я должен сделать еще одну проверку кнопки как-то во время желтого состояния? ох и спасибо за замечание о моей желтой миксе, вы на самом деле правы :) –

+1

Я предлагаю вам прекратить проверку самого перехода (lecture1! = lecture2) и вместо этого проверить, чтобы кнопка стабилизировалась в новом состоянии, нажималось ли это или не (информация, которую вы уже имели в allumerAmbre). Кроме того, найдите хорошую статью о [debouncing] (http://electronics.stackexchange.com/questions/6884/debouncing-buttons). –

+0

спасибо @Yann, я думаю, что получил свою проблему со всеми вашими предложениями! Я полностью переписал часть, где он проверил переход, и заменил его на некоторое время(); и, похоже, он работает как шарм! Я отправлю обратно в случае, если у меня возникнут проблемы, но я думаю, что это хорошо, спасибо еще раз :) –

1

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

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

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] 
+1

спасибо, я попробую это, (также то, что я написал, является моим вторым подходом к той же проблеме и с одним и тем же эффектом: D) вы думаете, что это может быть связано с оборудованием? –