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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

Vaha писал(а):Вопрос: - существует ли возможность includ-ы описывать, вставлять в верху файла, а их реальное размещение происходило по метке. Например: в файле "hex2ascii.asm" вставить строчку ".org pp_hex2ascii", а гдето в теле программы в нужном месте поставить метку "pp_hex2ascii:" - типа, чтоб сюда влился код из файла "hex2ascii.asm"?
Хм... Замудрёно как-то. Но если сильно хочется, то...
Если код в инклюде просто вставляется и исполняется. Нет вызовов процедур/функций внутри инклюдника извне, то оформить всё что есть в инклюднике как макрос, подключать инклюдник в начале, а где надо вставлять вызов макроса.

Vaha писал(а):.equ portB,0 = pinRS
Обычно наоборот :) Слева то, чему присваивают, справа то чему равно.

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

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

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

Возможно задам глупый вопрос.... Но иначе, у меня такой компактный код не получается, как у дЖЕдаев на форуме и я себя чувствую крайне не комфортно.
вот оператор AND или ANDI. Мы делаем
ПЕРЕМЕННАЯ И ПЕРЕМЕННАЯ (КОНСТАНТА).
Пусть у меня:

Переменная = 0b00010000, а константа 0b10011001, тогда если сделать с ними Логическое И, установится флаг Z (Флаг нуля/ Зиро)? ПОчему?

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

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

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

Сообщение Z_h_e »

СКАЗОЧНИК писал(а):О! Все. Пока писал понял. Спасибо. Вопрос снят.
Кстати, вот один из методов проверки регистра на равенство нулю без изменения его значения. Я сейчас не про AVR, а в общем

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

or Reg,0x00
Если регистр равен 0, то флаг Z будет установлен. Не во всех процессорах были команды типа TEST.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

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

Сообщение Jetetex »

Всем доброго времени суток, помогите с компаатором на ат90с2313. Написал алгоритм с прерыванем по совпадению компаратора, а он почему-то работает по переполнению. Мож где то в коде накоячил.

Вот здесь viewtopic.php?f=57&t=2018&start=20 в последнем посте архив с исходником и проэктом.
Только отставание не 10, а 2 сек. Тоесть у мк в минуте 62сек, что совпадает с переполнением.

Заранее спасибо за помосч.
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

ат90с2313 или AT90S2313?
Аналоговый компаратор или блок сравнения таймера?
Покажите инициализацию в человеческом виде (присвоение регистрам не магических чисел, а использование сдвигов и битовых операций, наличие осмысленных комментариев).
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Z_h_e писал(а):Не во всех процессорах были команды типа TEST.

А если и были, то это всего лишь другая мнемоника все той же команды AND Rx,Rx или ANDI Rx, 0xFF, так что недостающую TEST легко прописать макросом для любого камня :)
Изображение
Вложения
TST.JPG
(16.85 КБ) 953 скачивания
Изображение
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Правую часть картинки не понял. Поясните, причем здесь команда LSL Rd(ADD Rd,Rd). Например, Rd=$80
Применительно к AVR можно сравнить с 0 регистровые пары R25:R24, XH:XL, YH:YL, ZH:ZL командами

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

 ADIW R24,0
 SBIW ZL,0

Jetetex писал(а):Всем доброго времени суток, помогите с компаатором на ат90с2313. Написал алгоритм с прерыванием по совпадению компаратора, а он почему-то работает по переполнению.
Да и не должен таймер срабатывать по переполнению. По сравнению со значением в OCR1A будет срабатывать.
Jetetex писал(а):...Только отставание не 10, а 2 сек. Тоесть у мк в минуте 62сек, что совпадает с переполнением.
Так и будет. Вы не включили режим CTC1, поэтому только первая секунда будет формироваться правильно.
Спойлер

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

   .INCLUDE "2313def.inc"
.equ   Fo=4000000

.def   temp=r16

.ORG 0
   RJMP   RESET
.ORG 4
Timer1_comp1:
   NOP
   RETI
reset:
   ldi Temp,RamEnd ;инициализация стека
   out SPL,Temp

   ldi Temp,0b11111111 ;настройка портов
   out DDRB,Temp

   ldi Temp,0b01111000
   out ddrd,Temp

   ldi Temp,HIGH(Fo/64-1) ;инициализация компаратора
   out OCR1AH,Temp
   ldi Temp,LOW(Fo/64-1)
   out OCR1AL,Temp

;   ldi Temp,0xF4 ;инициализация компаратора
;   out OCR1AH,Temp
;   ldi Temp,0x24
;   out OCR1AL,Temp

   ldi Temp,0b01000000 ;разрешить прерывание компаратора
   out TIMSK,Temp
   OUT   TIFR,Temp

   ldi Temp,0b00001011 ;тактовый сигнал = Fo/64 режим CTC
   out TCCR1B,Temp

   sei

   RJMP   PC
.exit

Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6307
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Левая часть иллюстрирует тот факт, что команда TST - не что иное, как команда AND регистра самим с собой. Правая к этому факту отношения не имеет; это пример, что и некоторые другие команды - не что иное, как другая мнемоника уже известной команды. В самом деле, сложить регистр с самим собой = сдвинуть значение на один разряд влево.
Изображение
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Jack_A писал(а): то это всего лишь другая мнемоника
А я все думал, на кой ляд в AVR куча дублирующих команд, а их оказывается нет. Проверить лень было, вернее все хотел посчитать какое реальное количество команда камня AVR, но так и не посчитал.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

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

Сообщение Jetetex »

Вопрос по компаратору снят. Пока ждал ответа - дотумкал. По недосмотру при обработке прерывания обнулял не тот регистр.

Вместо TCNT1 (значения самого таймера) обнулял OCR1A (значение компаратора). в результате после 1й секунды он считал от 0 до 65536, тоесть 1,048 сек.

Всем спасибо за помощь.

=======

COKPOWEHEU писал(а):ат90с2313 или AT90S2313?

AT90S2313

COKPOWEHEU писал(а):Аналоговый компаратор или блок сравнения таймера?

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

Timer1_comp1:
ldi Temp,0 ;обнуление таймера
out TCNT1H,Temp
out TCNT1L,Temp

COKPOWEHEU писал(а):Покажите инициализацию в человеческом виде (присвоение регистрам не магических чисел, а использование сдвигов и битовых операций, наличие осмысленных комментариев).

В архиве (см пост выше) есть исходник, там весь текст программы.

===========
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Vaha
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Пт окт 11, 2013 20:43:07
Откуда: с. Муравлёвка Измаильский р-н.

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

Сообщение Vaha »

Kavka - Спасибо за "тынц", - полезная штука (как для меня, распечатал, полистываем :) ).
И на счет директивы .EQU - сперва что присваиваем, потом кому., в моем случае:

.EQU pinRS = portB0

следует обратить внимание на "portB0" - если в программе пишем "portB,0" - через запятую указываем пин, то при присвоении - нужно писать слитно :shock: (долго мучело - мяучело, подсмотрел на просторах "сети" :idea: )
И еще раз спасибо. :beer:
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

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

Сообщение COKPOWEHEU »

Jetetex писал(а):Даже из приведенного куска кода видно, что используется компаратор первого таймера -
Поскольку нормальной ссылки на код не было и нет, в первую очередь приходится судить по описанию. А под термином "компаратор" в первую очередь понимают именно аналоговый компаратор, а вовсе не блок сравнения таймеров.
Jetetex писал(а):В архиве (см пост выше) есть исходник, там весь текст программы.
Что мешало дать нормальную ссылку на тот код, который вы пытались скомпилировать? Посыл "где-то в той теме, в последнем посте" воспринимаются как "ищите сами, если найдете ошибку - не то нашли". Если имелось в виду вот это, то там всего один файл, отдаленно похожий на код, и тот не исходник. Зачем копировать туда содержимое стандартных заголовочных файлов? Зачем там адреса и коды команд? Куда уползает форматирование? Почему ни одна настройка не сделана по-человечески (со сдвигами, логическими операциями и комментариями)?
Вот, например
Timer1_comp1:
| 000063 E040 | ldi Temp,0 ;обнуление таймера
| 000064 BD4D | out TCNT1H,Temp
| 000065 BD4C | out TCNT1L,Temp
| 000066 3050 | cpi Temp5,0b00000000
| 000067 F011 | breq point_on
| 000068 E050 | ldi Temp5,0b00000000
| 000069 C001 | rjmp Shift
| 00006A E850 | point_on: ldi Temp5,0b10000000
Зачем-то прокомментировано обнуление TCNT1, хотя эта операция и так видна из кода. Зато сравнение Temp5 с 0b00000000 оставлено без внимания. Что такое Temp5? Что такое 0b00000000, что его пришлось записывать в двоичной форме? Только имя метки относительно осмыслено (это включение десятичной точки?).
.
И на счет директивы .EQU - сперва что присваиваем, потом кому., в моем случае:
Вообще-то сначала чему присваивает, потом что, в вашем случае pinRS <- PortB0, то есть присвоить "переменной" pinRS значение PortB0, то есть 0 (не особо понимаю, чем в данном случае константы portB0, pinB0, ddrB0, PB0 и т.п. лучше простого десятичного числа 0, но, видимо, кому-то нравится).
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

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

Сообщение Jetetex »

Прошу прощения. Пересмотрел тот архив и понял что не все положил. :roll:

Проект закончен, осталось только собрать. Если кому интересно, все в архиве (исходник тоже, ПДФ файл - плата). В протеусе все работает, комментарии старался оставлять, но довести до ума никак не соберусь.

Так вот, после сборки возникла проблема - не заводится контроллер. При касании пальцем к 5-й ноге МК как бы заводится, но походу на малых частотах (индикатор моргает поочередно, нарушены знаки), убираешь рука, снова тухнет. Подскажите кто в курсе, куда копать, или где можно найти внятную информацию.
Вложения
Alarm_Clock.rar
(76.49 КБ) 126 скачиваний
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Похоже кварц не заводится. Если применен действительно 90S2313, попробуйте убрать кондесаторы рядом с кварцем, а корпус оного посадите на 10 лапу.
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

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

Сообщение Jetetex »

Попробовал, не помогло. Другой кварц поставил, результат тот-же. И вот в чем парадокс-то - на макетке все работало.

Если это поможет - вот видео.
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Посмотрел видео. Проблема, по мне, в тактировании. Кварц к контроллеру поставить поближе. Хорошо вымыть в районе 4,5 лап.
Аватара пользователя
Jetetex
Встал на лапы
Сообщения: 117
Зарегистрирован: Ср окт 15, 2014 12:45:46
Откуда: Анапа

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

Сообщение Jetetex »

Действительно, притчина в тактировании - отсутствовал контакт конденсаторов с минусом. Аж стыдно на такой мелочи завалится. :oops:

PS. Во время сборки схема чуток изменилась - аноды индикаторов (bsr10011) питаются через нпн транзисторы, и на 6-ю ногу подтяжка "-" через 10кОм, иначе минуты и часы переставяются по ветру :-)

PPS. Протупают сегменты из предидущего розряда. Как от этого избавится?
Если я чего-то не знаю, это не говорит о моем невежестве, а только о том, что раньше этот вопрос лежал вне сферы моих интересов.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Jetetex писал(а):PPS. Протупают сегменты из предидущего розряда. Как от этого избавится?
Выключить текущий разряд, включить сегменты следующего разряда, включить следующий разряд.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

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

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

Напрямую к ШИМ этот вопрос не относится, поэтому задам его здесь.

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

ldi temp, 00               ; Загрузка коэффициентов для каналов
          sts Capture1, temp

          ldi temp, 60
          sts Capture2, temp

          ldi temp, 130
          sts Capture3, temp

          ldi temp, 170
          sts Capture4, temp

         ldi temp, 210
          sts Capture5, temp

          ldi temp, 225
          sts Capture6, temp

          ldi temp, 240
          sts Capture7, temp


Вот это надо двигать в цикле по кругу... Т.е. значение Capture1 сдвинуть на место Capture2 и т.д., а последнее на место первого. Как? Понятно, что надо какой-то массив сделать, в него выгрузить, потом обратно загрузить в переменные из массива, сдвигая каждый раз адрес на один...
Не. не так. Блин, туплю. Надо кольцом зафигачить.
Станислав
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Может двигать указатель?

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

   LDI   YH,HIGH(Capture0)
   LDI   Yl,low(Capture0)
GO:
   LD   R0,Y+
   OUT   PORTB,R0
   ANDI   YL,0b00000111   ; для 8 точек
   RCALL   DELAY
   RJMP   GO

viewtopic.php?p=2671311#p2671311
Ответить

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