Перейти к содержанию

Помогите с инкрементом в операторе ветвления


Юстас

Рекомендуемые сообщения

11 минуту назад, Геннадий сказал:

Никакого прерывания с кнопками быть не должно. Главное правило прерывания - как можно меньше времени в нем находиться.

я считаю, что должно быть в прерывании, вы же не предлагаете обрабатывать кнопки в основном теле программы? Если основой алгоритм работы будет затратный по ресурсам, то с кнопками проблемы начнутся.

А для чего вы предлагаете сначала разобраться с таймером, зачем он нужен будет?

У меня, в прерывании (на 1 млсек), как я уже, писал идёт обработка кнопок, вывод на экран, чтение с портов, вывод в порт (если на это не задействовано другое прерывание), формирование таймеров на 1 сек, 250 млсек, т.е то, что не нужно при реализации основного алгоритма, только анализ флагов. И по времени это всё занимает порядка 20-30 мксек (разве это много, если у вас уже решены все проблемы с периферией и у вас все силы сосредоточены на основном алгоритме).

Изменено пользователем dm37
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Конечно в основном теле, там и дребезг без задержек решится и одноразовое нажатие кнопки продетектируется. Заметьте, все будет без delay-ев, поэтому о затратности алгоритма речи не ведем. Перегнем с ресурсами, подправим. Это же Ассм! Тут никаких рамок и ограничений нет.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Генадий, я могу вернуться к исходному коду и плясать от него?

Скрытый текст

/*
 * ATmega_8_Project.asm
 * Кварц 16 МГц
 *  Created: 01.11.2016 22:11:39
 *   Author: Admin
 */ 
;**********************************************
;ПЕРЕМЕННЫЕ************************************
;**********************************************
.def temp = r16
.def flag = r17
.def DLTST_IMPSA = r18
.def ANTDRBZG = r19

;**********************************************

;**********************************************
;ВЕКТОРА ПРЕЫВАНИЙ*****************************
;**********************************************
.cseg
.org   0x000
  rjmp   RESET
.org 0x009
  rjmp   TIMER0_OVF
;**********************************************

;**********************************************
;ИНИЦИАЛИЗАЦИЯ*********************************
;**********************************************
RESET:
;СТЕК//
ldi   r16, low(RAMEND)
out   SPL,   r16
ldi   r16, high(RAMEND)
out   SPH,   r16
;ПОРТЫ//
ldi   temp, 0b00000000
out DDRC, temp           ; PORTC на вход
ser temp
out DDRD, temp
;НАСТРОЙКА ТАМЕРА 0//
ldi   temp, 0b00000011   ; предделитель 64
out   TCCR0, temp
ldi temp, 0b00000001     ; прерывание по переполнению каждые 980 мкс
out   TIMSK, temp
sei
;***********************************************

;***********************************************
;ОСНОВНЩЙ ЦИКЛ**********************************
;***********************************************
CIKLE:
rcall KNOPKI
rjmp CIKLE
;***********************************************

;***********************************************
;*******ПРЕРЫВАНИЕ ПО ВЕКТОРУ TIMER0_OVF********
;***********************************************
TIMER0_OVF:
ldi flag, 1       ; поднимем флаг
reti
;***********************************************


;***********************************************
;******ПРОГРАММА ПРОВЕРКИ СОСТОЯНИЯ КНОПОК******
;***********************************************
KNOPKI:
in temp, PINC        ; считываем PINC в переменную
cpi temp, 0b00000011 ; сравниваем с константой  
breq ANTIDREBEZG     ; если равно то запускаем антидребезг 60 мс
ret
;***********************************************


;***********************************************
;************ПРОГРАММА АНТИДРЕБЕЗГА*************
;***********************************************
ANTIDREBEZG:
tst flag           ; пповерим флаг
breq INKRIMENT     ; если поднят, прыгаем в INKRIMENT
ret                ; если нет, возвращаемся в основной цикл
INKRIMENT:
inc ANTDRBZG       ; инкримент переменной для антидребезга
ldi flag, 0        ; очистим флаг
cpi ANTDRBZG, 0x3c ; сравним переменую с 60 (примерно 60 мс)
ret                ; если равно 60 мс, то...
rjmp SET_PORTD0    ; ... прыгаем установить 1 в PORTD.0
;***********************************************

;***********************************************
;*********ПРОГРАММА УСТАНОВКИ PORTD.0***********
;***********************************************
SET_PORTD0:
sbi PORTD, 0       ; поднимем PORTD.0 в 1
clr ANTDRBZG       ; очищаем переменную
ret

 

 

Изменено пользователем Юстас
Ссылка на комментарий
Поделиться на другие сайты

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

то, что не должно быть delay в основном теле программы, это верно, но а как же кнопки, а если завтра захочется автоповтор при нажатии? Ведь задержка после первого нажатия, как правило ~700 млсек, а при повторном нажатии, например, 200. Как Быть?

Опрос в прерывании эту проблему решит полностью

p.s.

мы ведь пока обсуждаем принцип построения программы

Изменено пользователем dm37
Ссылка на комментарий
Поделиться на другие сайты

Может достаточно на таймере завести программный счетчик с интервалом 100 мс и по его "срабатыванию" проверять кнопки?

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Давайте сначала заставим биться сердце программы.

Юстас, вернемся к начальной инициализации и прерыванию по таймеру на 1мс. 

Кстати. Какой на этот раз МК и его частота тактирования?

Ссылка на комментарий
Поделиться на другие сайты

Начать можно с вот этого, реализовано прерывание на 1 млсек + состояние кнопок в регистре Key

Цитата

.include "m8def.inc"

.def temp = r16
.def Key = r17

.cseg
.org   0x000
  rjmp   RESET
.org 0x009
  rjmp   TIMER0_OVF

//==============================================================================
//
//==============================================================================
RESET:

ldi        r16, low(RAMEND)
out        SPL,   r16
ldi        r16, high(RAMEND)
out        SPH,   r16

ldi        temp, 0b00000000
out        DDRC, temp           ; PORTC ?? ????
ser        temp
out        DDRD, temp

ldi        temp, 6
out        TCNT0, temp
ldi        temp, (1 << TOIE0)
out        TIMSK, temp
ldi        temp, (0 << CS02) | (1 << CS01) | (1 << CS00)
out        TCCR0, temp
sei

//==============================================================================
// Основной цикл
//==============================================================================
Main:


rjmp Main

//==============================================================================
// Прерывание на 1 милисекунду
//==============================================================================
TIMER0_OVF:

    push    temp
    ldi        temp, 6
    out        TCNT0, temp
    in        Key, PINC
    andi    Key, 0b00000011
    pop     temp
reti

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

Изменено пользователем dm37
Ссылка на комментарий
Поделиться на другие сайты

Генадий, на этот раз ATmega8, 16МГц.

Инициализация TIMER0 на 1 мс, прерывание по переполнению.


 

;НАСТРОЙКА ТАМЕРА 0//
ldi   temp, (1<<CS02 | 1<<CS00)   ; предделитель 1024
out   TCCR0, temp        ; прерывание по переполнению каждую 1 мс
ldi temp, 0b00000001     
out   TIMSK, temp
sei

dm37, а для чего логическое и с константой? /andi    Key, 0b00000011/



 

Изменено пользователем Юстас
Ссылка на комментарий
Поделиться на другие сайты

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

dm37, а для чего логическое и с константой? /andi    Key, 0b00000011/

Допустим у вас ещё что-то подключено на данный порт, то будут меняться биты 7,6,5,4,3,2. Чтобы их сбросить в ноль и оставить только разряды отвечающие за кнопки применяется маскирование битов с помощью andi. В простейшем случае вы сразу можете сравнить key с каким либо значением (если Key=0 - кнопки не нажаты, Key=1 - нажата кнопка 1, Key=2 - нажата кнопка 2, Key=3 - нажаты кнопки 1 и 2)

Изменено пользователем dm37
Ссылка на комментарий
Поделиться на другие сайты

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

1: Обработка минимум 4 кнопок.

2: 3 объединённых семисегментных индикатора

3: 1 соленоид 150 Ватт.
 

Ссылка на комментарий
Поделиться на другие сайты

полный перечень задач определяет разработчик, а 16 Мгц как раз достаточно, что бы обрабатывать кнопки в прерывании.

У нас контроллер mega16 на 8 Мгц обрабатывала кнопки, выводила на LCD и.т.. и всё успевала + это абсолютно не мешало основному алгоритму.

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

Ссылка на комментарий
Поделиться на другие сайты

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

Ссылка на комментарий
Поделиться на другие сайты

Я пробовал предложить такую идею. И сам уже думал заюзать асинхронные таймеры. Если сбросить частоту кварца до 8МГц, то можно и двумя 8 битными таймерами обойтись.
 

Ссылка на комментарий
Поделиться на другие сайты

Забыл напомнить, длительность импульса для соленоида будет не фиксированной, а задаваться пользователем станка. За это будут отвечать 2 кнопки + и - длительность.
 

Энергопотребление будет от сети, так что полный безлимит)))
 

Ссылка на комментарий
Поделиться на другие сайты

22 часа назад, Юстас сказал:

Генадий, в Мс) думаю от 1 Мс до 200 Мс. Такой градации должно хватить.

опять же получается шаг 1 млсек от 1 до 200. Т.е. вполне можно сделать счётчик длительности включения соленоида (в млсек) и в этом же прерывании (1 млсек) включать и выключать соленоид (если не пугает, что импульс не сможет запуститься между прерываниями). А в основном теле программы только устанавливать длительность импульса и флаг на запуск формирования импульса

Изменено пользователем dm37
Ссылка на комментарий
Поделиться на другие сайты

Если соленоид сработает сам по себе, то капец пальцам оператора и мне тоже))
 А задержка из-за прерывания  даже на милисекунду, никак не повлияет на результат.

 

Изменено пользователем Юстас
Ссылка на комментарий
Поделиться на другие сайты

а почему он должен сработать сам по себе, я имел ввиду, что импульс будет запускаться кратно 1 млсек (0.5, 1.5 млсек не получиться)

у вас будет условие, по которому будет формироваться импульс, так что всё в порядке

Ссылка на комментарий
Поделиться на другие сайты

если вас @Юстас такой подход устраивает, то следующий шаг создать две переменных определяющую длительность импульса (t_imp - одна переменная) и счётчик импульса (t_imp_count - вторая переменная) и переменную (flags - третья) для флагов и один бит отвести для признак формирования импульса.

алгоритм работы словами:

в прерывании

если флаг на запуск установлен, то
проверяем счётчик (t_imp_count) на достижение нуля
если ноль, то выключаем соленоид и t_imp_count = t_imp и сбрасываем флаг, если нет
то включаем соленоид и t_imp_count = t_imp_count -1

если ничего не напутал )))

значение длительности импульса задайте в основном теле программы, а флаг пока устанавливайте, например по прерывания INT0 (или в прерывании другого таймера)
 

Когда заработает формирование импульса, можно заняться выводом значения t_imp на индикаторы,
потом заняться устранением дребезга кнопок и изменением значения переменной t_imp от кнопок

Ссылка на комментарий
Поделиться на другие сайты

dm37, спасибо за помощь) Я сейчас пишу алгоритм обработки кнопок. Чувствую гореть мне опять на костре инквизиции когда покажу код)))
 

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...