Страница 1 из 1

Управление светодиодом. Проблема с программой. Внутри.

Добавлено: Ср ноя 06, 2013 20:16:56
Vova777
Не могу понять, вот программа из обучающей книжки по ассемблеру для AVR, должна управлять скоростью смены светодиода. На кнопки вообще не реагирует. Собирал сначала в Протеусе, там вообще каша творится такая, что даже объяснить ничего не могу. Вот, смотрите, какие-то желтые квадратики светятся там, где должны быть красные (если "1") или синие (если "0"):
Изображение
Потом она проскакивает не зажигая через один светодиод:
Изображение
Дальше работает вроде как по программе. Периодически эти желтые сигналы откуда-то появляются.

Собрал реальное устройство - работает совсем по-другому, чем в Протеусе. В реальном биты порта D подтянуты резисторами на 6 кОм к плюсу. Каши нет никакой, все вроде нормально, но на кнопки все равно никак не реагирует.

Код: Выделить всё

 ; Автор: Владимир Николаевич
 ; Дата: 06.11.13
 ; Версия: 0.01
 ; Имя файла: Running LED
 ; Для AVR: ATmega32A
 ; Тактовая частота: 4 МГц

 ; Выполняемые функции: Бегущий огонек

 .device ATmega32
 .nolist
 .include "C:\Program Files\Atmel\AVR Studio 5.0\avrassembler\include\m32def.inc"
 .list

 ; ==========
 ; Объявления
 .def temp = r16
 .def Mark240 = r17
 .def Counter = r18
 .def Speed = r19

 ; ==========
 ; Начало программы
 rjmp Init

 ; ==========
 ; Инициализация
 Init:

 ldi Mark240, 240       ; Начальное значение маркера - 240
 ldi Counter, 5         ; Начальное значение счетчика - 5
 ldi Speed, 5           ; Начальное значение регистра - 5

 ldi temp, 0b00000101
 out TCCR0, temp        ; Т/С0 сконфирурирован как таймер с частотой СК/1024

 ser temp
 out DDRB, temp         ; Порт В - биты 0..7 - выходы
 ldi temp, 0b11111100
 out DDRD, temp         ; Порт D - биты 0,1 - входы, биты 2..7 - выходы

 ldi temp, 0b00000001
 out PortB, temp        ; Порт В - начальное состояние PB0 - вкл, остальные - выкл.
 ldi temp, 0b00000011
 out PortD, temp        ; Порт В - биты 0,1 - вкл. подтяжку, биты 2..7 - начальное состояние все выкл.

 ; ==========
 ; Основная программа
 Start:

 sbis PinD, 0           ; Проверяем, нажата ли кнопка уменьшения скорости
 rjmp UpTest            ; Если не нажата, переходим по метке
 
 inc Speed              ; Если нажата, уменьшаем скорость (увеличиваем Speed на 1)
 cpi Speed, 11          ; Сравниваем с числом 11, регистр равен 11?
 brne ReleaseDown       ; Если нет, переходим по метке
 dec Speed              ; Уменьшаем Speed на 1

 ReleaseDown:
 sbis PinD, 0           ; Ждем отпускания кнопки
 rjmp ReleaseDown

 UpTest:
 sbis PinD, 1           ; Проверяем, нажата ли кнопка увеличения скорости
 rjmp Timer             ; Если не нажата, переходим по метке

 dec Speed              ; Если нажата, увеличиваем скорость (уменьшаем Speed на 1)
 brne ReleaseUp         ; Если не равно нулю, то переходим по метке
 inc Speed              ; Увеличиваем Speed на 1

 ReleaseUp:
 sbis PinD, 1           ; Ждем отпускания кнопки
 rjmp ReleaseUp

 Timer:
 in temp, TCNT0         ; Загружаем значение таймера в temp
 cp temp, Mark240       ; Сравниваем значение таймера со значением маркера
 brne Start             ; Если не равны, переходим по метке

 subi Mark240, -240     ; Прибавляем 240 к значению маркера

 dec Counter            ; Декркментируем счетчик
 brne Start             ; Если не ноль, переходим по метке

 ; Заданное время прошло, меняем светодиод

 mov Speed, Counter     ; Перенести значение из Speed в Couner

 in temp, PortB         ; Загружаем значение из PortB в temp
 lsl temp               ; Логический сдвиг влево
 brcc PC+2              ; Пропустить команду, если флаг переноса сброшен
 ldi temp, 0b00000001   ; Сбрасываем в исходное состояние

 out PortB, temp        ; Изменяем состояние выводов порта В
 rjmp Start

 ; ==========
Ничего не могу понять, что не так-то там?

В общем, разобрался почему не реагировала на кнопки. Эту строку:

Код: Выделить всё

mov Speed, Counter     ; Перенести значение из Speed в Couner
Нужно было написать вот так:

Код: Выделить всё

mov Counter, Speed     ; Перенести значение из Speed в Couner
Это ладно, пол беды. Но при нажатии на кнопки, она моментально ставится либо на максимальную либо на минимальную скорость. Без промежуточных. Почему?

Re: Не понимаю, не работает и все. Внутри.

Добавлено: Ср ноя 06, 2013 20:41:27
phanis
Желтые:Line1 c +5 ,а Line2 с (-) и с пином порта дайте другие названия

Re: Не понимаю, не работает и все. Внутри.

Добавлено: Ср ноя 06, 2013 20:44:12
Шурики
По схеме Line2 и Line2 дублируется на светодиодах. Думаю, так не должно быть. Как минимум, из-за этого пропуск.

Re: Не понимаю, не работает и все. Внутри.

Добавлено: Ср ноя 06, 2013 21:07:22
Vova777
Спасибо Шурики и phanis! Точно, блин, это я когда маркировал связи, запарился. Вот, исправил так, как Вы подсказали (еще показал как мои входные биты к плюсу подтянуты), теперь работает без пропусков и "желтых" сигналов:
Изображение

Но при нажатии на кнопку уменьшения скорости, она ставится сразу на минимальную скорость. Аналогично с кнопкой для увеличения скорости. Проблема, скорее всего, программная. Помогите, пожалуйста.

Re: Не понимаю, не работает и все. Внутри.

Добавлено: Ср ноя 06, 2013 21:18:50
zero648
Желтые квадратики, это когда плюс с минусом встречаются, в протеусе ты сжег контроллер, вот так.

p.s. Я даже думаю, они поэтому и желтые, что символизируют огонь :idea: !!!!

Re: Не понимаю, не работает и все. Внутри.

Добавлено: Ср ноя 06, 2013 21:25:43
Vova777
zero648 писал(а):Желтые квадратики, это когда плюс с минусом встречаются, в протеусе ты сжег контроллер, вот так.
Спасибо. Все же, я думаю, что я сжег наверное, не весь контроллер, а только один из выходов :)) Впредь постараюсь быть внимательнее. :solder:

Помогите, пожалуйста: при нажатии на кнопку уменьшения скорости, скорость ставится сразу на минимальную скорость. Аналогично с кнопкой для увеличения скорости. Проблема, скорее всего, программная. Не понимаю, в чем причина.

Re: Управление светодиодом. Проблема с программой. Внутри.

Добавлено: Ср ноя 06, 2013 21:46:02
Шурики
Проблема, действительно, скорее всего программная. Вывод на 99(9) живой.

Re: Управление светодиодом. Проблема с программой. Внутри.

Добавлено: Ср ноя 06, 2013 21:48:33
Vova777
Шурики писал(а):Вывод на 99(9) живой.
Такая проблема была только в Протеусе, в реальном устройстве было подключено нормально. Но с кнопками беда и там. Что делать?

Re: Управление светодиодом. Проблема с программой. Внутри.

Добавлено: Ср ноя 06, 2013 22:20:09
zero648
Проблема в обработке кнопок, нет ни пауз ни проверки антидребезга, думаю счетчик просто быстро уходит в крайнее положение, как при увеличении так и при уменьшении скорости. Ну поставь хотябы на кнопки RC цепочки для аппаратного антидребезга где-то 4,7мкФ и 47кОм, попробуй мож поможет.

Re: Управление светодиодом. Проблема с программой. Внутри.

Добавлено: Ср ноя 06, 2013 22:23:22
Vova777
zero648 писал(а):...Проблема в обработке кнопок, нет ни пауз ни проверки антидребезга, думаю счетчик просто быстро уходит в крайнее положение...
Программно реализовано так, что программа зацикливается, ожидая отпускания кнопки. Вот:

Код: Выделить всё

ReleaseDown:
sbis PinD, 0           ; Ждем отпускания кнопки
rjmp ReleaseDown
и здесь:

Код: Выделить всё

ReleaseUp:
sbis PinD, 1           ; Ждем отпускания кнопки
rjmp ReleaseUp
zero648 писал(а):...Ну поставь хотябы на кнопки RC цепочки для аппаратного антидребезга где-то 4,7мкФ и 47кОм...
В Протеусе тоже дребезг кнопок?

Это не аппаратная проблема. В программе где-то нужно смотреть.

Вот, возьмите проект Протеуса (симулятор), сами увидите:
Lesson 4 Running LED.rar
(13.97 КБ) 119 скачиваний
А здесь проект в AVR Studio 5.0 (hex там):
Lesson 4 Running LED.rar
(17.62 КБ) 118 скачиваний

Re: Управление светодиодом. Проблема с программой. Внутри.

Добавлено: Ср ноя 06, 2013 22:29:00
zero648
выложи проект в протеусе и хекс файл, посмотрим

p.s. Мысли читаешь, я в шоке :shock:

Re: Управление светодиодом. Проблема с программой. Внутри.

Добавлено: Ср ноя 06, 2013 22:29:38
Vova777
zero648 писал(а):выложи проект в протеусе и хекс файл, посмотрим
Уже готово. См. пост выше :)
zero648 писал(а):p.s. Мысли читаешь, я в шоке :shock:
как говорится, у умных людей мысли сходятся :)) :)

По идее, там должно быть десять скоростей - от 0,1 сек до 1 сек.

Re: Управление светодиодом. Проблема с программой. Внутри.

Добавлено: Ср ноя 06, 2013 22:45:45
zero648
Да, действительно, аппартный тормоз не влияет на скорость, в протеусе бы точно сработало, вот посмотри. Стало быть, нужно искать в коде ошибки обработки кнопок и изменения скорости.

Re: Управление светодиодом. Проблема с программой. Внутри.

Добавлено: Ср ноя 06, 2013 22:49:55
Vova777
zero648 писал(а):Стало быть, нужно искать в коде ошибки обработки кнопок и изменения скорости.
Да, ошибка где-то там.

Re: Управление светодиодом. Проблема с программой. Внутри.

Добавлено: Чт ноя 07, 2013 07:15:32
zero648
Вот они, ошибочки:

Код: Выделить всё

 sbis PinD, 0           ; Проверяем, нажата ли кнопка уменьшения скорости
...
 sbis PinD, 1           ; Проверяем, нажата ли кнопка увеличения скорости
нужно сделать так:

Код: Выделить всё

 sbic PinD, 0           ; Проверяем, нажата ли кнопка уменьшения скорости
...
 sbic PinD, 1           ; Проверяем, нажата ли кнопка увеличения скорости

Re: Управление светодиодом. Проблема с программой. Внутри.

Добавлено: Чт ноя 07, 2013 12:25:49
Vova777
zero648 писал(а): Вот они, ошибочки
Спасибо, изменил, действительно, стало реагировать и последовательно перебирать доступные скорости и все было бы хорошо, если бы у меня было управление активной единицей. Но у меня управление активным нулем.

Соответственно, чтобы это работало, нужно чтобы кнопки были постоянно замкнуты (т.е. чтобы на биты № 0,1 шел "0"), а размыкались только при подаче команды (т.е. чтобы на биты № 0,1 шла "1"). Так не пойдет. У меня когда кнопки разомкнуты, на биты идет "1", а когда замкнуты - "0".

Ошибка где-то еще, не могу понять, помогите.

Re: Управление светодиодом. Проблема с программой. Внутри.

Добавлено: Чт ноя 07, 2013 12:32:28
Шурики
Управление активным нулём - это правильно. Плюс всё равно внутри микроконтроллера или снаружи подтянут резистором, а 0 это просто земля без всего лишнего. Кнопка на "1" даст больше помех, чем кнопка на "0".

Re: Управление светодиодом. Проблема с программой. Внутри.

Добавлено: Чт ноя 07, 2013 13:14:01
zero648
Не понял :shock: , схема в железе не соответствует схеме в протеусе? в чем проблема то?