Микроконтроллер от и до.......

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение YS »

Один пустой цикл for там сожрал 8 строк, когда я на асме это-же делаю в 4 строки.


А так пробовали? :)

Если я правильно понял словосочетание "пустой for"...

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

#include <avr/io.h>

void main(void)
{
  register volatile unsigned char i asm("r16");

  for (i=0; i<100; i++);

  while (1);
}


Дизассемблер:

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

@00000053: main
---- exp.c ----------
4:        {
+00000053:   930F        PUSH    R16              Push register on stack
7:          for (i=0; i<100; i++);
+00000054:   E000        LDI     R16,0x00         Load immediate

+00000055:   C001        RJMP    PC+0x0002        Relative jump
+00000056:   5F0F        SUBI    R16,0xFF         Subtract immediate
+00000057:   3604        CPI     R16,0x64         Compare with immediate
+00000058:   F3E8        BRCS    PC-0x02          Branch if carry set

+00000059:   CFFF        RJMP    PC-0x0000        Relative jump
+0000005A:   94F8        CLI                      Global Interrupt Disable
+0000005B:   CFFF        RJMP    PC-0x0000        Relative jump



Сам цикл занимает четыре строчки...
На С тоже есть свои твики... :wink:
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение DX168B »

А так?

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


       clr     r16
LOOP:  inc     r16
       ;Тут какой-нибудь код в цикле
       cpi     r16,    100
       brmi    LOOP


Или ещё короче:
Аналог на Си

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

void main(void)
{
     register volatile unsigned char i asm("r16");
     for(i = 100; i > 0; i--){/*код в цикле*/}
}

Аналог на АСМе

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

       ldi     r16,     100
LOOP:  ;Тут какой-нибудь код в цикле

       dec     r16
       brne    LOOP


Си хорош производительностью программиста. Всё решается несколькими строчками Си кода.
Но Си немного проигрывает АСМу в производительности программы и места в памяти.
Но не всё зависит от самого языка Си. Тут скорее от компилятора всё зависит. :)
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение YS »

Ну так не зря самые критичные участки пишут на ассемблере. Я и сам начинал с него, и по сей день его использую. Но в целом, как видно, С тоже неплох.

И да, многое еще зависит от настроек оптимизации.

Но Си немного проигрывает АСМу в производительности программы и места в памяти.


Не так уж и немного. А для небольших проектов так и весьма существенно. На асме вполне реально уместить что-то осмысленное в 2% памяти кристалла (делал контроллер простенького лазерного проектора, 2.3% mega48), а на С while(1) уже занимает 1%...
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Микроконтроллер от и до.......

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

YS писал(а):с R0 по R15 - для них не работает команда LDI

Кстати, SER для них тоже не работает, в отличие от CLR :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
sergeys
Поставщик валерьянки для Кота
Сообщения: 1946
Зарегистрирован: Сб сен 11, 2010 13:45:01
Откуда: Екатеринбург

Re: Микроконтроллер от и до.......

Сообщение sergeys »

Доброго всем времени суток! У меня такой вопрос, раз тут про регистры, вот есть РОН с ними все понятно-регистры общего назначения, а остальные что какого-то особого назначения, каждый выполняет свою функцию?

И вот еще про порты, мне уже отвечали но, а не может быть так что если от порта выведены три ного а он восьмибитный, не может быть что эти ноги старшие биты или всегда только младшие?

ну то есть если настройка то вот так:

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

ldi Temp, 0bxxx00000  ;xxx - выведенные ноги
out DDR, Temp
Ко мне можно на "ты", так даже лучше!
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Микроконтроллер от и до.......

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

sergeys писал(а):а остальные что какого-то особого назначения, каждый выполняет свою функцию?

Да.
sergeys писал(а):может быть что эти ноги старшие биты или всегда только младшие?

Теоретически может. Сверяйтесь с даташитом, там всё указано.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
sergeys
Поставщик валерьянки для Кота
Сообщения: 1946
Зарегистрирован: Сб сен 11, 2010 13:45:01
Откуда: Екатеринбург

Re: Микроконтроллер от и до.......

Сообщение sergeys »

Угу, спасибо! :)
Ко мне можно на "ты", так даже лучше!
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение DX168B »

sergeys писал(а):Доброго всем времени суток! У меня такой вопрос, раз тут про регистры, вот есть РОН с ними все понятно-регистры общего назначения, а остальные что какого-то особого назначения, каждый выполняет свою функцию?

И вот еще про порты, мне уже отвечали но, а не может быть так что если от порта выведены три ного а он восьмибитный, не может быть что эти ноги старшие биты или всегда только младшие?

ну то есть если настройка то вот так:

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

ldi Temp, 0bxxx00000  ;xxx - выведенные ноги
out DDR, Temp

PORTB, PINB, DDRB, SREG, TCNT и т.д. - это всё регистры специального назначения.
R0...R15 - Это уже РОН, но с определёнными ограничениями по сравнению с R16...R31

По поводу трех ног с восьмибитного порта: Всё куда проще - смотрите названия ног.
Например PA0, PA1 и PA2 - это значит, что они занимают 3 младших бита в порту А.
Если бы их названия были PA5, PA6 и PA7 , то они бы занимали последние 3 старших бита.
Таков стандарт Atmel.
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
путник
Открыл глаза
Сообщения: 43
Зарегистрирован: Сб дек 25, 2010 19:43:06
Откуда: Великй Новгород

Re: Микроконтроллер от и до.......

Сообщение путник »

Доброго времени.

Смотреть как работают профи, это сказка.

Значит, что бы светились светодиоды......

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

.include "at90s2313.inc";
ldi  r16,  0b11111111  ;
out  PORTB,  r16  ; загорелись 8 свет-ов


Спасибо.
Ищу мудрого кота, который будет моим гуру.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение DX168B »

Верно, но Вы забыли настроить PORTB на выход.
Микроконтроллеры AT90S2313 уже не выпускаются и найти их будет трудно.
ATTINY2313 - это почти его аналог.
Вот исправленный вариант:

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

.include  "tn2313def.inc" ; Это ATTINY2313, но можно и свой МК.
ldi   r16,   0b11111111 ;Присвоили значение регистру r16
out   DDRB,   r16 ;Настроим PORTB на выход.
out   PORTB,  r16 ;Зажжём 8 светодиодов.

Если отправить значение в порт, когда он настроен на вход,
то включатся встроенные подтягивающие на + питания резисторы.
На портах появится ток, но силы тока будет маловато, чтобы нормально загорелся светодиод.
Подтяжка резисторами нужна для того, чтобы входы МК не висели в Z состоянии.
Подробнее об этом есть в обучалке этого сайта.
Если у Вас есть Proteus, то можете отсимулировать в нём свою программу. А если есть микроконтроллер и программатор, то можете в нём проверить. :)
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение YS »

Не... Все немного не так.

Правильный вариант будет выглядеть так:

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

.include "2313def.inc" ; включаем файл определений

.def t=R16 ;присваиваем регистру R16 символическое имя t

.cseg ;собираемся писать код
.org 0 ;размещаем первую команду в начале памяти

  ldi t,0xFF
  out DDRB,t ;конфигурируем порт на выход

  out portB,t ;зажигаем светодиоды

LOOP:       ;этот пустой бесконечный цикл нужен для однозначноcти завершения программы

  rjmp LOOP


Подробнее - в Обучалке.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение DX168B »

Я про .cseg и .org 0x00XX забыл. Прошу прощения. :oops:
I am DX168B and this is my favourite forum on internet!
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Микроконтроллер от и до.......

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

DX168B писал(а):Я про .cseg и .org 0x00XX забыл. Прошу прощения. :oops:

Разве компилятор по умолчанию не начнёт код писать в начало памяти?
Конечно понимаю, хороший стиль указывать что, как и куда. Но в первый раз можно ведь и без этого?!?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение YS »

Но в первый раз можно ведь и без этого?!?


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

Re: Микроконтроллер от и до.......

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

YS писал(а):Угу. А во второй будет казаться, что так и надо... А потом будут проблемы, когда появится .eseg и .dseg или бутлоадер...

Ну так надо двигаться от простого к сложному. До бутлоадера можно и не дойти. :)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
sergeys
Поставщик валерьянки для Кота
Сообщения: 1946
Зарегистрирован: Сб сен 11, 2010 13:45:01
Откуда: Екатеринбург

Re: Микроконтроллер от и до.......

Сообщение sergeys »

YS писал(а):
когда появится .eseg и .dseg или бутлоадер...

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

Re: Микроконтроллер от и до.......

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

sergeys писал(а):Хм, а можно поинтересоваться, так для общего развития чего они значат?

cseg и eseg указывают компилятору область данных.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение YS »

.eseg (EEPROM segment) - область описания данных в EEPROM.
.dseg (data segment) - область описания данных в SRAM.
.cseg (code segment) - область описания данных в FLASH (т.е., исполняемого кода).
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
sergeys
Поставщик валерьянки для Кота
Сообщения: 1946
Зарегистрирован: Сб сен 11, 2010 13:45:01
Откуда: Екатеринбург

Re: Микроконтроллер от и до.......

Сообщение sergeys »

cseg, то я знаю.....
я про eseg и dseg
Теперь понятно спасибо! :)
Ко мне можно на "ты", так даже лучше!
Аватара пользователя
DX168B
Друг Кота
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)
Контактная информация:

Re: Микроконтроллер от и до.......

Сообщение DX168B »

К стати, где-то видел грубую ошибку с .dseg

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

.dseg
.db 0x01, 0x02, 0x03, 0x04

Никогда так не делайте. Компилятор может не ругнётся и даже отработает этот массив,
но когда зашьёте такую прошивку в МК, то она не будет работать.
Такие записи массива можно использовать только в .eseg и .cseg

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

.eseg ; Заранее заготовленные значения в EEPROM.
.db 0x01, 0x02, 0x03, 0x04

А в .dseg в основном "рулят" такие записи:

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

.dseg
buffer:   .byte   20 ; Выделим 20 байт под массив buffer
I am DX168B and this is my favourite forum on internet!
Ответить

Вернуться в «Теория»