Ассемблер (ASM) для AVR в вопросах и ответах
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Спс. Опробирую. P. s. опробовал пока на дебагинге = работает. Нечто близкое к гениальному! 
- Реклама
- Vicont
- Прорезались зубы
- Сообщения: 201
- Зарегистрирован: Пт июл 25, 2008 14:09:04
- Откуда: Зауралье
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Мяу, товарищи!
Только что читал книгу Юрия Ревича "'Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера" о локальных и глобальных переменных:

Программный код, приведенный в листинге 6.15, вызвал у мя некоторое недоумение.
Согласно логике автора, сначала значения 2-х переменных сохраняются в стеке, потом вызывается подпрограмма, и сразу после этого, сохраненные ранее значения вынимаются из стека, и присваиваются двум соответствующим локальным переменным.
НО! Насколько я понимаю, при вызове подпрограммы, в стеке должно еще сохраниться значение адреса следующей команды за "вызывалкой". Таким образом, переменной var_loc2 вместо значения var_2 должен присвоиться адрес строки "pop var_2", а переменной var_loc1 вместо значения var_1 должен присвоиться var_2, и далее путаница продолжится...
Так вот, товарищи, подскажите, пожалуйста, это я чего-то недопонимаю, или автор столь умной книжки ошибся ???
Только что читал книгу Юрия Ревича "'Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера" о локальных и глобальных переменных:
Программный код, приведенный в листинге 6.15, вызвал у мя некоторое недоумение.
Согласно логике автора, сначала значения 2-х переменных сохраняются в стеке, потом вызывается подпрограмма, и сразу после этого, сохраненные ранее значения вынимаются из стека, и присваиваются двум соответствующим локальным переменным.
НО! Насколько я понимаю, при вызове подпрограммы, в стеке должно еще сохраниться значение адреса следующей команды за "вызывалкой". Таким образом, переменной var_loc2 вместо значения var_2 должен присвоиться адрес строки "pop var_2", а переменной var_loc1 вместо значения var_1 должен присвоиться var_2, и далее путаница продолжится...
Так вот, товарищи, подскажите, пожалуйста, это я чего-то недопонимаю, или автор столь умной книжки ошибся ???
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
вы не ошиблись. выбросьте эту книжку! если в не есть такие ошибки - мало ли что там еще будет "рекомендовано"?!Vicont писал(а):Так вот, товарищи, подскажите, пожалуйста, это я чего-то недопонимаю, или автор столь умной книжки ошибся ???
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Да, код - бред сивой кобылы. Хотя это не значит, что через стек нельзя принимать/передавать параметры. Но это делается не таким тупым способом, как в примере, а с определенными плясками. Наверно, овчинка не стоит... Лучше договориться самому с собой о порядке использования для этих целей группы регистров.
В языках высокого уровня на РС так действительно делается, но там совсем другая архитектура.
В языках высокого уровня на РС так действительно делается, но там совсем другая архитектура.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Листал книжку Цифровая схемотехника и архитектура компьютера /Дэвид М. Харрис и Сара Л. Харрис/ (распространяется в сети бесплатно), понравилось как организованы регистры в описываемой архитектуре MIPS. Их также более 30 шт, но они имеют более осмысленные названия, говорящие об их использовании.Jack_A писал(а):Лучше договориться самому с собой о порядке использования для этих целей группы регистров.![]()
Код: Выделить всё
Название Номер Назначение
$0 0 Константный нуль
$at 1 Временный регистр для нужд ассемблера
$v0–$v1 2–3 Возвращаемые функциями значения
$a0–$a3 4–7 Аргументы функций
$t0–$t7 8–15 Временные переменные
$s0–$s7 16–23 Сохраняемые переменные
$t8–$t9 24–25 Временные переменные
$k0–$k1 26–27 Временные переменные операционной системы (ОС)
$gp 28 Глобальный указатель (англ.: global pointer)
$sp 29 Указатель стека (англ.: stack pointer)
$fp 30 Указатель кадра стека (англ.: frame pointer)
$ra 31 Регистр адреса возврата из функции
- Реклама
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Так обычно и делается.
Однако...
Обычно в программе несколько различных модулей. Хорошо, если их можно "раскидать" по уже имеющимся регистрам с однозначной привязкой.
А вот в случае, когда прийдется одному регистру в разных подпрограммах разные задачи (и соответственно имена) давать последуют некоторые сложности (зависит от компилятора).
Если у ячейки ОЗУ в принципе может быть несколько символических имен, то у регистра в регистровом файле только одно (или undet потребуется для АВР).
Так что модель разметки - это весьма творческое дело и зависит как от личных предпочтений, так и от конкретной архитектуры МК и потребных в конструкции ресурсов. Плюс особенности применяемого компилятора учитывать надо.
Я как-то попытался попробовать эту тему поглубже копнуть (в своем "монологе") предложил на обсуждение вот такой набросок http://radiokot.ru/forum/download/file.php?id=204531... но ответов не обнаружилось пока.

Однако...
Обычно в программе несколько различных модулей. Хорошо, если их можно "раскидать" по уже имеющимся регистрам с однозначной привязкой.
А вот в случае, когда прийдется одному регистру в разных подпрограммах разные задачи (и соответственно имена) давать последуют некоторые сложности (зависит от компилятора).
Если у ячейки ОЗУ в принципе может быть несколько символических имен, то у регистра в регистровом файле только одно (или undet потребуется для АВР).
Так что модель разметки - это весьма творческое дело и зависит как от личных предпочтений, так и от конкретной архитектуры МК и потребных в конструкции ресурсов. Плюс особенности применяемого компилятора учитывать надо.
Я как-то попытался попробовать эту тему поглубже копнуть (в своем "монологе") предложил на обсуждение вот такой набросок http://radiokot.ru/forum/download/file.php?id=204531... но ответов не обнаружилось пока.
- Vicont
- Прорезались зубы
- Сообщения: 201
- Зарегистрирован: Пт июл 25, 2008 14:09:04
- Откуда: Зауралье
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Товарищи, всем спасибо за советы!
Приятно сознавать, что мя правильно понимаю некоторые из особенностей работы AVR - это вдохновляет на новые свершения.
Подобные книжки буду читать с осторожностью, ведь альтернатив на русском языке об ассемблере для AVR довольно мало.
Конечно, у архитектуры MIPS в этом плане больше возможностей, ведь ее разрядность может быть от 32-х до 64-х бит. На АВР если функция простая, чтобы задать исходные значения, может хватить 2-х регистров, а если функция сложная, то от 3 до 6. В MIPS для тех же самых целей может хватить 1 - 2 регистра.
Jack_A, Вы правы, тут сложнее всего самому с собой договориться...
Приятно сознавать, что мя правильно понимаю некоторые из особенностей работы AVR - это вдохновляет на новые свершения.
Подобные книжки буду читать с осторожностью, ведь альтернатив на русском языке об ассемблере для AVR довольно мало.
Интересный прием. Ко мне порой тоже приходили подобные мысли, чтобы в одних регистрах хранились аргументы для функций, в других временные значения, а в третьих - результаты. НО! Если вовремя выполнения какой-нибудь функции случайным образом сработает какое-нибудь прерывание, которое будет работать с теми же регистрами, то произойдет сбой программы. Конечно, во время выполнения такой функции все прерывания можно запретить, но если функция громоздкая, то прерывание можно просто проморгать.ks0 писал(а):понравилось как организованы регистры в описываемой архитектуре MIPS. Их также более 30 шт, но они имеют более осмысленные названия, говорящие об их использовании.
Конечно, у архитектуры MIPS в этом плане больше возможностей, ведь ее разрядность может быть от 32-х до 64-х бит. На АВР если функция простая, чтобы задать исходные значения, может хватить 2-х регистров, а если функция сложная, то от 3 до 6. В MIPS для тех же самых целей может хватить 1 - 2 регистра.
Jack_A, Вы правы, тут сложнее всего самому с собой договориться...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Я выделил себе группу регистров, которые использовал для передачи параметров и в подпрограммах их не использовал . При крайней необходимости в подпрограмме сохранял их в стеке. А в главной программе можно с ними делать что угодно, только к моменту вызова п/п оттуда все забрать. Остается проблема вложенных п/п . Но тут стек нам в помощь.
Еще неплохой, я считаю, метод - передавать в п/п указатель на область ОЗУ, где лежат входные параметры и куда складывать выходные.
Насчет прерываний. Правила хорошего программирования рекомендуют сохранять в стеке все используемые в обработчике регистры, тогда прерывание никаких бед не натворит. А запрещать его - в крайних, критически важных по времени случаях, например - запись в EEPROM.
Еще неплохой, я считаю, метод - передавать в п/п указатель на область ОЗУ, где лежат входные параметры и куда складывать выходные.
Насчет прерываний. Правила хорошего программирования рекомендуют сохранять в стеке все используемые в обработчике регистры, тогда прерывание никаких бед не натворит. А запрещать его - в крайних, критически важных по времени случаях, например - запись в EEPROM.
- Vicont
- Прорезались зубы
- Сообщения: 201
- Зарегистрирован: Пт июл 25, 2008 14:09:04
- Откуда: Зауралье
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Что Вы под этим подразумеваете?Jack_A писал(а): использовал для передачи параметров...
Семен Семеныч!Jack_A писал(а):Правила хорошего программирования рекомендуют сохранять в стеке все используемые в обработчике регистры, тогда прерывание никаких бед не натворит.
А ведь и правда, оказывается, всё гениальное - просто!
Спасибо. Обязательно учту в будущем этот прием.
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вот, кто бы что не говорил, а у Ревича, даже с его косяками, это есть и написано. )))) Просто, действительно, надо читать вдумчиво и все проверять.Jack_A писал(а):рекомендуют сохранять в стеке все используемые в обработчике регистры, тогда прерывание никаких бед не натворит.
Станислав
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Очепятки в разумных пределах у всех возможны.
Насчет стека...
У ПИКова семейства есть его подвид - так называемый быстрый(теневой) стек.
В АВРке также подобный прием возможен - переброс пары регистров (нескольких пар) из полнофункциональной части в младший блок регистрового файла - все равно там с непосредственными данными работать неудобно, а как хранилище -весьма подходяще.

Насчет стека...
У ПИКова семейства есть его подвид - так называемый быстрый(теневой) стек.
В АВРке также подобный прием возможен - переброс пары регистров (нескольких пар) из полнофункциональной части в младший блок регистрового файла - все равно там с непосредственными данными работать неудобно, а как хранилище -весьма подходяще.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Vicont писал(а):на русском языке об ассемблере для AVR довольно мало.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Я ничего не подразумеваю - это общепринятые понятия в программировании. В подпрограмму(функцию) передаются аргументы - параметры, которые нужно обработать ( по значению или по ссылке - это не принципиально ). Заканчивая работу, функция в определенное место возвращает вычисленное значение, подпрограмма - одно или несколько значений. В общем случае она может изменять только значение глобальных переменных, в этом случае выходных параметров может и не быть.Vicont писал(а):Что Вы под этим подразумеваете?Jack_A писал(а): использовал для передачи параметров...![]()
- СКАЗОЧНИК
- Идёт направо - песнь заводит, Налево - сказку говорит.
- Сообщения: 5000
- Зарегистрирован: Чт апр 21, 2011 17:55:50
- Откуда: Иркутск
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Елки, прочитал уже 60 страниц книги Белова (см. выше), очень нравится. Не сильно подробно, но вполне доступно, логично и последовательно подается информация.
Спасибо, что рекомендовали.
Купил бы в бумажном варианте, но в местном ПродалитЪе нету, а заказывать мне лень...
Спасибо, что рекомендовали.
Купил бы в бумажном варианте, но в местном ПродалитЪе нету, а заказывать мне лень...
Станислав
- alex38779
- Потрогал лапой паяльник
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ни как не могу улететь в прерывание. мяу
мега8, аврстудия, прерывание от таймера Т0
флаг I стоит, TOIE0 тоже.
вот вектор и обработчик прерывания
настройка таймера:
и перед главным циклом программы:
шо может быть не так?
мега8, аврстудия, прерывание от таймера Т0
флаг I стоит, TOIE0 тоже.
вот вектор и обработчик прерывания
Код: Выделить всё
; птчк взлитай------------------------------
.org $00
; старт основной программы------------------
rjmp Start
; вектора прерываний------------------------
.org $01 ; External Interrupt Request 0
reti
.org $02 ; External Interrupt Request 1
reti
.org $03 ; Timer/Counter2 Compare Match
reti
.org $04 ; Timer/Counter2 Overflow
reti
.org $05 ; Timer/Counter1 Capture Event
reti
.org $06 ; Timer/Counter1 Compare Match A
reti
.org $07 ; Timer/Counter1 Compare Match B
reti
.org $08 ; Timer/Counter1 Overflow
reti
.org $09 ; Timer/Counter0 Overflow
rjmp ovf_tim0
.org $0a ; Serial Transfer Complete
reti
.org $0b ; USART, Rx Complete
reti
.org $0c ; USART Data Register Empty
reti
.org $0d ; USART, Tx Complete
reti
.org $0e ; ADC Conversion Complete
reti
.org $0f ; EEPROM Ready
reti
.org $10 ; Analog Comparator
reti
.org $11 ; 2-wire Serial Interface
reti
.org $12 ; Store Program Memory Ready
reti
.org INT_VECTORS_SIZE ; конец таблицы прерываний
;обработка прерываний------------------------------
ovf_tim0:
ldi r17, $ff
retiКод: Выделить всё
.equ tim0_tccr0 = (1<<CS01)
.equ tim0_tcnt = $60
.equ tim0_timsk = (1<<TOIE0) ;
Код: Выделить всё
ldi r16, tim0_tccr0
out TCCR0, r16
ldi r16, tim0_tcnt
out TCNT0, r16
ldi r16, tim0_timsk
out TIMSK, r16
sei Re: Ассемблер (ASM) для AVR в вопросах и ответах
Да, вроде, всё так. Ниже показывается, что каждые 1281/1287 тактов идёт изменение выводов порта B
Спойлер
Код: Выделить всё
.INCLUDE "m8def.inc"
.equ tim0_tccr0 = (1<<CS01)
.equ tim0_tcnt = $60
.equ tim0_timsk = (1<<TOIE0) ; ; птчк взлитай------------------------------
.org $00
; старт основной программы------------------
rjmp Start
; вектора прерываний------------------------
.org $01 ; External Interrupt Request 0
reti
.org $02 ; External Interrupt Request 1
reti
.org $03 ; Timer/Counter2 Compare Match
reti
.org $04 ; Timer/Counter2 Overflow
reti
.org $05 ; Timer/Counter1 Capture Event
reti
.org $06 ; Timer/Counter1 Compare Match A
reti
.org $07 ; Timer/Counter1 Compare Match B
reti
.org $08 ; Timer/Counter1 Overflow
reti
.org $09 ; Timer/Counter0 Overflow
rjmp ovf_tim0
.org $0a ; Serial Transfer Complete
reti
.org $0b ; USART, Rx Complete
reti
.org $0c ; USART Data Register Empty
reti
.org $0d ; USART, Tx Complete
reti
.org $0e ; ADC Conversion Complete
reti
.org $0f ; EEPROM Ready
reti
.org $10 ; Analog Comparator
reti
.org $11 ; 2-wire Serial Interface
reti
.org $12 ; Store Program Memory Ready
reti
.org INT_VECTORS_SIZE ; конец таблицы прерываний
;обработка прерываний------------------------------
ovf_tim0:
OUT TCNT0,R18
; ldi r17, $ff
IN R16,PORTB
EOR R16,R17
OUT PORTB,R16
reti
START:
LDI XH,HIGH(RAMEND)
OUT SPH,XH
LDI XL,LOW(RAMEND)
OUT SPL,XL
LDI R17,$FF
OUT DDRB,R17
ldi r16, tim0_tccr0
out TCCR0, r16
ldi r18, tim0_tcnt
out TCNT0, r18
; ldi r16, tim0_tcnt
; out TCNT0, r16
ldi r16, tim0_timsk
out TIMSK, r16
sei
RJMP PC
.EXIT- alex38779
- Потрогал лапой паяльник
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Может авр студия погнала? У меня 6 версии, попробую 5 скачать и проверить.
Так и было, в 5 версии все заработало..
Так и было, в 5 версии все заработало..
- alex38779
- Потрогал лапой паяльник
- Сообщения: 386
- Зарегистрирован: Чт окт 31, 2013 10:54:32
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Помогите с алгоритмом, на си было два цикла, была переменная bool и вокруг нее плясали циклы. true - первый цикл, false - второй. кнопка рулила этой переменной, переключая циклы.
как на асме сделать подобное?
Вот нагородил что то, но думаю не правильно все таки сделал. Может как то использовать регистр, либо флаг T например. Как вообще можно заменить булевый тип в асме?
как на асме сделать подобное?
Вот нагородил что то, но думаю не правильно все таки сделал. Может как то использовать регистр, либо флаг T например. Как вообще можно заменить булевый тип в асме?
Код: Выделить всё
MainLoop:
; вызываем программы
menu:
in temp, PIND
sbrc temp, 0
rjmp start_auto
nop
nop
nop
rjmp menu
start_auto:
in temp, PIND
sbrc temp, 0
rjmp menu
nop
nop
nop
nop
rjmp start_auto
rjmp MainLoop- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Можно использовать 1 командуalex38779 писал(а): in temp, PIND
sbrc temp, 0
Код: Выделить всё
sbic PIND, 0[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Может так?
Код: Выделить всё
MainLoop:
; вызываем программы
menu:
SBIS PIND,0
rjmp start_auto
adiw r24, $a ;эта команда работает с регистровыми парами R25:R24, X, Y, Z
; adiw r16, $a
nop
nop
nop
rjmp menu
start_auto:
SBIC PIND,0
rjmp menu
nop
nop
nop
nop
rjmp start_auto
; rjmp MainLoop
.EXIT

