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

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


Юстас

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

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

Еще раз пофиксил код и добавил второй вариант "для ленивых контроллеров". В первом пофиксил (надеюсь) переполнение счетчика. Самому обидно что допускаю такие косяки.

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

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

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

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

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

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

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

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

34 минуты назад, Юстас сказал:

Как же жить теперь с этим?)) 
 

Это решается элементарно, с помощью флага.

Никогда не спорьте с дураком - люди могут не заметить между вами разницы

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

Особенности хранения литиевых аккумуляторов и батареек

Потеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>>

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

А если не нагружать прерывание таким образом? Почему нельзя обработать кнопки в подпрограмме или основном цикле? Или то и другое?
 

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

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

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

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

Почему нельзя? Очень даже можно... и нужно. Особенно, если векторов прерываний используется больше чем одно/два и время их наступления не синхронно. В таких случаях, долго находиться в прерывании и заниматься там обработкой алгоритмов очень не желательно. Все дела можно делать в подпрограммах и там же сфокусироваться на алгоритме, не размывая внимание по кускам кода, разбросанным по разным процедурам...

Сейчас у нас получается помощь в виде "лебедь, щука и рак". Юстас, определитесь с выбором направления. И можно двигать алгоритм далее.

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

Я бы не хотел обрабатывать кнопки в прерывании.

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

 

 

Опять чат лагает

Если замутить проверку кнопок вот так?

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

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

;***********************************************
;******ПРОГРАММА ПРОВЕРКИ СОСТОЯНИЯ КНОПОК******
;***********************************************
KNOPKI:
in REG_PINC, PINC       ; прочтём PINC
   cpi REG_PINC, 0b00000011 ; сравним
   breq KEY1
   cpi REG_PINC, 0b00000100 ; сравним
   breq KEY2
   cpi REG_PINC, 0b00001000 ; сравним
   breq KEY3
ret

 

 

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

@Юстас  вы можете сказать уже сейчас какая часть кода где будет обрабатываться?

1) как (где) будет работать динамическая индикация?

2) как (где) будет работать клавиатура?

3) где будет формироваться импульс и следовательно, за счёт чего будет формироваться длительность импульса?

Я бы начал с формирования импульса, а не с обработки клавиш. Как уже говорил, если выясниться, что от 1 до 200 млсек будет недостаточно (нужно будет например 300 млсек), то обработку клавиатуры придётся переделывать, индикацию придётся переделывать. А изменения будут серьёзные (это не Си, где можно поменять тип данных с uint8_t на uint16_t).

Т.е. я бы делал в таком порядке (на ассемблере):

1) реализовать формирование импульса
2) реализовать динамическую индикацию
3) реализовать обработку кнопок

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

dm37, если вам не в тягость нянчиться со мной, то давайте попробуем поступить как вы написали)

Итак импульс будет формироваться за счёт кнопки +1 или кнопки -1, то есть 2 кнопки управления длительностью импульса.

параллельно данные по длительности импульса, должны выводится на трёхзначный семисегментник. Чтобы визуально видеть эту длительность.

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

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

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

там должно быть не сложно, единственно, что если не хватит регистров нужно будет использовать ОЗУ, знаете как?

p.s.
Сам давно не программировал на ассемблере, придётся вспоминать

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

Такого мир ещё не видел)))

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

; Частота кварца 16 МГц
.include "m8def.inc" 
.def temp = r16
.def Key = r17
.def flag_timer = r18
.def flag_knopki1 = r19
.def timer = r20
.def DELEY_IMPULS = r21

.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 

clr        temp
out        DDRC, temp           ; PORTC на вход
ser        temp
out        DDRB, temp           ; PORTB на выход
out        DDRD, temp           ; PORTD на выход

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: 
cpi Key, 0b00000011
breq KNOPKI
rjmp Main

   KNOPKI: 
   ldi flag_knopki1, 1
   rjmp Main

//==============================================================================
// Прерывание на 1 милисекунду
//==============================================================================
TIMER0_OVF: 
    push    temp
    ldi        temp, 6
    out        TCNT0, temp
    in        Key, PINC
    andi    Key, 0b00000011


	tst flag_knopki1
	breq START
	pop temp
	reti
	START:
	sbi PORTD, 0
	dec DELEY_IMPULS
	tst DELEY_IMPULS
	breq STOP
	pop temp
	reti
	STOP:
	cbi PORTD, 0
	clr flag_knopki1
    pop     temp
reti

 

По моему сегодня не расстреляют)))

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

Возможно, стоит использовать не Timer0, а Timer2. У него можно использовать режим CTC чтобы не перезагружать TCNT каждый раз.

В прерывании надо всегда сохранять SREG.

Delay пишется через A а не через Е.
 

Цитата

 

dec DELEY_IMPULS

tst DELEY_IMPULS

 

отдельная проверка тут не нужна, dec сам выставляет нужные флаги

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

Не слишком понятен алгоритм. Получается что после короткого (менее 256 мсек) нажатия импульс не закончится? Само время импульса также нигде не задается. Распишите его не в терминах ассемблера и регистров, а обычным языком.

Чем вам не понравилась моя версия с подсчетом времени нажатия кнопок?

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

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

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

@COKPOWEHEU  У меня нифига не получается оживить хоть что-то. Пояснений много, а результат я не сдвинулся ни на йоту. Часами думаю над алгоритмом, всё в пустую...
 

13 минуты назад, COKPOWEHEU сказал:

 

отдельная проверка тут не нужна, dec сам выставляет нужные флаги

 

А какой флаг он выставит?

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

давайте немного по другому

для начала создадим новый файл с именем, например, def_prog.inc и в него перенесём следующий код

; описание регистров
.def temp = r16
.def Key = r17
.def flags = r18
.def t_imp = r19
.def t_imp_count = r20

; описание портов ввода/вывода
.equ RELAY_PORT = PORTD   ; порт подключения соленоида
.equ RELAY_PIN = 0        ; разряд подключения соленоида

; описание констант
; описание флагов (регистр flags)
.equ FLAG_START_IMPULS = 0
  
; макросы
.MACRO RELAY_ON
	sbi RELAY_PORT, RELAY_PIN
.ENDM

.MACRO RELAY_OFF
	cbi RELAY_PORT, RELAY_PIN
.ENDM

подключается файл строкой (не забудьте добавить файл в проект)

.include "def_prog.inc"

Это нам даст включение/выключение соленоида следующими строками

RELAY_ON ; включение соленоида
RELAY_OFF ; выключение соленоида

и все настройки находятся в одном месте и определяются только один раз/

Выделять под один флаг целый регистр это расточительство, для этого нужен один бит. Попробуйте написать макросы для установки и для сброса бита 0 (FLAG_START_IMPULS) в регистре flags (по аналогии с моими). Используйте команды sbr, cbr.

Потом дальше

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

20 минут назад, COKPOWEHEU сказал:

Чем вам не понравилась моя версия с подсчетом времени нажатия кнопок?

Я там не совсем понял. Например:

dec timer

brne TIMER_CONT

Почему переход, без сравнения с константой?

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

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

def_prog.inc это библиотека?

Пардон за глупые вопросы)

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

с макросами - да

с файлом - нет

вы в существующем проекте, где у вас "Source Files", нажимаете правую кнопку мышки и выбираете "Add Files to Project" и выбираете ваш новый файл

строку def_prog.inc пишете после строки .include "m8def.inc"

у меня правда AVR Studio 4.18

def_prog.inc - это ваш новый файл, куда мы вынесли все определения

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

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

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

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

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

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

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

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

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

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

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

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