|
|
  |
AD7760-АЦП 24 разряда, 2,5 МГц, кто пользовал? |
|
|
|
Jan 31 2008, 09:50
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(Stanislav @ Jan 31 2008, 06:22)  Для более точного ответа нужно посмотреть сгенерённый ассемблерный код (знаете, как это делать?).
У Вашего АЦП есть сигнал DRDY, а у чёрного фина - ножки DMAR0 и DMAR1. Во первых, большое спасибо за Ваш подробный анализ и рекомендации. Все они полезны. Ассемблерный код, который генерит компилятор я посмотрела. Ssync-и стоят ровно там, где я их поставила и ничего более. У моего BF537 указанных Вами входов DMAR0 и DMAR1. я не обнаружила. Посмотрите фрагмент проги на ASM, отвечающий за анализ появления сигнала DRDY от АЦП. При скорости SCLK=133MГц после прихода DRDY до появления CS проходит более 100нс. Непонятно откуда такая задержка. lw_start: //ожидание DRDY r1=w[p1](z); CC=!bittst(r1,5); if CC jump lw_start; // w[p1+4]=r2; //сброс залипающего бита DRDY r0.h=w[i0]; // считывание первого слова DATA_ADC (высталение CS) ssync;
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
Jan 31 2008, 11:37
|

Гуру
     
Группа: Свой
Сообщений: 4 363
Регистрация: 13-05-05
Из: Москва
Пользователь №: 4 987

|
Цитата(SALOME @ Jan 31 2008, 12:50)  Ассемблерный код, который генерит компилятор я посмотрела. Ssync-и стоят ровно там, где я их поставила и ничего более. Это понятно. Вопрос в том, нужно ли их вообще там ставить. Ну да Бгъ с ним... Цитата(SALOME @ Jan 31 2008, 12:50)  ...У моего BF537 указанных Вами входов DMAR0 и DMAR1. я не обнаружила. Плохо смотрите. PF0 и PF1. ЗЫ. Поиском текста в pdf-ах пользоваться умеете? Цитата(SALOME @ Jan 31 2008, 12:50)  ...Посмотрите фрагмент проги на ASM, отвечающий за анализ появления сигнала DRDY от АЦП. При скорости SCLK=133MГц после прихода DRDY до появления CS проходит более 100нс. Непонятно откуда такая задержка. Почему же непонятно? 100 нС - это при частоте ядра 400 МГц - 40 тактов. Посмотрите время выполнения команд, в частности условных переходов, и убедитесь, что здесь всё нормально.
--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
|
|
|
|
|
Jan 31 2008, 12:54
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(Stanislav @ Jan 31 2008, 18:37)  Плохо смотрите. PF0 и PF1.
ЗЫ. Поиском текста в pdf-ах пользоваться умеете? Почему же непонятно? 100 нС - это при частоте ядра 400 МГц - 40 тактов. Посмотрите время выполнения команд, в частности условных переходов, и убедитесь, что здесь всё нормально. Нашла. Оказались альтернативные функции, а я смотрела по пинам  . Буду думать. PF0/1 у меня тоже заняты под UART0: boot-загрузка и передача данных на Комп. С количеством тактов еще хуже  . Там управление периферией, а след-но не 400, а 133 Мгц. Надо переходить на прерывание. Два дня возилась с ассемблерной вставкой, теперь - прерыванием ХЕЗ_сколько  . Зато опыт копится...
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
Feb 2 2008, 18:27
|

Гуру
     
Группа: Свой
Сообщений: 4 363
Регистрация: 13-05-05
Из: Москва
Пользователь №: 4 987

|
Цитата(SALOME @ Jan 31 2008, 15:54)  Нашла. Оказались альтернативные функции, а я смотрела по пинам  . Буду думать. PF0/1 у меня тоже заняты под UART0: boot-загрузка и передача данных на Комп. На комп можно поробовать второй УАРТ заюзать. С загрузкой несколько сложнее - без дополнительного коммутатора сигналов обойтись, скорее всего, не получится. Правда, если Вам в процессе работы нужно только передавать данные на комп, задача сильно упрощается: в этом случае, нужно использовать UART0 TX (PF0) ножку на передачу, а DMAR1 (PF1) - как вход для запроса HMDMA. Коммутировать сигналы RxD и DRDY можно при помощи простейшего двухвходового переключателя, управляемого одной из ножек GPIO процессора. Как вариант - загрузка из SPI флешки. Сам так делаю. Цитата(SALOME @ Jan 31 2008, 15:54)  ...С количеством тактов еще хуже  . Там управление периферией, а след-но не 400, а 133 Мгц. Времена выполнения команд, в том числе и с обращением к периферии, принято отсчитывать в тактах ядра. Цитата(SALOME @ Jan 31 2008, 15:54)  ...Надо переходить на прерывание. Два дня возилась с ассемблерной вставкой, теперь - прерыванием ХЕЗ_сколько  . Зато опыт копится... Salome, дорогая, у меня есть серьёзное предположение, что никакими программными ухищрениями положение Вы не исправите. Нужно внимательно проанализировать аппаратную часть, для чего придётся хотя бы поверхностно научиться читать схемы и управляться с осциллоскопом.
--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
|
|
|
|
|
Feb 3 2008, 16:57
|
Местный
  
Группа: Свой
Сообщений: 210
Регистрация: 15-01-08
Из: Новосибирск
Пользователь №: 34 105

|
Цитата(SALOME @ Jan 31 2008, 18:54)  Надо переходить на прерывание. Прерывания, скорее всего мало что изменят. В лучшем случае уменьшите время начала CS после прихода DRDY. Надо смотреть на временные диаграммы считывания по шине EBIU. При скоростях SKLK>100MHz скорее всего процессор считывает НЕустановившиеся на шине АЦП данные, т.е. мусор. Программная регулировка времени считывания данных ARDY относительно выставления AMSx (CS_ADC) - не более 4-х тактов. т.е 40нс. А по даташиту AD7760 - более 41нсек. Это без учета задержек буферов. Цитата(Stanislav @ Feb 3 2008, 00:27)  Времена выполнения команд, в том числе и с обращением к периферии, принято отсчитывать в тактах ядра. Что-то не совсем понятно. Ведь в приведенном фрагменте идет обращение к порту GPIO lw_start: //ожидание DRDY r1=w[p1](z); --> Считывание с периферийного порта GPIO. и время выполнения надо считать в SCLK (т.е 1 такт 7,5нс) CC=!bittst(r1,5);--> А здесь в CCLK (т.е. 1 такт 2,5нс) if CC jump lw_startРазве не так? И потом, в самом деле, откуда в этом цикле набегает более 100нс?
Сообщение отредактировал Linker - Feb 3 2008, 16:59
--------------------
Я здесь и сейчас...
|
|
|
|
|
Feb 3 2008, 20:17
|

Гуру
     
Группа: Свой
Сообщений: 4 363
Регистрация: 13-05-05
Из: Москва
Пользователь №: 4 987

|
Цитата(Linker @ Feb 3 2008, 19:57)  Прерывания, скорее всего мало что изменят. В лучшем случае уменьшите время начала CS после прихода DRDY. Надо смотреть на временные диаграммы считывания по шине EBIU. При скоростях SKLK>100MHz скорее всего процессор считывает НЕустановившиеся на шине АЦП данные, т.е. мусор. Программная регулировка времени считывания данных ARDY относительно выставления AMSx (CS_ADC) - не более 4-х тактов. т.е 40нс. А по даташиту AD7760 - более 41нсек. Это без учета задержек буферов. Опять двадцать пять... Простите, а Вы точно знаете, как именно ноги EBIU процессора подключены к терминалам приведённой схемы? По-моему, даже уважаемая SALOME имеет об этом весьма смутное представление... Лично я же сильно подозреваю, что трабл именно в этом, а именно: в неправильной подаче сигналов управления на АЦП. О чём уже неоднократно высказался. Цитата(Linker @ Feb 3 2008, 19:57)  Что-то не совсем понятно. Ведь в приведенном фрагменте идет обращение к порту GPIO lw_start: //ожидание DRDY r1=w[p1](z); --> Считывание с периферийного порта GPIO. и время выполнения надо считать в SCLK (т.е 1 такт 7,5нс) CC=!bittst(r1,5);--> А здесь в CCLK (т.е. 1 такт 2,5нс) if CC jump lw_start Разве не так? И потом, в самом деле, откуда в этом цикле набегает более 100нс? EBIU не является GPIO. 100 нс набегает не только в этом цикле. Есть ещё обращение к внешнему устройству через EBIU. Дело в том, что для синхронизации ядра и перифериии требуется определённое время, зависящее от соотношения CCLK и SCLK. При этом не нужно забывать, что данные при операции чтения из периферии и записи в неё становятся в конвейер (за мегагерцы приходится платить). Для его гарантированной выгрузки и используются команды SSYNC. Кроме того, для заполнения программного конвейера после перехода требуется тоже определённое время. Короче, возьмите симулятор и попробуйте посимулять. По первой прикидке, у меня получилась вполне соответствующая цифра. Точно проверять щас лень, но могу это сделать в случае необходимости. ЗЫ. Плохой разработчик систему, функционирующую с /редкими/ сбоями, считает условно работающей. Хороший - безусловно не работающей.
--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
|
|
|
|
|
Feb 4 2008, 07:38
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(Stanislav @ Feb 4 2008, 03:17)  По-моему, даже уважаемая SALOME имеет об этом весьма смутное представление... Лично я же сильно подозреваю, что трабл именно в этом, а именно: в неправильной подаче сигналов управления на АЦП. О чём уже неоднократно высказался. Я Вас понимаю. Жещина-разработчик уже по определению - курица  . Распределение выводов таково: за выбор АЦП отвечает AMS1 (EBIU). За опрос DRDY отвечает PortH.5(GPIO). Направление передачи RD/WR - PortH.7. При этом направление передачи в ходе считывания выборке не меняется. А меняется только при настройке АЦП. Поэтому уточняю мой фрагмент : lw_start: //ожидание DRDY r1=w[p1](z); //Считывание состояния PortH, р1 - адрес PortH CC=!bittst(r1,5); //Проверка состояния залипающего бита PortH.5 if CC jump lw_start //Если DRDY не пришел, то продолжить опросВот здесь задержка между DRDY и спадом AMS1~150нс [i]//Считывание данных с АЦП r0.h=w[i0]; // считать старшие 2 байта DATA_ADC. i0 - адрес АЦП (EBIU) ssync; //считать младший байт DATA_ADC + байт STATUS r0.l=w[i0]; // считать младший байт DATA_ADC + байт STATUS w[i2++]=r0.h; // сохранить старшие 2 байта в SRAM w[i2++]=r0.l; // сохранить младший в SRAM BLA... BLA...[/i] Цитата(Linker @ Feb 3 2008, 23:57)  Прерывания, скорее всего мало что изменят. С настройкой прерываний разобралась и теперь встал вопрос как организовать цикл опроса АЦП по прерываниям. Приходит в голову IDDLE. Однако есть подозрение, что выход из спячки не скор. А по другому как?
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
Feb 4 2008, 19:13
|

Гуру
     
Группа: Свой
Сообщений: 4 363
Регистрация: 13-05-05
Из: Москва
Пользователь №: 4 987

|
Цитата(SALOME @ Feb 4 2008, 10:38)  Я Вас понимаю. Жещина-разработчик уже по определению - курица  . Дело вовсе не в этом. А в том, что для получения сколь-нибудь полезного совета нужно научится правильно задавать вопрос, не упуская при этом существенных деталей. К сожалению, этим часто пренебрегают представители обоих полов в равной степени. Цитата(SALOME @ Feb 4 2008, 10:38)  ...Распределение выводов таково: за выбор АЦП отвечает AMS1 (EBIU). За опрос DRDY отвечает PortH.5(GPIO). Направление передачи RD/WR - PortH.7. При этом направление передачи в ходе считывания выборке не меняется. Ну, наконец-то.  Подключение логичное, и, с моей точки зрения, правильное (если не рассматривать всё-таки возможность ввода по HMDMA). Продолжим "пытку". 1. Как инициализирован PORT H? Интересуют все значения регистров, которые Вы изменяете. 2. Почему не подано питание V_EXT на ногу VccY транслятора уровней U30 в Вашей схеме? 3. Каков период сигнала DRDY? Цитата(SALOME @ Feb 4 2008, 10:38)  ...А меняется только при настройке АЦП. Поэтому уточняю мой фрагмент : lw_start: //ожидание DRDY r1=w[p1](z); //Считывание состояния PortH, р1 - адрес PortH CC=!bittst(r1,5); //Проверка состояния залипающего бита PortH.5 if CC jump lw_start //Если DRDY не пришел, то продолжить опрос
Вот здесь задержка между DRDY и спадом AMS1~150нс 150нс - это минимальная или максимальная задержка? И что тогда есть 100нс? ЗЫ. Задержка возникает не только, и не столько здесь. Цитата(SALOME @ Feb 4 2008, 10:38)  ...[i]//Считывание данных с АЦП r0.h=w[i0]; // считать старшие 2 байта DATA_ADC. i0 - адрес АЦП (EBIU) ssync; //считать младший байт DATA_ADC + байт STATUS r0.l=w[i0]; // считать младший байт DATA_ADC + байт STATUS Сдаётся, уважаемая Salome, что у Вас слишком мал интервал между последовательными чтениями. Попробуйте вместо одной команды SSYNC вставить подряд две или даже три. Цитата(SALOME @ Feb 4 2008, 10:38)  ...С настройкой прерываний разобралась и теперь встал вопрос как организовать цикл опроса АЦП по прерываниям. Приходит в голову IDDLE. Однако есть подозрение, что выход из спячки не скор. А по другому как? В данном случае, команда IDLE нужна не для изменения режима, а именно для ожидания прерывания. "Мёртвое" время будет всяко меньше, чем в Вашей программе. Однако, длительность задержки даже в 100нс не может вызвать сбой в работе АЦП.
--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
|
|
|
|
|
Feb 5 2008, 04:01
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(Stanislav @ Feb 5 2008, 02:13)  1. Как инициализирован PORT H? Интересуют все значения регистров, которые Вы изменяете. 2. Почему не подано питание V_EXT на ногу VccY транслятора уровней U30 в Вашей схеме? 3. Каков период сигнала DRDY?
150нс - это минимальная или максимальная задержка? И что тогда есть 100нс? ЗЫ. Задержка возникает не только, и не столько здесь. / ******** Настройка порта H: ************************************** PH5-in ADC_DRDY PH6-in ADC_MX2(SYNHRO) PH7-out ADC_RESET PH9-out ADC_R/W PH10-out ADC_SYNC */ *pPORTH_FER=0x0000; *pPORTHIO_DIR =0x179C; *pPORTHIO_INEN =0xE060; // Разрешение буфера приема порта H *pPORTHIO_POLAR =0x8060; // 1- активен низкий (спадающий) уровень ~~~~~~~~~|_____ *pPORTHIO_EDGE =0x8060;; // 0 - уровень (не залипает),т.е. повторяет pin *pPORTHIO =0x1FFF; Напряжение Vext реально подано. А в схеме упущено. Спасибо. Период DRDY пробовала разный: от 156КГц до 1,25МГц. Установить сколько точно задержка сложно, т.к. фронт сильно CS дрожит. Полагаю из-за асинхронности поступления DRDY и момента его определения GPIO PH5. Но по любому оно не должно влиять на устойчивость работы. Просто не понятно почему такая большая задержка. У меня еще одно подозрение. Может в процесс опроса АЦП вмешивается еще кто-то, заложенный компилятором? Пробовала запретить прерывания в теле ассемблерной вставки - программа виснет.
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
Feb 5 2008, 21:07
|

Гуру
     
Группа: Свой
Сообщений: 4 363
Регистрация: 13-05-05
Из: Москва
Пользователь №: 4 987

|
Цитата(SALOME @ Feb 5 2008, 07:01)  / ******** Настройка порта H: ************************************** .................. Вроде, всё правильно. Цитата(SALOME @ Feb 5 2008, 07:01)  ...Период DRDY пробовала разный: от 156КГц до 1,25МГц. Тогда "наползаний" быть точно не должно. Продолжим: что записано в регистры управления АЦП? Цитата(SALOME @ Feb 5 2008, 07:01)  ...Установить сколько точно задержка сложно, т.к. фронт сильно CS дрожит. Полагаю из-за асинхронности поступления DRDY и момента его определения GPIO PH5. Но по любому оно не должно влиять на устойчивость работы. Просто не понятно почему такая большая задержка. С этим разберётесь пожже. Ещё раз: у Вас слишком мало время между чтениями первого и второго слова из АЦП ( t6). По даташиту, оно должно быть не менее 1 периода внутреннего тактового сигнала АЦП, а у Вас оно - меньше, это видно даже без осциллографа. Увеличьте его, и всё станет ОК. Цитата(SALOME @ Feb 5 2008, 07:01)  ...У меня еще одно подозрение. Может в процесс опроса АЦП вмешивается еще кто-то, заложенный компилятором? Пробовала запретить прерывания в теле ассемблерной вставки - программа виснет. А разрешить при выходе не забыли? Если в программе используются прерывания, такое поведение вполне закономерно.
--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
|
|
|
|
|
Feb 5 2008, 21:24
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250

|
Цитата(Stanislav @ Feb 6 2008, 00:07)  Продолжим: что записано в регистры управления АЦП? С этим разберётесь пожже. Ещё раз: у Вас слишком мало время между чтениями первого и второго слова из АЦП. По даташиту, оно должно быть не менее 1 периода внутреннего тактового сигнала АЦП, а у Вас оно - меньше, это видно даже без осциллографа. Увеличьте его, и всё станет ОК. В регистрах управления трудно накосячить, чтобы к такому результату привело. По поводу времени между чтениями - совершенно верно, обязательно надо выдерживать 50 нс. НО - судя по предыдущим данным, сбоит и старшее слово. Состояние выходного автомата АЦП сбрасывается по DRDY, поэтому это не должно влиять на старший байт. Надо искать в тракте данных. Через сколько стробируется от начала CS при описанном SALOME включении ?
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
|
Feb 5 2008, 22:25
|

Гуру
     
Группа: Свой
Сообщений: 4 363
Регистрация: 13-05-05
Из: Москва
Пользователь №: 4 987

|
Цитата(DS @ Feb 6 2008, 00:24)  В регистрах управления трудно накосячить, чтобы к такому результату привело. При желании, можно. Например, делитель на 2 для 40 МГц MCLK не включить. Цитата(DS @ Feb 6 2008, 00:24)  ...Через сколько стробируется от начала CS при описанном SALOME включении ? В зависимости от момента прихода падающего фронта DRDY внутри цикла ожидания, задержка CS относительно DRDY может сильно меняться. Но меньше минимально допустимых 10нс (t2) быть не может. Длительность CS - 82,5нc. Промежуток между последовательными CS тоже может слегка гулять, и составляет минимально около 30 нс (точно считать лень), что, по моему мнению, и приводит к сбоям. Защёлкивание данных в процессоре происходит через 75нс после начала сигнала CS. Если времена другие, это означает косяк в настройках самогО процессора.
Сообщение отредактировал Stanislav - Feb 5 2008, 22:35
--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
|
|
|
|
|
Feb 5 2008, 22:33
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250

|
Цитата(Stanislav @ Feb 6 2008, 01:25)  При желании, можно. Например, делитель на 2 для 40 МГц MCLK не включить. В зависимости от момента прихода падающего фронта DRDY внутри цикла ожидания, задержка CS относительно DRDY может сильно меняться. Но меньше минимально допустимых 10нс (t2) быть не может. Длительность CS - 75нc. Промежуток между последовательными CS тоже может слегка гулять, и составляет минимально около 30 нс (точно считать лень), что, по моему мнению, и приводит к сбоям. Так можно и входной буфер или модулятор забыть включить  . Работать совсем не будет. Не, вопрос не про задержку DRDY-CS, а про строб данных в процессор относительно начала CS. Все говорит, что проблема в этом. Если, конечно, не какая нибудь глупость типа порванного проводника на плате. Данные на АЦП могут появляться аж череж 40+ нс после CS, если еще и буфер есть, могут быть пробемы именно с этим.
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
|
Feb 5 2008, 22:49
|

Гуру
     
Группа: Свой
Сообщений: 4 363
Регистрация: 13-05-05
Из: Москва
Пользователь №: 4 987

|
Дописал уже...  2 SALOME Попробуйте вставить ещё одну команду SSYNC вот здесь: w[i2++]=r0.h; // сохранить старшие 2 байта в SRAM SSYNC; w[i2++]=r0.l; // сохранить младший в SRAM Или сразу после второго чтения. В данном случае, он всё-таки нужен.
--------------------
Самонадеянность слепа. Сомнения - спутник разума. (с)
|
|
|
|
|
Feb 6 2008, 11:37
|

Местный
  
Группа: Свой
Сообщений: 311
Регистрация: 11-06-07
Из: Российская империя, 1861г.
Пользователь №: 28 349

|
Цитата(Stanislav @ Feb 6 2008, 04:07)  А разрешить при выходе не забыли? Если в программе используются прерывания, такое поведение вполне закономерно. Я в своей программе не использую прерывания. Но когда в ассемблерной вставке их запрещаю, то вся прога виснет. А если в конце вставки разрешаю прерывания, то все нормально. Разобраться, что нагенерил компилятор кроме моей программы пока нет времени. Но наверное придется. Цитата(Stanislav @ Feb 6 2008, 04:07)  Продолжим: что записано в регистры управления АЦП? регистр 1= 0x020A, регистр 2= 0x0002. Хотя пробовала и другие комбинации. Например, включала фильтр_3 (User), но коэффициентв не загружала. Цитата(DS @ Feb 6 2008, 05:33)  Не, вопрос не про задержку DRDY-CS, а про строб данных в процессор относительно начала CS. Все говорит, что проблема в этом. Если, конечно, не какая нибудь глупость типа порванного проводника на плате. Данные на АЦП могут появляться аж череж 40+ нс после CS, если еще и буфер есть, могут быть пробемы именно с этим. Сейчас буду еще раз перетряхивать железо в обвязке АЦП и тыкать туда осцилом. Дело затрудняется сложностью доступа. Придется делать переходники... Цитата(Stanislav @ Feb 6 2008, 05:49)  Попробуйте вставить ещё одну команду SSYNC вот здесь:
w[i2++]=r0.h; // сохранить старшие 2 байта в SRAM SSYNC; w[i2++]=r0.l; // сохранить младший в SRAM Вставляла SSYNC всяко и разно. Проверю версию с проблемой в старшем байте шины данных. Очень похоже на это. Мусор начинается, при появлении нулей в старшем разряде 24битового слова и всегда в битах статуса, где возможны нули. Может буфер косячит...
--------------------
Итак увидел я, что нет ничего лучше, чем наслаждаться человеку делами своими (Еккл) .
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|