AVReAl Описание Адаптеры History FAQ English Russian

AVReAl - описание программы

Программа AVReAl предназначена для программирования микроконтроллеров серии AVR (ATtiny, AT90S, ATmega) фирмы Atmel в режиме ISP (in-cirсuit serial programming, последовательное программирование в схеме). Т.е. на плату устройства устанавливается разъём, к которому подключается шлейф от программатора (подключение адаптеров к микроконтроллеру рассмотрено в разделе "адаптеры"). По окончании процесса программирования снимается сигнал сброса и микроконтроллер начинает выполнять записанную в него программу.

Программа компилируется в следующих вариантах

Для работы Win32 и Linux версий с USB-адаптерами на микросхеме FT2232 необходимо установить соответствующую версию драйверов/библиотеки FTD2XX.

При работе WIN32 версии c адаптерами, подключенными к порту LPT используются
W95/W98 - встроенный модуль прямого доступа к портам
Windows NT4, Windows 2000, Windows XP 32 bit, Windows 7 32 bit - драйвер DLportIO
Windows XP 64 bit, Windows 7 64 bit - драйвер DLportIO x64

DLportIO - драйвер доступа к портам из пакета DriverLINX от Scientific Software Tools, Inc. (http://www.sstnet.com).

В режиме "fbprg" незадействованные выходы данных LPT могут быть использованы как питание (ключ -ap).

При использовании буферированных адаптеров (Altera ByteBlaster, Atmel STK200 STK300) программа рассчитана на шитьё в плате с "родными" питанием и кварцем.

Также возможна генерация XTAL программой (ключ -o0), данный режим может оказаться полезен и при наличии кварца в плате (LPT-порт легко его пересилит) для "обхода" ошибок кристалов "не читается содержимое EEPROM данных при частотах кварца, близких к максимальной".

Принимает INTEL HEX (avrasm -i). Загружает HEX в память не в массив, а в список. Т.е. различается ситуация "байт 0xFF в .hex" и "неупомянутый байт" В результате есть возможность шить только то, что надо, остальное только проверять при необходимости (см. ключ -v+).

Для любителей корректировать прошивку прямо по HEX-файлу: если не совпадает контрольная сумма строки, то задается вопрос - "игнорировать?". При ответе 'Y' (или 'y') эта и все остальные ошибки CSUM игнорируются (но сами символы контрольной суммы должны присутствовать, иначе программа закончит работу еще раньше по недопустимому символу в строке).
Для облегчения такого редактирования (особенно "форматных" записей в EEPROM) реализована возможность, подсмотренная у программы от VMK для программирования PIC через Tait-совместимое железо: перед анализом строки из нее убираются пробелы и табуляции. В итоге можно дать:

  :08 0001 00   00 01 0203 0405 0 6 0 7    DB
Также игнорируются пустые строки и строки, начинающиеся с символа '#', последнее предназначено для помещения комментариев о версии непосредственно в HEX-файлы.

Проверяется верхний адрес в HEX-файле, если не влазит в опознанный кристалл, то никаких действий (кроме выдачи сообщения об ошибке) не производится.
Проверяется перекрытие адресов записей в HEX файле. При нахождении первого перекрытия производится выход из программы с указанием диапазона адресов перекрывающихся данных.

Для кристаллов с объёмом flash более 64KB необходим расширенный формат HEX-файла (обычный не поддерживает объем больше 64KB). Запись прочитанных данных в файл всегда производится с дополнительными записями тип '04' - Extended Linear Address Record, как не имеющим разночтений. Чтение из HEX-файла записей типа '02' Extended Segment Address Record производится в соответствии с формированием их в AVRASM by Atmel (без предусмотренного документацией Intel сворачивания адреса смещения по модулю 64Kb).


ВЫЗОВ

avreal [ключи] [[-c] имя_файла_кода [[-d] имя_файла_данных]]
 или
avreal [ключи] -d имя_файла_данных   (когда код трогать желания нет)
Если есть только имена файлов, но нет относящихся к ним ключей (-r -w -v), то файлы игнорируются. Подробнее про работу с файлами и про ключи -c, -d рассказано после описания остальных ключей.

Ключи

-h (-?)
выдать ключи и перечень поддерживаемых кристаллов. Команда
   avreal +имя -h 
(+имя должен быть задан раньше ключа -h) выдает список fuses, поддерживаемых в режиме ISP для заданного контроллера.

-i
Установить порог выдачи сообщений с приоритетом не выше, чем:
-ie or -i1errors
-iw or -i2warnings
-i or -i3info (по умолчанию)
-id or -i4debug
-it or -i5trace
Опции progress bar
-ip-не показывать на всех уровнях сообщений
-ipавтоматически, показывать на уровне "info" и более высоких (по умолчанию)
-ip+показывать на всех уровнях сообщений
Примечание: Ключ -% устарел, использутеся как синоним -id. Внутри .bat файлов следует писать -%%.


+имя
установить тип кристалла, имя допускается задавать как с префиксом 'AT', так и без него, в том виде, в котором имена выдаются по -h. Регистр букв не важен. Например, at90usb162, attiny13a, atmega168 либо 90usb162, tiny13A, MEGA168. Обязательный ключ, никаких действий по умолчанию не производится. Если задан только тип (больше нет ни ключей, ни имен файлов), то контроллер будет сброшен и выдана информация о нем (наличие, если есть доступные по ISP fuses - их состояние).

-a
Группа ключей "адаптер"

-c filename
Задаёт имя файла для записи в пространство кода (flash) микроконтроллера.

-d filename
Задаёт имя файла для записи в пространство данных (EEPROM) микроконтроллера.

-k, -K
Ожидать нажатия кнопки на адаптере перед началом программирования. Две формы ключа (с маленькой и с большой буквой) имеют несколько различное поведение до входа в программирование.
Порядок действий для формы -k следующий: В этом варианте сначала загружаются файлы и при ошибках в них не делается никаких обращений к устройству адаптера.
Выходы адаптера разрешаются до начала опроса кнопки, так как у некоторых адаптеров входы разрешаются одноремённо с выходами.
Для формы -K порядок действий изменяется следующим образом: Тут загрузка файлов происходит после нажатия кнопки. Сделано это для того, чтобы можно было зациклить avreal с ключом -K в командном файле и нажимать кнопку программирования после успешной перекомпиляции. Однако, в этом случае микроконтроллер должен работать во время ожидания нажатия кнопки, поэтому выходы адаптера активируются после успешной загрузки файлов.
Режим доступен для адаптеров, у которых кнопка опрашивается и при запрещённых выходах.


-p<device>
  • Для работы с USB-адаптерами на микросхеме FT2232
    Один или несколько из параметров s=SERNO,d=DESCRIPTION
    Linux дополнительно v=VID,p=PID
    Например "-pd=Dual RS232 A,s=FT01001A,p=6003"
    По умолчанию используется
    -pd="Dual RS232 A"для FT2232C, FT2232L, FT2232D
    -pd="Dual RS232-HS A"для FT2232H
    -pd="Quad RS232-HS A"для FT4232H
    что соответствует микросхемам без EEPROM.
    -p? - получить список подключенных FTDI устройств с их параметрами.
  • Для работы с адаптерами на LPT
    Для WIN32, LINUX - шестнадцатеричное число
    1,2,3 - номер LPT порта, >0x100 - базовый адрес порта. Принято, что LPT1/2/3 имеют адреса 378/278/3BC. Адрес и в виде -p3BC, и в виде -p0x3BC воспринимается как шестнадцатеричное число. По умолчанию -p2 (LPT2)
    Для Linux может также использоваться имя устройства параллельного порта, например, /dev/parport0
    Для FreeBSD - только имя устройства для параллельного порта, например, /dev/ppi0

-o<число>
Задать частоту тактировани микроконтроллера для настройки скорости SPI. При вычислении частоты SCK берётся запас 5%, после чего частота делится на сумму SCK Low SCK high для заданного микроконтроллера и частоты.
-os<число>
Задать непосредственно частоту SCK.
Частота допускается с плавающей точкой и единицами измерения частоты Hz, kHz, MHz, например,
   -o3.686MHZ
   -o14745600hz
   -os1500
   -os3.8MHz
При отсутствии единиц измерения для совместимости с предыдущими версиями считается, что частота в килогерцах. При отсутствии ключа частота по умолчанию 800 (0.8MHz)
-o0[,<число>]
означает необходимость генерации XTAL из программы. Можно указать дополнительный делитель для генерации более меделнного сигнала SCK, что необходимо для работы ключа -o0 с кристаллами с прошитым CKDIV:
       -o0,8
Допустимые значения делителя 1..32
У STK*00 для генерации XTAL используется линия LED. ByteBlaster (ByteBlasterMV) должен быть несколько доработан. ByteBlaster-II уже имеет необходимое подключение к выводу 8 колодки.
XILINX parallel download cable не имеет свободных линий и ключ -o0 не может быть с ним использован.

-n[<число>]
Использовать последние 2 байта кода как счетчик стираний. Если указано <число>, то для записи счетчика используется оно, а не инкрементированное прочитанное значение. При -e -w -n если последние 2 байта заняты кодом, то -n игнорируется.

-e[-]
Стереть
'-' задаёт сохранение содержимого EEPROM способом прочесть/стереть/записать. Для кристаллов, имеющих fuse EESAVE, по -e- также применяется этот способ. Если же хочется пользоваться имеющимся fuse EESAVE, следует установить его (-feesv=0) отдельным запуском avreal и применять обычную форму ключа -e.

-1,-2,-3,-4,-5
Увеличить задержки на программирование в 1.5, 2, 3, 4, 5 раз соответственно (для программирования при пониженном напряжении)

-b{c|d}
Проверить на чистоту.
-b код и данные
-bc только код
-bd только данные


-r
Прочитать из контроллера в файл[ы]

-w[+][p]
Записать в контроллер файлы кода/данных, заданные в командной строке fuses.
'+' - если кристалл в этом задании не стирался и задана запись в EEPROM, то прописать FF в ячейки EEPROM, не заданные в HEX. Верификация этих ячеек на значение FF будет производиться даже если был задан просто -v, а не -v+ (мы же эти ячейки писали). Автоматическое стирание не производится по -w, используйте -ew для нестёртого кристалла.
'p' - использовать поллинг для определения конца записи. Если в течении времени, равного восьмикратному номинальному времени записи, поллинг не даёт положительного результата - выдаётся сообщение об ошибке и происходит завершение работы программы.

-v[+]
Верифицировать (только то, что есть в hex). Дополнительный '+' вызывает проверку на FF "свободных" с точки зрения HEX-файла позиций

-l[+]#
Установить уровень защиты # = 1 (LB2=1,LB1=0) or 2 (LB2=0,LB1=0).
При наличии '+' lock биты прошиваются до зашивки fuses (необходимо для включения BODEN и залочки 90s4433 в одном цикле подачи питания)

-f<fuselist>
список fuses для тех контроллеров, в которых они шьются по ISP. <fuselist> выглядит как fusename=value,fusename=value,bytename=value... где value - ШЕСТНАДЦАТЕРИЧНОЕ значение без префиксов и суффиксов. Для однобитовых fuse добавлены значения ON и OFF (прошить и стереть, 0 и 1 соответственно).
Внимание! Начиная с версии 1.23 НЕ ПОДДЕРЖИВАЮТСЯ однобуквенные синонимы для fuses.
При наличии "пересекающихся" name=val выдается сообщение об ошибке. Перечень fusename для конкретного кристалла с диапазоном value и комментарием можно получить при помощи
   avreal +chipname -?
Для сокращения строки возможно задание полного байта fuses при помощи специальных имен bytename, представляющие собой названия байтов по документации с лидирующим подчерком: _low,_high,_ext,_lock. Нереализованные в данном байте биты рекомендуется устанавливать в '1'. Имя _lock относится к байту lock-битов и BLB, однако на состояние lock-битов не влияет. Для блокировки кристалла по прежнему надо использовать ключ -l. Допускается комбинация отдельных fuse и байтов, однако они при этом не должны пересекаться, т.е. каждый байт fuses должен быть задан либо только через специальное имя, либо только через имена отдельных fuse. Например,
    допустимо:     -f_low=C3,_high=F4,blb1=2
    недопустимо:   -f_lock=FB,blb1=2
Если работа с fuses по SPI поддерживается, то их состояние сообщается при любой операции с кристаллом, задание ключа -f необязательно. Fuses программируются или верифицируются указанием ключа -w или -v совместно с ключом -f (в том числе в одном сеансе с программированием/верификацией кода или данных).
Неупомянутые fuse остаются неизменными (кроме битов защиты boot-блока BLB, так как они могут быть стёрты по -e независимо от ключа -f). Группа BLB относится скорее к lock-битам, записать 1 поверх уже запрограммированной в 0 fuse невозможно. Если запрошена такая операция и контроллер не стирался, то программа завершает работу с соответствующим предупреждением.
AVReAl обеспечивает также расширенную поддержку osccal.
Внимание! У некоторых контроллеров SPIEN и RSTDSBL могут быть запрограммированы через ISP. Будьте осторожны, SPIEN по умолчанию запрограммировано, ключ -fspien=1 (-fspien=off) сотрет SPIEN и запретит дальнейшее низковольтное программирование. То же произойдет и при программировании RSTDSBL (-frstdsbl=0 или -frstdsbl=on).

-!
Делать, что велено, даже если контроллер не распознан (или распознан "не так", как задано в +name) а также если не обнаружен указанный в командной строке адаптер. Попытка стереть нераспознанный (возможно просто залоченный) кристалл при наличии команды стирания производится и без -!, после чего проводится повторное детектирование типа.

возможны осмысленные комбинации:

-v -w       записать, проверить
-e- -w -v+  стереть с сохранением EEPROM, записать, верифицировать
            с проверкой на чистоту свободных участков.
-b -w       проверить на чистоту, если грязная - выход, иначе писать
Внимание! в связи с усложнением форматов ключей во избежание разночтений в дальнейшем возможность указывать группу ключей одним аргументом (например, -ewv) может быть исключена

После ключа -d идёт имя файла данных, после -c имя кода, в этом случае порядок файлов не важен. Пробел между ключами -c/-d и именами не обязателен, т.е. допустимо как -cfoo.hex так и -c foo.hex. Если дано два имени файла без ключей -c и -d, то первое имя - файл кода, второе - файл данных (EEPROM).
Если имя одно и нет ключей -c/-d, то этот файл содержит данные для кода и, если он содержит информацию после верхнего адреса FLASH для заданного кристалла, то эта информация используется для программирования EEPROM данных. Т.е. если, например, для 90s2313 hex-файл содержал данные в адресах от 0x800 до 0x87F, то эти данные будут записаны в EEPROM по адресам 0x00-0x7F.

Порядок ключей не важен, выполнение производится в порядке E B W V L. Если проверка (B, V) дала отрицательный результат, то дальнейшая работа не производится. Т.е.

   -e -b -w -v -l2
означает: стереть, если стёрлось - писать, если верифицировалась - залочить.
   +tiny12 -w -c foo.hex -c*osccal=1f3 -fcksel=3,boden=0
Для tiny12 записать во флеш кода файл foo.hex, по адресу байта 0x1F3 занести прочитанное из контроллера значение OSCCAL, запрограммировать fuse boden и установить fuse CKSEL в бинарное значение 0011


Дополнительные возможности

Для занесения в код и/или данные специальных параметров применяются особые формы ключей -c и -d следующего вида:
-d*name=offset,extкак байты в EEPROM данных
-c*name=offset,extкак байты во FLASH кода (под команду LPM)
-?name=offset,extкак часть последовательных команд LDI начиная с offset
где
name
имя специального параметра, может состоять из собственно имени и уточняющего числа.
offset
адрес байта, начиная с которого производится запись специального значения, шестнадцатеричное значение без префиксов и суффиксов. Используется адрес байта, а не слова, в том числе и при обращении ко flash кода. В зависимости от применяемого инструментария адрес в MAP-файле может указываться как в байтах, так и в словах, в последнем случае необходимо умножить найденный адрес на два перед указанием его в командной строке.
ext
дополнительный аргумент
Байты, необходимые для записи, должны существовать в исходном HEX-файле. В качестве специальных параметров могут выступать:

Значение калибровочного байта RC-генератора
В качестве имени используется слово osccal с номером калибровочного байта. При использовании нулевого байта OSCCAL указание номера 0 не обязательно. Дополнительный аргумент ext - корректирующее значение к прочитанной из кристалла величине OSCCAL (может быть необходимо при напряжении питания, отличающемся от напряжения калибровки на производстве). При выходе корректированного значения за пределы [0..255] происходит ограничение значения и выдача предупреждения.
Примеры.
1. Необходимо записать значение 3-го (считая с 0) байта osccal как байт по адресу 0x3F в EEPROM данных. Используется ключ

-d*osccal3=3F
2. Необходимо записать значение 0-го байта osccal, уменьшенное на 3, как часть команды LDI.
   public osccal_ldi
   ...
osccal_ldi:
   ldi R16,0xFF
   out OSCCAL,R16
   ...
Далее выясняем по MAP-файлу байтовый адрес метки osccal_ldi, например он вышел 0x120. Команда примет вид:
avreal +tiny12 -ewv -c foo.hex -c?osccal=120,-3

Серийный номер прибора
Предназначено для присвоения последовательных серийных номеров програмируемым изделиям. В качестве имени параметра используется слово serno с числом - длиной номера в байтах от 1 до 4. Серийный номер записывается в двоичном виде, младший байт записывается первым. Дополнительный аргумент ext - имя текстового файла, в котором записан номер в десятичном виде. После успешной записи в кристалл номер увеличивается на 1 и записывается назад в файл. Файл при этом переписывается полностью, если после серийного номера в нём была другая информация - она теряется. При сбое верификации при команде -w -v номер не меняется. Если в командной строке задана только верификация (без записи), то значение серийного номера из файла используется, но не инкрементируется, файл остаётся без изменений.
Примеры.
1. Необходимо записать значение 2-байтного серийного номера как 2 байта начиная с адреса 0x12 в EEPROM данных. Сам номер записан в файле serno.txt Используется ключ
 -d*serno2=12,serno.txt
2. Необходимо записать значение 3-байтового серийного номера как часть команд LDI. Номер записан в файле proj.serno
   public serno_load
   ...
serno_load:
   ldi R16,0xFF ; младший байт
   ldi R17,0xFF ; средний байт
   ldi R18,0xFF ; старший байт
Пусть байтовый дрес serno_load по map-файлу вышел 0x120. Используется ключ:
 -c?serno3=120,proj.serno

Произвольная последовательность байтов
Предназначено для записи произвольных данных. В качестве имени параметра используется слово bytes с числом записываемых байтов. Дополнительный аргумент ext - шестнадцатеричная строка, число букв (hex-цифр) должно быть равно удвоенному числу байтов. Младший байт в hexstr должен быть расположен первым, т.е. для записи числа 0xDEADBEEF надо задать

  -c*bytes4=addr,EFBEADDE


Работа с USB-адаптерами на FT2232

Для программирования может быть использован только канал А микросхем FT2232C, FT2232L, FT2232D. Для FT2232H, FT4232H могут быть использованы каналы A и B. В качестве MOSI, MISO, SCK используются только сигналы аппаратного последовательного интерфейса TDI (adbus1), TDO (adbus2), TCK (adbus0) соответственно, однако при конфигурироваии можно указать инверсию сигнала. По умолчанию для сигнала RESET используется линия TMS (adbus3), сигнал enable отсутствует. Для назначения сигналов можно воспользоваться аргументом PINMAP.
Внимание! Начиная с версии 1.28r0 для FT2232 используется полный набор сигналов с управлением полярностью при помощи символа '~'. При этом для сигнала enable используется та же логика, что и для других сигналов. Инверсии, внешние относительно микросхемы, следует указать в записи про сигнал. Это касается в том числе формирователей с активным низким входом разрешения.

Задать экземпляр адаптера можно, указав в ключе -p серийный номер и/или описание канала микросхемы (см. описание ключа -p), для Linux необходимо также указать VID и PID устройства, если они отличаются от VID и PID по умолчанию для микросхем FTDI.


Конфигурирование выводов адаптера

Конфигурирование адаптера осуществляется заданием соответствия сигналов интерфейса программирования выводам адаптера. Аргумент PINMAP соответствующих ключей (-am и -aft2232) может принимать одну из двух форм
=filename, например,

    -am=bb2.cfg
:configuration_string, например,
    -aft2232:enable=~adbus4

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

Название адаптера (параметр 'name') задаётся записью

name = "произвольная строка"
Сигналы программатора (параметры mosi, miso, sck, reset, xtal) задаются записями вида
signal_name = [~]pin_name
Признак инверсии '~' означает, что между выводом известной программатору части адаптера (разъёма LPT или микросхемы FT2232) и выводом микроконтроллера присутствует инвертор.

Допустимые имена выводов
FT2232 adbus0..adbus7, acbus0..acbus3.
FT2232H dbus0..dbus7, cbus0..cbus7 для обеих каналов.
FT4232H dbus0..dbus7 для каналов A и B, поддерживающих MPSSE.
LPT d0..d7 alf init strobe select ask busy error pe online.
Внутренняя инверсия контроллера LPT учитывается автоматически.
Внимание! Для выходных сигналов программатора можно использовать только выводы d0..d7 порта LPT.

Запись key служит для определения вывода и полярности кнопки, запускающей программирование при наличии ключа -k. Инверсия означает активный низкий уровень на входе кнопки.

Существуют специальные группы выводов set, power, enable, led_ok, led_error. В записях для этих групп допускается перечисление нескольких выводов через запятую. Признак инверсии при каждом выводе означает, что на вывод необходимо выдать низкий уровень.
Перед началом работы в заданное (активное) состояние устанавливаются выводы группы set, сигналы led_ok, led_error устанавливаются в пассивое состояние. Затем при непустой группе power активируются её выводы и выдерживается пауза около 0.3 секунды, после чего активируются выводы enable.
По окончании работы в зависимости от результата активируются сигналы led_ok либо led_error, в пассивное состояние переводятся выводы enable, затем выводы power. Выводы set остаются в установленном в начале состоянии.
Cигналы led_ok, led_error следует делать независимыми от линий enable, иначе они будут отключены и не смогут выполнять свои функции.
Для микросхемы FT2232 выход из битового режиме MPSSE по окончании программирования возвращает канал в основной режим, прописанй в EEPROM (как правило, UART), поэтому для корректной индикации необходимо использовать ключ -az.

Поиск файла конфигурации производится в следующей последовательности

Конфигурационная строка состоит из записей, аналогичных записям конфигурационного файла (за исключением записи name), разделённых символом ':'. Завершающий символ не обязателен, при наличии в строке пробелов весь аргумент, как и любой другой аргумент командной строки с пробелами, необходимо заключить в кавычки.

Пример ключа с конфигурационной строкой для адаптера Amontec JTAGkey
С использовеним TMS в качестве RESET

-aft2232:enable=~adbus4
С использовеним SRST в качестве RESET (добавляется второй сигнал enable для открывания выхода SRST)
-aft2232:reset=acbus1:enable=~adbus4,~acbus3

Примеры описания LPT-адаптера для системы, состоящей из двух микроконтроллеров AVR, связанных между собой по SPI.

Пусть контролеры соединены следующим образом:

При высокоимпедансном состоянии адаптера программирования или его отсутствии контроллеры могут свободно обмениваться информацией по последовательному интерфейсу.

Для программирования первого микроконтроллера необходимо использовать следующий конфигурационный файл.

name=1'st controller programmer
mosi=D6
miso=BUSY
sck = D0
reset = D1
enable=~ALF
set =~D3
Для программирования второго контроллера конфигурация адаптера должна быть следующая.
name=2'nd controller programmer
mosi=D6
miso=BUSY
set = ~D0
reset = D1
enable=~ALF
sck = D3


Возвращаемый ERRORLEVEL

0
Все заказанное сделано.
10
not blank при -b, несравнение при -v[+]
20
Невозможность осуществить запрошенную операцию.
HEX кода или данных слишком большой для распознанного типа контроллера.
Запрошенное для записи состояние BLB нельзя записать, не стерев контроллер (а команды стирания не было).
30
Не распознан конкретный тип (бывает при защищенном контроллере, поэтому при -e все равно делается попытка стереть и если после этого тоже не распознан - выход из программы)
40
Кабель программирования не подключен или не удалось войти в программирование по алгортиму для At90s.
50
Ошибка при чтении HEX-файла (не найден, "не те" символы, не совпала контрольная сумма, ошибка чтения, ...) или его записи (есть защищенный от перезаписи с таким же именем, ...).
60
Недостаточно памяти для списков кода/данных
70
Недопустимая командная строка (в т.ч. задан номер отсутствующего LPT)


P.S. При обнаружении неприятностей просьба сообщать версию и очень желательно копию расширенной выдачи программы по -% (перенаправив выдачу в файл).
Внимание!!! Письма по поводу avreal с аттачами в виде скриншотов, WORD-овских и прочеофисовских документов и других способов переслать 1-килобайтный текст с помощью 100-килобайтного файла не будут даже читаться, не говоря уже об ответах