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

Таймер ATtiny13A каждый такт на частоте 9.6 МГц


dubrovkin

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

4 минуты назад, dubrovkin сказал:

аппаратное и программное

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

С уважением, Владимир

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

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

1 минуту назад, ДядяВован сказал:

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

Это я взял из какой-то статьи:

Цитата

В микроконтроллере ATtiny13 есть два типа внешних прерваний: аппаратное (INT0, на ножке INT0) и программное (PCINT0, на ножках PCINT0-5, которое можно разрешить по маске только на нужных ножках).

INT0 может работать в четырёх рехимах:

По низкому уровню на ножке;

По изменению уровня на ножке;

По спадающему фронту;

По нарастающему фронту.

PCINT0 может работать только по изменению уровня на любой из ножек, настроенных по маске.

 

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

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

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

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

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

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

12 минут назад, dubrovkin сказал:

из какой-то статьи

Лучше читать первоисточник. Бросьте в ЛС адрес почты. Я вам книги Евстифеева пришлю. Практически, это переводы даташитов на русский язык.

С уважением, Владимир

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

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

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

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

30 минут назад, dubrovkin сказал:

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

Это будет мало информативно.
Принцип прерываний в AVR следующий.
Если возникает условие для какого-либо прерывания, то устанавливается соответствующий флаг/бит. Если прерывания разрешены, то вызывается обработчик прерывания, который сбрасывает установленный флаг. Пока выполняется обработчик, прерывания запрещены, они разрешатся командой RETI. Либо их можно разрешить внутри обработчика соответствующей командой, при необходимости. Если прерываний несколько, то приоритет у прерывания с меньшим адресом вектора перехода.

Таким образом прерывания не теряются. Но! Можно потерять количество событий, если за время запрета прерываний их будет несколько.

Если в программе используются прерывания, то запрещать их можно на максимально короткое время. Как пример, атомарные операции, когда запрет на прерывание длится несколько команд, необходимых выполнить неразрывно.

Делать прерывание от кнопки, без аппаратного подавления дребезга, ИМХО не логично. Всё равно придётся анализировать временные интервалы, чтобы отделить дребезг от полезной информации.

С уважением, Владимир

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

18 минут назад, ДядяВован сказал:

Пока выполняется обработчик, прерывания запрещены, они разрешатся командой RETI. Либо их можно разрешить внутри обработчика соответствующей командой, при необходимости.

А что за команда? Это Вы про команду sei? Я понимаю, что прерывание reset имеет максимальный приоритет, что даже если мы находимся в обработчике прерывания reset и случилось прерывание reset, то будет вызвано прерывание reset (я так понимаю, даже если все прерывания запрещены :) ). Ну, наверное ещё если конфигурация фьюзов не отключило этот reset с пина. Но, если я нахожусь в другом векторе прерывания (скажем от таймера) и я разрешил в нём прерывания, то у меня может же сработать оно же? Если да, то что будет с...в общем сомневаюсь что он тут всю цепочку составит и потом развернёт. Скорее всего возможны только другие прерывания пока мы в прерывании или как? Ну а вообще, даже механика вызова прервания A из прерывания B, а из него прерывание C, потом прерывание D из прерывания C и так далее...кажется странным. Он реально всё это запомнит и потом пройдётся обратно?

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

9 минут назад, dubrovkin сказал:

Вы про команду sei?

Да

12 минут назад, dubrovkin сказал:

Скорее всего возможны только другие прерывания пока мы в прерывании или как?

Скорее да. Могут быть и нюансы, но надо много думать.

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

кажется странным

Ни чуть. Просто надо это применять осмысленно и при необходимости.
У меня в одной программе это используется. Есть прерывание по таймеру, довольно длинное (много команд). И есть прерывание при переходе сетевого напряжения через ноль, оно сделано максимально коротким, но его нельзя пропустить. Поэтому внутри прерывания от таймера есть sei. Разумеется, не может возникнуть повторного прерывания от таймера, пока обрабатывается первое, т.к. интервал между ними гораздо больше времени выполнения.

С уважением, Владимир

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

1 час назад, ДядяВован сказал:

Пока выполняется обработчик, прерывания запрещены, они разрешатся командой RETI.

 

Получается, например в цикле я вызываю sei и когда будет прерывание, оно вызовется. Скажем, сработало какое-то прерывание и, когда она сработала, словно само вызывается cli. Я могу попросить в прерывании ещё прерывания через sei. Ну это ладно. Вопрос у меня был бы какой: для прерываний есть какой-то счётчик с которым нужн осчитаться? Что я имею в виду. Типа есть же reti, которое разрешает прерывание. А если в внутри прерывания вызову подряд 20 команд cli, то потом один reti все их невелирует, или же тут как подсчёт ссылок?

1 час назад, ДядяВован сказал:

Если прерываний несколько, то приоритет у прерывания с меньшим адресом вектора перехода.

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

43 минуты назад, ДядяВован сказал:

Поэтому внутри прерывания от таймера есть sei. Разумеется, не может возникнуть повторного прерывания от таймера, пока обрабатывается первое, т.к. интервал между ними гораздо больше времени выполнения.

А если бы интервал был бы большим, то что случилось бы? Скажем, берём прерывание по таймеру. Срабатывает, каждые, там, пускай, 20 тиков. И вот сработало такое прерывание и мы в нём. В нём мы включили прерывания и что бы мы там не делали, но это заняло больше 20 тиков и что тогда?

  1. Ничего. Мы дальше сидим в этом прерывании. Точно такое же прерывание нельзя вызывать из этого же прерывания.
  2. Тупо идёт переход в начало обработки прерывания (то что не выполнили, это не выполнится). А когда там дело дойдёт до reti, то мы возвращемся не в то место, откуда мы вышли из прошлого такого же прерывания (когда не добили инструкции), а в место, откуда мы вообще вошли в прерывание (скажем из главного цикла).
Изменено пользователем dubrovkin
Ссылка на комментарий
Поделиться на другие сайты

7 минут назад, dubrovkin сказал:

20 команд cli, то потом один reti все их невелирует

Да. Эти команды просто сбрасывают и устанавливают один бит глобального разрешения прерываний. Никакого счетчика нет.

9 минут назад, dubrovkin сказал:

произойти прерывание, у которого адрес вектора больше чем у текущего?

Да, конечно, любо может. Приоритет играет роль только при одновременном запросе нескольких прерываний.

 

11 минут назад, dubrovkin сказал:

и что тогда?

Ж.па по п.2. Потом одна надежда, на WDT.

 

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

Срабатывает, каждые, там, пускай, 20 тиков

Обработчик такого прерывания может содержать только одну команду: RETI

С уважением, Владимир

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

21 минуту назад, dubrovkin сказал:

мы возвращемся не в то место, откуда мы вышли

Пока хватает памяти стека, будете возвращаться туда, откуда вышли.

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

6 минут назад, ДядяВован сказал:

Ж.па по п.2. Потом одна надежда, на WDT.

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

Только что, Гость_Григорий_Т. сказал:

Пока хватает памяти стека, будете возвращаться туда, откуда вышли.

То есть ни 1 ни 2 пункт, а третий?

3. Тупо идёт переход в начало обработки прерывания. А когда там дело дойдёт до reti, то мы возвращемся в то место, откуда тогда не закончили обработку прерывания.

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

32 минуты назад, IMXO сказал:

В АВР отсутствует стек?

Кстати, про стек. В ATtiny13A получается можно выделить память для программы и память для данных. Для кода программы выделена область от 0x0000 до 0x01FF. Для регистров общего назначения от 0x0000 до 0x001F (уже другая память). Для регистров ввода/вывода от 0x0020 до 0x005F. А вот оставшаяся память от 0x0060 до 0x009F для переменных и стека. Вопрос: а как грамотно организовать на ассемблере (в частности avr-as) чтобы у меня стек не зашёл на область переменных? Вот смотрите. Стек же растёт сверху вниз? То есть, от старших адресов, к младшим. Ну, потому что странно было бы чтобы он заходил вообще в регистры. Хм, кстати, странно. Я думал есть прерывание переполнения стека, а нет, не вижу. Ну ладно. Получается как. Объявленные переменные нужно назначать к старшим адресам. А стек устанавливать за ними. А есть гарантия что avr-as их туда и поставит сам? Чтобы, когда я брал метку stack из этого кода:

.data

age: .byte 0x0C
height: .byte 0x96

stack:

То у меня как раз брался нужный адрес.

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

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

отсутствует стек?

Я же про количество команд cli и sei отвечал. Причём здесь стек?

4 минуты назад, dubrovkin сказал:

гарантия что avr-as

Не могу ничего сказать про avr-as. В обычном асм переменные в младшие адреса, стек при старте программы =RamEnd.

С уважением, Владимир

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

Кажись всё нормально. Код:


.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 взял.

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

В общем, есть у кого идеи как заставить ассемблер размещать переменные в обратом порядке? Он размещает их с адреса 0x0060 (0x0061, 0x0062 и так далее). Через .org можно добиться смещения, например .org 0x0010 заставит их размещаться в 0x0070, 0x0071, 0x0072 и так далее. А как бы их заставить размещаться вот так 0x9F, 0x9E, 0x9D, 0x9C и так далее?

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

Ну так определитесь с адресом. Пусть переменные идут по порядку вверх, а стек вниз. Вы так хотя бы ошибку получите, если память для переменных кончится, а не тупое налезание на стек, если вниз будет размещение.

С уважением, Владимир

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

10 минут назад, ДядяВован сказал:

Ну так определитесь с адресом. Пусть переменные идут по порядку вверх, а стек вниз. Вы так хотя бы ошибку получите, если память для переменных кончится, а не тупое налезание на стек, если вниз будет размещение.

Так я бы на этапе ассемблирования всё понял же. К примеру:

.data

var1: .byte 0	; 0x9F
var2: .byte 0	; 0x9E
var3: .byte 0	; 0x9D
var4: .byte 0	; 0x9C

stack:			; 0x9B

Указатель стека всегда после переменных. Я и сейчас могу так сделать, но для этого мне нужно у каждой строчки (причём не на ней, а выше) проставить .org с нужным добавлением адреса. Но это всё не автоматизированная вещь. Мне так не нравится. В общем, такое указание, с учётом того что лимиты известны (от 0x60 до 0x9F) и так понимало бы, в момент ассемблирования, ушли переменные за лимит или нет, и сколько места осталось под стек (к примеру, ввести минимальное значение для стека и если определилось что выделили меньше, выдавать ошибку на этапе ассемблирования).

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

18 минут назад, dubrovkin сказал:

Указатель стека всегда после переменных

Можете объяснить, какую цель преследуете? Я не могу понять смысл этих телодвижений. Переменные с нулевого адреса, стек от максимального размера памяти вниз, чем этот вариант не устраивает? От перестановки слагаемых...

24 минуты назад, dubrovkin сказал:

выдавать ошибку на этапе ассемблирования

Этого никогда не узнать на этапе ассемблирования!!! Стек переполнится только в процессе выполнения программы.

С уважением, Владимир

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

6 минут назад, ДядяВован сказал:

Можете объяснить, какую цель преследуете?

Эстетическую.

6 минут назад, ДядяВован сказал:

Этого никогда не узнать на этапе ассемблирования!!! Стек переполнится только в процессе выполнения программы.

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

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

18 минут назад, dubrovkin сказал:

хватит ли места для работы стека

А как это узнать на этапе компиляции??? Может по каким-то условиям ни разу не выполнится push, call, не будет ни одного прерывания. И вообще не нужно место для работы стека. Я никак не пойму ход Вашей мысли.

С уважением, Владимир

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

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

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

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

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

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

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

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

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

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

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

  • Сообщения

    • Чтобы потом не допиливать паровоз до истребителя. Заводские варианты схемотехники куда более предсказуемы. Из "вольностей" в первую очередь как-то решать проблему коммутации, подходящий переключатель для режимов искать история долгая и грустная. Что-то там с реле. На диапазоны 6п4н вроде же ?  пг2 хрен найдёшь, п2г тугое неудобство(  Рассыпушный ацп делать, боже упаси. Ну разве что был грешен, побаловался когда-то пнч-ацп. С 1108пп1 и 155 серией
    • Но зачем повторять 1в1? Там дана просто топология   Но не совсем же с нуля. Маловероятно, что вы найдете расширение диапазона 7135 до 200мВ по тому же методу, что это реализовано в В7-38, тем не менее, это вполне реализуемо. А вот до 20мВ я спустить диапазон не смог Что-то предусилитель интегратора отказывается вести себя хорошо   Для сравнения, та же точка (вход интегратора) при 200мв пределе, усиление х10   Ну и 2В Госпаде боже лтц2400, на этой штуке можно и 6 разрядник собрать, лютый АЦП, какие 4.5 разряда Цена на него сейчас конечно негуманная кстати.
    • Что то не нашёл примеров такой реализации замены. С нуля целесообразность подобного действа под вопросом. Тут мои полномочия всё) Как бы почему смотрю на hm8011-3, возможность реализации +/- норм настольного мультиметра без всякой там жести в виде кодинга и микро-мелких современных элементов. Для калибровки валяется где-то в1-12 и прецизионных резисторов если моих не хватит, есть где заказать.  На данный момент разве что качественного файла нет, пытался там всякими улучшайками чего сделать, увы. Пойду через впн лазить по уголочкам всяким, вдруг всплывёт чего. ------------- 8012, 80c32 + 27c512. Чертежи плат есть, осталось hex раздобыть 
    • Вот на этом фото? Я думал  тут радиатор будет под ними, и они к нему "пузом" будут прикручиваться, а дырочки - для отвёртки. У @asng60 транзисторы в наружную сторону "мордой" смотрят. "Пузом" на плату ложатся. Плата так разведена. Вот и непонятно, как их "пузом" к радиатору прикручивать.
    • Что касаемо модели Парафина, я бы порекомендовал товарищу Джексону проверить ток покоя выходного каскада, это первым делом, и вторым делом- проверить модель ОУ. Ибо в ОМ нет никаких оу а в парафине- есть. 
    • сломался Ну точно сломался! Все, сломался, однозначно! Несите в мастерскую!
×
×
  • Создать...