То есть наличие паузы (пауза - есть машинное время затраченное на вычисление следующего бита в основной программе) между посылаемыми битами не критично?dimmer писал(а): Вот в обработчике прерывания этого таймера и выдавать очередной бит, а значение следующего бита затем вычислять в основной программе
Ассемблер (ASM) для AVR в вопросах и ответах
- Реклама
У Вас же 100мкс между сменами битов. За это время раз 10 можно очередной бит вычислить )
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Вот это и не понятно зачем мне вообще пауза между посылаемыми битами? Тем более 100мкс. При продолжительности бита в 960мкс, 100мкс, думаю, чувствительно. Честно говоря, вообще не пойму зачем мне необходим уход в прерывание в данном случае. Таймер мне необходим для формирования точной задержки в 320мкс (один интервал).
- Сообщения: 31
- Зарегистрирован: Сб сен 17, 2016 18:56:30
Первое прерывание допустим установит выход в 1, через какое-то время (320мкс) второе прерывание сбросит выход и т. д.
Есть такой у таймера странный режим CTC, а ещё у таймера есть выходы , которые меняют свое состояние сами, без процессора. Процессору остается - только вовремя остановит и запустить неугомонного.
- Реклама
- Сообщения: 31
- Зарегистрирован: Сб сен 17, 2016 18:56:30
Да ILYAUL, если это соответствует логике программы, то это идеальное решение.
Прерывание позволит разгрузить контроллер на время передачи бита. Т.е. программа выдала уровень первого бита и начала отсчет времени. ***Программа подготавливает уровень следующего бита и занимается своими делами или просто уходит в SLEEP. Отсчитав заданное время, вызывается прерывание и значение следующего уровня одной командой (желательно не изменяющей SREG, чтобы его не нужно было пушить-попить) заносится на выход. Далее производится анализ передачи всей кодовой посылки и, если она не передана переходит на ***. В итоге, обработчик займет 10,11 тактов. Выше уже советовали применить режим CTC. Задействовать лапы контроллера в режиме OCx не советую, т.к. при этом вскакивают слишком много ограничений.Serhio писал(а):... Честно говоря, вообще не пойму зачем мне необходим уход в прерывание в данном случае. Таймер мне необходим для формирования точной задержки в 320мкс (один интервал).
Ну "точные задержки" с разрешением до такта можно и программным способом сформировать...
Все зависит от конкретной программы, принятых приоритетов и имеющихся в распоряжении ресурсов.
У каждого метода свои особенности и ресурсные требования. Выбор за автором конкретной прожки.

Все зависит от конкретной программы, принятых приоритетов и имеющихся в распоряжении ресурсов.
У каждого метода свои особенности и ресурсные требования. Выбор за автором конкретной прожки.
Подскажите пожалуйста где в Atmel Studio 6.2 хранятся инклудники. Например tn2313def.inc
Есть очень удобная штука в компе - поиск файлов.
Написал несколько строчек кода
.include "m8def.inc"
.list
.def temp = r16
.equ kdel = 64 // Ввели константу и обозвали ее - kdel
ldi Temp, High(RAMEND) // Причесали стек как в даташите
out SPH, Temp
ldi Temp, Low(RAMEND)
out SPL, Temp
.dseg
.cseg
.org 0
собственно все стандартно, НО при написании любой другой строчки, например элементарно
ldi temp, 0
выпадает следующая ошибка при компиляции
Overlap in .cseg: addr=0x0 conflicts with 0x0:0x4
Господа, что это такое? Такая реакцию на любую последующую запись будь то инициализация чего-либо или просто запись в temp. Что я упустил?
Код: Выделить всё
.include "m8def.inc"
.def temp = r16
.equ kdel = 64 // Ввели константу и обозвали ее - kdel
.cseg
.org 0
ldi Temp, High(RAMEND) // Причесали стек как в даташите
out SPH, Temp
ldi Temp, Low(RAMEND)
out SPL, Temp
Кстати, .include "m8def.inc" можно убрать. Atmel Studio 6 сама их подключит автоматом что надо. Только в настройках проекта правильно МК выберите.
Возможна реакция на "перекрытие" области векторов прерываний (в 4-й студии только в случае"варминг" -предупреждений, как будет реагировать иная версия студии - не ведаю).

Как вариант альтернативы (дабы не заморачиваться с предупреждениями и подсчетами по конкретным МК)

Как вариант альтернативы (дабы не заморачиваться с предупреждениями и подсчетами по конкретным МК)
Код: Выделить всё
.cseg
.org 0x000
irq_res:
rjmp init ; переход к началу программы инициализации системы
; - - - - - - - - - - - - - - - - - - - - - - - - - - -
; блок размещения векторов активных прерываний
; .org OC0Aaddr
; irq_t0:
; rjmp timers_bum ; steps
; - - - - - - - - - - - - - - - - - - - - - - - - - - -
;________________________
.org (irq_res+int_vectors_size) ; обход блока векторов прерываний
init: ;блок начальной инициализации кристаллаСудя по сторонним ресурсам это именно реакция на перекрытие. Не знал как с ним бороться. А почему, если тоже самое проделать с Tiny2313, то такой реакции нет (ведь там тоже есть прерывания)? Более того прерывания в данном случае использовать не хочу (взял за пример листинг 4.11 из книги Белова), задаю константу - столько раз тикнуть таймеру, а затем выход из подпрограммы.
Нет. Ошибка не в этом у Вас была. Я же поправил код.
Если не указывать с какого адреса будет код, он будет с 0 адреса. После инициализации регистра стека, Вы указывает что следующий код пойдет опять с 0 адреса (.org 0). Вот и вся ошибка. Текст ошибки об этом и говорит.
Если не указывать с какого адреса будет код, он будет с 0 адреса. После инициализации регистра стека, Вы указывает что следующий код пойдет опять с 0 адреса (.org 0). Вот и вся ошибка. Текст ошибки об этом и говорит.
ВИНОВАТ, действительно не увидел сразу, спасибо Вам.Z_h_e писал(а): Я же поправил код.
Все работает.
- Сообщения: 31
- Зарегистрирован: Сб сен 17, 2016 18:56:30
С вашего позволения, ещё замечание. Если записать имя файла в директиве include в таких скобках <m8def.inc>, то компилятор будет искать этот файл сначала в собственной библиотеке, и вам не придётся копировать файл в папку проекта. Хотя иногда требуется в настройках указать компилятору путь к библиотеке.
Я не так делаю. Копирую таблицу векторов из ДШ, вставляю в проект, заменяю все переходы на reti, по мере написания проекта, восстанавливаю нужный переход на обработчик прерывания. Вот например вектора atmega8 из кой-какого проекта.BOB51 писал(а):Как вариант альтернативы (дабы не заморачиваться...
Спойлер
Код: Выделить всё
.org 0
rjmp RESET ; Reset Handler
reti//rjmp EXT_INT0 ; IRQ0 Handler
reti//rjmp EXT_INT1 ; IRQ1 Handler
reti//rjmp TIM2_COMP ; Timer2 Compare Handler
rjmp TIM2_OVF ; Timer2 Overflow Handler
reti//rjmp TIM1_CAPT ; Timer1 Capture Handler
reti//rjmp TIM1_COMPA ; Timer1 CompareA Handler
reti//rjmp TIM1_COMPB ; Timer1 CompareB Handler
reti//rjmp TIM1_OVF ; Timer1 Overflow Handler
rjmp TIM0_OVF ; Timer0 Overflow Handler
reti//rjmp SPI_STC ; SPI Transfer Complete Handler
rjmp USART_RXC ; USART RX Complete Handler
reti//rjmp USART_UDRE ; UDR Empty Handler
rjmp USART_TXC ; USART TX Complete Handler
reti//rjmp ADC ; ADC Conversion Complete Handler
reti//rjmp EE_RDY ; EEPROM Ready Handler
reti//rjmp ANA_COMP ; Analog Comparator Handler
reti//rjmp TWSI ; Two-wire Serial Interface Handler
reti//rjmp SPM_RDY ; Store Program Memory Ready Handler
;
всегда возражаю против этого подхода, возражу и сейчас.Z_h_e писал(а):Я не так делаю. Копирую таблицу векторов из ДШ, вставляю в проект, заменяю все переходы на reti, по мере написания проекта, восстанавливаю нужный переход на обработчик прерывания.
существует, на мой взгляд, более правильная методика работы с векторами прерываний: при помощи директивы ORG задавать адрес вектора, используя именованную константу, описанную в соответствующем инклюднике. неиспользуемые векторы, таким образом, в тексте программы не упоминаются вообще.
Код: Выделить всё
.ORG 0 ; старт
rjmp begin_program
.ORG OVF0addr ; обработчик переполнения 0-го таймер
rjmp vector_ovf0
begin_program:
ldi r16, 0
...в чем плюсы?
во-первых, векторы можно описывать в любом порядке - компилятор сам расставит их в нужные ячейки. ошибка, когда из-за copy-paste таблицы векторов обработчик оказывался не в той ячейке - одна из самых распространенных.
во-вторых, мы имеем возможность напихать в неиспользуемые области таблицы векторов какие-то полезные данные или коды - это, раз уж мы говорим об ассемблере, позволит нам выжать максимум из имеющегося минимума.
в-третьих, в программе минимум "магических чисел", т.е. она становится более переносима, а за соответствие символьных констант реальным адресам уже отвечает разработчик инклюдника (т.е. производитель).
наконец, в программе нет ничего лишнего, а это (см. мою подпись) соответствует принципу Оккама, который можно трактовать и как "чем меньше лишнего, тем правильнее"
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
+100500..при помощи директивы ORG задавать адрес вектора...



