Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Железки на микроконтроллерах - собираем с нуля


Информационный Канал Subscribe.Ru

Выпуск номер 2 Сравниваем камни
   
 

В этом выпуске мы начнем рассматривать микроконтроллеры двух фирм конкурентов - Microchip (C) PIC и Atmel (C) AVR. Много копий, было наломано на разных формух, в беседах "матерых спецов", примерная тема которых сводилась: какой микроконтроллер лучше? Возьмём два "одинаковых" (по частоте работы тактового генератора, количеству портов и памяти) микроконтроллера PIC и ATmega.Оба микроконтроллера имеют 8 битную Гарвардскую архитектуру и их производители клянутся в том, что ядро оных "камней" может выполнить одну комманду за такт.Я человек, который два года "просидел" на операционной системе OS/2 сразу смекнул, что эти чипы хороши, но каждый по своему. С точки зрения обывателя PICи просто убийственны свой простотой и функциональностью, но для программиста раньше имевшего дело с ассемблером x86 написание сложной программы может превратиться в пытку, так как семейство микроконтроллеров фирмы Микрочип содержат "всего" 35 комманд (кстати, )см. табл 1.

Система команд РIC. Табл 1.

Мнемокод

Название команды

Циклы Код команды (11-бит) Биты состояния Примечания

Команды работы с байтами

ADOWF f,d Сложение W с f 1 0001 lldf ffff С, DC, Z 2,4
ANDWF f,d Логическое И W и f 1 0001 0ldf ffff Z 2,4
CLRF f Сброс регистра f 1 0000 0llf ffff Z 4
CLRW Сброс регистра W 1 0000 0100 0000 Z
COMF f,d Инверсия регистра f 1 0010 0ldf ffff Z
DECF f,d Декремент регистра f 1 0000 lldf ffff Z 2,4
DECFSZ f,d Декремент f, пропустить команду, если 0 1(2) 0010 lldf ffff 2,4
INCF f,d Инкремент регистра f 1 0010 l0df ffff Z 2,4
INCFSZ f,d Инкремент f, пропустить команду.если 0 1(2) 0011 lldf ffff 2,4
IORWF f,d Логическое ИЛИ W и f 1 0001 00df ffff Z 2,4
MOVF f,d Пересылка регистра f 1 0010 00df ffff 2 2,4
MOVWF f Пересылка W в f 1 0000 00lf ffff 4
NOP Холостая команда 1 0000 0000 0000
RLF f,d Сдвиг f влево через перенос 1 0011 0ldf ffff С 2,4
RRF f,d Сдвиг f вправо через перенос 1 0011 00df ffff С 2,4
SUBWF f,d Вычитание W из f 1 0000 10df ffff С, DC, Z 2,4
SWAPF f,d Обмен местами тетрад в f 1 0011 l0df ffff 2,4
XORWF f.d Исключающее ИЛИ W и f 1 0001 l0df ffff Z 2,4

Команды работы с битами

BCF f,b Сброс бита в регистре f 1 0100 bbbf ffff 2,4
BSF f,b Установка бита в регистре f 1 0101 bbbf ffff 2,4
BTFSC f,b Пропустить команду, если бит в f равен нулю 1(2) 0110 bbbf ffff
BTFSS f,b Пропустить команду. и если бит в f равен единице 1(2) 0111 bbbf ffff

Команды передачи управления и операции с константами

ANDLW k Логическое И константы и W 1 1110 kkkk kkkk Z
CALL k Вызов подпрограммы 2 1001 kkkk kkkk
CLRWDT Сброс сторожевого таймера WDT 1 0000 0000 0100 TO.PD 5
GOTO k Переход по адресу 2 101k kkkk kkkk
IORLW k Логическое ИЛИ константы и W 1 1101 kkkk kkkk Z
MOVLW k Пересылка константы в W 1 1100 kkkk kkkk
OPTION Загрузка регистра OPTION 1 0000 0000 0010
RETLW k Возврат из подпрограммы с загрузкой константы в W 2 1000 kkkk kkkk
SLEEP Переход в режим SLEEP 1 0000 0000 ООН TO, PD
TRIS f Загрузка регистра TRIS 1 0000 0000 Offf 3
XORLW k Исключающее ИЛИ константы и W 1 1111 kkkk kkkk Z

Отсутствие толковых команд перехода явилось для меня настоящей головной болью. И именно по этой причине при компиляции программы на Сях (языке Си) объектный код (код, который мы после компиляции загружаем в микроконтроллер) разрастается пропорционально оператору IF (а особенно, при применении оператора SWITCH-CASE), и это большая беда, так как без применения операторов сравнения не обходиться не одна маломальская программа.

Ниже наглядный пример этого безобразия (синим код на Сях, зеленым- ассемблер):

Программа для PIC:

_main__code
;;;;;;;;{
;;;;;;;; while (1)
label_0000
;;;;;;;; {
;;;;;;;; a++;

incf _a, F
;;;;;;;; switch ( a )
movf _a, W
movwf _code_tmp_0000
;;;;;;;; {
;;;;;;;; case 3: b = 7;

movf _code_tmp_0000 , W
sublw D'3'
btfss STATUS, Z
goto label_0003
label_0004
movlw D'7'
movwf _b
;;;;;;;; case 7: b = 4;
label_0003
movf _code_tmp_0000 , W
sublw D'7'
btfss STATUS, Z
goto label_0005
label_0006
movlw D'4'
movwf _b
;;;;;;;; case 9: b = 1;
label_0005
movf _code_tmp_0000 , W
sublw D'9'
btfss STATUS, Z
goto label_0007
label_0008
movlw D'1'
movwf _b
;;;;;;;; case 10:a = 0;
label_0007
movf _code_tmp_0000 , W
sublw D'10'
btfss STATUS, Z
goto label_0009
label_0010
clrf _a
;;;;;;;; };
label_0009
label_0002
;;;;;;;; };
goto label_0000
label_0001
;;;;;;;;}
_main__end
Программа для ATmega:

29 void main(void)
30 {

.CSEG
_main:
; 31
; 32 while (1)
_0x2:
; 33 {
; 34 a++;

INC R4
;35 switch ( a )
MOV R30,R4
;36 {
;37 case 3: b = 7;

CPI R30,LOW(0x3)
BRNE _0x8
LDI R30,LOW(7)
MOV R5,R30
;38 case 7: b = 4;
RJMP _0x9
_0x8:
CPI R30,LOW(0x7)
BRNE _0xA
_0x9:
LDI R30,LOW(4)
MOV R5,R30
;39 case 9: b = 1;
RJMP _0xB
_0xA:
CPI R30,LOW(0x9)
BRNE _0xC
_0xB:
LDI R30,LOW(1)
MOV R5,R30
;40 case 10:a = 0;
RJMP _0xD
_0xC:
CPI R30,LOW(0xA)
BRNE _0x7
_0xD:
CLR R4
; 41 }
_0x7:
; 42 };
RJMP _0x2
;43 }
_0xF:
RJMP _0xF

Исходя из этого, ПИК, проигрывает Атмелу в размере объектного кода, что в сочетании с муторностью программирования на чистом ассемблере, несколько добавляет очков в пользу применения в разработках АТmega .

На сегодня всё. Всем удачи! Продолжение следует :-)

 

 

 
     
Илья - MechCraft(Собака)yandex.ru

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.hard.microhard
Отписаться

В избранное