Страница 4 из 8

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

Добавлено: Вт янв 11, 2011 00:59:33
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:

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

Добавлено: Вт янв 11, 2011 01:23:20
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
Си хорош производительностью программиста. Всё решается несколькими строчками Си кода.
Но Си немного проигрывает АСМу в производительности программы и места в памяти.
Но не всё зависит от самого языка Си. Тут скорее от компилятора всё зависит. :)

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

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

И да, многое еще зависит от настроек оптимизации.
Но Си немного проигрывает АСМу в производительности программы и места в памяти.
Не так уж и немного. А для небольших проектов так и весьма существенно. На асме вполне реально уместить что-то осмысленное в 2% памяти кристалла (делал контроллер простенького лазерного проектора, 2.3% mega48), а на С while(1) уже занимает 1%...

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

Добавлено: Вт янв 11, 2011 12:08:04
Gudd-Head
YS писал(а):с R0 по R15 - для них не работает команда LDI
Кстати, SER для них тоже не работает, в отличие от CLR :)

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

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

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

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

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

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

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

Добавлено: Вт янв 11, 2011 13:19:22
Gudd-Head
sergeys писал(а):а остальные что какого-то особого назначения, каждый выполняет свою функцию?
Да.
sergeys писал(а):может быть что эти ноги старшие биты или всегда только младшие?
Теоретически может. Сверяйтесь с даташитом, там всё указано.

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

Добавлено: Вт янв 11, 2011 13:25:07
sergeys
Угу, спасибо! :)

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

Добавлено: Вт янв 11, 2011 17:36:47
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.

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

Добавлено: Вт янв 11, 2011 20:16:38
путник
Доброго времени.

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

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

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

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

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

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

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

.include  "tn2313def.inc" ; Это ATTINY2313, но можно и свой МК.
ldi   r16,   0b11111111 ;Присвоили значение регистру r16
out   DDRB,   r16 ;Настроим PORTB на выход.
out   PORTB,  r16 ;Зажжём 8 светодиодов.
Если отправить значение в порт, когда он настроен на вход,
то включатся встроенные подтягивающие на + питания резисторы.
На портах появится ток, но силы тока будет маловато, чтобы нормально загорелся светодиод.
Подтяжка резисторами нужна для того, чтобы входы МК не висели в Z состоянии.
Подробнее об этом есть в обучалке этого сайта.
Если у Вас есть Proteus, то можете отсимулировать в нём свою программу. А если есть микроконтроллер и программатор, то можете в нём проверить. :)

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

Добавлено: Вт янв 11, 2011 22:17:40
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
Подробнее - в Обучалке.

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

Добавлено: Вт янв 11, 2011 22:23:25
DX168B
Я про .cseg и .org 0x00XX забыл. Прошу прощения. :oops:

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

Добавлено: Ср янв 12, 2011 09:53:27
Gudd-Head
DX168B писал(а):Я про .cseg и .org 0x00XX забыл. Прошу прощения. :oops:
Разве компилятор по умолчанию не начнёт код писать в начало памяти?
Конечно понимаю, хороший стиль указывать что, как и куда. Но в первый раз можно ведь и без этого?!?

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

Добавлено: Ср янв 12, 2011 14:04:23
YS
Но в первый раз можно ведь и без этого?!?
Угу. А во второй будет казаться, что так и надо... А потом будут проблемы, когда появится .eseg и .dseg или бутлоадер...

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

Добавлено: Ср янв 12, 2011 14:41:04
Gudd-Head
YS писал(а):Угу. А во второй будет казаться, что так и надо... А потом будут проблемы, когда появится .eseg и .dseg или бутлоадер...
Ну так надо двигаться от простого к сложному. До бутлоадера можно и не дойти. :)

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

Добавлено: Ср янв 12, 2011 14:57:50
sergeys
YS писал(а):
когда появится .eseg и .dseg или бутлоадер...
Хм, а можно поинтересоваться, так для общего развития чего они значат?

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

Добавлено: Ср янв 12, 2011 15:09:50
Gudd-Head
sergeys писал(а):Хм, а можно поинтересоваться, так для общего развития чего они значат?
cseg и eseg указывают компилятору область данных.

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

Добавлено: Ср янв 12, 2011 15:13:33
YS
.eseg (EEPROM segment) - область описания данных в EEPROM.
.dseg (data segment) - область описания данных в SRAM.
.cseg (code segment) - область описания данных в FLASH (т.е., исполняемого кода).

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

Добавлено: Ср янв 12, 2011 15:32:20
sergeys
cseg, то я знаю.....
я про eseg и dseg
Теперь понятно спасибо! :)

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

Добавлено: Ср янв 12, 2011 20:40:14
DX168B
К стати, где-то видел грубую ошибку с .dseg

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

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

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

.eseg ; Заранее заготовленные значения в EEPROM.
.db 0x01, 0x02, 0x03, 0x04
А в .dseg в основном "рулят" такие записи:

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

.dseg
buffer:   .byte   20 ; Выделим 20 байт под массив buffer