Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVRdragon против CKDIV8 & DWEN :)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
ReAl
На внутреннем 128кГц с CKDIV8 дракон не входит в обмен и не может блокировать DW

Подробности про две новости, плохую и хорошую
ILYAUL
Цитата(ReAl @ May 4 2008, 14:43) *
На внутреннем 128кГц с CKDIV8 дракон не входит в обмен и не может блокировать DW

Подробности про две новости, плохую и хорошую

Не открываеется ссылка
SasaVitebsk
Только что писал прогу. Микруха м48. В прошивке вывел частоту 10кГц на OC2 (совмещён с MOSI). После этого AVREAL и JTAG ICE MK2 в режиме ISP микруху не берут.
AVREALом проблему победить не смог, а вот JTAGом взял таким образом. Выставляешь частоту 100 Гц и выполняешь только операцию ERASE. После этого, естественно, всё работает.
defunct
Цитата(SasaVitebsk @ May 4 2008, 14:50) *
Только что писал прогу. Микруха м48. В прошивке вывел частоту 10кГц на OC2 (совмещён с MOSI). После этого AVREAL и JTAG ICE MK2 в режиме ISP микруху не берут.

Странно. А как же 20ms reset пульс?
ISP алгоритм предусматривает ввод последовательности входа в режим программирования не ранее чем через 20ms после перевода Reset в 0. Неужели таймер продолжает тикать после сброса?

ЗЫ: а если сместить инициализацию таймера подальше от начала программы?
SasaVitebsk
Цитата(defunct @ May 4 2008, 18:05) *
Странно. А как же 20ms reset пульс?
ISP алгоритм предусматривает ввод последовательности входа в режим программирования не ранее чем через 20ms после перевода Reset в 0. Неужели таймер продолжает тикать после сброса?

Да, действительно странно. Пробовал ключ -ai в AVREAL - не помогает. Программирование из под AVR Studio вообще может привести к фатальным последствиям. Хорошо что сразу заметил. Она типа сразу фузы читает, и естественно - совершенно не верно. Поэтому появляются галочки типа "похезать ресет". Если это не исправить и при автоматическом программировании установить галочку "программить фузы", то прощай кристалл. smile.gif
Цитата
ЗЫ: а если сместить инициализацию таймера подальше от начала программы?

Наверное поможет, но мне это уже практически без разницы - прога отлажена. А при серийном программировании - значения не имеет.
ReAl
Цитата(ILYAUL @ May 4 2008, 14:22) *
Не открываеется ссылка

Странно... У меня и сейчас открывается. Может тогда на сахару протолкаться нельзя было?
http://caxapa.ru/119698.html

Цитата(SasaVitebsk @ May 4 2008, 14:50) *
Только что писал прогу. Микруха м48. В прошивке вывел частоту 10кГц на OC2 (совмещён с MOSI). После этого AVREAL и JTAG ICE MK2 в режиме ISP микруху не берут.
Есть у меня m168 в макетке, попробую на ней. Непонятно. Сброс-то подаётся, микросхема должна все выводы в Hi-Z перевести.

p.s. -ai не для этого, а для супервизоров с затяжкой снятия сброса - после стирания надо сброс снять и опять подать, а некоторые супервизоры затягивают снятие на сотни милисекунд и сброс не успевает сняться, после чего не проходит вход в программирование.
zhevak
Цитата(ReAl @ May 4 2008, 16:43) *
На внутреннем 128кГц с CKDIV8 дракон не входит в обмен и не может блокировать DW

Подробности про две новости, плохую и хорошую


Вчера я тоже наступил на эти же грабли, только с STK500 и Tiny13. Причем дважды.

Первый раз, когда прошивал из CodeVision. Поднял фьюзы на внутренний RC-генератор на 128 кГц и сразу "потерял" кристал. STK500 (под CV) отказывался функционировать, хотя Танька13 сама по себе работала нормально.

Ситуацию поправил так: загрузил AVRStudio, перевел STK500 с режима ISP в режим VHSP, поправил фьюзы, стер прошивку. Все восстановилось.

Второй раз на грабли встал, когда установил предделитель частоты ядра на максимум (на 256) при частоте внутреннего RC-гернератора 4.8 МГц. При тактовой 4.8 МГц и предделителе на 8 все работало нормально. Стоило только увеличить коэфиициент предделителя, программатор потерял чип. Вылечил кристалл аналогично.

Я не стал выяснять вопрос -- "а начиная с какого коэф. предделителя программатор теряет чип?" Просто для себя отметил территорию "Осторожно! Здесь грабли!"
ReAl
Цитата(zhevak @ May 4 2008, 22:03) *
Вчера я тоже наступил на эти же грабли, только с STK500 и Tiny13. Причем дважды.

Первый раз, когда прошивал из CodeVision. Поднял фьюзы на внутренний RC-генератор на 128 кГц и сразу "потерял" кристал. STK500 (под CV) отказывался функционировать, хотя Танька13 сама по себе работала нормально.
Ну в режиме ISP тот же дракон, кажется, хоть 10Гц тактовой может выставить и ничего не потеряется. avreal насильно ограничен 1кГц тактирования ядра (т.е. 250Гц SPI), чтобы меньше вопросов было на тему "оно что, зависло?".
А тут речь о DW, которую сам дракон поставить может при 128кГц/8, а снять - нет.

Цитата(zhevak @ May 4 2008, 22:03) *
Второй раз на грабли встал, когда установил предделитель частоты ядра на максимум (на 256) при частоте внутреннего RC-гернератора 4.8 МГц. При тактовой 4.8 МГц и предделителе на 8 все работало нормально. Стоило только увеличить коэфиициент предделителя, программатор потерял чип. Вылечил кристалл аналогично.
"Становится всё чудесатее и чудесатее". Вроде бы ж при входе в программирование сброс должен вернуть предделитель на место (по документации CLKPS сбрасывается в 0000 или в 0011 в зависимости от фьюза CKDIV8), от тех 256 ничего не должно оставаться.
Интересно... Проверю на днях и это.
zhevak
Цитата(ReAl @ May 5 2008, 01:26) *
Интересно... Проверю на днях и это.


Да, было бы не полохо. Добавлю, что у меня тарджет-питалово было 3.3 В.

(Моя цель -- ищу алтернативу MSP430F2xxx; пытаюсь понять, сможет-ли что-нибудь из АВР работать так же. Основные два противоположных требования -- экономия питания (макс = 50-70 мкА) и выдавать достаточно короткие импульсы (~ 1-2 мкс); ну еще плюс некоторая неспешная обработка входных/выходных сигналов. Но это к вопросу не относится.)
defunct
Цитата(zhevak @ May 4 2008, 22:46) *
(Моя цель -- ищу алтернативу MSP430F2xxx; пытаюсь понять, сможет-ли что-нибудь из АВР работать так же. Основные два противоположных требования -- экономия питания (макс = 50-70 мкА) и выдавать достаточно короткие импульсы (~ 1-2 мкс); ну еще плюс некоторая неспешная обработка входных/выходных сигналов. Но это к вопросу не относится.)

Работать в пульсирующем режимы -
PowerDown + WDT + Internal RC + максимально возможная частота - 9.6Mhz.

t13 в PowerDown с включенным WDT потребляет <=5мкА.
В активном режиме (при 3.3V питании) - <= 4 ma.
Смысл пробудиться, быстро выполнить всю обработку, сгенерить требуемый пульс и уйти обратно в PowerDown. Если находиться в активном режиме 1/50 секунды - запросто можно выйти на интегральное потребление ~40мкА. 1/50 секунды на 9.6Mhz - это ~96..192 тыс. операций (в 1.5 раза больше чем если чип будет постоянно работать на 128kHz, поребление кстати при постоянной работе от 128kHz будет в ~1.5 раза выше).
Где-то была статья о том, что AVR в пульсе бъет MSP по показателю производительность/потребление.
galjoen
Цитата(defunct @ May 5 2008, 00:56) *
Смысл пробудиться, быстро выполнить всю обработку, сгенерить требуемый пульс и уйти обратно в PowerDown. Запросто можно выйти на интегральное потребление 50-70мкА.

Если делить тактовую частоту, например, на 256 и поотключать всё компараторы, порты, АЦП и т.п., то даже без ухода в PowerDown АВР будет по потреблению укладываться. Из PowerDown АВР выходит больно долго и энергию при этом потребляет. Не считая режима IDLE конечно.
zhevak
Цитата(defunct @ May 5 2008, 02:56) *
Работать в пульсирующем режимы -
PowerDown + WDT + Internal RC + максимально возможная частота - 9.6Mhz.

t13 в PowerDown с включенным WDT потребляет <=5мкА.
В активном режиме (при 3.3V питании) - <= 4 ma.
Смысл пробудиться, быстро выполнить всю обработку, сгенерить требуемый пульс и уйти обратно в PowerDown. Если находиться в активном режиме 1/50 секунды - запросто можно выйти на интегральное потребление ~40мкА. 1/50 секунды на 9.6Mhz - это ~96..192 тыс. операций (в 1.5 раза больше больше чем если чип будет постоянно работать на 128kHz, поребление кстати при постоянной работе от 128kHz будет в ~1.5 раза выше).
Где-то была статья о том, что AVR в пульсе бъет MSP по показателю производительность/потребление.


Да, я так и делаю.

Ядро все время дрыхнет, просыпается по таймеру, делает свое дело и снова в спячку.
Таймер срабатывает один раз в миллисекунду (1000 Гц). Ядро должно проснуться, включить компаратор, посмотреть результат, отключить компаратор и, в зависимости от результата, сформировать или не сформировать импульс на одной из ножек. Импульс должен быть коротким -- 1-2 мкс. Про попутную медленную обработку я ничего не говорю, т.к. там времени уходит не много.

Проблема в том, что для формирования корокого импульса нужна "хорошая" тактовая частота. При такой частоте сам RC-генератор потребляет достаточно ощутимо. Поскольку используется счетчик (для отсчета времени в 1 мс), то уйти в Down или PowerSafe нельзя. Из этих режимов нельзя проснуться по таймеру. Актуальны только сброс, внешнее событие или вотч-дог. Этим объясняется большое энергопотребление.

Конечно, задачу можно попытаться решить и другим способом. А именно -- увести частоту ядра куда-нибудь вниз на 128 или даже на 32 кГц, а импульс на выходе формировать такой, какой получится. Потом его пропустить через дифф. RC-цепочку, которая сформирует ему нужную ширину (1-2 мкс), а очень крутой задний фронт (это обязательно!) сделать жесткой логике. Но это уже получаются дополнительные элементы на плате, что выливается в габариты, пайку, увеличение цены изделия и т.д. Тоже плохо.

Есть еще один вариант. Я его, правда, еще не пробовал. Отказаться от таймера и уходить в полный даун или пауэр-сэйф. А вместо таймера "будильником" сделать вотч-дог. Только у меня сомнения, что собака сможет гавкать 1000 раз в секунду.

Цитата
Где-то была статья о том, что AVR в пульсе бъет MSP по показателю производительность/потребление.

да, что-то подобное читал. Давно, правда, -- год или два назад. Хорошо бы освежить.


PS.
блин, полный офф-топ получился.
ReAl
Цитата(SasaVitebsk @ May 4 2008, 14:50) *
Только что писал прогу. Микруха м48. В прошивке вывел частоту 10кГц на OC2 (совмещён с MOSI). После этого AVREAL и JTAG ICE MK2 в режиме ISP микруху не берут. AVREALом проблему победить не смог

Мега48, внутренний RC 8MHz
Код
#include <avr/io.h>

#include "pin_macros.h"

#define SCK    B,5,H
#define MISO    B,4,H
#define MOSI    B,3,H


void main(void)
{
    PORTC = 0xFF;
    PORTB = 0xFF;
    DDRB = MASK(SCK) | MASK(MISO) | MASK(MOSI);
    PORTD = 0xFF;

    TCCR2A = (1 << COM2A1) | (1 << WGM20);
    TCCR2B = (1 << CS20);
    OCR2A = 0x7F;

    for(;;) {
        TOGGLE(SCK);
        TOGGLE(MISO);
    }
}
ШИМ, правда, 16кГц получается. Но и так, и без ШИМ - с внесением TOGGLE(MOSI) в цикл, и все ножки по одной, и в разных комбинациях - всё нормально перешивается на нормальной тактовой SPIЮ без занижения.
"Ну не знаю я".


Цитата(zhevak @ May 4 2008, 22:03) *
Первый раз, когда прошивал из CodeVision. Поднял фьюзы на внутренний RC-генератор на 128 кГц и сразу "потерял" кристал.
А там разве нет возможности изменить частоту SPI при программировании?

Цитата(zhevak @ May 4 2008, 22:03) *
Второй раз на грабли встал, когда установил предделитель частоты ядра на максимум (на 256) при частоте внутреннего RC-гернератора 4.8 МГц. При тактовой 4.8 МГц и предделителе на 8 все работало нормально. Стоило только увеличить коэфиициент предделителя, программатор потерял чип. Вылечил кристалл аналогично.
Аналогично - достаточно изменить частоту SPI.
4.8MHz / 256 ~ 19kHz
avreal32 с ключиком -o15khz и всё перешивается.
Надо снизить нижнюю границу допустимого значения ниже 1кГц, а то 32768/256 = 128Гц :-)

Гораздо интереснее - "а какого".
Даже из-за "безударного" переключения частот (в документации задержка переключения T1 + (1..2)*T2, где T1 - период до переключения) должно было бы успеть, период при 19кГц немогим больше 50мкс, по документации выдержка от сброса до подачи команды входа в программирование 20мс, в avreal все 100мс.
Значит сброс CLKPR производится после снятия сброса в те 14 тактов дополнительной задержки, которые есть даже при 0-вом SUT.
Вероятно, так же и у всех регистров, кроме связанных с IO-портами - не зря там постоянно повторяется, что у портов асинхронный сброс непосредственно по поступлению какого-либо сигнала reset.
Т.е. при подаче сброса только переводятся в hi-z все выводы, но CLKPR не сбрасывается, по снятию сброса отрабатывает SUT, потом в 14 тактов происходит сброс всех регистров, включая CLKPR.
Поэтому при программировании действует оставшееся от программы состояние предделителя.



Цитата(galjoen @ May 5 2008, 00:13) *
Из PowerDown АВР выходит больно долго и энергию при этом потребляет. Не считая режима IDLE конечно.
Если работа от кварца - то кто угодно будет выходить долго и печально, так как надо раскачаться кварцу в генераторе и дождаться стабилизации его амплитуды. А от внутреннего RC - по документации старт за 6 тактов и я не замечал отклонений. Мерять время старта я не мерял, но у меня в одном месте контроллер просыпается из POWER DOWN по WDT interrupt с интервалом 250мс приблизительно на сотню тактов - ток укладывается в оценку по скважности исходя из потребления в непрерывном режиме и в POWER DOWN.
zhevak
Цитата(ReAl @ May 5 2008, 18:25) *
А там разве нет возможности изменить частоту SPI при программировании?

"Ви будете долго смеятся" (С), но в CV действительно нет никакой возможности, что бы изменить в STK500 частоту SPI. sad.gif Хотя, если быть до конца честным, то я особо-то и не искал. Я пощел коротким путем, загрузил AVR-Studio, из-под него вызывал STK-500 и там поправил частоту. После этого фьюзы у т13 поставил обратно на 9.6 МГц.

Цитата
... у меня в одном месте контроллер просыпается из POWER DOWN по WDT interrupt с интервалом 250мс приблизительно на сотню тактов - ток укладывается в оценку по скважности исходя из потребления в непрерывном режиме и в POWER DOWN.

250 мс -- это очень редко. Мне нужно эдак разов в 250 чаще щелкать. smile.gif
galjoen
Цитата(ReAl @ May 5 2008, 16:25) *
Если работа от кварца - то кто угодно будет выходить долго и печально, так как надо раскачаться кварцу в генераторе и дождаться стабилизации его амплитуды. А от внутреннего RC - по документации старт за 6 тактов и я не замечал отклонений. Мерять время старта я не мерял, но у меня в одном месте контроллер просыпается из POWER DOWN по WDT interrupt с интервалом 250мс приблизительно на сотню тактов - ток укладывается в оценку по скважности исходя из потребления в непрерывном режиме и в POWER DOWN.

При выходе из sleep происходит то-же, что и при запуске процессора. Т.е. если у вас SUT1..0=00, то действительно будет за 6 тактов просыпаться. А в других случаях добавляется 4 или 64 мс. Кстати 6 тактов это уже после делителя CLKPR. Если делитель = 128, то 768 тактов процессор будет просыпаться. А лишний ток при старте конечно только при работе от кварца потребляется.
ReAl
Цитата(zhevak @ May 5 2008, 15:59) *
250 мс -- это очень редко. Мне нужно эдак разов в 250 чаще щелкать. smile.gif
Да я видел, что нужно 1мс. WDT меньше 16мс не умеет.
Это я о другом - если бы AVR просыпался из power down так, как об этом говорит galjoen, то при периоде 250мс и задержке просыпания с полноценной жрачкой 64мс потребление очень отличалось бы от того, которое выходит по рассчёту 100 циклов работа, 250мс сон. А оно не отличалось.

Цитата(galjoen @ May 5 2008, 16:02) *
При выходе из sleep происходит то-же, что и при запуске процессора. Т.е. если у вас SUT1..0=00, то действительно будет за 6 тактов просыпаться. А в других случаях добавляется 4 или 64 мс.
Это Вы где-то в документации прочли или личный опыт?

У меня стоит SUT=10, т.е. 64мс, так как BOD выключен из-за того, что жрёт, зараза, а питание нарастает не слишком быстро (по осциллографу - где-то за 30-40мс). И при этом процессор потребляет полный ток отнюдь не 64мс из 250мс.

В документации (мега48-168, tiny13, mega128) написано
Для RC-генератора и внешнего тактирования:
Start-up Time from Powerdown and Power-save - 6CK
Additional Delay from Reset (VCC = 5.0V) - 14CK / 14CK + 4.1 ms / 14CK + 65 ms в зависимости от SUT
Т.е. из power down стартует за 6 циклов. После сброса - дополнительная задержка.
Для кварца и кермаического резонатора там другие задержки, нужные для разгона. Дополнительная задержка по SUT та же, она не зависит от источника тактирования.


Цитата(galjoen @ May 5 2008, 16:02) *
Кстати 6 тактов это уже после делителя CLKPR. Если делитель = 128, то 768 тактов процессор будет просыпаться.
Меня до сих пор не интересовал предделитель, но считаю, что это не страшно. Он будет просыпаться шесть тех времён, на которые мы уже согласились как на длительность одного машинного цикла, длительность выполнения простой команды. Потом ещё четыре 128-тактовых таких цикла идёт на вход в прерывание, два - на rjmp с вектора на первую команду обработчика, ...
В любом случае это не те "SUT-овые" 64 мс, о которых Вы говорите.

Хотя странно.
У тини13 вообще на блок-схеме делитель не нарисован отдельно.
У меги48 - после мультиплексора тактирования сигнал идёт отдельно на логику сброса, отдельно на предделитель, с которого на clock control unit.
У тини25 - после мультиплексора сначала на предделитель, с него на логику сброса и clock control unit.

Интересно, из этих шести циклов четыре - те же самые, что и при выходе из IDLE (которые тоже отдельные, ещё четыре на вход в прерывание потом само собой), или "аж ещё" дополнительные?
Надо проверить.
galjoen
Цитата(ReAl @ May 5 2008, 17:56) *
WDT меньше 16мс не умеет.

Проверял, WDT вообще вместо типовых 2.1 секунды при максимальном делителе - от 1.5 до 1.8 имел. Нельзя к нему привязываться если хоть какая-то точность нужна.
Цитата(ReAl @ May 5 2008, 17:56) *
Это я о другом - если бы AVR просыпался из power down так, как об этом говорит galjoen, то при периоде 250мс и задержке просыпания с полноценной жрачкой 64мс потребление очень отличалось бы от того, которое выходит по рассчёту 100 циклов работа, 250мс сон. А оно не отличалось.

Это Вы где-то в документации прочли или личный опыт?

Я эксперементировал с кварцем. У меня при SUT-овых 64mc потребление повышалось, но не так сильно, как в рабочем режиме. При работе от внутреннего генератора думаю, что потребление вообще не повысится.
Цитата(ReAl @ May 5 2008, 17:56) *
У меня стоит SUT=10, т.е. 64мс, так как BOD выключен из-за того, что жрёт, зараза, а питание нарастает не слишком быстро (по осциллографу - где-то за 30-40мс). И при этом процессор потребляет полный ток отнюдь не 64мс из 250мс.

Я об этом и не писал. Я имел ввиду, что при просыпании расходуется лишняя энергия (это уже из личного опыта). И если ЧАСТО просыпаться, то лучше вообще не засыпать, а использовать CLKPR. То, что время просыпания зависит от CLKPR это точно - проверял. И у меня получилось, что по потреблению энергии выгоднее использовать максимальный CLKPR, чем на 5 мс засыпать. Хотя это для кварца. Для внутреннего генератора времена видимо другие, но на 1 мс думаю засыпать и в этом случае не стоит.
ReAl
Цитата(galjoen @ May 5 2008, 17:29) *
Я эксперементировал с кварцем. У меня при SUT-овых 64mc потребление повышалось, но не так сильно, как в рабочем режиме. При работе от внутреннего генератора думаю, что потребление вообще не повысится.
А нельзя ли точно сказать - какой был контроллер, какие CKSEL/SUT?
А то мало ли что... Вдруг не туда глянули... Вы говорили о SUT=00, а при каких остальных битах они были?
Вон у меги64/128, меги32, меги 48//168 для кварца/керамического резонатора
при CKSEL0=0
SUT=00 - 258 CK - 4.1ms - Ceramic resonator, fast rising power
при CKSEL0=1
SUT=00 - 1K CK - 65ms - Ceramic resonator, slowly rising power
SUT=11 - 16K CK - 65ms - Crystal Oscillator, slowly rising power
Т.е. разница между SUT=00 и SUT=11 при CKSEL0=1 совсем не во времени дополнительной задержки при сбросе. А разница времени просыпания в 15К периодов резонатора (около двух милисекунд на 7,37МГц), достаточна, чтобы заметить.

Ещё раз:
Цитата(galjoen @ May 5 2008, 00:13) *
Из PowerDown АВР выходит больно долго и энергию при этом потребляет. Не считая режима IDLE конечно.

Цитата(galjoen @ May 5 2008, 16:02) *
При выходе из sleep происходит то-же, что и при запуске процессора. Т.е. если у вас SUT1..0=00, то действительно будет за 6 тактов просыпаться. А в других случаях добавляется 4 или 64 мс.

Нет. При выходе из power down происходит только задержка на раскачку генератора. Для RC-генератора она установлена в 6 тактов, для керамических/кварцевых гораздо длиннее. Никаких 4 или 65 мс при выходе из power down не добавляется.
Проверьте сами.
Устанавливаем WDT на прерывания, минимальный период - около 2мс.
Перед командой sleep поднимаем ножку, в начале обработчика прерывания опускаем.

Код
MCU = attiny13
FUSES = wdton=1,bodlevel=2,sut=2,ckdiv=1,cksel=2
Для тини13 SUT=2 (0b10) - это 65мс от сброса, 6 циклов от побудки.

Код
#define PDOWN    B,0    // power down indicator
#define REQ    B,1    // interrupt request pin

#define TICK_PERIOD    WDTO_15MS
#define WD_MODE (1 << WDTIE) | (1 << WDTIF)
//#define WD_MODE (1 << WDE)

    .text
    .global main
main:
    outi    ACSR, (1 << ACD)
    outi    PORTB, MASK(REQ)
    outi    DDRB, ~MASK(REQ)
    out    MCUSR, __zero_reg__
    wdr
    outi    MCUCR, (1 << SE) | SLEEP_MODE_PWR_DOWN

    outi    WDTCR, (1 << WDCE) | (1 << WDE)
    outi    WDTCR, WD_MODE | TICK_PERIOD
    sei
1:    sbi    PORTBIT(PDOWN)
    sleep
    rjmp 1b

    .global WDT_vect
WDT_vect:
    cbi    PORTBIT(PDOWN)
    reti

Если бы по прерыванию от WDT выход из SLEEP_MODE_PWR_DOWN зависел от SUT, то у нас при данных FUSES никак на ножке PDOWN не получились бы импульсы с периодом около 2мс. Тогда должно было бы быть около 67мс.
А вот если сделать WD_MODE (1 << WDE), то на ножке PDOWN держится "1" окол 2мс, потом плавно падает в 0 (так как по сбросу нога переходит в hi-Z и к земле тянет входное сопротивления осциллографа), потом около 65мс низкий уровень и опять поднимается на 2мс. Заметьте - при этом фьюзы не менялись, только константа для записи в WDTCR.
defunct
Цитата(ReAl @ May 5 2008, 15:25) *
Значит сброс CLKPR производится после снятия сброса в те 14 тактов дополнительной задержки, которые есть даже при 0-вом SUT.

Дык, добавьте кратковременный положительный пульс на Reset
0-1-0 ..

Цитата(zhevak @ May 5 2008, 08:53) *
Поскольку используется счетчик (для отсчета времени в 1 мс), то уйти в Down или PowerSafe нельзя. Из этих режимов нельзя проснуться по таймеру. Актуальны только сброс, внешнее событие или вотч-дог. Этим объясняется большое энергопотребление.

Ну надо смотреть может Вам и не надо 1ms smile.gif или может быть можно снаружи взять 1kHz.
А так самый распространенный способ просыпать от WDT.

Цитата(galjoen @ May 5 2008, 16:02) *
А лишний ток при старте конечно только при работе от кварца потребляется.

t13 не имеет даже возможности тактироваться от внешнего кварца. Только RC и внешний клок.
ReAl
Цитата(defunct @ May 5 2008, 23:27) *
Дык, добавьте кратковременный положительный пульс на Reset
0-1-0 ..
А он есть, короткий, для повышения вероятности условия SCK=0 в момент подачи сброса (уменьшения потребности пересинхронизаций).
Т.е. сейчас 100мс сброс (этот для перевода портов в hi-Z, можно было и короткий сделать), несколько тактов (исходя из ключа -o) снятие сброса, 100мс сброс, вход в программирование.
Только тут какая штука - как я понял текст, те 14 тактов будут отрабатывать после снятия внутреннего сброса, т.е. после отработки SUT.
Если эта единичка на сбросе будет короче выставленной по SUT задержки, то, получается, CLKPR не сбросится (видимо, это у меня и было в эксперименте, у меня там в болванке SUT=2 забито). А если единичка будет длиннее более, чем на время от начала работы программы до записи делителя в CLKPR, то оно запишется опять smile.gif
Короче, а по дырочкам - ну никак попасть в те несколько тактов от конца работы SUT до записи в CLKPR всё равно не удастся.
Да и решается это всё с помощью -oочень_мало
Можно в тестовой программе сделать задержку милисекунд в 10 до записи в CLKPR и выставить SUT на 0мс, перекомпилировать avreal на милисекунду-другую единички между сбросами, ...
А оно надо?
galjoen
Цитата(ReAl @ May 5 2008, 23:36) *
А нельзя ли точно сказать - какой был контроллер, какие CKSEL/SUT?
А то мало ли что... Вдруг не туда глянули... Вы говорили о SUT=00, а при каких остальных битах они были?

Проверял на ATmega64 с кварцем 14.7456.
Фузы были такие:
CKSEL0..3=1111
1й вариант SUT01=11 - 16K CK - 64ms
2й вариант SUT01=10 - 16K CK - 0ms
BOD включена, а остальные фузы значения думаю не имеют.
Пробуждалось от таймера, работающего в ассинхронном режиме от часового кварца, а так-же от WDR.
Пробовал разные варианты с делением тактовой частоты (у ATmega64 регистр XDIV).

При пробуждении от таймера пришёл к следующим выводам:
1. SUT01 =11 или 10 на время пробуждения в этом режиме не влияет
2. При делении тактовой время пробуждения пропорционально увеличивается. В смысле время на эти 16K. Т.е проснутся, с поделённой на 4 тактовой, быстрее чем за 5 мс невозможно.
3. Потребление во время пробуждения, с пониженной за счёт XDIV тактовой, растёт за счёт увеличения времени этого самого пробуждения.
4. Наиболее экономично по потреблению просыпаться без деления тактовой.
5. Но ещё экономичнее вообще не засыпать на 5 мс, а просто делить тактовую на 128 и отключать всё что возможно (компаратор, АЦП, порты и т.д.). Видимо это происходит из-за дополнительных затрат при раскачке кварца. А м.б. что-то другое влияет - не выяснил.
6. М.б. есть смысл в IDLE уходить, но разницы в потреблении я не заметил поэтому так делать не стал

При пробуждении от WDR (а у ATmega64 это эквивалентно сбросу) таймера пришёл к следующим выводам:
1. SUT01 =11 или 10 на время пробуждения в этом режиме влияет (т.е. происходит полноценный сброс)
2. XDIV при этом сбрасывается
3. По потреблению (и точности по времени) этот способ явно хуже, чем пробуждение от часов, поэтому с ним особо не эксперементировал

С процессорами у которых WDR свой адрес в таблице переходов имеет не эксперементировал. Поэтому м.б. мы о разных вещах говорим. Я-то говорил о тех, у которых WDR эквивалентен сбросу. А задержка в 1 мс на пониженной в 256 раз тактовой это не более 40 тактов. Поэтому я писал, что нет смысла в слип уходить особенно если из него по WDR выходить придётся.
ReAl
Цитата(galjoen @ May 6 2008, 00:14) *
При пробуждении от таймера пришёл к следующим выводам:
1. SUT01 =11 или 10 на время пробуждения в этом режиме не влияет
....
При пробуждении от WDR (а у ATmega64 это эквивалентно сбросу)
С асинхронным таймером, как я понимаю, уход в power save был, который power down + работает асинхронный таймер?
И SUT ведь не влиял?
Так почему Вы говорите, что SUT влияет на время просыпания?

А про WDT у меги - сами же говорите, что это сброс а не побудка, там и должен SUT отработать.

Цитата(galjoen @ May 6 2008, 00:14) *
Поэтому м.б. мы о разных вещах говорим. Я-то говорил о тех, у которых WDR эквивалентен сбросу.
Я, конечно, зануда, но Вы говорили о том, что "при выходе из sleep происходит то же, что и при запуске процессора", а не "при сбросе по WDT происходит то же, что и при внешнем сбросе процессора". Со вторым я бы и не спорил.
galjoen
Цитата(ReAl @ May 6 2008, 01:32) *
1. С асинхронным таймером, как я понимаю, уход в power save был, который power down + работает асинхронный таймер?

2. И SUT ведь не влиял?

3. Так почему Вы говорите, что SUT влияет на время просыпания?

4. А про WDT у меги - сами же говорите, что это сброс а не побудка, там и должен SUT отработать.

5. Я, конечно, зануда,
6. но Вы говорили о том, что "при выходе из sleep происходит то же, что и при запуске процессора", а не "при сбросе по WDT происходит то же, что и при внешнем сбросе процессора". Со вторым я бы и не спорил.

1. Совершенно верно.
2. Я пробовал SUT=00 ставить (1K тактов на раскачку). Просыпался быстро, но некорректно т.к. этот режим для керамического резонатора.
3. От SUT кол-во тактов раскачки зависит. Т.е. время просыпания. Когда я это писал, о работе от встроенного генератора, как и о t13, речи ещё не было. Обсуждались АВР вообще.
4. Совершенно верно, но WDR можно использовать для побудки, если в ОЗУ достаточно длинный ключ писать, а при пробуждении проверять, что от WDR проснулись и этот ключ.
5. Видимо мы с вами одной крови.
6. Был неправ. Надо было написать "при выходе из sleep происходит то же, что и при запуске процессора, за исключением задержки Tr, если таковая имеется".
defunct
Цитата(ReAl @ May 6 2008, 00:10) *
Если эта единичка на сбросе будет короче выставленной по SUT задержки, то, получается, CLKPR не сбросится (видимо, это у меня и было в эксперименте, у меня там в болванке SUT=2 забито). А если единичка будет длиннее более, чем на время от начала работы программы до записи делителя в CLKPR, то оно запишется опять smile.gif

Эх, весело однако. wink.gif
ReAl
Цитата(galjoen @ May 6 2008, 01:07) *
3. От SUT кол-во тактов раскачки зависит. Т.е. время просыпания. Когда я это писал, о работе от встроенного генератора, как и о t13, речи ещё не было. Обсуждались АВР вообще.
...
5. Видимо мы с вами одной крови.
3. Ну так и я обсуждал выход из power down вообще, хоть по прерыванию от WDT, хоть по внешнему wink.gif Просто на макете проще проверить WDT-шное, ничего тянуть не надо smile.gif
5. Запросто!


Цитата(zhevak @ May 4 2008, 22:03) *
Вчера я тоже наступил на эти же грабли, только с STK500 и Tiny13. Причем дважды.
...
При тактовой 4.8 МГц и предделителе на 8 все работало нормально. Стоило только увеличить коэфиициент предделителя, программатор потерял чип. Вылечил кристалл аналогично.
Я сегодня погонял на 3.3В тини13 с 9.6МГц, для 4.8 для случая побудки из power down мало что изменится - частота ниже, но время выполнения будет дольше, микроджоули на команду от частоты 9,6 или 4,8 не зависят smile.gif

Вышло следующее:
9,6МГц полное потребление - 3,5мА
Висение в ILDE - забыл померять

9,6 / 8
Полное - 670мкА
IDLE - 235мкА
Просыпание из IDLE по таймеру раз в 820мкс (почему именно такое время - ниже) и работа в течении 160 тактов - 300мкА

9,6 / 64
полное 173мкА, но в это время успевает сделать только 125 тактов
не-совсем-IDLE - 138мкА (просыпание по таймеру раз в 820мкс только затем, чтобы сразу же заснуть).

Теперь с уходом в power down с побудкой по PCINT от генератора. Точнее, от половинки генератора, так как снаружи у тини13 был один транзистор BC557, один конденсатор 1нФ, два резистора - 1МОм и 300 Ом, вторая половина мультивибратора реализована программно.
Период у генератора вышел 820мкс.
WDT выключен.

Побудка из power down раз в 820мкС на время 102мкс (это длительность импульса на ножке, полнимается первой командой обработчика прерывания, опускается перед командой sleep).
Это по числу выполняемых команд эквивалентно непрерывной работе с 9,6 / 8.
Вышло 405мкА (меньше, чем 670мкА).

Побудка из power down раз в 820мкС на время 17мкс (меньше нехорошо по работе генератора).
Это по числу выполняемых команд за период - около 160 - больше, чем при непрерывной работе с 9,6 / 64.
Вышло 110мкА (меньше, чем 173мкА для непрерывной работы с CLK/64).

Если увеличить период, потребление упадёт.
Но я не включал аналоговый компаратор. Надо добавить его среднее потребление с учётом времени включенного состояния.

Вопрос стабильности и повторяемости генератора, конечо, стоит.
Повторяемость больше зависит от точности резистора и конденсатора, термостабильность определяется в основном дрейфом напряжения база-эмиттер в отношении к удвоенному напряжению питания. Думаю, это всё равно лучше, чем дрейф логических уровней AVR, да и нехорошо слишком плавно менять напряжение на входе, поэтому "генератор" из одного внешнего резистора и одного конденсатора я даже не паял.

У меня при нагреве дорожным (в не в смысле "строительным", а в смысле в дорогу брать, маленький такой) феном где-то градусов до 50 период падал до 805мкс, при охлаждении фризером из баллончика до "на корпусе транзистора иней выпал" - рос до 850мкс. Итого около 6% в диапазоне, +-3% от середины.

p.s. При побудке по PCINT либо INT0 импульсами от внешнего генератора от спада сигнала генератора на входе тини13 до перепада выхода, изменяемого первой командой обработчика прерывания - около 5,6мкс при тактовой 9,6МГц.
SasaVitebsk
Цитата(ReAl @ May 5 2008, 16:25) *
ШИМ, правда, 16кГц получается. Но и так, и без ШИМ - с внесением TOGGLE(MOSI) в цикл, и все ножки по одной, и в разных комбинациях - всё нормально перешивается на нормальной тактовой SPIЮ без занижения.
"Ну не знаю я".

Код
__task void    main( void )
{
  uint8_t    i;
  int8_t    j;

// Инициализация портов и переменных

//==== Таймер 2 =====
#ifdef __PORT88__
  TCCR2A=0x42;                                            // Таймер 2 инициализация FCLK/8 Режим СТС
  TCCR2B=0x2;                                            // с выводом на порт
  OCR2A=50;                                                // частота около 10 кГц
#else
  TCCR2=0x1a;                                            // Таймер 2 инициализация FCLK/8 Режим СТС
  OCR2=50;                                                // частота около 10 кГц
#endif


Давайте может прошивку вышлю готовую?
galjoen
Цитата(ReAl @ May 6 2008, 21:21) *
...
Вышло 405мкА (меньше, чем 670мкА).
...
Вышло 110мкА (меньше, чем 173мкА для непрерывной работы с CLK/64).
...

Т.е. получается, что в случае использования внутреннего генератора эффективнее уходить в слип, чем использовать деление тактовой частоты.
У меня, при использовании кварца, получилось наоборот. Видимо это объясняется тем, что пока кварц долго-долго раскачивается энергия-то потребляется, и, в период раскачки, потребление (генератором) даже БОЛЬШЕ, чем при нормальной работе кварца. К тому-же на время меньше 1 мс с кварцем в слип уходить невозможно, т.к. генератор раскачивается более 1 мс.

Аналоговый компаратор по умолчанию включен. М.б. вы хотели сказать, что не выключали его?
zhevak
Цитата
Я сегодня погонял на 3.3В тини13...


Спасибо, ReAl!
Я очень внимательно прочитал Ваш отчет. И скажу, Вы даже мне немного помогли. Т.е Вы проделали какую-то часть моей работы, за что я Вам очень и очень благодарен. Вы подтвердили, что моя задача "прямо в лоб" все-таки не решается. Ну что ж, непроблема! Будем искать обходные пути. smile.gif

Кстати, всех с наступающим Праздником -- С днем Радио!
ReAl
Цитата(SasaVitebsk @ May 6 2008, 21:26) *
Давайте может прошивку вышлю готовую?
Я не вижу причин, по которым именно 10кГц должны мешать (в силу того, что avreal можно запускать с всякими разными частотами), поэтому и поленился что-то выписывать - написал OCR2A = 0x7F;, включил "точный" ШИМ и всё.
У меня есть макетка с кучей панелек, где на каждую разведен только разъём программирования и возле каждой персональные гнёзда для кварца. Т.е. не важно, что прошивка может молотить ещё какими-то ногами, конфликтов не будет.
Есть мега 48 и 168 (и мега8, и 90s4433 smile.gif ). Давайте Ваш hex и перечень fuses, скажите, в какой кристалл шить (если скомпилируете и под 48, и под 168 - будет тольео интереснее). Впереди выходные, чай есть, осциллограф есть - попробую.
Но что-то странное, не должно это влиять...



Цитата(galjoen @ May 6 2008, 21:46) *
Т.е. получается, что в случае использования внутреннего генератора эффективнее уходить в слип, чем использовать деление тактовой частоты. У меня, при использовании кварца, получилось наоборот. Видимо это объясняется тем, что пока кварц долго-долго раскачивается энергия-то потребляется, и, в период раскачки, потребление (генератором) даже БОЛЬШЕ, чем при нормальной работе кварца.
Ну да, я же об этом сразу и сказал
Цитата(ReAl @ May 5 2008, 15:25) *
Если работа от кварца - то кто угодно будет выходить долго и печально, так как надо раскачаться кварцу в генераторе и дождаться стабилизации его амплитуды. А от внутреннего RC - по документации старт за 6 тактов и я не замечал отклонений. Мерять время старта я не мерял,
...
Больше потребление во время раскачки или нет - это надо смотреть, но что при CLK/XXX все 100% времени работы используются, а при просыпании на полезное время, равное времени раскачки кварца - выходит что 50% времени генератор лупит зря, да и ядро при этом потребляет, хоть и на месте топчется.
Ну а время я таки замерял, в предыдущем сообщении грубо указал, а точнее так:
При 9,6МГц (замер дал время одного цикла около 105нс, т.е. 9,52МГц) время старта из IDLE - 1,36мкс от спада на входной ножке до перепада на выходной, т.е. 13 тактов. Из них (обратным ходом от выходной ножки к входному воздействию)
а) 2 - сама команда SBI, которая состояние ножки поменяла
б) 2 - rjmp из вектора на обработчик
в) 4 - обычный вход в прерывание
г) 4 - указанная в документации доп. задержка при просыпании.
Итого 12, а ещё один где-то на подсинхронизациях набрался.

А вот из POWER DOWN - 5,68мкс (54 такта). Если считать, что к 13 при IDLE должно добавиться 6 раскачки генератора, то это 19, выходит, 35 тактов генератор стартовал до того уровня, когда его сигнала стало достаточно для работы счётчика start-up?
Что-то много для RC-генератора. Пары тактов достаточно, да и то - период первых может быть не тот, но амплитуда-то сразу нормальная должна быть. Ну, как сделано, так сделано. В любом случае 35 тактов не многие тысячи, как для кварца.
О, интересно (продолжаю расшифровывать вчерашние заметки).
При CLK/8 выход из IDLE, как положено, удлиннился в 8 раз до ~10.8мкс, а выход из POWER DOWN - до 19,8мкс, около 3,5раз.
Так, если добавить к задержке IDLE "те 6 тактов", то разница между полученным и задержкой POWER DOWN в микросекундах меняется очень мало при изменении делителя от /1 до /64.
А если добавить ещё такт, то она равна приблизительно 3.5мкс независимо от делителя.
Т.е. при выходе из POWER DOWN сначала идёт фиксированная задержка около 3,5мкс (включение источников тока генератора?), потом отрабатывается 7 CK (с учётом CLKPR) и дальше идёт то, что идёт при просыпании из IDLE. Куда делся ещё такт - лень выяснять, вечно на какие-то подсинхронизации/конвейеризации они уходит, в уставновившемся режиме всё на месте, а при переходных режимах куда-то пропадают. Был бы это мой проект в ПЛИС - обязательно искал бы biggrin.gif

Цитата(galjoen @ May 6 2008, 21:46) *
Аналоговый компаратор по умолчанию включен. М.б. вы хотели сказать, что не выключали его?
Нет, именно не включал. Я его выключил на старте программы, а при просыпаниях не включал, так как всё равно не знаю, на какое время его включение нужно zhevak. На время POWER DOWN, насколько я помню, компаратор выключается автоматически, но я во всех тестовых программках (и с непрерывной работой с делителем, и с уходом в IDLE с побудкой по таймеру, ...) компаратор выключал сразу для равенства условий.

Кстати, из тех 110мкА где-то 8-10 ушло на "генератор побудки". Может даже немного больше.
SasaVitebsk
Цитата(ReAl @ May 7 2008, 11:55) *
Я не вижу причин, по которым именно 10кГц должны мешать (в силу того, что avreal можно запускать с всякими разными частотами), поэтому и поленился что-то выписывать - написал OCR2A = 0x7F;, включил "точный" ШИМ и всё.
У меня есть макетка с кучей панелек, где на каждую разведен только разъём программирования и возле каждой персональные гнёзда для кварца. Т.е. не важно, что прошивка может молотить ещё какими-то ногами, конфликтов не будет.
Есть мега 48 и 168 (и мега8, и 90s4433 smile.gif ). Давайте Ваш hex и перечень fuses, скажите, в какой кристалл шить (если скомпилируете и под 48, и под 168 - будет тольео интереснее). Впереди выходные, чай есть, осциллограф есть - попробую.
Но что-то странное, не должно это влиять...


К счастью у меня нет претензий к AVREALу. Одни благодарности. beer.gif beer.gif beer.gif
Я его и не мучил сильно. Я сразу в студию полез ч/з ICE2. И там - те же хомуты. HEX в личку.
zhevak
как в старом анекдоте про золотую рыбку:
-- Ящик водки и всех обратно!

Мне в очередной раз пришлось вернуться к теме энергетики. Слепил схему внешнего RC-хронометра, по аналогии ReAl, только без транзистора. Питание, резистор 2.7 МОм, средняя точка, конденсатор 470 пФ, земля. Средняя точка сразу на лапку тайни13, т.е. -- без транзистора. В нормальном состоянии нога повернута на ввод (без подтяжки) и отслеживает заряд конденсатора. Как только напряжение на конденсаторе станет определяться как логическая единица, возникает прерывание и тайни пробуждается, она переворачивает ногу на выход и разряжает конденсатор. Потом ногу поворачивает на вход и снова уходит в PowerDown.

Объясняю почему сделал именно так. Не опасно, гореть, собственно, нечему; энергии и так не хватает. (Порты у АВРок достаточно мощные в этом плане и защищены от к.з., т.е. кратковременно держат коротыш и на землю, и на питалово.) Емкость 470 пик -- разряжается за каких-то 200-300 нс. Т.е. конденсатор успевает разрядится до нуля.

Что в результате поимел с этого?

1. Для меня осталось загадкой, почему изменеие номиналов R и C практически не влияет на энергопотребление. На частоту влияет, а на потребляемый ток, практически, -- нет. Изменение емкости с 470 пф на 1000 пФ приводит к уменьшению частоты почти в два раза, а потребляемый ток уменьшается примерно на 10%. То же самое про резистор. Я его менял от 1 МОм до 2.7 МОм.

2. Упомянутый выше компаратор выключен. А более точно, принудительное выключение (поднятием бита ACD в регистре ACSR) не приводит к уменьшению потребляемого тока.

3. Снял завсимость потребляемого тока от питающего напряжения. (Зависимость похоже квадратичная.)
Вот табличка: первая колонка -- напряжение питания (В), вторая -- потребляемый ток (мкА), третья -- частота (кГц)

5.0 288 1.40
4.0 168 1.39
3.3 102 1.36
3.0 78 1.335
2.7 59 1.33
2.5 49 1.26
2.0 30 1.23

4. Обследовал три штуки тайни13. Разброс следующий:
Питание 5В, потребление: 287, 350 и 364 мкА
Питание 3.3В, потребление: 100, 114 и 122 мкА, соответственно, у первой, второй и третьей.

Видно, что несколько не "сшиваются" данные с первой табличкой. Это объясняется тем, что это были разные замеры и я не особо тщательно выствлял напряжение питания. Разброс в 2-3% меня вполне устравал.

Частота была каждый раз разной, но в пределах 1.3-1.5 кГц. (Честно говоря, мне нужна частота 1 кГц, но это не принципиально.)

5. Я увидел, что частота достаточно слабо зависит от питания, и эта зависимость меня вполне устраивает.

6. Мне важно было получить потребление тока в 70-110 мкА при питании 5В. Как ни старался, мне этого добиться не удалось. Питание 3.3В меня не устраивает по одной причине -- мне нужно раскачивать ключ на полевом транзисторе (напряжение стока до 400В, ток стока до 100-150 мА). Таким транзисторам нужно в затвор запихивать как минимум вольта четыре, что бы получить сопротивление открытого канала несколько Ом. При трех (условно) вольтах (от MSP430) _ни_один_ транзистор у меня не заработал. Городить каскодную схему из пары полевиков -- можно. Собственно, у меня сейчас такая и собрана, но я как раз хотел бы уйти от нее. Не полуилось. sad.gif


А теперь вопросы.

1. Как Вы, ReAl, получили значение 8-10 мкА? Вычислением тактов?
Цитата(ReAl @ May 7 2008, 13:55) *
Кстати, из тех 110мкА где-то 8-10 ушло на "генератор побудки". Может даже немного больше.


2. Кто-нибудь работал с AVR-ками c PicoPower? На сколько они имеют меньшее энергопотребление относительно не PiciPower АВРок? А при питании 5В?

3. Существуют-ли еще какие-нибудь способы понизить энергопотребление или я уже уперся в предел АВР-ок? Пожалуйста, укажите направление. Тропинку я и сам найду smile.gif
zhevak
хочу добавить про MSP430. Может кому будут интересны полученные цифры.

После обеда проделал то же самое на MSP430F2001 и получил следущие результаты (напряжение питания (В), потребляемый ток (мкА), частота (Гц)):

3.3 74 983
3.0 62 969
2.7 52 949
2.5 44 930
2.0 31 867
1.8 25 832
1.5 19 777

Ядро уводил в глубокий даун (LPM4), просыпался по изменению сигнала на ноге (RC-хрон), дергал другой ножкой (импульс в затвор ключа -- см. предыдущий пост), потом изменял направление ноги, разряжал конденсатор, снова менял направление ноги. Т.е. все по минимуму. Накрутить функциональность -- дело не хитрое! А вот получить твердый минимум по потреблению, т.е. знать реально до какой величины можно опускаться -- это важно.

Хочу заметить, что при низком напряжении питания около 2В Тайни13 Веля себя крайне неустойчиво. Иногда даже вооще отказывалась релаксировать. В то время как МСП430Ф2001 удалось проснять полностью, вплоть до 1.5 В. Да, чуть не забыл! У МСП внутренний DCO-генератор был настроен на 1 МГц, а у Тайни13 -- на 9.6 Мгц.
smk
Цитата
Да, чуть не забыл! У МСП внутренний DCO-генератор был настроен на 1 МГц, а у Тайни13 -- на 9.6 Мгц.

Ну так это принципиально. Настройте Тиню на 128 кГц и потребление упадет в разы. Не забывайте принудительно выключать АЦП, если он включается и т.п.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.