Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Сообщения: 249
Зарегистрирован: Вс авг 15, 2010 20:42:44
Откуда: Тюмень

Сообщение Serhio »

dimmer писал(а): Вот в обработчике прерывания этого таймера и выдавать очередной бит, а значение следующего бита затем вычислять в основной программе
То есть наличие паузы (пауза - есть машинное время затраченное на вычисление следующего бита в основной программе) между посылаемыми битами не критично?
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

Сообщение ptr128 »

У Вас же 100мкс между сменами битов. За это время раз 10 можно очередной бит вычислить )
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Реклама
Прорезались зубы
Сообщения: 249
Зарегистрирован: Вс авг 15, 2010 20:42:44
Откуда: Тюмень

Сообщение Serhio »

Вот это и не понятно зачем мне вообще пауза между посылаемыми битами? Тем более 100мкс. При продолжительности бита в 960мкс, 100мкс, думаю, чувствительно. Честно говоря, вообще не пойму зачем мне необходим уход в прерывание в данном случае. Таймер мне необходим для формирования точной задержки в 320мкс (один интервал).
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб сен 17, 2016 18:56:30

Сообщение dimmer »

Первое прерывание допустим установит выход в 1, через какое-то время (320мкс) второе прерывание сбросит выход и т. д.
Реклама
Эиком - электронные компоненты и радиодетали
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

Есть такой у таймера странный режим CTC, а ещё у таймера есть выходы , которые меняют свое состояние сами, без процессора. Процессору остается - только вовремя остановит и запустить неугомонного.
Реклама
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб сен 17, 2016 18:56:30

Сообщение dimmer »

Да ILYAUL, если это соответствует логике программы, то это идеальное решение.
Реклама
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Serhio писал(а):... Честно говоря, вообще не пойму зачем мне необходим уход в прерывание в данном случае. Таймер мне необходим для формирования точной задержки в 320мкс (один интервал).
Прерывание позволит разгрузить контроллер на время передачи бита. Т.е. программа выдала уровень первого бита и начала отсчет времени. ***Программа подготавливает уровень следующего бита и занимается своими делами или просто уходит в SLEEP. Отсчитав заданное время, вызывается прерывание и значение следующего уровня одной командой (желательно не изменяющей SREG, чтобы его не нужно было пушить-попить) заносится на выход. Далее производится анализ передачи всей кодовой посылки и, если она не передана переходит на ***. В итоге, обработчик займет 10,11 тактов. Выше уже советовали применить режим CTC. Задействовать лапы контроллера в режиме OCx не советую, т.к. при этом вскакивают слишком много ограничений.
Друг Кота
Аватара пользователя
Сообщения: 15793
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Ну "точные задержки" с разрешением до такта можно и программным способом сформировать...
Все зависит от конкретной программы, принятых приоритетов и имеющихся в распоряжении ресурсов.
У каждого метода свои особенности и ресурсные требования. Выбор за автором конкретной прожки.
:beer:
Прорезались зубы
Сообщения: 249
Зарегистрирован: Вс авг 15, 2010 20:42:44
Откуда: Тюмень

Сообщение Serhio »

Подскажите пожалуйста где в Atmel Studio 6.2 хранятся инклудники. Например tn2313def.inc
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Есть очень удобная штука в компе - поиск файлов.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Прорезались зубы
Сообщения: 249
Зарегистрирован: Вс авг 15, 2010 20:42:44
Откуда: Тюмень

Сообщение Serhio »

:)) Есть.
Написал несколько строчек кода

.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. Что я упустил?
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Код: Выделить всё

.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
Добавлено after 4 minutes 53 seconds:
Кстати, .include "m8def.inc" можно убрать. Atmel Studio 6 сама их подключит автоматом что надо. Только в настройках проекта правильно МК выберите.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Аватара пользователя
Сообщения: 15793
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Возможна реакция на "перекрытие" области векторов прерываний (в 4-й студии только в случае"варминг" -предупреждений, как будет реагировать иная версия студии - не ведаю).
8)
Как вариант альтернативы (дабы не заморачиваться с предупреждениями и подсчетами по конкретным МК)

Код: Выделить всё

  .cseg
		.org 0x000
	irq_res:
		rjmp init ; переход к началу программы инициализации системы
; - - - - - - - - - - - - - - - - - - - - - - - - - - -
; блок размещения векторов активных прерываний
;		.org OC0Aaddr
;	irq_t0:
;		rjmp timers_bum ; steps
; - - - - - - - - - - - - - - - - - - - - - - - - - - -
;________________________
   .org (irq_res+int_vectors_size) ; обход блока векторов прерываний
		init:                    ;блок начальной инициализации кристалла
:dont_know:
Прорезались зубы
Сообщения: 249
Зарегистрирован: Вс авг 15, 2010 20:42:44
Откуда: Тюмень

Сообщение Serhio »

Судя по сторонним ресурсам это именно реакция на перекрытие. Не знал как с ним бороться. А почему, если тоже самое проделать с Tiny2313, то такой реакции нет (ведь там тоже есть прерывания)? Более того прерывания в данном случае использовать не хочу (взял за пример листинг 4.11 из книги Белова), задаю константу - столько раз тикнуть таймеру, а затем выход из подпрограммы.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Нет. Ошибка не в этом у Вас была. Я же поправил код.
Если не указывать с какого адреса будет код, он будет с 0 адреса. После инициализации регистра стека, Вы указывает что следующий код пойдет опять с 0 адреса (.org 0). Вот и вся ошибка. Текст ошибки об этом и говорит.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Прорезались зубы
Сообщения: 249
Зарегистрирован: Вс авг 15, 2010 20:42:44
Откуда: Тюмень

Сообщение Serhio »

Z_h_e писал(а): Я же поправил код.
ВИНОВАТ, действительно не увидел сразу, спасибо Вам.
Все работает.
Контактная информация:
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб сен 17, 2016 18:56:30

Сообщение dimmer »

С вашего позволения, ещё замечание. Если записать имя файла в директиве include в таких скобках <m8def.inc>, то компилятор будет искать этот файл сначала в собственной библиотеке, и вам не придётся копировать файл в папку проекта. Хотя иногда требуется в настройках указать компилятору путь к библиотеке.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

BOB51 писал(а):Как вариант альтернативы (дабы не заморачиваться...
Я не так делаю. Копирую таблицу векторов из ДШ, вставляю в проект, заменяю все переходы на reti, по мере написания проекта, восстанавливаю нужный переход на обработчик прерывания. Вот например вектора atmega8 из кой-какого проекта.
Спойлер

Код: Выделить всё

 .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
;
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18790
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Z_h_e писал(а):Я не так делаю. Копирую таблицу векторов из ДШ, вставляю в проект, заменяю все переходы на reti, по мере написания проекта, восстанавливаю нужный переход на обработчик прерывания.
всегда возражаю против этого подхода, возражу и сейчас.

существует, на мой взгляд, более правильная методика работы с векторами прерываний: при помощи директивы ORG задавать адрес вектора, используя именованную константу, описанную в соответствующем инклюднике. неиспользуемые векторы, таким образом, в тексте программы не упоминаются вообще.

Код: Выделить всё

.ORG 0 ; старт
   rjmp begin_program
.ORG OVF0addr ; обработчик переполнения 0-го таймер
   rjmp vector_ovf0

begin_program:
   ldi r16, 0
   ...
как-то так...

в чем плюсы?
во-первых, векторы можно описывать в любом порядке - компилятор сам расставит их в нужные ячейки. ошибка, когда из-за copy-paste таблицы векторов обработчик оказывался не в той ячейке - одна из самых распространенных.
во-вторых, мы имеем возможность напихать в неиспользуемые области таблицы векторов какие-то полезные данные или коды - это, раз уж мы говорим об ассемблере, позволит нам выжать максимум из имеющегося минимума.
в-третьих, в программе минимум "магических чисел", т.е. она становится более переносима, а за соответствие символьных констант реальным адресам уже отвечает разработчик инклюдника (т.е. производитель).
наконец, в программе нет ничего лишнего, а это (см. мою подпись) соответствует принципу Оккама, который можно трактовать и как "чем меньше лишнего, тем правильнее" :)
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Держит паяльник хвостом
Аватара пользователя
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Сообщение ILYAUL »

..при помощи директивы ORG задавать адрес вектора...
+100500
Ответить

Вернуться в «AVR»