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

Обсуждаем контроллеры компании Atmel.
Ответить
Вымогатель припоя
Сообщения: 507
Зарегистрирован: Чт июн 16, 2011 15:06:10
Откуда: электрощитовая

Сообщение 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
Это ладно, пол беды. Но при нажатии на кнопки, она моментально ставится либо на максимальную либо на минимальную скорость. Без промежуточных. Почему?
Последний раз редактировалось Vova777 Ср ноя 06, 2013 21:27:54, всего редактировалось 2 раза.
даешь высокое напряжение
Реклама
Вымогатель припоя
Сообщения: 513
Зарегистрирован: Сб фев 19, 2011 18:04:08
Откуда: Татарстан, пос. Актюбинский

Сообщение phanis »

Желтые:Line1 c +5 ,а Line2 с (-) и с пином порта дайте другие названия
Контактная информация:
Реклама
Вымогатель припоя
Сообщения: 506
Зарегистрирован: Пн авг 31, 2009 22:10:50
Откуда: СК

Сообщение Шурики »

По схеме Line2 и Line2 дублируется на светодиодах. Думаю, так не должно быть. Как минимум, из-за этого пропуск.
Вымогатель припоя
Сообщения: 507
Зарегистрирован: Чт июн 16, 2011 15:06:10
Откуда: электрощитовая

Сообщение Vova777 »

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

Но при нажатии на кнопку уменьшения скорости, она ставится сразу на минимальную скорость. Аналогично с кнопкой для увеличения скорости. Проблема, скорее всего, программная. Помогите, пожалуйста.
даешь высокое напряжение
Реклама
Эиком - электронные компоненты и радиодетали
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Желтые квадратики, это когда плюс с минусом встречаются, в протеусе ты сжег контроллер, вот так.

p.s. Я даже думаю, они поэтому и желтые, что символизируют огонь :idea: !!!!
Реклама
Вымогатель припоя
Сообщения: 507
Зарегистрирован: Чт июн 16, 2011 15:06:10
Откуда: электрощитовая

Сообщение Vova777 »

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

Помогите, пожалуйста: при нажатии на кнопку уменьшения скорости, скорость ставится сразу на минимальную скорость. Аналогично с кнопкой для увеличения скорости. Проблема, скорее всего, программная. Не понимаю, в чем причина.
даешь высокое напряжение
Реклама
Вымогатель припоя
Сообщения: 506
Зарегистрирован: Пн авг 31, 2009 22:10:50
Откуда: СК

Сообщение Шурики »

Проблема, действительно, скорее всего программная. Вывод на 99(9) живой.
Вымогатель припоя
Сообщения: 507
Зарегистрирован: Чт июн 16, 2011 15:06:10
Откуда: электрощитовая

Сообщение Vova777 »

Шурики писал(а):Вывод на 99(9) живой.
Такая проблема была только в Протеусе, в реальном устройстве было подключено нормально. Но с кнопками беда и там. Что делать?
даешь высокое напряжение
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Проблема в обработке кнопок, нет ни пауз ни проверки антидребезга, думаю счетчик просто быстро уходит в крайнее положение, как при увеличении так и при уменьшении скорости. Ну поставь хотябы на кнопки RC цепочки для аппаратного антидребезга где-то 4,7мкФ и 47кОм, попробуй мож поможет.
Вымогатель припоя
Сообщения: 507
Зарегистрирован: Чт июн 16, 2011 15:06:10
Откуда: электрощитовая

Сообщение 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 скачиваний
Последний раз редактировалось Vova777 Ср ноя 06, 2013 22:44:10, всего редактировалось 2 раза.
даешь высокое напряжение
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

выложи проект в протеусе и хекс файл, посмотрим

p.s. Мысли читаешь, я в шоке :shock:
Последний раз редактировалось zero648 Ср ноя 06, 2013 22:29:54, всего редактировалось 1 раз.
Вымогатель припоя
Сообщения: 507
Зарегистрирован: Чт июн 16, 2011 15:06:10
Откуда: электрощитовая

Сообщение Vova777 »

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

По идее, там должно быть десять скоростей - от 0,1 сек до 1 сек.
даешь высокое напряжение
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Да, действительно, аппартный тормоз не влияет на скорость, в протеусе бы точно сработало, вот посмотри. Стало быть, нужно искать в коде ошибки обработки кнопок и изменения скорости.
Вложения
Lesson 4 Running LED.rar
(14.34 КБ) 137 скачиваний
Вымогатель припоя
Сообщения: 507
Зарегистрирован: Чт июн 16, 2011 15:06:10
Откуда: электрощитовая

Сообщение Vova777 »

zero648 писал(а):Стало быть, нужно искать в коде ошибки обработки кнопок и изменения скорости.
Да, ошибка где-то там.
даешь высокое напряжение
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Вот они, ошибочки:

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

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

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

 sbic PinD, 0           ; Проверяем, нажата ли кнопка уменьшения скорости
...
 sbic PinD, 1           ; Проверяем, нажата ли кнопка увеличения скорости
Вымогатель припоя
Сообщения: 507
Зарегистрирован: Чт июн 16, 2011 15:06:10
Откуда: электрощитовая

Сообщение Vova777 »

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

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

Ошибка где-то еще, не могу понять, помогите.
даешь высокое напряжение
Вымогатель припоя
Сообщения: 506
Зарегистрирован: Пн авг 31, 2009 22:10:50
Откуда: СК

Сообщение Шурики »

Управление активным нулём - это правильно. Плюс всё равно внутри микроконтроллера или снаружи подтянут резистором, а 0 это просто земля без всего лишнего. Кнопка на "1" даст больше помех, чем кнопка на "0".
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Не понял :shock: , схема в железе не соответствует схеме в протеусе? в чем проблема то?
Ответить

Вернуться в «AVR»