Побитово два int16_t во float и обратно.

Vitaly_Ekb
Offline
Зарегистрирован: 08.05.2016
Уважемые гуру пожлуйста подскажите. 
Я соверненно не силен в Си++ c арудино на весьма любительском уровне.
Задача у меня следующия. От электросчетчика SDM120 (слейва) по Modbus получаю на ардуину (мастер) последовательность байт 2 шт. по 16 бит. 
Формат данных счетчика Float. Нужно 2 по 16 бит переделать во float 32 бита
Попробовал сделать:
  uint16_t au16data[]={111,222} ;
  float volts  ;
  bitWrite(volts, 0, bitRead(au16data [1], 0)); 

 

Компилятор ругается:
error: invalid operands of types 'float' and 'long unsigned int' to binary 'operator&'
 #define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
 Находил решения подбных проблема
 типа: 

 typedef union
{
 float asFloat;
 long asLong;
 short asWord[2];
 byte asByte[4];
}
float_cracker_t;

void setup( void )
{
 float_cracker_t cracker;
 
 cracker.asFloat = 13.13;
 
 for ( int8_t i=0; i < 4; ++i )
 {
   byte byteToSend = cracker.asByte[i];
 }
}

void loop( void )
{
}

 

или http://arduino.ru/forum/processing/peredacha-float-v-processing

Но мозг взорвал но не разобрался и в примере выше конвертирует только в одну сторону. 
Пожалуйста подскажите 
1. Как должен выглядеть код в моем случае. 
2. Что и где конкретно почитать про все элементы в коде выше в небольшом обьеме. 
 
Заранее благодарен. 
Vitaly_Ekb
Offline
Зарегистрирован: 08.05.2016

Блин..приношу извинения за орфографию...., а правка невозможно!!!!!!!!!!!!!!!!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. Хотелось бы знать, какой смысл Вы вкладываете в слово "конвертировать". Что при этом должно происходить?

2. В тексте Вы говорите о "конвертации" одного float в два 16-разрядных слова, а в примере "конвертируете" float в 4 байта. Это как?

3. Что значит "конвертирует только в одну сторону"?

b707
Offline
Зарегистрирован: 26.05.2017

мне больше понравилось про "2 байта по 16 бит".

ТС, разберитесь с типами переменных и с их размерностью. Для затравки хочу открыть вам тайну -в  байте ВСЕГДА 8 бит. А теперь сами - сколько байт и бит в лонге, флоат, и инте? - при этом учитывайте, что размеры типов на разном железе могут быть разными.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

b707 пишет:

 Для затравки хочу открыть вам тайну -в  байте ВСЕГДА 8 бит.

Не всегда, зависит от платформы ;) Именно поэтому существует константа CHAR_BIT в limits.h ;)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

тиресно, на какой платформе в байте не 8 бит? 

b707
Offline
Зарегистрирован: 26.05.2017

DIYMan пишет:

Не всегда, зависит от платформы ;) Именно поэтому существует константа CHAR_BIT в limits.h ;)

DIYMan, это непедагогично - подрывать автритет коллеги в глазах учеикоа :) Тем более что по сути-то я прав, во всех современных компьютерных системах байт = 8 бит

sva_khv
Offline
Зарегистрирован: 19.12.2016

С интресом уточнил для себя что оказывается  байт это не котегорично 8 бит!  Принято, все используют, все ЗАНАЮТ!  По сути - да сейчас стандарт де факто!  Но формально есть ньюанс!

Байт (англ. byte) (русское обозначение: байт и "Б"; международное: Bbyte)[1] — единица хранения и обработки цифровой информации; совокупность битов, обрабатываемая компьютером одномоментно. В современных вычислительных системах байт состоит из восьми битов и, соответственно, может принимать одно из 256 (28) различных значений (состояний, кодов). Однако в истории компьютерной техники существовали решения с иными размерами байта (например, 6, 32 или 36 битов), поэтому иногда в компьютерных стандартах и официальных документах для однозначного обозначения группы из 8 битов используется термин «октет» (лат. octet).

Ряд ЭВМ 1950-х и 1960-х годов использовали 6-битовые символы в 48-битовых или 60-битовых машинных словах. В некоторых моделях ЭВМ производства Burroughs Computer Corporation (ныне Unisys) размер символа был равен 9 битам. Во многих современных цифровых сигнальных процессорах используется машинное слово длиной 16 бит и больше.



Название Байт было впервые использовано в 1956 году В. Бухгольцем при проектировании первого суперкомпьютера IBM 7030 для пучка одновременно передаваемых в устройствах ввода-вывода битов (шести штук) , позже в рамках того же проекта расширили байт до восьми (23) бит.



Байтовая адресация памяти была впервые применена в системе IBM System/360. В более ранних компьютерах адресовать можно было только целиком машинное слово, состоявшее из нескольких символов, что затрудняло обработку нечисловых данных.



8бит - размер "машинного слова" в процессоре i8080 - на нем собрали

первый IBM PC. А все (точнее, подавляющее большинство) современные компьютеры являются именно IBM-совместимыми, т. е. развернись история так, что на первое место вышли бы процессоры другой фирмы (не Intel, т. к. i8080 — 8-битный микропроцессор, выпущенный компанией Intel в апреле 1974 года) , мы бы, возможно, использовали семибитовые буты или девятибитовые баты ;-)))

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

DetSimen пишет:

тиресно, на какой платформе в байте не 8 бит? 

https://stackoverflow.com/questions/2098149/what-platforms-have-somethin...

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

b707 пишет:

DIYMan пишет:

Не всегда, зависит от платформы ;) Именно поэтому существует константа CHAR_BIT в limits.h ;)

DIYMan, это непедагогично - подрывать автритет коллеги в глазах учеикоа :) Тем более что по сути-то я прав, во всех современных компьютерных системах байт = 8 бит

По сути - ты неправ, не во всех компьютерных системах байт = 8 бит: https://stackoverflow.com/questions/2098149/what-platforms-have-something-other-than-8-bit-char 

Давай не будем привязываться к слову "современный". Всё зависит не от слова "современный", а от платформы, под которую собирается код. И там, ВНЕЗАПНО, CHAR_BIT может быть равен 12, скажем. И если ты изначально закладываешься на CHAR_BIT == 8, то код на такой платформе будет работать неверно. 

Да, в современных реалиях всем пох, и мало кто юзает CHAR_BIT в коде - тупо считают, что там 8. И я тоже - не исключение. Но для полноты картины - не упомянуть не мог ;)

З.Ы. Авторитет не подрывал, даже в мыслях не было ;)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

b707 пишет:

при этом учитывайте, что размеры типов на разном железе могут быть разными.

Дополню: категорически советую для переносимого между разными платформами скетча юзать не int, byte, char, long и т.п. - а типы с чётко прописанной размерностью:

int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, uint64_t

Ну и структуры выравнивать по границе байта:

#pragma pack( push, 1 )
typedef struct
{
 int8_t header;
 uint16_t data;
} SOME;

#pragma pack( pop )

Помогает избежать многих головняков при переносе проекта на другую платформу.

b707
Offline
Зарегистрирован: 26.05.2017

DIYMan, если ты хочешь по гамбурскому счету - то обьясни, какое отношение имеет CHAR_BIT к байту? то. что char на разных системах может быть разным - это понятно. но байт - это единица измерения, как "метр" или "секунда", он везде одинаков.

То. что когда-то где-то байт был не 8 бит - это примерно тоже самое как устаревшие единицы измерения "сажЕнь" или "локоть",

Я понимаю, что могу сильно ошибатся - но всегда думал именно так. Тут уж не до авторитета - хочу разобраться.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

b707 пишет:

DIYMan, если ты хочешь по гамбурскому счету - то обьясни, какое отношение имеет CHAR_BIT к байту? 

Читать: https://ru.wikipedia.org/wiki/Limits.h , увидеть, что "

CHAR_BIT Число бит в байте

"

CHAR_BIT  - просто название определения, но его суть - это именно число бит в байте. Вообще, limits.h - интересная штука, если это дело юзать в проектах - это ещё один большой шаг к переносимому коду, взять те же лимиты мин/макс-значений.

sadman41
Offline
Зарегистрирован: 19.10.2016

...я думал, что сойду с ума от перловых регекспов, а тут вон чего - еще похлеще в ваших Си. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

DIYMan, спасибо, почитал.  Век живи, век учись.  Правда я с сигнальными процессорами дела не имел никада, паэтому был свято уверен, что байт всегда = 8 бит, а бит - это байт минус налоги.  Придёца напицца. 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

sadman41 пишет:

...я думал, что сойду с ума от перловых регекспов, а тут вон чего - еще похлеще в ваших Си. 

Да не, у нас всё норм :) Просто история языка длинная, вот и вылезают уши всякие. Да и требования к переносимости кода - существуют, зависит от проекта, конечно, но - существуют. Поэтому если закладываться на переносимость - в Perl легче, конечно: поставил интерпретатор под конкретную платформу - и похер. А вот с C - придётся повозиться.

Да далеко ходить не надо: размерность int под AVR (Arduino Uno) и ARM (Arduino Due) - не совпадает, емнип. В одном проекте сталкивался, пришлось допиливать, т.к. сам дурак - не заложил переносимость.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

DetSimen пишет:

 паэтому был свято уверен, что байт всегда = 8 бит

Строго говоря, в текущем окружении ты вряд ли столкнёшься с другой ситуацией, так что 8 бит в байте - это как норма, обратное - исключение, достаточно редкое. Хотя (емнип, опять же, могу ошибаться), в Windows CE единицей данных являлось двухбайтовое поле (wchar_t), т.е. формально в такой системе в байте - 16 бит. Но, во-первых - могу ошибаться (память подводит, старенький :) ), и, во-вторых - то уже всё сдохло, и недостойно выкапывания из могилы :)

Так что считаем, что в байте 8 бит, и не забиваем себе голову академическими знаниями :)

З.Ы. Не пей много :) И мало - тоже не надо :)

b707
Offline
Зарегистрирован: 26.05.2017

DIYMan, спасибо

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

DIYMan пишет:

 в Windows CE единицей данных являлось двухбайтовое поле (wchar_t), т.е. формально в такой системе в байте - 16 бит. Но, во-первых - могу ошибаться (память подводит, старенький :) ), и, во-вторых - то уже всё сдохло, и недостойно выкапывания из могилы :)

В своё время имел коммуникатор на WinCE 6.5 и писал под него программы на шарпе в VS2005/8.  Символы там действительно все были широкие (2 байта), но и тип byte был, никуда не девался. И знаковый был, и беззнаковый. 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

DetSimen пишет:

В своё время имел коммуникатор на WinCE 6.5 и писал под него программы на шарпе в VS2005/8.  Символы там действительно все были широкие (2 байта), но и тип byte был, никуда не девался. И знаковый был, и беззнаковый. 

Ну я ж говорю - память подводит :)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sva_khv пишет:

8бит - размер "машинного слова" в процессоре i8080 - на нем собрали

первый IBM PC. А все (точнее, подавляющее большинство) современные компьютеры являются именно IBM-совместимыми, т. е. развернись история так, что на первое место вышли бы процессоры другой фирмы (не Intel, т. к. i8080 — 8-битный микропроцессор, выпущенный компанией Intel в апреле 1974 года) , мы бы, возможно, использовали семибитовые буты или девятибитовые баты ;-)))

Это, конечно, очень интересно, но, увы, не соответствует действительности.

IBM PC был собран не на 8080, а на 8088, который, кстати, в отличие от 8080 был не 8-, а 16-разрядным процессором. Хотя и с 8-разрядной внешней шиной. За счет чего в IBM PC широко использовалась 8-разрядная периферия, разработанная для 8080, что позволило выпустить 16-разрядный компьютер почти по цене 8-разрядного. Что и определило в конце концов его популярность.

В любом случае, утеврждение, что размером 8 бит байт обязан 16-разрядному процессору, выглядит как-то немного странно.

sva_khv
Offline
Зарегистрирован: 19.12.2016

andriano пишет:

IBM PC был собран не на 8080, а на 8088, который, кстати, в отличие от 8080 был не 8-, а 16-разрядным процессором. Хотя и с 8-разрядной внешней шиной.

Да. Верно. 

IBM PC/TX на 8088 только разглядывал. А вот IBM PC/AT на 80286 уже пользовал. Давно это было!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

на 8080 были собраны "Микроша", "Радио РК-86" и "Специалист".  Но как только в союзе появился "Спектрум", все эти поделки бесславно сгинули. 

sva_khv
Offline
Зарегистрирован: 19.12.2016

DetSimen пишет:

на 8080 были собраны "Микроша", "Радио РК-86" и "Специалист".  

Как сказал мой одногрупник в институте в году примерно 1988 - "тех кто сам собрал дома Радио РК-86, ОБХСС может сразу сажать". Для молодежи поясняю - тогда детали для его сборки было ОЧЕНЬ трудно КУПИТЬ (дефицит). А вот с работы вынести детали (у кого они были на работе) - гораздо легче.

Сгинули, да. Но не согласен что бесславно. Они сильно помогли в продвижении ЭВМ в массы. 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

естесственно.  я для своего спектрума чесно накрал деталек на тогдашней работе.  Правда, качество было не ахти, мне пришлось перебрать ночами, когда я дежурил, целый ящег РУ5 и РУ6, чтобы найти не битые. А Z80 пришлось у спекулянтов покупать, GoldStar.  Он на 9 Мгц запросто работал. :) 

Еще паял их, помню, на индий, чтоб заменять было легче. Плату над ланпой подержал, поддел отверткой и достал без проблем. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sva_khv пишет:

IBM PC/TX на 8088 только разглядывал. А вот IBM PC/AT на 80286 уже пользовал. Давно это было!

Вероятно, дело не в процессоре, а в видеоадаптере: XT обычно комплектовался CGA с безальтернативно латинским знакогенератором, а в AT уже зачастую использовались EGA/VGA с загружаемым знакогенератором, куда уже можно было залить кириллицу.

sva_khv
Offline
Зарегистрирован: 19.12.2016

Ностальгия она такая ностальгическая. В первый матричный принтер тоже загружали кирилицу. А второй взяли Star-1500 с прошитой кириллицой. Круть неимоверная.

SLKH
Offline
Зарегистрирован: 17.08.2015

sva_khv пишет:

andriano пишет:

IBM PC был собран не на 8080, а на 8088, который, кстати, в отличие от 8080 был не 8-, а 16-разрядным процессором. Хотя и с 8-разрядной внешней шиной.

Да. Верно. 

IBM PC/TX на 8088 только разглядывал. А вот IBM PC/AT на 80286 уже пользовал. Давно это было!

у мя первый был на 8086.

SLKH
Offline
Зарегистрирован: 17.08.2015

andriano пишет:

sva_khv пишет:

IBM PC/TX на 8088 только разглядывал. А вот IBM PC/AT на 80286 уже пользовал. Давно это было!

Вероятно, дело не в процессоре, а в видеоадаптере: XT обычно комплектовался CGA с безальтернативно латинским знакогенератором, 

Работали XT с кириллицей.

SLKH
Offline
Зарегистрирован: 17.08.2015

sva_khv пишет:

Ностальгия она такая ностальгическая. В первый матричный принтер тоже загружали кирилицу. А второй взяли Star-1500 с прошитой кириллицой. Круть неимоверная.

мы в (не помню какой) принтер пзу знакогенератора прошивали/меняли.

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Ранний Epson, скорее всего.   Мня тоже начальство озадачивало. 

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

Ранний Epson, скорее всего.   Мня тоже начальство озадачивало. 

мне с начальством повезло. Мой начальник считал. что русский в принтере - это для лохов. "Если в принтере нет русского - это даже хорошо, будем учить английский." - это было в то время, когда всякую ерунду, типа заявления в отпуск или обьяснительных на принтерах не печатали - только серьезные вещи :)

Тридцать лет прошло, а я до сих пор чту его заветы. Ни в одной из моих программ за эти годы не было кириллицы :)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ну вот и на ардуино это как-то удачно легло... никакой кириллицы. 

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

 это было в то время, когда всякую ерунду, типа заявления в отпуск или обьяснительных на принтерах не печатали - только серьезные вещи :)

Серьёзно? По-моему первое, что печатал новый принтер - это было вот такое:

ASCII art girl stretching.

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Серьёзно? По-моему первое, что печатал новый принтер - это было вот такое:

ASCII art girl stretching.

ну и где тут кириллица? :)

sadman41
Offline
Зарегистрирован: 19.10.2016

Кириллицы нет - тут спорить не стану. 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

нинаю, я когда в не свой Epson кириллицу вставил, первым делом Стругацких напечатал с конференций релкома и читал. 

 

Ну это кому что.  Кто-то первым делом Руфь Диксон печатал. 

Vitaly_Ekb
Offline
Зарегистрирован: 08.05.2016
Пожалуйста не пинайте сильно, я профан в ардуино, а в с++ полный "0". Попробую сформулировать подругому. 
Я взял скетч из примеров из библиотеки  Modbus-Master-Slave-for-Arduino-master. 
В этом примере данные из  регистров мдбас слейв устройств  считываются в массив 
uint16_t au16data[];
В Модбас слейв в двхух регистрах по 16 бит лежит одно значение float размером 32 бит
то есть в двух ячейках uint16_t массива у меня сохраняеся одно значение  float размером 32 бит.
Я планировал в скетче из двух uint16_t побитово перенести  в переменную float 32 бита.
Примерно так:
  uint16_t au16data[16] ;
  float volts  ;
  
  bitWrite(volts, 0, bitRead(au16data [1], 0));
  bitWrite(volts, 1, bitRead(au16data [1], 1)); 
  bitWrite(volts, 2, bitRead(au16data [1], 2));  
  bitWrite(volts, 3, bitRead(au16data [1], 3)); 
  
  bitWrite(volts, 4, bitRead(au16data [2], 0));
  bitWrite(volts, 5, bitRead(au16data [2], 1)); 
  bitWrite(volts, 6, bitRead(au16data [2], 2));  
  bitWrite(volts, 7, bitRead(au16data [2], 3));   

 

Но компилятор ругается. см в первом сообщении. 

sva_khv
Offline
Зарегистрирован: 19.12.2016

DetSimen пишет:

нинаю, я когда в не свой Epson кириллицу вставил, первым делом Стругацких напечатал с конференций релкома и читал. 

+1

Я тоже фантастику печатал. :-)

sva_khv
Offline
Зарегистрирован: 19.12.2016

Vitaly_Ekb пишет:

Но компилятор ругается. см в первом сообщении. 

1. При беглом изучении прочитал что у функций bitRead() и bitWrite()  первый передаваемый ей параметр имеет тип byte (вроде и на int не ругается).   А у тебя volts это float. 
 
 
 
 
 

 

Vitaly_Ekb
Offline
Зарегистрирован: 08.05.2016

Большое спасибо всем кто откликнулся. 

Если в функций bitRead() и bitWrite() не передавать float а передвать только  uint16_t или int16_t, то все работает.

Вот еще полностью, что выдает помпилятор.  


C:\Users\Vitaly\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.21\cores\arduino/Arduino.h:112:37: error:   in evaluation of 'operator|=(float, long unsigned int)'
 #define bitSet(value, bit) ((value) |= (1UL << (bit)))
C:\Users\Vitaly\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.21\cores\arduino/Arduino.h:114:52: note: in expansion of macro 'bitSet'
 #define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
C:\Users\Vitaly\AppData\Local\Temp\arduino_modified_sketch_712994\sketch_jun25c.ino:121:5: note: in expansion of macro 'bitWrite'
     bitWrite(volts, 0, bitRead(au16data [1], 0));
C:\Users\Vitaly\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.21\cores\arduino/Arduino.h:113:39: error: invalid operands of types 'float' and 'long unsigned int' to binary 'operator&'
 #define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
C:\Users\Vitaly\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.21\cores\arduino/Arduino.h:114:73: note: in expansion of macro 'bitClear'
 #define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
C:\Users\Vitaly\AppData\Local\Temp\arduino_modified_sketch_712994\sketch_jun25c.ino:121:5: note: in expansion of macro 'bitWrite'
     bitWrite(volts, 0, bitRead(au16data [1], 0));
C:\Users\Vitaly\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.21\cores\arduino/Arduino.h:113:39: error:   in evaluation of 'operator&=(float, long unsigned int)'
 #define bitClear(value, bit) ((value) &= ~(1UL << (bit)))
C:\Users\Vitaly\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.6.21\cores\arduino/Arduino.h:114:73: note: in expansion of macro 'bitClear'
 #define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit))
C:\Users\Vitaly\AppData\Local\Temp\arduino_modified_sketch_712994\sketch_jun25c.ino:121:5: note: in expansion of macro 'bitWrite'
     bitWrite(volts, 0, bitRead(au16data [1], 0));

 

nik182
Offline
Зарегистрирован: 04.05.2015
Vitaly_Ekb
Offline
Зарегистрирован: 08.05.2016

Огромное спасибо всем откликнувшимся за подсказки, кажется победил:

int16_t au16data[]={17260, 0, 17259, 52429 };// 236.00 and 235.8
float* ptr_recData;
uint8_t numPar =0;   // номер параметра из массива
float volts =0 ;
int16_t temp[2];


void setup() {
Serial.begin(9600);
ptr_recData = (float*)(&temp[0]) ;  // получаем адрес переменной 
}

void loop() {

temp [1] = au16data[(numPar*2)];
temp [0] = au16data[(numPar*2)+1];
volts =*ptr_recData; 

Serial.println(temp [0]);
Serial.println(temp [1]);
Serial.println(volts,8);

Serial.println("_");

++numPar*2;
temp [1] = au16data[(numPar*2)];
temp [0] = au16data[(numPar*2)+1];
volts =*ptr_recData; 

Serial.println(temp [0]);
Serial.println(temp [1]);
Serial.println(volts,8);
Serial.println("__________");
delay(2000);
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

SLKH пишет:

у мя первый был на 8086.

Тогда это был не "IBM PC/XT", а "IBM PC/XT-совместимый". Их - на чем только не делали. В том числе и на К1810ВМ86.

 

SLKH пишет:

Работали XT с кириллицей.

Не работали. Работали - некоторые "совместимые". У которых в аппаратный знакогенератор была изначально зашита кириллица. Помнится, у жены, когда она преподавала информатику, был целый класс таких - совместимых. Если мне не изменяет память - на NEC V30.