А SBI, если я не ошибаюсь (давно асм в руки брал), инструкция одна, но работает именно в три этапа со всеми побочными эффектами.
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Код: Выделить всё
a = (a | ((1<<2) | (1<<0))) & ~((1<<4) | (1<<1));Код: Выделить всё
a |= ((1<<2) | (1<<0));
a &= ~((1<<4) | (1<<1));Код: Выделить всё
const __flash char lcd_data[] = "строка";Код: Выделить всё
#define MY_STRING "строка"
#define MY_STRING_LEN sizeof(MY_STRING)
const __flash char lcd_data[] = MY_STRING;
Код: Выделить всё
volatile uint8_t a = 1;
const __flash char lcd_data[] = "stroka";
int main() {
a = sizeof(lcd_data);
56: 87 e0 ldi r24, 0x07 ; 7
58: 80 93 60 00 sts 0x0060, r24 ; 0x800060 <__data_start>
я сказал "напрямую", т.е. невозможно заранее предсказать, какой именно код получится от 1, 2 или 3 строчной записи одного и того же действия. например, в случае не-volatile может и 100500 строк превратиться в одну командуПростоНуб писал(а):связана
не поленился, поднял документы... ошибаетесь вы:NStorm писал(а):Нет там никаких 3х этапов, путаете что-то.
в конкретно вашем примере, как вам посоветовали, через sizeof. но вообще-то для этого есть в модуле avr/pgmspace.h специальная функция strlen_P, которая вычислит длину любой строки в памяти программ.Shuspano писал(а):Как узнать длину строки в такой конструкции, не считая это вручную:
Ну там не совсем так написано. Там написано просто, что некоторые биты очищаются путем записи 1 в них. Поэтому запись в такой флаг 1 на самом деле очищает его. По ссылке более интересно. Надо подробнее почитать, может я ошибаюсь.как не о том?! написано же: берет все биты и записывает обратно установенные в 1 - чистое RMW
Тут не выйдет ) UDR всего лишь буфер. Регистры там внутренние другие RXB, TXB. Поэтому UDR в принципе не поддерживает RMW. Потому что читать вы будете из другого регистра входящего буфера.кстати, даже стало любопытно, что будет, если послать в USART байт 0xFF, а в обработчике прерываний сделать CBI UDR, 1 ?хотя, конечно, это не совсем то, о чем мы тут говорим, но зато убедительно докажет RMW или не-RMW команда CBI/SBI
Т.е. уже чистый сброс/установке без всяких RMW.Цитата из ДШ мега48
Some of the Status Flags are cleared by writing a logical one to them. Note that, unlike most other AVRs, the CBI and SBI instructions will only operate on the specified bit, and can therefore be used on registers containing such Status Flags. The CBI and SBI instructions work with registers 0x00 to 0x1F only.
И такое поведение команд CBI и SBI свойственно для всех АВРок, начиная с тини13, то есть, все выпущенные за последние 3 года модели. Неужели некоторые уже 3 года не читали даташитов? А вера здесь не при чём.
В общем для "новых" (те, что после tiny13 были) AVR не актуально. Для старых тоже надо смотреть, как бы не ошибочная копипаста в ДШ.I believe that these are actually incorrect. In older AVRs the sbi/cbi opcodes did indeed affect other bits in the register and therefore one had to be careful not to use them in registers that contained interrupt flags. However, as the line I quoted above says, in newer AVRs these opcodes only affect the desired bit. Likely these are just copy-paste errors from older datasheets.
Проблема:......
#define TICK_PER_CURRENT_PERIOD (200)
......
const uint8_t VALUE_TICK_PER_CURRENT_PERIOD = TICK_PER_CURRENT_PERIOD;
......
const uint8_t SCHEDULE1 = (VALUE_TICK_PER_CURRENT_PERIOD + 1);



а вот так умеет?VladislavS писал(а):А тем временем GCC 10 теперь вот так умеет
Код: Выделить всё
#define правда true
#define брехня false
typedef bool логическое;
логическое значение = брехня;Потом будут думать откуда погрешности в расчетах...VladislavS писал(а):Они ведь серьёзно считают, что Пи это знаковая целая константа, равная 3.
,ПростоНуб писал(а):Ну и кодировку учитывайте при кириллице. Если вдруг в utf-8 запишите, будет 13 байт соотв, по 2 байта на символ.
спасибо большое, все заработало.ПростоНуб писал(а):
Shuspano,Код: Выделить всё
#define MY_STRING "строка" #define MY_STRING_LEN sizeof(MY_STRING) const __flash char lcd_data[] = MY_STRING;
И зачем? Зачем под это тратить память, когда размер строки во флэше всё-равно неизменен всегда?int strlegnt = MY_STRING_LEN