roboforum.ru

Технический форум по робототехнике.

МикроКонтроллер AVR начинающим - общие вопросы

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Re: МикроКонтроллер AVR начинающим - общие вопросы

Сообщение Radist » 30 ноя 2011, 14:33

Знать и понимать как и что работает - не круто, а просто необходимо. Поэтому я за то, чтобы начинали с асемблера. Теперь по конкретным вопросам.
1.Не как не могу понять для чего нужен стек?


Стек - это определенным образом организованная часть ОЗУ, организация по принципу (первым зашел - последним уйдешь. Представьте как народ в тупик набивается). У стека есть указатель стека - он всегда указывает на первую свободную ячейку ОЗУ. А теперь для чего он нужен. Когда выполняется код - он выполняется шаг за шагом. Когда встречается команда "вызов подпрограммы" - эта размеренность прерывается, нужно прыгнуть в эту подпрограмму. Так вот в стеке запоминается адрес возврата из подпрограммы, чтоб не забыть в какое место возвращаться. Также в стеке можно хранить содержимое регистров.

2.что за регистры xyz и вообще по ним я ничего не понял.

Это парные регистры-указатели. В них можно загрузить адрес ОЗУ и специальными командами писать данные в ОЗУ по этим адресам.

3.что это такое LDI ZL,low(M2)
LDI ZH,High(M2)


М2 - это метка, которая при компилиции станет адресом. Хай и лоу - это спецслова асемблера, которые двухбайтный адрес разбивают на два куска для записи в два однобайтных регистра.

4.Зачем вообще надо перепрыгивать с одной строчки памяти на другую,если можно просто ставить метки.


Вопрос не понял. Метки использовать можно и нужно, прыгать без меток, задавая прямо адрес - не хорошо. Такой код можно увидеть в листингах сишных программ - там меток никто ставить не будет, метки - это для людей.

5.не смог понять для чего это нужно да и что это вообще такое? http://easyelectronics.ru/img/AVR_kurs/new/ak8.gif


Эта картинка всего лишь говорит, что регистры - это всего лишь ячейки ОЗУ по определенным адресам, к которым можно обращаться по имени.

6.Для чего ставиться в некоторых местах знак $?


Этот знак - признак 16-тиричного числа. Можно заменить 0х, но это ведь два символа.

7.И вообще я не понял самой сути регистров, то есть регистры это все? я могу назначить константу регистром потом удалть и назначить регистром что-то другое? Можно ли вообще создать переменную x и присвить ей какое-то значение или слово?


Регистр - это именованная ячейка памяти, расположенная в ОЗУ по определенному адресу. В ней можно хранить байт данных, читать и писать. А что эти данные означают - решает программист.

8.почему стек записывается с конца озу, а не просто в отдельной памяти? почему ее нету?


В некоторых моделях авр нет ОЗУ вообще, а стек есть (аппаратный). Для них можно писать только на асемблере. В остальных стек не вынесен отдельно и это очень удобно: вы сами его помещаете куда хотите и сами следите за ним. В конец памяти стек помещают чтобы не заботиться о его переполнении (так он получается максимального размера).

9.не могу понять что такое прерывания, обьясните простым и доступным языком.\


Прерывания - это процесс прерывания :D выполнения основной программы для выполнения каких-либо действий, требующих немедленной реакции. Допустим у вас индикатор с динамической индикацией. Периодически надо зажигать новое знакоместо. Вообще прерывания позволяют иметь квазимультизадачность (в каждый момент времени делается только одно действие, все действия выполняются по очереди, очень быстро, поэтому кажется что одновременно).

10. к каким ножка в atmega16a-pu подключать кварц? Зачем он нужен? почему к кварца такие значения до тысячных для чего это нужно?
Пока все, дальше - больше.
Заранее спасибо.


К каким ногам подключать - смотрите в даташите, на второй странице рисунок. Кварц нужен для синхронизации работы МК, потому что в нем все должно быть синхронно: в определенные моменты времени должны выполняться определенные действия. Все кварцы имеют конкретную частоту, очень точно поддерживаемую производителем. Поэтому столько цифр после запятой.
Аватара пользователя
Radist
 
Сообщения: 2254
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: МикроКонтроллер AVR начинающим - общие вопросы

Сообщение bartik226 » 30 ноя 2011, 15:54

регистров ведь всего 32 то есть могу задать 32 переменных? можно ли написать что то типа того: x=5? а дальше оперировать с x-ом? про кварц понял но зачеем такое разнообразие этих кварцов? Про прервания так и не понял.
bartik226
 
Сообщения: 66
Зарегистрирован: 06 ноя 2011, 01:32

Re: МикроКонтроллер AVR начинающим - общие вопросы

Сообщение boez » 30 ноя 2011, 16:11

Регистры - это такие ячейки ОЗУ. Основное отличие регистров от других ячеек ОЗУ, которые составляют основное ОЗУ AVR, те самые полкилобайта или сколько там в даташите указано - регистры находятся прямо в ядре AVR. Это вообще говоря единственные ячейки памяти, с которыми возможны операции. Например, чтобы сложить 2 числа - они должны находиться в регистрах и результат будет помещен в регистр. Чтобы работать с данными из основного ОЗУ - их надо считывать в регистры и по необходимости сохранять обратно, этим занимаются соответствующие команды ld... и st... . Т.е. ты можешь иметь переменные и в регистрах (не более 32, а реально меньше), и в основном ОЗУ, но последние тебе придется вытягивать временно в какие-то регистры чтобы что-то с ними сделать.

По поводу x - ассемблер AVR позволяет давать регистрам имена и потом работать с этими именами (алиасами). Но x=5 написать нельзя, потому что в асме нету команды '=' :)

Кварцы бывают разные. потому что для разных задач нужны разные частоты. Реально для аврок вариантов немного: 8 или 16 МГц - просто для работы на максимальной скорости, 14.7456 или 7.3728 для точной скорости UART 115200 ну и еще может 12 МГц для программного USB.
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: МикроКонтроллер AVR начинающим - общие вопросы

Сообщение bartik226 » 30 ноя 2011, 16:28

вот, спасибо всем большое, раобрался)
bartik226
 
Сообщения: 66
Зарегистрирован: 06 ноя 2011, 01:32

Re: МикроКонтроллер AVR начинающим - общие вопросы

Сообщение boez » 01 дек 2011, 14:24

Это тебе только так кажется... ;)
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: МикроКонтроллер AVR начинающим - общие вопросы

Сообщение bartik226 » 02 дек 2011, 15:51

Вот опять я)
1.А можно ли обьявить переменную на си так:
char i
i = 1
2.char i
for (i=5; i<20; i+=4)
это условие зациклица же? а на сайте proavr указано что нет.
ведь каждый раз когда будет начинаться цикл i будет присваиваться значение 5.
3. И я не понял значение этих строк Операции, приведённые на одной строчке, имеют одинаковый приоритет. Операции, помеченные как R->L, исполняются справа налево
4. И еще там написано что максимальное значение i может быть 255 это так? а можно переменной i присвоить строку?
5.можно ли обьявить лобальную переменную перед функцией main?
bartik226
 
Сообщения: 66
Зарегистрирован: 06 ноя 2011, 01:32

Re: МикроКонтроллер AVR начинающим - общие вопросы

Сообщение HarryStar » 02 дек 2011, 16:11

bartik226 писал(а):Вот опять я)
1.А можно ли обьявить переменную на си так:
char i
i = 1

Да можно, только везде ; в конце.
bartik226 писал(а):2.char i
for (i=5; i<20; i+=4)
это условие зациклица же? а на сайте proavr указано что нет.
ведь каждый раз когда будет начинаться цикл i будет присваиваться значение 5.

Это не условие, это цикл. Он будет выполнятся 4 раза со значениями i = 5,9,13,17
bartik226 писал(а):3. И я не понял значение этих строк Операции, приведённые на одной строчке, имеют одинаковый приоритет. Операции, помеченные как R->L, исполняются справа налево

не совсем понял про что вы?
bartik226 писал(а):4. И еще там написано что максимальное значение i может быть 255 это так? а можно переменной i присвоить строку?

все зависит от типа переменной. Если как вы выше писали char i; то i занимает 1 байт и никакая строка туда не может быть записана, только 1 символ. Вот если char text[200]; то это уже массив однобайтовых символов, туда можно записать строку не длиннее 200 символов.
bartik226 писал(а):5.можно ли обьявить лобальную переменную перед функцией main?

Глобальную можно.

Добавлено спустя 4 минуты 15 секунд:
Если вы совсем новичек в программировании не читайте не в коем случае сайт proavr или 123авр. Изложение языка Си там крайне непоследовательное, нелогичное и только запутает вас. Читайте нормальную книжку по Си для чайников. А из курса проавр берите только специфику микроконтроллеров.
Аватара пользователя
HarryStar
 
Сообщения: 995
Зарегистрирован: 15 ноя 2010, 13:56
Откуда: Нижний Новгород
прог. языки: С, С++, РНР

Re: МикроКонтроллер AVR начинающим - общие вопросы

Сообщение bartik226 » 02 дек 2011, 16:24

не я не новичек вроде, ну почти все там ясно, я на питоне писал раньше там примерно также, только есть ньюансы и различие в написании.
bartik226
 
Сообщения: 66
Зарегистрирован: 06 ноя 2011, 01:32

Re: МикроКонтроллер AVR начинающим - общие вопросы

Сообщение avr123.nm.ru » 02 дек 2011, 22:01

bartik226 писал(а): а на сайте proavr указано что нет.
Раз указано - значит не зациклится. :D

Эти куски кода удобно протестировать самому в PROTEUS и увидеть как он выполняется.
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: МикроКонтроллер AVR начинающим - общие вопросы

Сообщение bartik226 » 03 дек 2011, 00:35

спасибо за ответы, вот еще вопрос накопились.
1.VMLAB имеет только 8 светодиодов - почему именно 8?
2.значит нужно отобразить 8 старших бит результата - т.е. биты_9_2 - для этого мы сдвигаем все биты слова ADCW вправо на 2 позиции ввобще ничего не понял, это все о прерывании:
interrupt [ADC_INT] void adc_isr(void)
{
PORTB=(unsigned char) (~(ADCW>>2));

delay_ms(127);

ADCSRA|=0x40;
не понимаю эту строку PORTB=(unsigned char) (~(ADCW>>2));
а точнее именно это (~(ADCW>>2)), тут я разобрался что тут выкидывает два бита считая справа, но зачем?
вообще не понял что такое ADSW
эти вопросы скорее к avr123.nm.ru потому как другие могут просто не понять суть проблемы

4.Почему написано DDRB=0xFF и что это делает выходами, почему именно ff? то есть что получается что DDRB=11111111 почему именно 8-мь???

кстати, что будет если идет код и посередине случается прерывание, потом выполнение кода продолжается и вот я правильно все понял, что код дальше работает так же нормально если бы не было прерывания, да?
А долго ли идут прерывание обычно? И дайте пожалуйста хоть один пример наружней работы мк, когда в нем произойдет прерывание.
bartik226
 
Сообщения: 66
Зарегистрирован: 06 ноя 2011, 01:32

Re: МикроКонтроллер AVR начинающим - общие вопросы

Сообщение bartik226 » 03 дек 2011, 15:17

register int beta @10;

Старший байт двухбайтовой переменной beta будет размещен в регистре общего назначения 10 а младший в регистре 11.
Не понял про размещение битов, я понимаю почему именно два, потому что int - 16 bit , но почему у них быт размещаются именно так- не понятно. И щас я еще понял что ссначала старший пишется а потом младший, НО ЧТО ОЗНАЧАЕТ @10?
Последний раз редактировалось bartik226 03 дек 2011, 20:52, всего редактировалось 1 раз.
bartik226
 
Сообщения: 66
Зарегистрирован: 06 ноя 2011, 01:32

Re: МикроКонтроллер AVR начинающим - общие вопросы

Сообщение Gre4in » 03 дек 2011, 15:49

bartik226 писал(а):DDRB=11111111 почему именно 8-мь???


А сколько ног у порта B? Каждому биту соответствует своя нога...
bartik226 рекомендую перечитать курсы заново, с особой внимательностью, вникая в каждую строчку...
Gre4in
 
Сообщения: 157
Зарегистрирован: 13 сен 2008, 17:53
Откуда: Иваново
прог. языки: Pascal, С

Re: МикроКонтроллер AVR начинающим - общие вопросы

Сообщение bartik226 » 03 дек 2011, 16:33

мне не все не понятно, только некоторое. вопросы еще остались)
ну ответьте плиззз!
bartik226
 
Сообщения: 66
Зарегистрирован: 06 ноя 2011, 01:32

Re: МикроКонтроллер AVR начинающим - общие вопросы

Сообщение bartik226 » 04 дек 2011, 00:52

и скажите пожалуйста есть ли в avrstudio 5 типа шаблонов как в cvavr if, while, for и т.д.?

Добавлено спустя 1 час 26 минут 23 секунды:
Код: Выделить всёРазвернуть
#include <avr/io.h>
#include <avr/m8_128.h>      
#define PA_OUT DDRA = 0xFF
int initialization(void)
{

   PA_OUT;

   TCCR0 = 0x05;
}
int main(void)
{
   initialization();
   while(1)
    {
        PORTA++;
      while (!(TIFR&0x01));
      TIFR = 0x01;
    }
return 0;
}

вот такой кол в avrtudio 5 выдает ошибку Warning control reaches end of non-void function C:\AVRProjects\AVRGCC2\AVRGCC2\AVRGCC2.c здесь while (!(TIFR&0x01)); в этом слове TIFR, в чем ошибка?этот код взят с задачи номер 1 на сайте проавр, там пишут под компилятор cvavr.
bartik226
 
Сообщения: 66
Зарегистрирован: 06 ноя 2011, 01:32

Re: МикроКонтроллер AVR начинающим - общие вопросы

Сообщение boez » 04 дек 2011, 10:11

То что ты привел - это просто предупреждение, что ты объявил функцию, как возвращающую целое число, но не возвращаешь его :)

А ошибка - ну может этого регистра в этом AVR нету? Щас лень смотреть в ДШ.
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Пред.След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 6