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

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
barok22
Родился
Сообщения: 11
Зарегистрирован: Пт фев 28, 2014 09:04:13

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

Сообщение barok22 »

"В ранних версиях применялся микроконтроллер ATmega168 с меньшими объемами памяти: память программ - 16 К (2 К заняты загрузчиком), ОЗУ - 1 Кбайт, EEPROM - 512 байт."
http://freeduino.ru/arduino/spec.html

У меня как раз 168PA. Как бы проверить, сколько на самом деле?
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

barok22 писал(а):память программ - 16 К (2 К заняты загрузчиком), ОЗУ - 1 Кбайт, EEPROM - 512 байт.
Так и осталось.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Аватара пользователя
barok22
Родился
Сообщения: 11
Зарегистрирован: Пт фев 28, 2014 09:04:13

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

Сообщение barok22 »

Я не понимаю: если у нас стек в конце памяти, то он должен начинаться в конце 16k памяти? т.е. с адреса 3FFF . почему ему назначили 4FF ? т.е. гораздо ближе?
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

Стек, как правило, устанавливается в конец оперативной памяти (RAM), т.е. 0x4FF.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Вы окончательно запутались в мягком и тёплом: у МК 3 (ТРИ!!!) вида памяти:
— память программ (флэш) 16 к
— память данных (РОН, РОВ и SRAM (в которой стек)) — 1280 байт
— ЭСППЗУ — 1 килобайт.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Аватара пользователя
barok22
Родился
Сообщения: 11
Зарегистрирован: Пт фев 28, 2014 09:04:13

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

Сообщение barok22 »

а 16к памяти это память с медленным доступом? почему не туда засунуть стек?
В книжках пишут, что стек может затереть программы, поэтому мне и кажется, что стек в старших адресах, заполняясь достигает младших адресов, и может затереть программу. если же он в младших адресах, то программу он не затрет никак.
Последний раз редактировалось barok22 Пт фев 28, 2014 13:12:33, всего редактировалось 1 раз.
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

barok22 писал(а):а 16к памяти это память с медленным доступом?
Это флэш память, она стирается постранично и у неё ресурс ограничен на уровне 10000 записей, у EEPROM побольше — 100000 стираний. А ОЗУ вообще можно перезаписывать побайтно бесконечно. Учите матчасть, как грится.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

barok22, ещё раз прочитайте, что написал Gudd-Head.
Gudd-Head писал(а):у МК 3 (ТРИ!!!) вида памяти:
— память программ (флэш) 16 к
— память данных (РОН, РОВ и SRAM (в которой стек)) — 1280 байт
— ЭСППЗУ — 1 килобайт.
И добавьте к этому тот факт, что эти "памяти" находятся отдельно друг от друга, на разных шинах адреса.
Т.е. если вы адресуете FLASH, то вы никак там в RAM или EEPROM не попадёте.
Это три разных вида памяти каждая в своём адресном пространстве.
barok22 писал(а):В книжках пишут, что стек может затереть программы
Это возможно в архитектурах, где память программ и данных общая (тынц).
У AVR-ок она раздельная (тынц).
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3871
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

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

Сообщение Engineer_Keen »

Kavka писал(а):Это возможно в архитектурах, где память программ и данных общая (тынц).
А вот попортить значение переменной стек может (и наоборот). Если граница стека пересечет границу, где располагаются переменные и массивы, то возможно 2 варианта:
1) Стек запишет что-то в переменную, тогда при чтении этого адреса вместо переменной просто получите хрень (например кусок адреса возврата).
2) Программа запишет что-то в переменную, тогда при чтении этого адреса стек получит вместо адреса возврата значение переменной и программа перескочит по произвольному адресу (что скорее всего повлечет за собой сброс).
Так что учтите, что ваш килобайт на самом деле не килобайт, а немного меньше!
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Аватара пользователя
barok22
Родился
Сообщения: 11
Зарегистрирован: Пт фев 28, 2014 09:04:13

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

Сообщение barok22 »

Значит не может случиться так, что программа сама изменяет данные во флеш памяти(та что большая, 16к), и может превысить лимит на перезапись в 10 000раз? Например:
.CSEG
const: .DW 2
Перезаписал значение 10 000раз, (за 1 сек к примеру) и микросхема накрылась?
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

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

Сообщение Gudd-Head »

Для изменения памяти программ в цикле программы нужна специальная команда SPM.
Если в коде она не будет её трогать, то память будет в порядке.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
Andrew Martin
Вымогатель припоя
Сообщения: 606
Зарегистрирован: Вт июн 25, 2013 18:45:07

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

Сообщение Andrew Martin »

barok22 писал(а):Значит не может случиться так, что программа сама изменяет данные во флеш памяти(та что большая, 16к), и может превысить лимит на перезапись в 10 000раз? Например:
.CSEG
const: .DW 2
Перезаписал значение 10 000раз, (за 1 сек к примеру) и микросхема накрылась?
Это не пример. Запись в память программ может делать либо программатор при прошивке, либо сама программа (инструкцией SPM, как это делает например бутлодырь), но это сложная процедура с массой ограничений.
Ещё раз - учите матчасть и читайте даташиты. Самопрограммирование МК - это не такая простая процедура, как кажется, и "случайно" записать что-либо в память программ (FLASH) у вас никак не получится.
Аватара пользователя
barok22
Родился
Сообщения: 11
Зарегистрирован: Пт фев 28, 2014 09:04:13

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

Сообщение barok22 »

Спасибо.
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

Ребят, подскажите, я правильно делаю?
На МК atmega8 при тактировании от внутреннего RC на 8мГц, необходимо сделать вншнее прерывание (Т2) от кварца 32768, оставив сам МК тактироваться от внутреннего RC. кварц подключен к выводам XTAL1 XTAL2 (PB6 PB7). Прерывание Т2 должно приходить раз в секунду. кусок инициализации

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

	ldi tmp,0b00000100		;0b00000100	;0.125мкс*256=32мкс
	out tccr0,tmp
	ldi tmp,(1<<toie0)|(1<<ocie2)
	out timsk,tmp		;Enable Timer/Counter0, timer2
	ldi tmp,(1<<wgm21)|(1<<CS22)|(1<<CS21)|(1<<CS20) ;/1024
	out TCCR2,tmp
	ldi tmp,32
	out ocr2,tmp
	sei
1. Какое при этом должно срабатывать прерывание? TIM2_COMP или TIM2_OVF ?
2. Правильно ли я все написал в программе?
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15556
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

Внимательно прочитай ерраты в даташите!
:beer:
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

дело в том что с английским дружу по стольку по скольку... вот и прошу помощи у вас.
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

разобрался!

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

	ldi tmp,0b00000100		;0b00000100	;0.125мкс*256=32мкс
	out tccr0,tmp

	ldi tmp,(1<<toie0)|(1<<ocie2)
	out timsk,tmp		;Enable Timer/Counter0, timer2
	ldi tmp,(1<<wgm21)|(1<<CS22)|(1<<CS21)|(0<<CS20) ;110/256
	out TCCR2,tmp
	ldi tmp,128;128*256=32768
	out ocr2,tmp
	ldi tmp,(1<<as2)
	out assr,tmp
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

Мяу вам.
помогите разобраться с необходимостью плавности индикации значения ацп. То есть надо что бы при значительном изменении уровня ацп число на индикаторе не скакало, а как бы нарастало или убывало постепенно.
примерно подсчет следующий:
((старое значение АЦП) * 9 + (новое значение АЦП)) / 10
но тут остается остаток, который дает погрешность в 9 единиц при нарастании сигнала АЦП. то есть ели значение АЦП прыгнуло со 100 до 150, то на индикаторе оно меняется до 141. А если наоборот значение АЦП упало со 150 до 100, то на индикаторе все правильно отображается. Вот и вопрос: Что делать с остатком после деления?
Спойлерlds r18,ADC1 ;берем старое значение
ldi r21,0
ldi r20,9 ;множитель 9
rcall mul_2_1 ;R18 * R21,R20 = R26,R25,R24
rcall ADC_opros ;берем новое значение в tmp
ldi tmp0,0
clc
add r24,tmp
adc r25,tmp0
ldi r20,10 ;делитель 10
rcall div_3_1 ;R26,R25,R24 / R20 = R26,R25,R24...R21-остаток
;что делать с остатком R21?
sts ADC1,r24 ;сохраняем значение
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Это можно сделать усреднением. Считаете среднее арифметическое по большому количеству отсчётов, например по 16384 или 65536. Затем делите результат на это число (в последнем случае просто откидываете два младших байта)
Делений/умножений не надо, просто сдвиги и сложения. Быстро и эффективно.
Аватара пользователя
xkp
Опытный кот
Сообщения: 781
Зарегистрирован: Ср ноя 18, 2009 12:50:31
Откуда: ковров
Контактная информация:

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

Сообщение xkp »

то есть надо:
начало:
X = Y ;копируем X в Y
цикл:
Y - 1
считываем АЦП
(старое) + (новое) ;значения АЦП, результат в "старое"
если Y > 0 то на "цикл"
если Y = 0 то:
(значение) / X ;результат в "значение"
сохраняем значение.
где X-количество считываний
R5VCH
Хотелки:
СпойлерАналоговый осциллограф С1-112, С1-118, другие
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Ответить

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