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

Обсуждаем контроллеры компании Atmel.
Ответить
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Все. все. Разобрался. СПасибо за поддержку. :beer:
Станислав
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 39
Зарегистрирован: Пн дек 31, 2012 13:16:59

Сообщение *скрыто* »

Вот тут недавно у человека Flash.#13 была проблема с ацп. Так вот у меня тоже такая проблема появилась.
При быстром переключении каналов adc0 и adc1, с интервалом 80 мкс считывалось что то среднее между напряжениями на 1и0 входе, а так же оба входных напряжения влияли не на своих измерениях . Кварц 16м, тактирование ацп fclk/2.
Вот такая дурацкая конструкция решила проблему.

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

		sbi adcsra,6				;
			sbic adcsra,6				; 
			rjmp pc-1					; 
			sbi adcsra,6				; 
			sbic adcsra,6
			rjmp pc-1
			sbi adcsra,6				;
			sbic adcsra,6
			rjmp pc-1                                  ; (все заняло 6мкс)
При убирании псоледних 3 строчек влияние каналов друг на друга остается, но становится чуть слабее.
В даташите сказано что после инструкци sbi adcsra,6 мультиплексор переключается и происходит измерение. Не успевает заряжаться емкость? у меня низкоомные цепи, с выхода операционников прям на вход контроллера через 680 ом.
Ладно в первый раз не дозарядилась, но на втором измерении почему опять пролезает помеха с соседнего канала. Что то скорее всего с мультиплексором.

adc_inp_sh.jpg
(9.62 КБ) 375 скачиваний
как то заработало и ладно. Но неприятно тратить время на такую ерунду.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18757
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

то есть вы запустили АЦП на частоте 8 МГц и удивляетесь, что получили не очень хороший результат?! это в то время, как даташит рекомендует не более 200 кГц для качества, ну и в крайнем случае до 1 МГц можно дотянуть...

говорите, жалко время тратить? не потратили его на чтение даташита - потратили на борьбу с тенью...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Коты! :) Небольшой вопрос по использованию директив условной компиляции...

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

.if R_Wport == 0

			rcall	DELAY_102

.endif
Вот, если такая конструкция, где условия не выполняется (R_Wport == 1), значит он не будет мне при компиляции вставлять вызов задержки?
Станислав
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18757
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

А если у меня

.equ R_Wport = PORTD
Разобрался... ТАк не работает. :)))
Станислав
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 39
Зарегистрирован: Пн дек 31, 2012 13:16:59

Сообщение *скрыто* »

Попробую на 1 мгц. Мне нужно разрешение 8 бит и невысокая точность будет достаточна. Главное чтобы быстро,и с других каналов не было влияния.
afz
Опытный кот
Аватара пользователя
Сообщения: 744
Зарегистрирован: Сб дек 22, 2012 08:17:42
Откуда: Караганда, Казахстан

Сообщение afz »

Кстати, несколько раз скачивал из Сети разнообразные асмовые проекты и обратил внимание. Очень часто в асмовом тексте встречается строчка, допустим, для Меги-8:

.include "m8h.inc"

и в архивчике с проектом - сам файлик m8h.inc

А я, когда еще только осваивал АВР Студию и асм, в первой же програмке, не задумываясь, "пошел на поводу" у своего Сишного "автопилота" и написал .include <m8h.inc> и ни разу не удивился, когда Студия сама без вопросов нашла этот файлик в своиих библиотеках .inc- и .h-файлов. То есть, Студия работает с асмовскими .include точно так же, как и с Сишными #include - если аргумент в кавычках, файл ищется в папке проекта, если в угловых скобках - в библиотеках Студии.

Кто не знал - рекомендую, а такие, судя по скачанным проектам, встречаются...
Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 39
Зарегистрирован: Пн дек 31, 2012 13:16:59

Сообщение *скрыто* »

сделал тактирование 1 мгц, выкинул дурацкую конструкцию с 3 стартами ацп, все работает но теперь ждать около 13-15 мкс завершния. Похоже ограничения в мультиплексоре, и быстрее 6 мкс не переключается .
Держит паяльник хвостом
Аватара пользователя
Сообщения: 965
Зарегистрирован: Сб апр 12, 2014 23:46:03
Откуда: Киев

Сообщение Flash.#13 »

*скрыто* писал(а):сделал тактирование 1 мгц, выкинул дурацкую конструкцию с 3 стартами ацп, все работает но теперь ждать около 13-15 мкс завершния. Похоже ограничения в мультиплексоре, и быстрее 6 мкс не переключается .
У меня была аналогичная проблема, и две страницы назад она описана)) Правда в моем случае минимальное время переключения составило около 160мкс. И задержка вводилась между вторым замером и реальным. Но товарищи говорили что может быть и конструкцией реальной партии камней завода изготовителя. Главное чтобы работало))
____________________

Ребята, теперь новая проблема, на сей раз с ШИМ. А точнее с "ОС2" на timer2. Полез в мануалы, написал вот так:

Устанавливаем PortB-3 на выход, ножка ШИМ

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

ldi R16, 0b00001000
out ddrB, R16
Включаем второй таймер, и биты работы "прямого" ШИМ'а, с COM21=1, COM20=0, WGM21 и WGM20 "0"

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

...
ldi R16, 0b00100011	;задержка 32,для 40кГц,+вкл прямой ШИМ
out TCCR2, R16 		;пуск таймера "ШИМ"
Затем задаю значение в регистр ШИМ'а OCR2:

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

...
ldi R16, 0x80	;128h половина скважности
out OCR2, R16 	;запись в регистр ШИМ
Вроде все готово, но при этом ШИМ не генерирует колебания на ножке "17" PB3(OC2) с амплитудой 5в...(( Ребята, чего не так?
Немного файлов по зажиганию: ФУОЗ 2.2 + программа правки таблиц 0.987, монтажка
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Тоже вопрос...
А на АТМЕГА16 и выше работает команда rcall и rjmp?
Станислав
Опытный кот
Аватара пользователя
Сообщения: 721
Зарегистрирован: Ср июн 11, 2014 09:43:13
Откуда: США

Сообщение Pink-Pank »

работают. только помимо них есть еще альтернативные команды с большим диапазоном охватываемых адресов.
Fucking static initialization order fiasco
Контактная информация:
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Pink-Pank писал(а):команды с большим диапазоном охватываемых адресов.
Да, про них знаю, которые не относительные, а просто call и jmp. Просто хотелось быть уверенным, что эти тоже будут работать (для будущего переноса и универсальности кода).
Да ! Спасибо за консультацию.
Станислав
Держит паяльник хвостом
Аватара пользователя
Сообщения: 965
Зарегистрирован: Сб апр 12, 2014 23:46:03
Откуда: Киев

Сообщение Flash.#13 »

Это уже не смешно! Запустить хардварный ШИМ не удается, зато нормально работает программный:

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

...
.org 3				;вектор прер. сравнения timer2
rjmp compare                                    ;идти туда
.org 4 				;вектор прер. timer2
rjmp overflow
...
;========ШИМ=============
compare:                   ;счетчик равен заданному числу
cbi PortB,3                 ;пишем "0" на ножке 17 "OC2"
reti                            ;возврат с прерывания
overflow:                   ;счетчик сделал круг и стал на "0"
sbi PortB,3                 ;пишем "1" на ножке 17 "OC2"
reti
И на осциллографе сразу лезет прямоуголка. Но использовать прерывания для организации ШИМ'а не круто...((
Немного файлов по зажиганию: ФУОЗ 2.2 + программа правки таблиц 0.987, монтажка
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Flash.#13 писал(а):Запустить хардварный ШИМ не удается
А какой у вас МК?
Там вроде тоже надо прерывания по ШИМ разрешать, гляньте в даташите таблицу прерываний на ваш МК, может там есть что-то похожее на OCR2??
З.Ы могу гнать.. ))) У меня уже ночь, пора спать.
Станислав
Держит паяльник хвостом
Аватара пользователя
Сообщения: 965
Зарегистрирован: Сб апр 12, 2014 23:46:03
Откуда: Киев

Сообщение Flash.#13 »

Atmega8, в мануале все норм, а ШИМ не идет...

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

.equ	INT0addr=$001	; External Interrupt0 Vector Address
.equ	INT1addr=$002	; External Interrupt1 Vector Address
.equ	OC2addr =$003	; Output Compare2 Interrupt Vector Address
.equ	OVF2addr=$004	; Overflow2 Interrupt Vector Address
.equ	ICP1addr=$005	; Input Capture1 Interrupt Vector Address
.equ	OC1Aaddr=$006	; Output Compare1A Interrupt Vector Address
.equ	OC1Baddr=$007	; Output Compare1B Interrupt Vector Address
.equ	OVF1addr=$008	; Overflow1 Interrupt Vector Address
.equ	OVF0addr=$009	; Overflow0 Interrupt Vector Address
.equ	SPIaddr =$00a	; SPI Interrupt Vector Address
.equ	URXCaddr=$00b	; USART Receive Complete Interrupt Vector Address
.equ	UDREaddr=$00c	; USART Data Register Empty Interrupt Vector Address
.equ	UTXCaddr=$00d	; USART Transmit Complete Interrupt Vector Address
.equ	ADCCaddr=$00e	; ADC Interrupt Vector Address
.equ	ERDYaddr=$00f	; EEPROM Interrupt Vector Address
.equ	ACIaddr =$010	; Analog Comparator Interrupt Vector Address
.equ        TWIaddr =$011     ; Irq. vector address for Two-Wire Interface
.equ	SPMaddr =$012	; SPM complete Interrupt Vector Address
Тупо конечно, но покнопаю софтово, куда тут денешься((
Последний раз редактировалось Flash.#13 Ср янв 21, 2015 21:00:07, всего редактировалось 1 раз.
Немного файлов по зажиганию: ФУОЗ 2.2 + программа правки таблиц 0.987, монтажка
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18757
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

СКАЗОЧНИК писал(а):
Flash.#13 писал(а):Запустить хардварный ШИМ не удается
А какой у вас МК?
Там вроде тоже надо прерывания по ШИМ разрешать, гляньте в даташите таблицу прерываний на ваш МК, может там есть что-то похожее на OCR2??
З.Ы могу гнать..
гнать не надо :) для аппаратного ШИМ разрешение прерываний не является необходимым условием. Нужно корректно установить биты в регистрах TCCRxA и TCCRxB, и потом задавать какое-нибудь значение в нужном регистре OCR
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Сообщение zero648 »

Flash.#13 писал(а):Atmega8, в мануале все норм, а ШИМ не идет...
Тупо конечно, но покнопаю софтово, куда тут денешься((
Установите режим FastPWM, а не NORMAL.
WGM21 WGM20 в единицу установите.
Идёт направо - песнь заводит, Налево - сказку говорит.
Аватара пользователя
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Сообщение СКАЗОЧНИК »

Еще вопрос мучает меня.
Спойлер

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

			USER:	.db	0b00011111,	0b00011111,	0b00000000,	0b00011111,	0b00000000,	0b00000000,	0b00000000,	0b00000000
					.db	0b00011111,	0b00011111,	0b00000000,	0b00011111,	0b00000000,	0b00000000,	0b00000000,	0b00000000
					.db	0b00000000,	0b00011111,	0b00000000,	0b00000000,	0b00000000,	0b00000000,	0b00000000,	0b00000000
					.db	0b00000000,	0b00000000,	0b00000000,	0b00000000,	0b00000000,	0b00000000,	0b00000000,	0b00000000
					.db	0b00000000,	0b00000000,	0b00000000,	0b00000000,	0b00000000,	0b00000000,	0b00000000,	0b00000000
					.db	0b00000000,	0b00000000,	0b00011111,	0b00000000,	0b00000011,	0b00011000,	0b00000000,	0b00000000
					.db	0b00000000,	0b00000000,	0b00011111,	0b00011111,	0b00000011,	0b00011000,	0b00011111,	0b00000000
					.db	0b00001111,	0b00000000,	0b00011111,	0b00011111,	0b00000011,	0b00011000,	0b00011111,	0b00000000

;							0			1			2			3			4			5			6			7			; Номер символа
Вот эта конструкция - массив. В какой очередности идут элементы? Слева направо, а дальше вторая строка с лева на право и т.д.? Является ли это все одним массивом? Смотрел в памяти, все элементы идут друг за другом. Т.е. их можно использовать с помощью команды загрузки из программной памяти с пост-инкрементом (LPM)?
И еще.
Команда эта (LPM) с пост-инкрементом загружает также очередное значение в R0, кроме того регистра, куда мне надо. Вот здесь можно увидеть:
Спойлер

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

ldi ZH, high (USER*2) 		; Переходим на нашу таблицу символов на самый первый элемент (точнее нулевой)
					ldi ZL, low (USER*2)

					lpm	R18, Z+					; Загружаем этот элемент  в регистр Р18
					rcall	DATA_WR				; Записываем значение из таблицы в память ЖКИ
В таком случае будет ли каждый элемент также загружатся в R0?, т.е. если я проверю этот R0, там должно быть тоже самое, что только что записалось в R18?
Станислав
akl
Друг Кота
Сообщения: 4453
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Нет, команда

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

 lpm   R18, Z+               ; Загружаем этот элемент  в регистр Р18
загружает в R18 содержимое памяти программ из евоного адреса. При чём тут R0?
Ответить

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