Страница 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
Сам цикл занимает четыре строчки...
На С тоже есть свои твики...

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 забыл. Прошу прощения.

Re: Микроконтроллер от и до.......
Добавлено: Ср янв 12, 2011 09:53:27
Gudd-Head
DX168B писал(а):Я про .cseg и .org 0x00XX забыл. Прошу прощения.

Разве компилятор по умолчанию не начнёт код писать в начало памяти?
Конечно понимаю, хороший стиль указывать что, как и куда. Но в первый раз можно ведь и без этого?!?
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
Никогда так не делайте. Компилятор может не ругнётся и даже отработает этот массив,
но когда зашьёте такую прошивку в МК, то она не будет работать.
Такие записи массива можно использовать только в .eseg и .cseg
Код: Выделить всё
.eseg ; Заранее заготовленные значения в EEPROM.
.db 0x01, 0x02, 0x03, 0x04
А в .dseg в основном "рулят" такие записи:
Код: Выделить всё
.dseg
buffer: .byte 20 ; Выделим 20 байт под массив buffer