Прерывание и таймер

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

Дима очень злой сегодня. :wink:
ТС! Пиши, я разрешаю. Все примеры есть в ДШ камня. В сети был где-то даже перевод ДШ на русский. Ищите и обрящите …

Хотел спросить, чем тебя не устраивает С, но передумал. Каждый дрочит, как он хочет.

Не понял, чем именно с Вами нужно поделиться. Что не устраивает в примере кода в разделе 12.4 даташита? Других реализаций прерываний у нас для Вас нет, там всё однозначно и ничего своего не придумаешь :frowning:

в его даташите нету такого раздела

И?

Кто-то или что-то мешает взять полный даташит? Или в “его” даташите он не может найти раздел 11.4?

Уверен, что этот пример ТС видел, вот испрашиваю чем он его не устроил.

Мне нужен пример запуска таймера на 5 секунд. Этот пример необходим для построения менеджера задач. Я не смог найти работающий пример. Времени на глубокий анализ нет, так как сейчас сессия. Поэтому я прошу оказать помощь в виде кода инициализации и реализации задержки с помощью таймера.
Если кто то сможет помочь буду очень благодарен.
На АССЕМБЛЕРЕ

Т.е. у Вас нет времени на то, чтобы сделать своё задание и Вы ищете человека, у которого есть время, чтобы сделать чужое? Я Вас правильно понял?

Вы действительно так наивны, что надеетесь такого найти?

Боюсь, Вы путаете термины. Вы просите на оказать помощь, а сделать Ваше задание за Вас – это разные вещи.

В такой ситуации, могу Вам предложить разместить Вашу просьбу в коммерческом разделе форума, где Вы сможете кому-нибудь “оказать помощь в виде” некоторого количества рублей, а он(а) в ответ окажет Вам помощь

по-моему, это будет справедливо.

А студентов-халявщиков здесь очень не любят, уж извините.

2 лайка
  • на ЯЗЫКЕ ассемблера. Это раз.
  • два: это в задании так, или идея выношена тобой лично бессонными ночами?

Я зачем спрашиваю? - затем, что если лично, то это требует комментариев о причине странного выбора.

То что я прошу написать 5-10 строк кода как пример того как вообще запустить таймер делает меня холявшиком ?
Мне нужно из корпоративной многозадачности перейти к нормальной многозадачности где менеджер выделяет процесорнное время.

Холявшики давно уже сдали на С и не парятся, поэтому тупо не у кого это спросить из вуза

Если не можете или не желаете помочь просто не отвечайте
Но давать характеристики мне и тому как я отношусь к своему делу не нужно

Я честно в шоке

Какая разница какая задача , какая разница зачем

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

Тебе ж сказали, что все есть в ДШ. Странный ты!
Вот ссылка на ДШ. Там три таймера в 328 контроллере. два 8 битных и 16 битный. Пример работы с регистрами есть в ДШ. Описание всех регистров есть.
В зависимости от того, что тебе нужно выбираешь просто самый простой режим таймера и ставишь вектор на OVF. Посмотри, как в Ардуине сделано, как пример. Там на С, конечно, но это просто присвоение значений регистрам. Переписываешь на язык ассемблера, если уж так приспичило.
Но, повторю, с точки зрения эффективности кода это просто “суходрочерство” - ничего не даст.

За информацию спасибо
Попробую разобраться

Вот тебе ответ ЧатЖПТ. Странно, когда 55 летний дядька учит студента пользоваться технологиями! :wink:

ПРОМПТ:

нужен образец кода на асм для настройки таймера 0 на МК атмега328 для прерывания по вектору переполнения каждые 5 миллисек. И образец кода вектора соответствующего прерывания.

Ответ.
Приведу пример кода на ассемблере для настройки таймера 0 на микроконтроллере ATmega328 с использованием режима нормального таймера для генерации прерывания каждые 5 миллисекунд.

Объяснение

  • Частота процессора (F_CPU) предполагается равной 16 МГц.
  • Таймер работает в режиме нормального счёта (Normal mode), где счётчик считает до 255 и вызывает прерывание по переполнению.
  • Используется предделитель (prescaler) для настройки временного интервала.

Расчёт предделителя:

  1. Таймер 0 работает на частоте FTIMER=FCPUPrescalerF_{\text{TIMER}} = \frac{F_{\text{CPU}}}{\text{Prescaler}}.
  2. Переполнение происходит через toverflow=256FTIMERt_{\text{overflow}} = \frac{256}{F_{\text{TIMER}}}.
  3. Для 5 мс: Prescaler=FCPU×ttarget256\text{Prescaler} = \frac{F_{\text{CPU}} \times t_{\text{target}}}{256}.

Для FCPU=16 МГцF_{\text{CPU}} = 16 , \text{МГц} и ttarget=5 мсt_{\text{target}} = 5 , \text{мс}, подойдёт предделитель 64.

Код

.include "m328pdef.inc"  ; Подключаем определения для ATmega328

.equ F_CPU = 16000000    ; Частота процессора 16 МГц
.equ PRESCALER = 64      ; Предделитель таймера

.org 0x0000
    rjmp RESET           ; Сброс

.org TIMER0_OVF_vect
    rjmp TIMER0_ISR      ; Вектор прерывания по переполнению таймера 0

RESET:
    ldi r16, HIGH(RAMEND) ; Инициализация стека
    out SPH, r16
    ldi r16, LOW(RAMEND)
    out SPL, r16

    ldi r16, (1 << TOIE0) ; Включаем прерывание по переполнению таймера 0
    out TIMSK0, r16

    ldi r16, (1 << CS01) | (1 << CS00) ; Устанавливаем предделитель 64
    out TCCR0B, r16

    sei                  ; Включаем глобальные прерывания

MAIN_LOOP:
    rjmp MAIN_LOOP       ; Бесконечный цикл

TIMER0_ISR:
    ; Ваш код обработки прерывания
    push r16             ; Сохраняем регистры, если они используются
    push r17

    ; Здесь, например, можно инвертировать порт
    in r16, PORTB
    eor r16, 0xFF
    out PORTB, r16

    pop r17              ; Восстанавливаем регистры
    pop r16
    reti                 ; Возврат из прерывания

Объяснение кода

  1. Настройка таймера 0:
  • TCCR0B настраивает предделитель: CS01=1,CS00=1\text{CS01}=1, \text{CS00}=1 (предделитель 64).
  • TIMSK0 включает прерывание по переполнению (TOIE0).
  1. Прерывание по переполнению:
  • В векторе TIMER0_OVF_vect обрабатывается прерывание.
  • Можно выполнить любую задачу, например, переключение состояния пина.
  1. Бесконечный цикл:
  • Главная программа остаётся в бесконечном цикле, прерывания обрабатываются асинхронно.

Если нужно что-то уточнить или добавить, дайте знать!


В ответе формулы написаны, при копировании они не отображаются на форуме, но если надо - разберешься.

В конце-концов просто повтори запрос к ЧатЖПТ в своем акке.

Нет, конечно! Это делает Вас халявщиком.

Простите, но, в отличие от Вас, я сам пишу нужные мне программы и сам решаю что мне нужно, а что не нужно, отвечать мне или не отвечать.

А чего Вы просите? Разве не написать код, который задали писать Вам? Нет? Ну, тогда мы Вас неправильно поняли, извините.

Вообще, Вы не поняли главного в моём ответе. Вы сюда зачем пришли? Поругаться и устроить срач? Ну, тогда продолжайте огрызаться. А если Вы пришли получить код – Вам в коммерческий раздел и договариваться насчёт оплаты. Так получите. А срачем здесь - ни фига не выйдет. Вот и решайте, что Вам нужно.

2 лайка

по праздникам такая щедрость?

и все это на асме? Ну дает…

Это прикол или…? Может из кооперативной?)

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

Нет, так называется подход, когда многопоточность организуется методом циклического опроса (round-robin). Обычно применяется в тех случаях, когда реакция системы требует значительного времени (например реакцией является ответ юзера).

Типичный пример: в бесконечном цикле (в функции loop()) Вы опрашиваете все объекты (кнопки, датчики или что там у Вас есть), по быстрому реагируете и снова в тот же loop – снова опрашивать.

1 лайк

Отстал от жизни…(