Ассемблер (ASM) для AVR в вопросах и ответах
Re: Ассемблер (ASM) для AVR в вопросах и ответах
"В ранних версиях применялся микроконтроллер ATmega168 с меньшими объемами памяти: память программ - 16 К (2 К заняты загрузчиком), ОЗУ - 1 Кбайт, EEPROM - 512 байт."
http://freeduino.ru/arduino/spec.html
У меня как раз 168PA. Как бы проверить, сколько на самом деле?
http://freeduino.ru/arduino/spec.html
У меня как раз 168PA. Как бы проверить, сколько на самом деле?
- Реклама
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Так и осталось.barok22 писал(а):память программ - 16 К (2 К заняты загрузчиком), ОЗУ - 1 Кбайт, EEPROM - 512 байт.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Я не понимаю: если у нас стек в конце памяти, то он должен начинаться в конце 16k памяти? т.е. с адреса 3FFF . почему ему назначили 4FF ? т.е. гораздо ближе?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Стек, как правило, устанавливается в конец оперативной памяти (RAM), т.е. 0x4FF.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вы окончательно запутались в мягком и тёплом: у МК 3 (ТРИ!!!) вида памяти:
— память программ (флэш) 16 к
— память данных (РОН, РОВ и SRAM (в которой стек)) — 1280 байт
— ЭСППЗУ — 1 килобайт.
— память программ (флэш) 16 к
— память данных (РОН, РОВ и SRAM (в которой стек)) — 1280 байт
— ЭСППЗУ — 1 килобайт.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Реклама
Re: Ассемблер (ASM) для AVR в вопросах и ответах
а 16к памяти это память с медленным доступом? почему не туда засунуть стек?
В книжках пишут, что стек может затереть программы, поэтому мне и кажется, что стек в старших адресах, заполняясь достигает младших адресов, и может затереть программу. если же он в младших адресах, то программу он не затрет никак.
В книжках пишут, что стек может затереть программы, поэтому мне и кажется, что стек в старших адресах, заполняясь достигает младших адресов, и может затереть программу. если же он в младших адресах, то программу он не затрет никак.
Последний раз редактировалось barok22 Пт фев 28, 2014 13:12:33, всего редактировалось 1 раз.
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Это флэш память, она стирается постранично и у неё ресурс ограничен на уровне 10000 записей, у EEPROM побольше — 100000 стираний. А ОЗУ вообще можно перезаписывать побайтно бесконечно. Учите матчасть, как грится.barok22 писал(а):а 16к памяти это память с медленным доступом?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
barok22, ещё раз прочитайте, что написал Gudd-Head.
Т.е. если вы адресуете FLASH, то вы никак там в RAM или EEPROM не попадёте.
Это три разных вида памяти каждая в своём адресном пространстве.
У AVR-ок она раздельная (тынц).
И добавьте к этому тот факт, что эти "памяти" находятся отдельно друг от друга, на разных шинах адреса.Gudd-Head писал(а):у МК 3 (ТРИ!!!) вида памяти:
— память программ (флэш) 16 к
— память данных (РОН, РОВ и SRAM (в которой стек)) — 1280 байт
— ЭСППЗУ — 1 килобайт.
Т.е. если вы адресуете FLASH, то вы никак там в RAM или EEPROM не попадёте.
Это три разных вида памяти каждая в своём адресном пространстве.
Это возможно в архитектурах, где память программ и данных общая (тынц).barok22 писал(а):В книжках пишут, что стек может затереть программы
У AVR-ок она раздельная (тынц).
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
- Engineer_Keen
- Друг Кота
- Сообщения: 3870
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А вот попортить значение переменной стек может (и наоборот). Если граница стека пересечет границу, где располагаются переменные и массивы, то возможно 2 варианта:Kavka писал(а):Это возможно в архитектурах, где память программ и данных общая (тынц).
1) Стек запишет что-то в переменную, тогда при чтении этого адреса вместо переменной просто получите хрень (например кусок адреса возврата).
2) Программа запишет что-то в переменную, тогда при чтении этого адреса стек получит вместо адреса возврата значение переменной и программа перескочит по произвольному адресу (что скорее всего повлечет за собой сброс).
Так что учтите, что ваш килобайт на самом деле не килобайт, а немного меньше!
Неправильно собранная из неисправных деталей схема нуждается в отладке и сразу не работает... (С)
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Значит не может случиться так, что программа сама изменяет данные во флеш памяти(та что большая, 16к), и может превысить лимит на перезапись в 10 000раз? Например:
.CSEG
const: .DW 2
Перезаписал значение 10 000раз, (за 1 сек к примеру) и микросхема накрылась?
.CSEG
const: .DW 2
Перезаписал значение 10 000раз, (за 1 сек к примеру) и микросхема накрылась?
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Для изменения памяти программ в цикле программы нужна специальная команда SPM.
Если в коде она не будет её трогать, то память будет в порядке.
Если в коде она не будет её трогать, то память будет в порядке.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Andrew Martin
- Вымогатель припоя
- Сообщения: 606
- Зарегистрирован: Вт июн 25, 2013 18:45:07
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Это не пример. Запись в память программ может делать либо программатор при прошивке, либо сама программа (инструкцией SPM, как это делает например бутлодырь), но это сложная процедура с массой ограничений.barok22 писал(а):Значит не может случиться так, что программа сама изменяет данные во флеш памяти(та что большая, 16к), и может превысить лимит на перезапись в 10 000раз? Например:
.CSEG
const: .DW 2
Перезаписал значение 10 000раз, (за 1 сек к примеру) и микросхема накрылась?
Ещё раз - учите матчасть и читайте даташиты. Самопрограммирование МК - это не такая простая процедура, как кажется, и "случайно" записать что-либо в память программ (FLASH) у вас никак не получится.
- xkp
- Опытный кот
- Сообщения: 781
- Зарегистрирован: Ср ноя 18, 2009 12:50:31
- Откуда: ковров
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ребят, подскажите, я правильно делаю?
На МК atmega8 при тактировании от внутреннего RC на 8мГц, необходимо сделать вншнее прерывание (Т2) от кварца 32768, оставив сам МК тактироваться от внутреннего RC. кварц подключен к выводам XTAL1 XTAL2 (PB6 PB7). Прерывание Т2 должно приходить раз в секунду. кусок инициализации1. Какое при этом должно срабатывать прерывание? TIM2_COMP или TIM2_OVF ?
2. Правильно ли я все написал в программе?
На МК 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
2. Правильно ли я все написал в программе?
R5VCH
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Внимательно прочитай ерраты в даташите!

- xkp
- Опытный кот
- Сообщения: 781
- Зарегистрирован: Ср ноя 18, 2009 12:50:31
- Откуда: ковров
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
дело в том что с английским дружу по стольку по скольку... вот и прошу помощи у вас.
R5VCH
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
- xkp
- Опытный кот
- Сообщения: 781
- Зарегистрирован: Ср ноя 18, 2009 12:50:31
- Откуда: ковров
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
разобрался!
Код: Выделить всё
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
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
- xkp
- Опытный кот
- Сообщения: 781
- Зарегистрирован: Ср ноя 18, 2009 12:50:31
- Откуда: ковров
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Мяу вам.
помогите разобраться с необходимостью плавности индикации значения ацп. То есть надо что бы при значительном изменении уровня ацп число на индикаторе не скакало, а как бы нарастало или убывало постепенно.
примерно подсчет следующий:
((старое значение АЦП) * 9 + (новое значение АЦП)) / 10
но тут остается остаток, который дает погрешность в 9 единиц при нарастании сигнала АЦП. то есть ели значение АЦП прыгнуло со 100 до 150, то на индикаторе оно меняется до 141. А если наоборот значение АЦП упало со 150 до 100, то на индикаторе все правильно отображается. Вот и вопрос: Что делать с остатком после деления?
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 ;сохраняем значение
помогите разобраться с необходимостью плавности индикации значения ацп. То есть надо что бы при значительном изменении уровня ацп число на индикаторе не скакало, а как бы нарастало или убывало постепенно.
примерно подсчет следующий:
((старое значение АЦП) * 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
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Это можно сделать усреднением. Считаете среднее арифметическое по большому количеству отсчётов, например по 16384 или 65536. Затем делите результат на это число (в последнем случае просто откидываете два младших байта)
Делений/умножений не надо, просто сдвиги и сложения. Быстро и эффективно.
Делений/умножений не надо, просто сдвиги и сложения. Быстро и эффективно.
- xkp
- Опытный кот
- Сообщения: 781
- Зарегистрирован: Ср ноя 18, 2009 12:50:31
- Откуда: ковров
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
то есть надо:
начало:
X = Y ;копируем X в Y
цикл:
Y - 1
считываем АЦП
(старое) + (новое) ;значения АЦП, результат в "старое"
если Y > 0 то на "цикл"
если Y = 0 то:
(значение) / X ;результат в "значение"
сохраняем значение.
где X-количество считываний
начало:
X = Y ;копируем X в Y
цикл:
Y - 1
считываем АЦП
(старое) + (новое) ;значения АЦП, результат в "старое"
если Y > 0 то на "цикл"
если Y = 0 то:
(значение) / X ;результат в "значение"
сохраняем значение.
где X-количество считываний
R5VCH
Хотелки:
не/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic
Хотелки:
Спойлер
Аналоговый осциллограф С1-112, С1-118, другиене/рабочие модули от комплекса ОДА-102
всё что касается AVR, arduino, raspberry
всё что касается КВ-УКВ-радиосвязи, mashtastic


