гхмм. медленно и огромный код ? эхх. я разрываюсь. хочется легкости си и четкости АСМ.avreal писал(а):Не советую. Получите объединение недостатков.
@hobbyelectronics
гхмм. медленно и огромный код ? эхх. я разрываюсь. хочется легкости си и четкости АСМ.avreal писал(а):Не советую. Получите объединение недостатков.
вы как-то определитесьКислый писал(а):гхмм. медленно и огромный код ? эхх. я разрываюсь. хочется легкости си и четкости АСМ.
Код: Выделить всё
UCSRB |= ( 1 << TXEN ) | ( 1 << RXEN );Код: Выделить всё
TXEN =1;
RXEN =1;т.е. это константа, и напис`ать TXEN=1 это значит напис`ать 3=1. А Сишный код в переводе на рабоче-крестьянский звучит приблизительно так : взять единицу и сдвинуть ее влево 3 раза, потом взять еще единицу и сдвинуть ее влево 4 раза, а то, что получится, по ИЛИ добавить к содержимому регистра UCSRB .ARV писал(а): TXEN - это символ номера бита в регистре
http://ru.wikipedia.org/wiki/Язык_ассемблераПри достаточной квалификации программиста, язык ассемблера позволяет писать самый быстрый и компактный код. Возможно, даже лучше, чем генерируемый трансляторами языков более высокого уровня.
Если код программы достаточно большой, данные, которыми он оперирует, не помещаются целиком в регистрах процессора, то есть частично или полностью находятся в оперативной памяти, то искусный программист, как правило, способен значительно оптимизировать программу по сравнению с высокоуровневыми трансляторами по одному или нескольким параметрам: скорость работы (за счёт оптимизации вычислений и/или более рационального обращения к ОП, перераспределения данных), объём кода (в том числе за счёт эффективного использования промежуточных результатов).
Обеспечение максимального использования специфических возможностей конкретной платформы, что также позволяет создавать более эффективные программы с меньшими затратами ресурсов.
На одном раньшем проекте у меня пошла напряженка с микросекундами, пришлось применить нестандартную "самопальную" плавающую арифметику : один байт порядок, 2 байта мантисса без скрытого разряда. Конечно, всю арифметику и минимальный набор функций ( exp,sin,cos,sqrt) пришлось напис`ать и оттестить, зато когда с моим коллегой - убежденным Си-шником провели сравнительное тестирование, выигрыш по скорости был в 2 раза! Обошлись без миграции на другой более быстрый ( и более дорогой! ) камень, что при большой серийности вылилось бы в бо-ольшую американскую копеечку. А при моей тутошней программерской зряплате пару недель дополнительного писания окупились продажей одной месячной партии изделий.phenomen писал(а): Если требуется быстродействие, то только асм!
В СиЛабовском компиляторе можно так написать, если регистр бит-адресуемыйКислый писал(а):но непонятно почему нельзя записатьилиэто просто для наглядности ?Код: Выделить всё
TXEN =1; RXEN =1;
Насколько я в курсе, бит-адресация была в 51-х МК, АВР вроде в таком не замечен.Gudd-Head писал(а): В СиЛабовском компиляторе можно так написать, если регистр бит-адресуемый
К регистрам ввода-вывода AVR адресами до 0x1F применимы команды SBI и CBI (установить и очистить бит)Jack_A писал(а):АВР вроде в таком не замечен.
вообще то можно, если немного схитрить:Кислый писал(а):но непонятно почему нельзя записатьКод: Выделить всё
TXEN =1; RXEN =1;
Код: Выделить всё
SFR_B(FLAGS,0x60)
#define FLAG1 FLAGS_Bit0
#define FLAG2 FLAGS_Bit1
// some code
FLAG1=1;
//some code
FLAG1=0;Код: Выделить всё
SFR_B(UCSRB,0x0A)
#define RXEN UCSRB_Bit4 //Rx enable
#define TXEN UCSRB_Bit3 //Tx enable
//some code
RXEN=1;
//some code
TXEN=1;Я же не утверждаю, что этого сделать нельзя. Просто из известных мне МК отдельные биты можно устанавливать не комантами SET BIT, CLR BIT (это не мнемоника команд, а их суть ), а прямым присваиванием MOV, только в 51-х. Хотя сути дела это не меняет, на асме эти биты взводишь-сбрасываешь не задумываясь, а вот на ЯВУ приходится, как выясняется, подумать.Gudd-Head писал(а):К регистрам ввода-вывода AVR адресами до 0x1F применимы команды SBI и CBI (установить и очистить бит)Под эти регистры, как правило, попадают и USART'овские с битами RXEN и TXEN.
Не используя sprintf и желая получить приличный вид на индикаторе, придется малость попотеть. Идея у Вас изложена правильно несколькими постами выше, только чтоб получить приемлемую точность отображения, нужно сначала определить порядок величины, чтобы знать, на каком знакоместе поместить точку, иначе малые числа будут отображаться с большой погрешностью. А отсюда будет видно, на сколько умножить перед преобразованием в integer. Получать частное вычитанием нет смысла, можно использовать целочисленное деление с остатком.ibiza11 писал(а): знаю что на асме было бы намного короче, поэтому воюю.