Ассемблер (ASM) для AVR в вопросах и ответах
Что есть "matrix"?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Реклама
- Сообщения: 29
- Зарегистрирован: Сб ноя 13, 2010 16:16:45
Находится сегмента cseg, что и является концом кода
Код: Выделить всё
matrix:
; 76543210 76543210
; gfedcba gfedcba
.db 0b00111111,0b00000110 ;0,1
.db 0b01011011,0b01001111 ;2,3
.db 0b01100110,0b01101101 ;4,5
.db 0b01111101,0b00000111 ;6,7
.db 0b01111111,0b01101111 ;8,9
С чего вы взяли, что в конце кода?stima писал(а):Находится сегмента cseg, что и является концом кода
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Сообщения: 29
- Зарегистрирован: Сб ноя 13, 2010 16:16:45
Дириктива вообщето стояла. .org 81, но походу, а может быть я и не прав, я просто перебал эти 81 строк и поэтому была такая бяка. И еще пару вопросов. Как правильно реализуется частота переключения индикаторов (те преславутые 25+Гц). Я понимаю, что по прирыванию таймера, но именно по какому? И второй вопрос как правильно реализовать 1 секунду (делаю секундомер) от внешнего генератора если там прескалинг максимум на таймер 1024, через сравнение с числом (по типу прерывания по компаратору?).
Странное число 81 для cseg, ну да ладно... Если директива стояла, а код программы не налез на адрес 81 то все было бы нормально, иначе компилятор бы ругнулся. Кстати что значит "для разных компьютеров"? В чем отличие?stima писал(а):Дириктива вообщето стояла. .org 81, но походу, а может быть я и не прав, я просто перебал эти 81 строк и поэтому была такая бяка.
Какой захотите, по такому и будет.stima писал(а):Как правильно реализуется частота переключения индикаторов (те преславутые 25+Гц). Я понимаю, что по прирыванию таймера, но именно по какому?
Да, подбираете (рассчитываете) число тактов с учетом прескалера и с ним сравниваете.stima писал(а):И второй вопрос как правильно реализовать 1 секунду (делаю секундомер) от внешнего генератора если там прескалинг максимум на таймер 1024, через сравнение с числом (по типу прерывания по компаратору?).
- Реклама
- Сообщения: 138
- Зарегистрирован: Вс май 16, 2010 01:13:39
Вот такой код (ниже) дает компилятор. Можно ли его уменьшить?
Inputpin Alias Pind.4
...
While Inputpin = 0 : Wend
----
LDI R26,$30
LDI R27,$00
LD R16,X
BST R16,4
BRTC $0204
RJMP $+0004
RJMP $-000C
Inputpin Alias Pind.4
...
While Inputpin = 0 : Wend
----
LDI R26,$30
LDI R27,$00
LD R16,X
BST R16,4
BRTC $0204
RJMP $+0004
RJMP $-000C
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
Если речь об экономии места, то 2 байта можно превратить в один заменив команду
LDI R27? $00
на
CLR R27.
Больше на ум пока ничего неприходит
LDI R27? $00
на
CLR R27.
Больше на ум пока ничего неприходит
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Ой, а что это за компилятор такой код даёт???Civil писал(а):LDI R26,$30
LDI R27,$00
LD R16,X
BST R16,4
BRTC $0204
RJMP $+0004
RJMP $-000C
И адрес $0204 - от какой команды?
Если я правильно понимаю, это эквивалентно С-шномуCivil писал(а):Inputpin Alias Pind.4
...
While Inputpin = 0 : Wend
Код: Выделить всё
while( (PIND & (1<<4)) == 0 ) ;
Код: Выделить всё
.L2:
sbis 48-32,4
rjmp .L2
Код: Выделить всё
SBIS $10, 4
RJMP $-0002
Последний раз редактировалось avreal Пн янв 03, 2011 23:18:51, всего редактировалось 1 раз.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
CLR R27 - это псевдоинструкция (встроенный макрос, если хотите), компилирующаяся в EOR R27, R27 и занимает те же два байта, что и LDI R27, 0, только ещё и флаги задевающая.Meteor писал(а):LDI R27? $00
на
CLR R27.
Однобайтовых команд у AVR нет вообще. Все по два или по четрыре.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
Верно. Я вот тоже когда-то предполагал, что clr займёт меньше места, пока однажды сам всё не проверил. 
I am DX168B and this is my favourite forum on internet!
- Сообщения: 4435
- Зарегистрирован: Сб мар 07, 2009 20:44:36
ну, правильно, как заметил avreal, при выполнении команды clr Rd, компилятор выполняет ее как команду Испключающее или регистра Rd с самим собой.
Не умеешь - не берись, но не взявшись не научишься...
- Сообщения: 138
- Зарегистрирован: Вс май 16, 2010 01:13:39
avreal, спасибо за помощь.
Это код от Bascom AVR.
Адрес $0204 RJMP $-000C
Я попробовал Ваш код, но компилятор его как-то странно преобразовал:

Это значит надо выяснять особенности синтаксиса данного компилятора?
Это код от Bascom AVR.
Адрес $0204 RJMP $-000C
Я попробовал Ваш код, но компилятор его как-то странно преобразовал:

Это значит надо выяснять особенности синтаксиса данного компилятора?
- Сообщения: 3961
- Зарегистрирован: Пн июл 13, 2009 14:37:39
- Откуда: Московская область, наукоград.....
Признаю, стар стал - забываю уже... 
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
- Сообщения: 8
- Зарегистрирован: Ср янв 05, 2011 12:59:13
мне нужен пример на ассемблере для микроконтроллера MEGA128 ну и желательно лист данных на русском.
А что именно надо? Мигалка, пищалка, бзделка или другое?
I am DX168B and this is my favourite forum on internet!
- Сообщения: 4435
- Зарегистрирован: Сб мар 07, 2009 20:44:36
ага, а больше ничего???Vovan91 писал(а):мне нужен пример на ассемблере для микроконтроллера MEGA128 ну и желательно лист данных на русском.
Не умеешь - не берись, но не взявшись не научишься...
ДаCivil писал(а):Это значит надо выяснять особенности синтаксиса данного компилятора?
Кстати, глядя на это место в его коде, которое даже без SBIC/SBIS можно сократить с
Код: Выделить всё
LDI R26,$30
LDI R27,$00
LD R16,X
BST R16,4
BRTC $0204
RJMP $+0004
RJMP $-000CКод: Выделить всё
LDI R26,$30
LDI R27,$00
label:
LD R16,X
BST R16,4
BRTC labelИли это оптимизация начисто выключена?
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.
- Сообщения: 8
- Зарегистрирован: Ср янв 05, 2011 12:59:13
мне всё равно какой пример, хотел просто более подробно посмотреть команды имено для этого микроконтроллера. Собираюсь сделать диодную матрицу скажем 16Х16. Меня больше всего волнует часть настройки прерываний имено для MEGA 128. DataSheet сам нашёл на русском, а вот пример найти пока не получилось
Команды на АСМе общие для всех АВРов. Они приведены в конце даташита. Подробнее - в книге Евстифеева.Vovan91 писал(а):мне всё равно какой пример, хотел просто более подробно посмотреть команды имено для этого микроконтроллера.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Более того, это можно ещё сократить до:avreal писал(а):...даже без SBIC/SBIS можно сократить сдоКод: Выделить всё
LDI R26,$30 LDI R27,$00 LD R16,X BST R16,4 BRTC $0204 RJMP $+0004 RJMP $-000CМожет пора сказать "ну его" и перейти на С ?Код: Выделить всё
LDI R26,$30 LDI R27,$00 label: LD R16,X BST R16,4 BRTC label
Или это оптимизация начисто выключена?
Код: Выделить всё
label:
LDS R16,$0030
BST R16,4
BRTC label


