Uklunok писал(а):Немного оговорился, язык Си, но используется много ассемблерных вставок. Да и по - моему в CodeVision попроще код будет, полюс там ещё автоматически инициализируются порты ввода/вывода, регистры и т.д.
К примеру в CodeVision код:
Код: Выделить всё
#include <mega16.h>
void main(void)
{PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0xFF;
while (1) //цикл, выполняемый пока нет прерываний
{
#asm //начало ассемблерной вставки
IN R18,0x19 //читаем данные из порта А в регистр R18
OUT 0x18,R18 //записываем данные из регистра R 18 в порт В
#endasm //конец ассемблерной вставки
};
}
В AVRSTUDIO этот же код выглядит так:
Код: Выделить всё
.
include "m16def.inc"
.def temp = r18; // присвоение символьного имени регистру r18
ser temp // установка всех бит регистра r18
out DDRB,temp // инициализация порта B (работает как выход)
START: // метка относительного безусловного перехода
in temp,PINA // считывание состояния порта A в регистр r18
out PORTB,temp // вывод содержимого регистра r18 в РВВ PORTB
rjmp START // команда относительного безусловного перехода
уважаемый, вы меня извините, но, как говорится, "буду краток, но резок": у вас приведе первый пример на
Си с ассемблерной вставкой (руки бы отбивал тем, кто такие примеры придумывает В КАЧЕСТВЕ ОБУЧАЮЩИХ), а второй пример -
чисто ассемблерный текст! поэтому говорить "что в студии посложнее будет" крайне неверно! нельзя сравнивать курицу и щуку!
ваш пример на
Си с ассемблерной вставкой будет выглядеть в студии так:
Код: Выделить всё
#include <avr/io.h>
void main(void){
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0xFF;
while (1){ //цикл, выполняемый пока нет прерываний
// начало вставки
asm volatile (
"IN R18,0x19 \n"
"OUT 0x18,R18 \n"
); // конец вставки
}
}
как говорится, найдите 10 отличий.
хотя повторюсь, за "Си с большим количеством ассемблерных вставок" начинающих бить надо нещадно, а тех, кто так учит - линчевать безжалостно!