ДядяВован Опубликовано 10 июня, 2023 Поделиться Опубликовано 10 июня, 2023 4 минуты назад, dubrovkin сказал: аппаратное и программное Сразу не совсем "вкуриваю" о чём речь. Может так. Аппаратное связано с железом (таймером, пинами). А программное, когда в коде устанавливается флаг прерывания, тем самым вызывая его обработчик. 0 С уважением, Владимир Ссылка на комментарий Поделиться на другие сайты Поделиться
dubrovkin Опубликовано 10 июня, 2023 Автор Поделиться Опубликовано 10 июня, 2023 1 минуту назад, ДядяВован сказал: Сразу не совсем "вкуриваю" о чём речь. Может так. Аппаратное связано с железом (таймером, пинами). А программное, когда в коде устанавливается флаг прерывания, тем самым вызывая его обработчик. Это я взял из какой-то статьи: Цитата В микроконтроллере ATtiny13 есть два типа внешних прерваний: аппаратное (INT0, на ножке INT0) и программное (PCINT0, на ножках PCINT0-5, которое можно разрешить по маске только на нужных ножках). INT0 может работать в четырёх рехимах: По низкому уровню на ножке; По изменению уровня на ножке; По спадающему фронту; По нарастающему фронту. PCINT0 может работать только по изменению уровня на любой из ножек, настроенных по маске. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
ДядяВован Опубликовано 10 июня, 2023 Поделиться Опубликовано 10 июня, 2023 12 минут назад, dubrovkin сказал: из какой-то статьи Лучше читать первоисточник. Бросьте в ЛС адрес почты. Я вам книги Евстифеева пришлю. Практически, это переводы даташитов на русский язык. 1 С уважением, Владимир Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
ДядяВован Опубликовано 10 июня, 2023 Поделиться Опубликовано 10 июня, 2023 30 минут назад, dubrovkin сказал: написать программу, чтобы определить как обрабатываются прерывания Это будет мало информативно. Принцип прерываний в AVR следующий. Если возникает условие для какого-либо прерывания, то устанавливается соответствующий флаг/бит. Если прерывания разрешены, то вызывается обработчик прерывания, который сбрасывает установленный флаг. Пока выполняется обработчик, прерывания запрещены, они разрешатся командой RETI. Либо их можно разрешить внутри обработчика соответствующей командой, при необходимости. Если прерываний несколько, то приоритет у прерывания с меньшим адресом вектора перехода. Таким образом прерывания не теряются. Но! Можно потерять количество событий, если за время запрета прерываний их будет несколько. Если в программе используются прерывания, то запрещать их можно на максимально короткое время. Как пример, атомарные операции, когда запрет на прерывание длится несколько команд, необходимых выполнить неразрывно. Делать прерывание от кнопки, без аппаратного подавления дребезга, ИМХО не логично. Всё равно придётся анализировать временные интервалы, чтобы отделить дребезг от полезной информации. 0 С уважением, Владимир Ссылка на комментарий Поделиться на другие сайты Поделиться
dubrovkin Опубликовано 10 июня, 2023 Автор Поделиться Опубликовано 10 июня, 2023 (изменено) 18 минут назад, ДядяВован сказал: Пока выполняется обработчик, прерывания запрещены, они разрешатся командой RETI. Либо их можно разрешить внутри обработчика соответствующей командой, при необходимости. А что за команда? Это Вы про команду sei? Я понимаю, что прерывание reset имеет максимальный приоритет, что даже если мы находимся в обработчике прерывания reset и случилось прерывание reset, то будет вызвано прерывание reset (я так понимаю, даже если все прерывания запрещены ). Ну, наверное ещё если конфигурация фьюзов не отключило этот reset с пина. Но, если я нахожусь в другом векторе прерывания (скажем от таймера) и я разрешил в нём прерывания, то у меня может же сработать оно же? Если да, то что будет с...в общем сомневаюсь что он тут всю цепочку составит и потом развернёт. Скорее всего возможны только другие прерывания пока мы в прерывании или как? Ну а вообще, даже механика вызова прервания A из прерывания B, а из него прерывание C, потом прерывание D из прерывания C и так далее...кажется странным. Он реально всё это запомнит и потом пройдётся обратно? Изменено 10 июня, 2023 пользователем dubrovkin 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ДядяВован Опубликовано 10 июня, 2023 Поделиться Опубликовано 10 июня, 2023 9 минут назад, dubrovkin сказал: Вы про команду sei? Да 12 минут назад, dubrovkin сказал: Скорее всего возможны только другие прерывания пока мы в прерывании или как? Скорее да. Могут быть и нюансы, но надо много думать. 13 минут назад, dubrovkin сказал: кажется странным Ни чуть. Просто надо это применять осмысленно и при необходимости. У меня в одной программе это используется. Есть прерывание по таймеру, довольно длинное (много команд). И есть прерывание при переходе сетевого напряжения через ноль, оно сделано максимально коротким, но его нельзя пропустить. Поэтому внутри прерывания от таймера есть sei. Разумеется, не может возникнуть повторного прерывания от таймера, пока обрабатывается первое, т.к. интервал между ними гораздо больше времени выполнения. 0 С уважением, Владимир Ссылка на комментарий Поделиться на другие сайты Поделиться
dubrovkin Опубликовано 10 июня, 2023 Автор Поделиться Опубликовано 10 июня, 2023 (изменено) 1 час назад, ДядяВован сказал: Пока выполняется обработчик, прерывания запрещены, они разрешатся командой RETI. Получается, например в цикле я вызываю sei и когда будет прерывание, оно вызовется. Скажем, сработало какое-то прерывание и, когда она сработала, словно само вызывается cli. Я могу попросить в прерывании ещё прерывания через sei. Ну это ладно. Вопрос у меня был бы какой: для прерываний есть какой-то счётчик с которым нужн осчитаться? Что я имею в виду. Типа есть же reti, которое разрешает прерывание. А если в внутри прерывания вызову подряд 20 команд cli, то потом один reti все их невелирует, или же тут как подсчёт ссылок? 1 час назад, ДядяВован сказал: Если прерываний несколько, то приоритет у прерывания с меньшим адресом вектора перехода. А если мы разрешаем в прерывании прерывание, то в нём может произойти прерывание, у которого адрес вектора больше чем у текущего? 43 минуты назад, ДядяВован сказал: Поэтому внутри прерывания от таймера есть sei. Разумеется, не может возникнуть повторного прерывания от таймера, пока обрабатывается первое, т.к. интервал между ними гораздо больше времени выполнения. А если бы интервал был бы большим, то что случилось бы? Скажем, берём прерывание по таймеру. Срабатывает, каждые, там, пускай, 20 тиков. И вот сработало такое прерывание и мы в нём. В нём мы включили прерывания и что бы мы там не делали, но это заняло больше 20 тиков и что тогда? Ничего. Мы дальше сидим в этом прерывании. Точно такое же прерывание нельзя вызывать из этого же прерывания. Тупо идёт переход в начало обработки прерывания (то что не выполнили, это не выполнится). А когда там дело дойдёт до reti, то мы возвращемся не в то место, откуда мы вышли из прошлого такого же прерывания (когда не добили инструкции), а в место, откуда мы вообще вошли в прерывание (скажем из главного цикла). Изменено 10 июня, 2023 пользователем dubrovkin 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ДядяВован Опубликовано 10 июня, 2023 Поделиться Опубликовано 10 июня, 2023 7 минут назад, dubrovkin сказал: 20 команд cli, то потом один reti все их невелирует Да. Эти команды просто сбрасывают и устанавливают один бит глобального разрешения прерываний. Никакого счетчика нет. 9 минут назад, dubrovkin сказал: произойти прерывание, у которого адрес вектора больше чем у текущего? Да, конечно, любо может. Приоритет играет роль только при одновременном запросе нескольких прерываний. 11 минут назад, dubrovkin сказал: и что тогда? Ж.па по п.2. Потом одна надежда, на WDT. 13 минут назад, dubrovkin сказал: Срабатывает, каждые, там, пускай, 20 тиков Обработчик такого прерывания может содержать только одну команду: RETI 0 С уважением, Владимир Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость_Григорий_Т. Опубликовано 10 июня, 2023 Поделиться Опубликовано 10 июня, 2023 21 минуту назад, dubrovkin сказал: мы возвращемся не в то место, откуда мы вышли Пока хватает памяти стека, будете возвращаться туда, откуда вышли. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dubrovkin Опубликовано 10 июня, 2023 Автор Поделиться Опубликовано 10 июня, 2023 6 минут назад, ДядяВован сказал: Ж.па по п.2. Потом одна надежда, на WDT. Я так понимаю, а если маску прерываний использовать, это поможет избежать того, что мы в сами же себя зайдём? Только что, Гость_Григорий_Т. сказал: Пока хватает памяти стека, будете возвращаться туда, откуда вышли. То есть ни 1 ни 2 пункт, а третий? 3. Тупо идёт переход в начало обработки прерывания. А когда там дело дойдёт до reti, то мы возвращемся в то место, откуда тогда не закончили обработку прерывания. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 10 июня, 2023 Поделиться Опубликовано 10 июня, 2023 9 минут назад, ДядяВован сказал: Никакого счетчика нет. В АВР отсутствует стек? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dubrovkin Опубликовано 10 июня, 2023 Автор Поделиться Опубликовано 10 июня, 2023 (изменено) 32 минуты назад, IMXO сказал: В АВР отсутствует стек? Кстати, про стек. В ATtiny13A получается можно выделить память для программы и память для данных. Для кода программы выделена область от 0x0000 до 0x01FF. Для регистров общего назначения от 0x0000 до 0x001F (уже другая память). Для регистров ввода/вывода от 0x0020 до 0x005F. А вот оставшаяся память от 0x0060 до 0x009F для переменных и стека. Вопрос: а как грамотно организовать на ассемблере (в частности avr-as) чтобы у меня стек не зашёл на область переменных? Вот смотрите. Стек же растёт сверху вниз? То есть, от старших адресов, к младшим. Ну, потому что странно было бы чтобы он заходил вообще в регистры. Хм, кстати, странно. Я думал есть прерывание переполнения стека, а нет, не вижу. Ну ладно. Получается как. Объявленные переменные нужно назначать к старшим адресам. А стек устанавливать за ними. А есть гарантия что avr-as их туда и поставит сам? Чтобы, когда я брал метку stack из этого кода: .data age: .byte 0x0C height: .byte 0x96 stack: То у меня как раз брался нужный адрес. Изменено 10 июня, 2023 пользователем dubrovkin 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ДядяВован Опубликовано 10 июня, 2023 Поделиться Опубликовано 10 июня, 2023 13 минут назад, IMXO сказал: отсутствует стек? Я же про количество команд cli и sei отвечал. Причём здесь стек? 4 минуты назад, dubrovkin сказал: гарантия что avr-as Не могу ничего сказать про avr-as. В обычном асм переменные в младшие адреса, стек при старте программы =RamEnd. 0 С уважением, Владимир Ссылка на комментарий Поделиться на другие сайты Поделиться
dubrovkin Опубликовано 10 июня, 2023 Автор Поделиться Опубликовано 10 июня, 2023 Кажись всё нормально. Код: .equ PINB,0x16 .equ DDRB,0x17 .equ PORTB,0x18 .equ SPL,0x3D .equ PIN5,0x01 .data var1: .byte 0x00 var2: .byte 0x00 var3: .byte 0x00 var4: .byte 0x00 stack: .section .text .org 0x0000 vectors: rjmp main rjmp vectors rjmp vectors rjmp vectors rjmp vectors rjmp vectors rjmp vectors rjmp vectors rjmp vectors rjmp vectors .global main main: cli lds R16,var1 lds R17,var2 lds R18,var3 lds R19,var4 ldi R20,stack out SPL,R20 rjmp .+0 Результат: 00000000 <.sec1>: 0: 09 c0 rjmp .+18 ; 0x14 2: fe cf rjmp .-4 ; 0x0 4: fd cf rjmp .-6 ; 0x0 6: fc cf rjmp .-8 ; 0x0 8: fb cf rjmp .-10 ; 0x0 a: fa cf rjmp .-12 ; 0x0 c: f9 cf rjmp .-14 ; 0x0 e: f8 cf rjmp .-16 ; 0x0 10: f7 cf rjmp .-18 ; 0x0 12: f6 cf rjmp .-20 ; 0x0 14: f8 94 cli 16: 00 91 60 00 lds r16, 0x0060 ; 0x800060 1a: 10 91 61 00 lds r17, 0x0061 ; 0x800061 1e: 20 91 62 00 lds r18, 0x0062 ; 0x800062 22: 30 91 63 00 lds r19, 0x0063 ; 0x800063 26: 44 e6 ldi r20, 0x64 ; 100 28: 4d bf out 0x3d, r20 ; 61 2a: ff cf rjmp .-2 ; 0x2a 2c: 00 00 nop Я только не знаю откуда он последний nop взял. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ДядяВован Опубликовано 10 июня, 2023 Поделиться Опубликовано 10 июня, 2023 0 С уважением, Владимир Ссылка на комментарий Поделиться на другие сайты Поделиться
dubrovkin Опубликовано 10 июня, 2023 Автор Поделиться Опубликовано 10 июня, 2023 (изменено) Да, что-то туплю. Наоборот он по низу это выставил. Изменено 10 июня, 2023 пользователем dubrovkin 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dubrovkin Опубликовано 10 июня, 2023 Автор Поделиться Опубликовано 10 июня, 2023 В общем, есть у кого идеи как заставить ассемблер размещать переменные в обратом порядке? Он размещает их с адреса 0x0060 (0x0061, 0x0062 и так далее). Через .org можно добиться смещения, например .org 0x0010 заставит их размещаться в 0x0070, 0x0071, 0x0072 и так далее. А как бы их заставить размещаться вот так 0x9F, 0x9E, 0x9D, 0x9C и так далее? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 10 июня, 2023 Поделиться Опубликовано 10 июня, 2023 9 минут назад, dubrovkin сказал: как заставить А на ху зачем??? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dubrovkin Опубликовано 10 июня, 2023 Автор Поделиться Опубликовано 10 июня, 2023 Не нравятся мне идущие друг другу на встречу стек и переменные. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ДядяВован Опубликовано 10 июня, 2023 Поделиться Опубликовано 10 июня, 2023 Ну так определитесь с адресом. Пусть переменные идут по порядку вверх, а стек вниз. Вы так хотя бы ошибку получите, если память для переменных кончится, а не тупое налезание на стек, если вниз будет размещение. 0 С уважением, Владимир Ссылка на комментарий Поделиться на другие сайты Поделиться
dubrovkin Опубликовано 10 июня, 2023 Автор Поделиться Опубликовано 10 июня, 2023 (изменено) 10 минут назад, ДядяВован сказал: Ну так определитесь с адресом. Пусть переменные идут по порядку вверх, а стек вниз. Вы так хотя бы ошибку получите, если память для переменных кончится, а не тупое налезание на стек, если вниз будет размещение. Так я бы на этапе ассемблирования всё понял же. К примеру: .data var1: .byte 0 ; 0x9F var2: .byte 0 ; 0x9E var3: .byte 0 ; 0x9D var4: .byte 0 ; 0x9C stack: ; 0x9B Указатель стека всегда после переменных. Я и сейчас могу так сделать, но для этого мне нужно у каждой строчки (причём не на ней, а выше) проставить .org с нужным добавлением адреса. Но это всё не автоматизированная вещь. Мне так не нравится. В общем, такое указание, с учётом того что лимиты известны (от 0x60 до 0x9F) и так понимало бы, в момент ассемблирования, ушли переменные за лимит или нет, и сколько места осталось под стек (к примеру, ввести минимальное значение для стека и если определилось что выделили меньше, выдавать ошибку на этапе ассемблирования). Изменено 10 июня, 2023 пользователем dubrovkin 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ДядяВован Опубликовано 10 июня, 2023 Поделиться Опубликовано 10 июня, 2023 18 минут назад, dubrovkin сказал: Указатель стека всегда после переменных Можете объяснить, какую цель преследуете? Я не могу понять смысл этих телодвижений. Переменные с нулевого адреса, стек от максимального размера памяти вниз, чем этот вариант не устраивает? От перестановки слагаемых... 24 минуты назад, dubrovkin сказал: выдавать ошибку на этапе ассемблирования Этого никогда не узнать на этапе ассемблирования!!! Стек переполнится только в процессе выполнения программы. 0 С уважением, Владимир Ссылка на комментарий Поделиться на другие сайты Поделиться
dubrovkin Опубликовано 10 июня, 2023 Автор Поделиться Опубликовано 10 июня, 2023 6 минут назад, ДядяВован сказал: Можете объяснить, какую цель преследуете? Эстетическую. 6 минут назад, ДядяВован сказал: Этого никогда не узнать на этапе ассемблирования!!! Стек переполнится только в процессе выполнения программы. Я и не говорил чтобы определить когда стек переполнился. Я говорил, чтобы определить хватит ли места для работы стека с учётом того, сколько переменных выделено. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
colorad Опубликовано 10 июня, 2023 Поделиться Опубликовано 10 июня, 2023 6 минут назад, dubrovkin сказал: Эстетическую. Предложите свою архитектуру МК . И реализуйте на ПЛМ-ках . 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ДядяВован Опубликовано 10 июня, 2023 Поделиться Опубликовано 10 июня, 2023 18 минут назад, dubrovkin сказал: хватит ли места для работы стека А как это узнать на этапе компиляции??? Может по каким-то условиям ни разу не выполнится push, call, не будет ни одного прерывания. И вообще не нужно место для работы стека. Я никак не пойму ход Вашей мысли. 0 С уважением, Владимир Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.