Например TDA7294

Форум РадиоКот • Просмотр темы - Вопрос по программированию задержки внутри прерывания
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вт дек 02, 2025 04:28:42

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 171 ]    , , , , 5, , , ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Вс янв 26, 2025 11:35:22 
Мучитель микросхем
Аватар пользователя

Карма: 1
Рейтинг сообщений: 39
Зарегистрирован: Ср янв 11, 2012 18:20:26
Сообщений: 473
Рейтинг сообщения: 0
во, к примеру, как у меня сделана подстановка адреса возврата в прерывании для таймера1:
Код:
;--- Таймер1 ---
ldi R16, low(RAMEND)
out SPL, R16
ldi R16, low(main)
push R16
ldi R16, high(main)
push R16
reti

перезаписываю вершину стека и пишу в стек адрес возврата.

Постепенно осознаю полезность приёма. :)))

В прерываниях конечно не везде зайдёт, а вот для использования какого-нибудь общего сценария без последующей проверки флагов самый раз.

Накидал дэмку для примера:
Спойлер
Код:
label_0:
ldi R16, low(RAMEND)
out SPL, R16
ldi R16, low(label_2)
push R16
ldi R16, high(label_2)
push R16
rjmp procedure

label_1:
ldi R16, low(RAMEND)
out SPL, R16
ldi R16, low(label_0)
push R16
ldi R16, high(label_0)
push R16
rjmp procedure

label_2:
ldi R16, low(RAMEND)
out SPL, R16
ldi R16, low(label_1)
push R16
ldi R16, high(label_1)
push R16
rjmp procedure

procedure:
nop
ret

То есть мы сразу обозначаем, куда нам нужно перейти после выполнения)
:beer:

Добавлено after 7 minutes:
Ну или так:
Спойлер
Код:
label_0:
tst R0
breq pc+6

ldi R16, low(label_1)
push R16
ldi R16, high(label_1)
push R16
rjmp procedure

ldi R16, low(label_2)
push R16
ldi R16, high(label_2)
push R16
rjmp procedure

label_1:
rjmp pc

label_2:
rjmp pc

procedure:
nop
ret


Добавлено after 41 minute 48 seconds:
А для тех, кто говорит, что на асм-е то ли много, то ли сложно писать :))) :
Спойлер
Код:
.equ after =0
.MACRO first            
ldi R16, low(@2)
push R16
ldi R16, high(@2)
push R16
rjmp @0
.ENDMACRO

Код:
; сначала в процедуру, потом на метку:
first PROCEDURE, after, LABEL_2

но это изврат) я так не делаю))

Добавлено after 3 minutes 5 seconds:
shonty писал(а):
я так не делаю))
потому что нельзя совсем абстрагироваться от кода))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Вс янв 26, 2025 11:57:27 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2926
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 18884
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
ну, и где видно, когда твоё макро перейдет на метку LABEL_2?

_________________
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Вс янв 26, 2025 13:03:01 
Мучитель микросхем
Аватар пользователя

Карма: 1
Рейтинг сообщений: 39
Зарегистрирован: Ср янв 11, 2012 18:20:26
Сообщений: 473
Рейтинг сообщения: 0
Starichok51 писал(а):
ну, и где видно, когда твоё макро перейдет на метку LABEL_2?
Код:
.equ after =0
.MACRO first            
ldi R16, low(@2)
push R16
ldi R16, high(@2)
push R16
rjmp @0
.ENDMACRO
; ----------

first PROCEDURE, after, LABEL_2

label_1:
rjmp pc

label_2:
rjmp pc

procedure:
nop
ret


Добавлено after 35 minutes 52 seconds:
redirect PROCEDURE, LABEL_2
- так более вменяемо будет..
но тогда макрос придётся немного переделать.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Вс янв 26, 2025 14:41:41 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2926
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 18884
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
а не проще вместо rjmp @0 сразу написать ret?

_________________
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Вс янв 26, 2025 15:20:34 
Мучитель микросхем
Аватар пользователя

Карма: 1
Рейтинг сообщений: 39
Зарегистрирован: Ср янв 11, 2012 18:20:26
Сообщений: 473
Рейтинг сообщения: 0
ret написать проще, но работать не будет :)))

как тогда передать, что перед меткой_2 сначала нужно посетить процедуру?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Вс янв 26, 2025 16:05:44 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2926
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 18884
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
тогда понятно. а то я "клюнул" на то, что процедура у тебя пустая.

_________________
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Вс янв 26, 2025 16:19:34 
Мучитель микросхем
Аватар пользователя

Карма: 1
Рейтинг сообщений: 39
Зарегистрирован: Ср янв 11, 2012 18:20:26
Сообщений: 473
Рейтинг сообщения: 0
тут вообще можно извратиться, передать в стёк несколько адресов, и получится по одному rjmp-у конвеерные переходы :)))

типа:
cruise label_1, label_3, label_10, label_7, label_1, label_4,...

но только это ненужно, а вот один такой переход я вполне представляю где применить.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Вс янв 26, 2025 16:46:18 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2926
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 18884
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
ну да, конвейер - это уже извращение.

_________________
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Вс янв 26, 2025 17:49:15 
Потрогал лапой паяльник
Аватар пользователя

Карма: 4
Рейтинг сообщений: 108
Зарегистрирован: Вс окт 25, 2020 22:13:25
Сообщений: 384
Откуда: Смоленск
Рейтинг сообщения: 1
Подход с манипуляцией стека с для условного возврата, в принципе, штука интересная. Хотя IMHO удобнее ICALL / IJMP.
Но зачем нам многократная переустановка указателя стека?
ldi R16, low(RAMEND)
out SPL, R16
Особенно в большом проекте, где стек обычно отнюдь не пустой.
Ну пришли в подпрограмму, хотим вернуться не туда откуда вызвали. Достанем адрес возврата посредством POP, запихнем новый адрес PUSH. Cтек на ramend единожды при старте настроить и хватит.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Вс янв 26, 2025 19:15:56 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2926
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 18884
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
ДядяВован, в данном случае мне НЕ НУЖЕН адрес возврата, поэтому я восстановил вершину стека и запихнул адрес начала цикла.
а shonty взялся придумывать, где еще можно применять этот прием.

_________________
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Вс янв 26, 2025 19:56:01 
Потрогал лапой паяльник
Аватар пользователя

Карма: 4
Рейтинг сообщений: 108
Зарегистрирован: Вс окт 25, 2020 22:13:25
Сообщений: 384
Откуда: Смоленск
Рейтинг сообщения: 0
Понятно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Пн фев 03, 2025 16:46:08 
Мучитель микросхем
Аватар пользователя

Карма: 1
Рейтинг сообщений: 39
Зарегистрирован: Ср янв 11, 2012 18:20:26
Сообщений: 473
Рейтинг сообщения: 0
Кстати вспомнил по теме..
В обработчик прерывания же вообще можно не заходить и не обрабатывать. А вести опрос флага преывания в цикле.

На асме для 328-й для примера:
Спойлер
Код:
; init INT0 (PD2):   
   cli
   ldi R16,(1<<ISC01)      ; прерывание INT0 по ниспадающему фронту
   sts EICRA, R16
   ; ldi R16,(1<<INT0)      ; разрешение внешнего прерывания INT0   НЕ ИСПОЛЬЗУЕМ
   ; out EIMSK, R16
   ldi r16, (1<<INTF0)      ; очистить флаг прерывания
   out EIFR, r16
   sei

Проверка в цикле:
Код:
   in R16, EIFR
   sbrc R16, INTF0
   rjmp КУДА_НИБУДЬ

И уже в подпрограмме чистим флаг:
Код:
ГДЕ_НИБУДЬ:
........
........
   ldi r16, (1<<INTF0)      ; очистить флаг прерывания
   out EIFR, r16


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Пн фев 03, 2025 19:19:37 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2926
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 18884
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
вот только запаздывание обработки в цикле относительно срабатывания прерывания может оказаться недопустимым.

_________________
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Пн фев 03, 2025 19:25:54 
Мучитель микросхем
Аватар пользователя

Карма: 1
Рейтинг сообщений: 39
Зарегистрирован: Ср янв 11, 2012 18:20:26
Сообщений: 473
Рейтинг сообщения: 0
Согласен.. Но топикстартеру как раз это не критично было.
А мне тоже, просто чтобы импульс прерывания с Si4735 зафиксировался, не обязательно подрываться))
Код:
STC_wait:
   in R16, EIFR
   sbrs R16, INTF0
   rjmp PC-2
   out EIFR, r16

типа spi_wait или i2c_wait..


Последний раз редактировалось shonty Вт фев 04, 2025 06:04:17, всего редактировалось 1 раз.

Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Пн фев 03, 2025 19:55:37 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1493
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15277
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Для обработчика кнопок/ низкоскоростных процессов запаздывание в пределах до 0,014 секунды не критично.
:roll:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Вт фев 04, 2025 03:55:08 
Друг Кота

Карма: 64
Рейтинг сообщений: 1019
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4364
Откуда: Ижевск
Рейтинг сообщения: 1
Замечу. Для m48...m328, да и не только справедливо такое.
Код:
STC_wait:
   SBIS EIFR,INTF0
   RJMP PC-1
   SBI EIFR,INTF0


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Вт фев 04, 2025 06:00:10 
Мучитель микросхем
Аватар пользователя

Карма: 1
Рейтинг сообщений: 39
Зарегистрирован: Ср янв 11, 2012 18:20:26
Сообщений: 473
Рейтинг сообщения: 0
akl писал(а):
Замечу. Для m48...m328, да и не только справедливо такое.
Спасибо. Полезный совет :beer:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Вт фев 04, 2025 07:55:03 
Говорящий с текстолитом
Аватар пользователя

Карма: 8
Рейтинг сообщений: 212
Зарегистрирован: Чт июн 10, 2010 20:11:19
Сообщений: 1525
Рейтинг сообщения: 0
RJMP PC-1

Плохая идея. У вас же и так метка есть
Код:
STC_wait:
  SBIS EIFR,INTF0
    RJMP STC_wait
  SBI EIFR,INTF0


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Вт фев 04, 2025 08:12:18 
Мучитель микросхем
Аватар пользователя

Карма: 1
Рейтинг сообщений: 39
Зарегистрирован: Ср янв 11, 2012 18:20:26
Сообщений: 473
Рейтинг сообщения: 0
COKPOWEHEU писал(а):
Плохая идея. У вас же и так метка есть
Использование PC более универсально, да и привычнее мне.
А конечный результат в данном случае в макросе оформлен будет.
С метками порой конфликты случаются, когда много своих "библиотек" подключаешь.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по программированию задержки внутри прерывания
СообщениеДобавлено: Вт фев 04, 2025 09:16:41 
Модератор
Аватар пользователя

Карма: 153
Рейтинг сообщений: 2926
Зарегистрирован: Сб авг 14, 2010 15:05:51
Сообщений: 18884
Откуда: г. Озерск, Челябинская обл.
Рейтинг сообщения: 0
Медали: 1
Лучший человек Форума 2017 (1)
shonty, ты что, вручную вычисляешь смещения для РС?
а если нужно сделать прыжок на много адресов, то тоже руками вычисляешь смещение?
а универсально - это использование метки - пусть компилятор вычисляет смещение.

_________________
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 171 ]    , , , , 5, , , ,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 33


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y