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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

ptr128 писал(а):Для примера, на уровне LD на платформах, поддерживающих и short и long CALL, можно получить очень своеобразные глюки, не управляя порядком следования функций/подпрограмм. А если жить только в IDE, то вынуждены будете отказаться от short CALL полностью, если памяти больше, чем доступно при short CALL.
WiseLord писал(а):Крик души такой
вы, уважаемые господа, обратите внимание, в какой теме находитесь! все понятно - и платформы разные, и IDE и прочее, но к чему это все в конкретном случае AVR?
сборка проекта из кучи библиотек? это вы о чем вообще, если 50% "программистов AVR" считают, что все сишные исходники нужно инклюдить в главный? библиотеки? нет, не слышали...
скрипты ld? это что такое, если 90% "программистов AVR" уверены, что компилятор сразу генерирует HEX для прошивки? что такое компоновка вообще?

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

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Надо исходить из возможностей конкретного компилятора. А в атмелевском (даже avrasm2) они весьма специфичны по многим объективным причинам.
Чего могут иные компиляторы - разговор особый и только по стольку, поскольку те приемы применимы/переносимы в применении к хотя-бы avrasm2
8)
Реклама
Аватара пользователя
oleg110592
Друг Кота
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

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

Сообщение oleg110592 »

командная строка для GCC asm:

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

d:\GCCAVR\bin\avr-gcc -mmcu=atmega48 -I. -Wa,-gstabs -Wall -o test.elf test.S
d:\GCCAVR\bin\avr-objcopy -j .text -j .data -O ihex test.elf test.hex
тестик:
Спойлер

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

define PORTB   0x05
#define data r16
#define loopone r17
#define looptwo r18
#define loopthr r19

.global main

main:
        ldi     data,0xFF
        out     PORTB,data
loop:
        ldi     data,0x00
        out     PORTB,data
        rcall  delay 

        ldi     data,0xFF
        out     PORTB,data
        rcall  delay

        rjmp    loop

delay:
        ldi loopone,0x0F
waitlooptwo:
        ldi looptwo,0xFF
waitloopthr:
        ldi loopthr,0xFF
waitloop:
        subi loopthr,0x01
        brne waitloop
        subi looptwo,0x01
        brne waitloopthr
        subi loopone,0x01
        brne waitlooptwo
        ret
trofim2
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

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

Сообщение trofim2 »

Спасибо oleg110592, ты первый, кто понял, чего я хочу.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

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

Сообщение ptr128 »

ARV писал(а): но к чему это все в конкретном случае AVR?
Вот сейчас на AVR делаю работу со шрифтами, хранящимися на SD. Идея в том, что при выводе строки, на основании заголовка шрифта мы получаем базу для рассчета позиций каждого символа. По мере считывания шрифта сразу формируем на TFT очередной считываемый символ во всех местах, где он есть или пропускаем его, если его нет в строке. Особенно для крупных шрифтов экономия памяти огромная, а в производительности теряем только время, необходимое для последовательного считывания шрифта с SD.

То есть, в одном проекте надо и под AVR код собирать, и для PC (преобразование шрифта в оптимальный для данного применения формат). В процессе экспериментов, особенно с пропорциональными шрифтами, структура хранения шрифта на SD уже несколько раз менялсь. В случае make, у меня корректно пересобираются обе части, причем быстро. Без make это было бы вообще два разных проекта, да еще и пересобираемых долго и нудно.

Посмотрите, например, сколько времени даже blink собирается в Arduino IDE, а сколько через make. В первом случае у меня секунд 10, во втором - меньше секунды.

Добавлено after 4 minutes 12 seconds:
oleg110592 писал(а):командная строка для GCC asm:
Ага, и каждый раз перекомпилировать все исходники. Особенно круто это будет выглядеть для реального проекта, кода *.s файлов на несколько килобайт, а включаемых файлов, суммарно для всех *.s файлов - несколько сот килобайт.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

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

Сообщение ARV »

ptr128 писал(а):Вот сейчас на AVR делаю работу со шрифтами
и что? сколько еще таких виртуозов, как вы? насколько ценным будет совет применять частность, как обобщающий принцип?

я не оспариваю важность знаний, но не всем и не всегда они требуются в максимальном объеме. я вот, например, так и не освоил матаппарат ТАУ, и даже дифференциальное исчисление... и как-то жив до сих пор. а многие, я знаю, обходятся даже без таблицы умножения...

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

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
ptr128
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Чт окт 06, 2016 21:12:07
Откуда: Южное Бутово

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

Сообщение ptr128 »

ARV писал(а):и что? сколько еще таких виртуозов, как вы?
Вы мне льстите. Я, до сентября этого года, последний раз программировал для МК в 1989 году. А последние 10 лет даже на C почти не приходилось писать (разве что, когда дочке с дипломом помогал). Обходился Perl, а остальное - на T-SQL или PL/SQL, ну и в довесок MDX с дотнетовскими сборками на C#.
ARV писал(а): насколько ценным будет совет применять частность, как обобщающий принцип?
Так я ровно про это речь и веду. Сборка только под одну платформу из одного или нескольких файлов исходного кода - частность. Сборка под любое количество платформ из любого объема исходных текстов и разделяемых библиотек - общий принцип.

Другое дело, что для новичка освоение autoconf (perl + m4) или даже cmake(чуть попроще) является излишеством. Пусть сначала GNU make научится пользоваться.
Не ошибается только то, кто ничего не делает.
Тот, кто признает свои ошибки, на них учится.
Глупец же, упорствуя в своих заблуждениях, остается глупцом.
bondyara
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб май 07, 2011 17:00:42
Откуда: Оттуда

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

Сообщение bondyara »

Подскажите!
Нужно в макросе выставить биты числа, заданные параметрами @0 - @3 в "0", остальные в "1"
К примеру, если биты 0, 2, 3, 5, то нужно получить 0b11010010
Так будет правильно?
~(1<<@0)|(1<<@1)|(1<<@2)|(1<<@3)
Или будет инвертирован только первый бит?

Погодите, почитал приоритеты, ~ выше, чем |
~((1<<@0)|(1<<@1)|(1<<@2)|(1<<@3))
Так?
trofim2
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

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

Сообщение trofim2 »

Не жалей скобки, не будет ошибок, да и понятнее запись.
Аватара пользователя
strengerst
Вымогатель припоя
Сообщения: 516
Зарегистрирован: Пт янв 18, 2013 15:11:02

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

Сообщение strengerst »

Помогите найти ошибку в коде, в протеуссе моментально срабатывает прерывание даже без сигнала высокого фронта, а в Atmel Studio прерывания срабатывает только раз, после флаг на разрешения прерывания, категорически отказывается выставляться командой, только тыкать в ручную. Хотя вроде все должно быть норм.
Спойлер

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

 *   Author: st
 */ 
.def XXX=R20;// Команда для переименования регистров.
.def timeprod=R21;
.def zero=R22;
.list; // Отоброжения листинга исполнения команды.
.cseg; работаем с програмной памятью а не озу или eeprom
.org 0; устанавливаем начальную позицию строки
rjmp START; Reset Handler
rjmp obrobotkaINT0; IRQ0 Handler
rjmp START; PCINT0Z Handler
rjmp START; Timer0 Overflow Handler
rjmp START; EEPROM Ready Handler
rjmp START; Analog Comparator Handler
rjmp obrobotkaTIM0_COMPA; TIM0_COMPA CompareA Handler
rjmp START; Timer0 CompareB Handler
rjmp START; Watchdog Interrupt Handler
rjmp START; ADC Conversion Handler

//броботка прерывания порта INT0, по высокому сигналу. 
obrobotkaINT0:
//Отключаем работу на срабатывания прерывания
ldi R16, (0<<INT0);
out GIMSK, R16;
//скидываем фдлаг если имеется
ldi R16, (1<<INTF0); /скидываем флаги прерывания
out GIFR, R16;
//Подключаем нужный нам порт.
ldi R16, (1<<PB4)|(1<<PB1);
out PORTB, R16;
//RCALL  TIMER; //Относительный вызов подпрограммы TIMER.
RCALL  TIMER;
nop;
reti; //команда выхода из оброботчика прерывания. 
//Прерывания при совапдении таймера
obrobotkaTIM0_COMPA:
inc XXX;
reti;
 /*Код установки таймера счетчика*/
TIMER:
/*
http://avrprog.blogspot.com/2013/03/t0-8.html
TIFR0 - регистр индикации флагов прерывания
TOV0 - флаг индикации по переполнению таймера
OCF0A,OCF0B - флаг индикации по совпадению. 
OCR0A,OCR0B - регистр установки значения для совпадения.
TCCR0A - регистр управления A;
TCCR0B - регистр управления B;
*TIMSK0 - Регистр выбора режима срабатывания прерывания
TOIE0 - по переполнению, OCIE0A - по совпадению со значанием в регистре А,
OCIE0B - по совпадению со значанием в регистре B.
*/
ldi R16, 0x00;// Сбрасываем все флаги таймера
out TIFR0, R16;

ldi R16, (1<<OCIE0A);Установка режима по совпадению с А;
out TIMSK0, R16;

ldi R16, 0xFF; Устанавливаем значение при совпадении с А
out OCR0A, R16;

/*Скорость работы микроконтролера*/
ldi R16, (1<<CS02)|(0<<CS01)|(1<<CS00);
out TCCR0B, R16;
//Присваем значение переменной 0, для упрощения дальнейшего применения
ret; //возврат из подпрограммы TIMER:
//Определяем начальные параметры микроконтролера.
START:

 CLI; команда запрещает глобальные прерывания.
 
 //инициализация стэка.(установка максимально размера ОЗУ);
 ldi R17, RAMEND;
 out SPL, R17;
 ldi zero, 0x00; //Присваеваем значение 0 переменной zero
 //Установка предделителя частоты тактового сигнала Устанавляваем деление на 2 что бы не перегревать процесор.
 //При прошивки во fuches надо учитывать что мы здесь выставили. В данном случаи этот параметр можно и не трогать.
 ldi R16, (1<<CLKPCE)|(0<<CLKPS3)|(0<<CLKPS2)|(0<<CLKPS1)|(0<<CLKPS0);
 out CLKPR, R16;
 ldi R16, (0<<CLKPCE)|(0<<CLKPS3)|(0<<CLKPS2)|(1<<CLKPS1)|(0<<CLKPS0);
 out CLKPR, R16;

 //Отключаем аналогово-цифровой преобразователь
 CBI ADCSRA, ADEN;

//Отключение компаратора
//запрещает прерывание от компаратора;
//Команда сбрасывает значение в 0 регистра ACSR ячейки ACIE.
CBI ACSR, ACIE;
////Команда устанавливает значение в 1 регистра ACSR ячейки ASD что выключает компаратор;
SBI ACSR, ACD;

//инициализация портов ввода вывод
//уствнввливаем работу на срабатывания прерывания
ldi R16, (1<<INT0);
out GIMSK, R16;
//порт на высокий уровень сигнала
ldi R16, (1<<ISC01)|(1<<ISC00);
out MCUCR, R16;

//Устанавливаем работу партов на вход и выход. 
//Если порт DDB установлен в 1 то данный порт является выходам, 
//а если в 0 то входам.
ldi R16,(0<<DDB5)|(1<<DDB4)|(0<<DDB3)|(0<<DDB2)|(0<<DDB1)|(0<<DDB0);
out DDRB, R16;
//Включаем подтягивающий резистор
ldi R16, (1<<PB1);
out PORTB, R16;
/*Конфигурация портов */
sei;//Разрешаем глобальные прерывания
rjmp START1;

START1:

clz; //Очистить флаг в 0 в регистре SREG;
cpi XXX, 254; сравнение чисел если равны то Z флаг установиться; 
BREQ prodTime; Условный переход если Z=0;
nop;
rjmp START1;

prodTime:
mov xxx, zero;
inc timeprod; //переменная для увелечения работы времени таймера.
//сравниваем не останавливать ли таймер
clz; //Очистить флаг в 0 в регистре SREG;
cpi timeprod, 10;
BREQ  timeoute;
/*Переходим в программу для остановки 
таймера и отключения порта питания */
rjmp start1;

timeoute:
/*Отключаем работу таймера*/
ldi R16, (0<<OCIE0A);Установка по совпадению с А отключаем.;
out TIMSK0, R16;
/*Отключаем порт выхода сигнала,
 на транзистор прикуривателя*/
 ldi R16,(0<<PB4)|(1<<PB1);
 out PORTB, R16;
/*Очищаем переменную timeprod*/
mov timeprod, zero;
 /*Подключаем прерывания от ножки микроконтролера int0*/
 ldi R16, (1<<INTF0); /скидываем флаги прерывания
out GIFR, R16;
 ldi R16, (1<<INT0);
out GIMSK, R16;
//Включаем глобальное прерывания
sei;
rjmp start1;
СпойлерИзображение
Вложения
Proteus.png
(143.88 КБ) 645 скачиваний
PodogrevMaslaKartera.rar
(20.89 КБ) 137 скачиваний
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Попробуйте посадить кнопку одним концом на общий, а в коде сделайте

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

	SBI	DDRB,1
	SBI	PORTB,1
	CBI	DDRB,1
//инициализация портов ввода вывод
//уствнввливаем работу на срабатывания прерывания
;	ldi R16, (1<<ISC01);|(1<<ISC00);
;	out MCUCR, R16;
	ldi R16, (1<<INT0);
	out GIMSK, R16;
	OUT	GIFR,R16
;	ldi R16, (1<<PB1);
;	out PORTB, R16;
/*Конфигурация портов */
Ваш код, исправленный
Спойлер

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

   .include "tn13Adef.inc"   

.def XXX=R20;// Команда для переименования регистров.
.def timeprod=R21;
.def zero=R22;
;.list; // Отоброжения листинга исполнения команды.
.cseg; работаем с програмной памятью а не озу или eeprom
.org 0; устанавливаем начальную позицию строки
rjmp START; Reset Handler
rjmp obrobotkaINT0; IRQ0 Handler
rjmp START; PCINT0Z Handler
rjmp START; Timer0 Overflow Handler
rjmp START; EEPROM Ready Handler
rjmp START; Analog Comparator Handler
rjmp obrobotkaTIM0_COMPA; TIM0_COMPA CompareA Handler
rjmp START; Timer0 CompareB Handler
rjmp START; Watchdog Interrupt Handler
rjmp START; ADC Conversion Handler

//броботка прерывания порта INT0, по высокому сигналу. 
obrobotkaINT0:
//Отключаем работу на срабатывания прерывания
;	ldi R16, (0<<INT0);
	out GIMSK,ZERO;
//скидываем фдлаг если имеется
;ldi R16, (1<<INTF0); /скидываем флаги прерывания
;out GIFR, R16;
//Подключаем нужный нам порт.
ldi R16, (1<<PB4)|(1<<PB1);
out PORTB, R16;
//RCALL  TIMER; //Относительный вызов подпрограммы TIMER.
RCALL  TIMER;
nop;
reti; //команда выхода из оброботчика прерывания. 
//Прерывания при совапдении таймера
obrobotkaTIM0_COMPA:
inc XXX;
reti;
 /*Код установки таймера счетчика*/
TIMER:
/*
http://avrprog.blogspot.com/2013/03/t0-8.html
TIFR0 - регистр индикации флагов прерывания
TOV0 - флаг индикации по переполнению таймера
OCF0A,OCF0B - флаг индикации по совпадению. 
OCR0A,OCR0B - регистр установки значения для совпадения.
TCCR0A - регистр управления A;
TCCR0B - регистр управления B;
*TIMSK0 - Регистр выбора режима срабатывания прерывания
TOIE0 - по переполнению, OCIE0A - по совпадению со значанием в регистре А,
OCIE0B - по совпадению со значанием в регистре B.
*/
;	ldi R16, 0x00;// Сбрасываем все флаги таймера
;	out TIFR0, R16;

	ldi R16, 0xFF; Устанавливаем значение при совпадении с А
	out OCR0A, R16;

	ldi R16, (1<<OCIE0A);Установка режима по совпадению с А;
	out TIMSK0, R16;
	out TIFR0, R16
/*Скорость работы микроконтролера*/
ldi R16,(1<<CS00);
;	ldi R16, (1<<CS02)|(0<<CS01)|(1<<CS00);
	out TCCR0B, R16;
//Присваем значение переменной 0, для упрощения дальнейшего применения
ret; //возврат из подпрограммы TIMER:
//Определяем начальные параметры микроконтролера.
START:

; CLI; команда запрещает глобальные прерывания.
 
 //инициализация стэка.(установка максимально размера ОЗУ);
; ldi R17, RAMEND;
; out SPL, R17;
 ldi zero, 0x00; //Присваеваем значение 0 переменной zero
 //Установка предделителя частоты тактового сигнала Устанавляваем деление на 2 что бы не перегревать процесор.
 //При прошивки во fuches надо учитывать что мы здесь выставили. В данном случаи этот параметр можно и не трогать.
; ldi R16, (1<<CLKPCE)|(0<<CLKPS3)|(0<<CLKPS2)|(0<<CLKPS1)|(0<<CLKPS0);
; out CLKPR, R16;
; ldi R16, (0<<CLKPCE)|(0<<CLKPS3)|(0<<CLKPS2)|(1<<CLKPS1)|(0<<CLKPS0);
; out CLKPR, R16;

 //Отключаем аналогово-цифровой преобразователь
;CBI ADCSRA, ADEN;

//Отключение компаратора
//запрещает прерывание от компаратора;
//Команда сбрасывает значение в 0 регистра ACSR ячейки ACIE.
;CBI ACSR, ACIE;
////Команда устанавливает значение в 1 регистра ACSR ячейки ASD что выключает компаратор;
SBI ACSR, ACD;
//порт на высокий уровень сигнала
;	ldi R16, (1<<ISC01)|(1<<ISC00);
;	out MCUCR, R16;
//Устанавливаем работу партов на вход и выход. 
//Если порт DDB установлен в 1 то данный порт является выходам, 
//а если в 0 то входам.
	SBI	DDRB,4
;	ldi R16,(1<<DDB4)
;	out DDRB, R16;
//Включаем подтягивающий резистор
;
	SBI	DDRB,1
	SBI	PORTB,1
	CBI	DDRB,1
//инициализация портов ввода вывод
//уствнввливаем работу на срабатывания прерывания
;	ldi R16, (1<<ISC01);|(1<<ISC00);
;	out MCUCR, R16;
	ldi R16, (1<<INT0);
	out GIMSK, R16;
	OUT	GIFR,R16
;	ldi R16, (1<<PB1);
;	out PORTB, R16;
/*Конфигурация портов */
	sei;//Разрешаем глобальные прерывания
;	rjmp START1;

START1:
;	clz; //Очистить флаг в 0 в регистре SREG;
	cpi XXX, 254; сравнение чисел если равны то Z флаг установиться; 
	BRNE	START1
;	BREQ prodTime; Условный переход если Z=0;
;	nop;
;	rjmp START1;

prodTime:
	mov xxx, zero;
	inc timeprod; //переменная для увелечения работы времени таймера.
//сравниваем не останавливать ли таймер
;clz; //Очистить флаг в 0 в регистре SREG;
	cpi timeprod, 10;
	BRNE start1
;	BREQ  timeoute;
/*Переходим в программу для остановки 
таймера и отключения порта питания */
;	rjmp start1;

timeoute:
/*Отключаем работу таймера*/
	ldi R16, (0<<OCIE0A);Установка по совпадению с А отключаем.;
	out TIMSK0, R16;
/*Отключаем порт выхода сигнала,
 на транзистор прикуривателя*/
 	ldi R16,(0<<PB4)|(1<<PB1);
 	out PORTB, R16;
/*Очищаем переменную timeprod*/
	mov timeprod, zero;
 /*Подключаем прерывания от ножки микроконтролера int0*/
; ldi R16, (1<<INTF0); /скидываем флаги прерывания
;out GIFR, R16;
	ldi R16, (1<<INT0);
	out GIMSK, R16;
	out GIFR, R16;
//Включаем глобальное прерывания
;sei;
rjmp start1;
.EXIT
bondyara
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб май 07, 2011 17:00:42
Откуда: Оттуда

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

Сообщение bondyara »

Вопрос отпал.
bondyara
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб май 07, 2011 17:00:42
Откуда: Оттуда

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

Сообщение bondyara »

Как в макросах сравнивать регистры?

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

.MACRO TEST
.if @0 != R20
...
.ENDM

;Запуск
TEST R16
Дает ошибку: Found no label/variable/constant named R16
Понятно, что регистры не объявлены как константы, в этом проблема.

Макрос выполняет: MOV R20,@0.
При совпадении получится MOV R20,R20.
Мало того, что бесполезная команда, она еще и искажает значение регистра
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Абсурд применения прибамбаса с гордым названием "макрос" :)

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

CP R16,R20
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

akl писал(а):CP R16,R20
Да нет, уважаемый akl, сдается мне что bondyara имел ввиду другое. А вот насчет абсурда соглашусь, то люди в одних магических цифрах пишут, чуть не в маш. коде, то пытаются из макросов новый язык программирования создать.
bondyara писал(а):При совпадении получится MOV R20,R20.
Мало того, что бесполезная команда, она еще и искажает значение регистра
Поясните мысль искажения регистра.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
bondyara
Встал на лапы
Сообщения: 139
Зарегистрирован: Сб май 07, 2011 17:00:42
Откуда: Оттуда

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

Сообщение bondyara »

Z_h_e писал(а):Поясните мысль искажения регистра.
По крайней мере, в Протеусе операция MOV Rn, Rn портит значение.
А смысл действительно не в сравнении значений регистров, а в проверке передаваемого регистра.
Пишу макрос, работающий с физическими портами ВВ и виртуальными. Виртуальный порт использует свой регистр, например при объявлении порта:
.def VP0_REG = R25
Далее, делаю разные модули (7-сегментные инд., LCD и т. д.) универсальными. При конфигурации можно указать как физический порт, так и виртуальный. В итоге, один и тот же код работает с любым портом (физ. или вирт.)
Чтобы вывести даныне в порт, используется макрос
OUTR PORT, R16
Макрос определяет тип порта, если виртаульный, пихает значение в VP0_REG
MOV VP0_REG, @0
и вызывает функцию записи в порт

Так вот, если регистр совпадет с VP0_REG, будет беда. Можно, конечно, отказаться от использования регистров, занятых вирт. портами. Это будет лучшим решением.
dimmer
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Сб сен 17, 2016 18:56:30

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

Сообщение dimmer »

Когда же вы закопаете Протеус? Макетка рулит.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

А не секрет зачем нужен вывод на виртуальный LCD? Может проще макросами указать порты, к которым подключен реальный или написать слой абстракции?
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

bondyara писал(а):... в Протеусе операция MOV Rn, Rn портит значение.
Афффигеть. :shock:
MOV_AVR.png
(21.54 КБ) 359 скачиваний
http://www.atmel.com/Images/Atmel-0856- ... Manual.pdf
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Кстати из глюков протеуса на avr заметил пока два. Не срабатывало прерывание сравнения , когда таймер в нормальном режиме. Неправильно устанавливаются флаги источника сброса, при записи 1 флаг устанавливается, при записи 0 сбрасывается. Что интересно, второй глюк присутствует и в атмел студио.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Ответить

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