У меня на stm32f1c8t6 восьмиканальный работает. Восхотелось маленькую коробочку на 25тиньке. Вот пытаюсь понять, если в таймере 1 ставлю переполнение по регистру С, какое прерывание должно отрабатывать переполнение? В 328 при установке режима СТС по регистру А срабатывает прерывание А, в 25тиньке СТС по регистру С. Прерывания по С нет. Пытаюсь понять овер будет работать или нет. В даташите не нашёл никаких слов по этому вопросу.
Да нет, там же видно прирост яркости, если двинуть ползунок дальше при мерцании. Причем оно бывает и на малой яркости мерцает, просто это не так заметно глазом, а бывает на всем диапазоне регулировки работает без мерцания. Я там уровни подбирал чтобы от совсем темного до совсем яркого ровно двигалось. Не в оверлоаде проблема точно. Что-то с цикличностью таймера происходит. Ограничить верхнюю планку мне еще и лучше в инкубаторах. Чтобы лампы сберечь. Да только не решит это проблему.
Дмитрий, может я уже вышлю вам готовый блок для препарации? Могу два :) Ну жалко такой проект губить.
Umka, да нет у меня интереса возится. У меня ДУЕ сейчас в голове :) Если б был интерес, я б написал сразу без уговоров. Тем более усложняет ситуацию тот факт, что тинька не удобна в отладке. По моему наш коллега nic182 заинтересовался, подождите, может чего напишет)
nik182, по поводу #54 малость туплю, не совсем понял в чём затык. Случайно эта темка не поможет?
Я разобрался. Конкретно в тиньке в режиме СТС нет прерываня при сбросе счётчика при достижении значения значения регистра С . Есть А В и оверлоад. Оверлоад работает только при достижении значения 0xff. Сделал синхронизацию как здесь https://www.circuitar.com/media/product/26/files/Zero_Cross_v1.0.pdf на переменном резисторе мерцаний нет. Сейчас i2c прикручу и попробую. Но проблема остается. Регулирование от 0 до 100% не получается из за ширины импульса синхронизации. Получилось или 10-100% или 0-90%. Если посадить массу на нейтраль и выкинуть опторазвязку, а фазу подать сразу на ногу тиньки через 1 МОм, то диапазон почти 0-99%.
З.Ы. Нормально работает только с ядром tiny NOMILLIS!
Вот этот скетч у меня не моргает. Обратите внимание - синхронизация на ногу PB1 и строки 11 и 29.
// автономный диммер на ATtiny85
// управляется по I2C. По мотивам
//<a href="<a href="<a href="http://forum.arduino.cc/index.php?topic=314773.0" rel="nofollow">http://forum.arduino.cc/index.php?topic=314773.0</a>" rel="nofollow"><a href="http://forum.arduino.cc/index.php?topic=314773.0" rel="nofollow">http://forum.arduino.cc/index.php?topic=314773.0</a></a>" rel="nofollow"><a href="<a href="http://forum.arduino.cc/index.php?topic=314773.0" rel="nofollow">http://forum.arduino.cc/index.php?topic=314773.0</a>" rel="nofollow"><a href="http://forum.arduino.cc/index.php?topic=314773.0" rel="nofollow">http://forum.arduino.cc/index.php?topic=314773.0</a></a></a>
#include <TinyWireS.h>
#define I2C_SLAVE_ADDR (0x41)
#define DETECT 1 //zero cross detect, interrupt 0, is physical pin 6
#define GATE 3 //triac gate is physical pin 2
#define PULSE 5 //trigger pulse width (counts)
// I2C pins: PB2 - SCL, PB0 - SDA
volatile byte i2cValue, ocr,jj;
void setup() {
// set up pins
TinyWireS.begin(I2C_SLAVE_ADDR);
DDRB &= ~(1 << DETECT); //zero cross detect
PORTB |= (1 << DETECT); //enable pull-up resistor
DDRB |= 1 << GATE; //triac gate control
GIMSK = 1 << PCIE;
PCMSK = 1 << PCINT1;
OCR1A = 50; //initialize the comparator
TIMSK = _BV(OCIE1A) | _BV(TOIE1); //interrupt on Compare Match A | enable timer overflow interrupt
sei(); // enable interrupts
TinyWireS.onRequest(requestEvent);
}
ISR (PCINT0_vect) {
for(uint8_t ii=0; ii<200; ii++) jj++;
if (PINB&(1<<PINB1)) { return;}
TCNT1 = 0; //reset timer - count from zero
OCR1A=ocr;
TCCR1 = B00001010; // prescaler on 1024, see table 12.5 of the tiny85 datasheet
}
ISR(TIMER1_COMPA_vect) { //comparator match
PORTB |= (1 << GATE); //set triac gate to high
TCCR1 =0;
TCNT1 = 255 - PULSE; //trigger pulse width, when TCNT1=255 timer1 overflows
TCCR1 = B00001010;
}
ISR(TIMER1_OVF_vect) { //timer1 overflow
PORTB &= ~(1 << GATE); //turn off triac gate
TCCR1 = 0; //disable timer stop unintended triggers
}
void loop() { // use analog input to set the dimmer
if (TinyWireS.available()) i2cValue = TinyWireS.receive();
ocr = map(i2cValue, 0, 254, 145, 15);
TinyWireS_stop_check();
}
void requestEvent() {
TinyWireS.send(i2cValue);
}
Проблема была в первой строке прерывания синхронизации. If нужен что бы отсеять положительные фронты. Из-за хреновой аппраратной схемы был дребезг, который отсеевал и нужные. Небольшая задержка для подавления дребезга решила эту проблему. Нужно подобрать длительность задержки для конкретного датчика синхронизации. При подачи прямо переменки на вход схемы ненужен if - так самый лучший результат.
Подумал немного и заменил проверку уровня на проверку работы таймера. Тоже работает стабильно.
// автономный диммер на ATtiny85
// управляется по I2C. По мотивам
//<a href="<a href="<a href="http://forum.arduino.cc/index.php?topic=314773.0" rel="nofollow">http://forum.arduino.cc/index.php?topic=314773.0</a>" rel="nofollow"><a href="http://forum.arduino.cc/index.php?topic=314773.0" rel="nofollow">http://forum.arduino.cc/index.php?topic=314773.0</a></a>" rel="nofollow"><a href="<a href="http://forum.arduino.cc/index.php?topic=314773.0" rel="nofollow">http://forum.arduino.cc/index.php?topic=314773.0</a>" rel="nofollow"><a href="http://forum.arduino.cc/index.php?topic=314773.0" rel="nofollow">http://forum.arduino.cc/index.php?topic=314773.0</a></a></a>
#include <TinyWireS.h>
#define I2C_SLAVE_ADDR (0x41)
#define DETECT 1 //zero cross detect, interrupt 0, is physical pin 6
#define GATE 3 //triac gate is physical pin 2
#define PULSE 5 //trigger pulse width (counts)
// I2C pins: PB2 - SCL, PB0 - SDA
volatile byte i2cValue, ocr,jj;
void setup() {
// set up pins
TinyWireS.begin(I2C_SLAVE_ADDR);
DDRB &= ~(1 << DETECT); //zero cross detect
PORTB |= (1 << DETECT); //enable pull-up resistor
DDRB |= 1 << GATE; //triac gate control
GIMSK = 1 << PCIE;
PCMSK = 1 << PCINT1;
OCR1A = 50; //initialize the comparator
TIMSK = _BV(OCIE1A) | _BV(TOIE1); //interrupt on Compare Match A | enable timer overflow interrupt
TinyWireS.onRequest(requestEvent);
TCCR1=0;
while((PINB&(1<<PINB1))!=0);
while((PINB&(1<<PINB1))==0);
for(uint8_t ii=0; ii<255; ii++) jj++;
TIFR=0xff;
for(uint8_t ii=0; ii<200; ii++) jj++;
sei(); // enable interrupts
}
ISR (PCINT0_vect) {
//for(uint8_t ii=0; ii<200; ii++) jj++;
//if (PINB&(1<<PINB1)) { return;}
if (TCCR1>0) return;
TCCR1 = 0;
TCNT1 = 0; //reset timer - count from zero
OCR1A=ocr;
TCCR1 = B00001010; // prescaler on 1024, see table 12.5 of the tiny85 datasheet
}
ISR(TIMER1_COMPA_vect) { //comparator match
PORTB |= (1 << GATE); //set triac gate to high
TCCR1 =0;
TCNT1 = 255 - PULSE; //trigger pulse width, when TCNT1=255 timer1 overflows
TCCR1 = B00001010;
}
ISR(TIMER1_OVF_vect) { //timer1 overflow
PORTB &= ~(1 << GATE); //turn off triac gate
TCCR1 = 0; //disable timer stop unintended triggers
}
void loop() { // use analog input to set the dimmer
if (TinyWireS.available()) i2cValue = TinyWireS.receive();
ocr = map(i2cValue, 0, 254, 145, 15);
// ocr=100;
TinyWireS_stop_check();
}
void requestEvent() {
TinyWireS.send(i2cValue);
}
Синхронизация на первой ноге не обязательно. У меня плата на первую ногу разведена, так что так получилось.
Второй скетч это проверка идеи, что во всём виновато железо. Можно так и так.
Подобрать в map() значения нужно. Хотя для i2c я не понимаю зачем. Значения можно сразу нужные писать. Разве что для единообразия, тогда непонятен входной диапазон. Я бы его от 0 до 100 сделал и посылал проценты от полной мощности.
Ну, мапить по нескольким причинам. Края чтобы нормально были, шаг ровнее и ширше :) Мне не только для света, а для нагрева инкубаторов ПИД регулятором. То есть чтобы лампа тепло линейно отдавала по изменению значения. 255 это байт. Байт и в порт слать удобнее и в ШИМе 8 бит разрядность. А на ЕСП82266 есть готовый интерфейс для руления диммером как ШИМ. Я сейчас этот диммер и гоняю в браузере мышкой. Большое спасибо за помощь!
Если рулите лампочками, то прыжок от 0 максимума всегда плохо. Если на секунду затянуть включение то вероятность выхода из строя ламп накаливания резко уменьшается. Т.е. да, было бы не плохо.
Объясните пожалуйста, что подключаем к PULSE 2 не совсем понятно... 1 провод на аппаратное прерывание это PCINT2 или 7 нога тини, PCINT3 или 2я нога на управление семистором, 3 на землю.... там питание тоже ясно... что за trigger pulse width (counts) и к чему его цеплять?
Это не цеплять. Это честная длина импульса зажигания тиристора в тиках таймера. Счётчик таймера после срабатывания переставляется на это число до конца счёта.
Вырубить ресет в финальной прошивке и пользоваться. Ну или вернуть ресет при надобности высоковольтным программатором. Я делал, не сложно. Я про сам код говорю. Добавить второй байт в i2c обмен для выбора канала и добавить дрыг пинами для диммера. Вроде так.
С используемым алгоритмом больше двух каналов использовать невозможно. Нужно полностью переписать программу. Если задействовать нулевой таймер, то можно максимум два канала по этому алгоритму. Для обеспечения окончания запуска тиристора счетчик таймера переписывается на пред конечное значение, поэтому его не получится использовать для другого канала. Всего два таймера. Каналов можно сделать только два. Или полностью переписать алгоритм.
Использовать такой же алгоритм. Только как потом счетчик сбрасывать? Просто по детектору обнулять и считать какой пин когда включить? Если бы я в этом железе тини понимал...
Господа, может кто возьмется на 4 канала переписать? А то у меня никак со временем свободным, а тут вникать надо в архитектуру. Боюсь не скоро руки дойдут.
C:\Users\Serhiy\AppData\Local\Temp\arduino_modified_sketch_356543\sketch_jan23c.ino: In function 'void setup()':
sketch_jan23c:25: error: 'class USI_TWI_S' has no member named 'onRequest'
TinyWireS.onRequest(requestEvent);
^
C:\Users\Serhiy\AppData\Local\Temp\arduino_modified_sketch_356543\sketch_jan23c.ino: In function 'void loop()':
sketch_jan23c:55: error: 'TinyWireS_stop_check' was not declared in this scope
TinyWireS_stop_check();
^
Используем библиотеку TinyWireS в папке: C:\Program Files (x86)\Arduino\libraries\TinyWireS (legacy)
exit status 1
'class USI_TWI_S' has no member named 'onRequest'
Ну вот там по ссылочке 10 сверху файлик и есть библиотека. TinyWire-master.zip называется.
А RC цепочка предусмотрена на плате. А как же. И усреднение скользящее в коде имеется. Все там есть, надо только ошибку мерцания подправить и можно пробовать.
Ну вот там по ссылочке 10 сверху файлик и есть библиотека. TinyWire-master.zip называется.
А RC цепочка предусмотрена на плате. А как же. И усреднение скользящее в коде имеется. Все там есть, надо только ошибку мерцания подправить и можно пробовать.
Я вот так и не разгадал почему мерцает, смотрел осциллографом и видно как МК порой включает симистор чучуть позднее или чучуть раньше чем нужно. Почему так я хз.
Вопрос по тому что код не компилируется снят. С гугла попал на Вашу тему, товарищ dimax как всегда внёс ясность в ситуацию, за что ему спасибо большое.
Это не цеплять. Это честная длина импульса зажигания тиристора в тиках таймера. Счётчик таймера после срабатывания переставляется на это число до конца счёта.
Так это не порт даже. Предлагаю для ясности назвать пины PB* в исходниках. К стати, если разлочить порт ресет, то обращаясь к нему просто через цифру 5 ничего не будет, он неразмечен в ядре, а вот через PB5 - запросто.
Ах да, и ещё, для удобной отладки я сносить загрузчик дигиспарка не стал, ядро Micronucleus позволяет прошивать даже hex-файлы. Просто лень собирать ВВ программатор, ибо после разлочки ресета только ВВ программатор или загручкик.
То есть я откомпилил hex-файл при варианте без загрузчика, но при помощи дигиспаркового загрузчика прошил hex-файл во flash микроконтроллера, и теперь могу и работать с PB5 и прошиваться по юсб. Я знаю толк в извращениях, если кратко. После отладки, когда код заработает так как мне нужно я полностью откажусь от дигиспарк, использовать буду один микроконтроллер в дип корпусе.
Во чего нарыл http://dimmer.readthedocs.io/en/latest/
Umka, на сайберплейсе есть темка про многоканальный диммер.
Ну там своя либа у них еще. Хотя по отзывам вроде нормально работает.
У меня на stm32f1c8t6 восьмиканальный работает. Восхотелось маленькую коробочку на 25тиньке. Вот пытаюсь понять, если в таймере 1 ставлю переполнение по регистру С, какое прерывание должно отрабатывать переполнение? В 328 при установке режима СТС по регистру А срабатывает прерывание А, в 25тиньке СТС по регистру С. Прерывания по С нет. Пытаюсь понять овер будет работать или нет. В даташите не нашёл никаких слов по этому вопросу.
Ну что господа, нету идей больше по стабилизации свечения? Можно впадато в отчаяние и выкидывать кучку готовых плат?
Umka, так я ж вам написал -ограничить OCR. То, что вы считали за 70-80 процентов по факту являлось оверлоадом, т.е. >100% яркости
Да нет, там же видно прирост яркости, если двинуть ползунок дальше при мерцании. Причем оно бывает и на малой яркости мерцает, просто это не так заметно глазом, а бывает на всем диапазоне регулировки работает без мерцания. Я там уровни подбирал чтобы от совсем темного до совсем яркого ровно двигалось. Не в оверлоаде проблема точно. Что-то с цикличностью таймера происходит. Ограничить верхнюю планку мне еще и лучше в инкубаторах. Чтобы лампы сберечь. Да только не решит это проблему.
Дмитрий, может я уже вышлю вам готовый блок для препарации? Могу два :) Ну жалко такой проект губить.
mailumka2(пёс)gmail.com мой мыл, давайте спишемся.
Umka, да нет у меня интереса возится. У меня ДУЕ сейчас в голове :) Если б был интерес, я б написал сразу без уговоров. Тем более усложняет ситуацию тот факт, что тинька не удобна в отладке. По моему наш коллега nic182 заинтересовался, подождите, может чего напишет)
nik182, по поводу #54 малость туплю, не совсем понял в чём затык. Случайно эта темка не поможет?
Я разобрался. Конкретно в тиньке в режиме СТС нет прерываня при сбросе счётчика при достижении значения значения регистра С . Есть А В и оверлоад. Оверлоад работает только при достижении значения 0xff. Сделал синхронизацию как здесь https://www.circuitar.com/media/product/26/files/Zero_Cross_v1.0.pdf на переменном резисторе мерцаний нет. Сейчас i2c прикручу и попробую. Но проблема остается. Регулирование от 0 до 100% не получается из за ширины импульса синхронизации. Получилось или 10-100% или 0-90%. Если посадить массу на нейтраль и выкинуть опторазвязку, а фазу подать сразу на ногу тиньки через 1 МОм, то диапазон почти 0-99%.
З.Ы. Нормально работает только с ядром tiny NOMILLIS!
Ура, я что-то подобное и подозревал. 0-90% устроит полностью. Про ядро не понял, оно таймер отбирает?
Вот этот скетч у меня не моргает. Обратите внимание - синхронизация на ногу PB1 и строки 11 и 29.
Проблема была в первой строке прерывания синхронизации. If нужен что бы отсеять положительные фронты. Из-за хреновой аппраратной схемы был дребезг, который отсеевал и нужные. Небольшая задержка для подавления дребезга решила эту проблему. Нужно подобрать длительность задержки для конкретного датчика синхронизации. При подачи прямо переменки на вход схемы ненужен if - так самый лучший результат.
Подумал немного и заменил проверку уровня на проверку работы таймера. Тоже работает стабильно.
Благодарю, сейчас заценим. А синхронизация именно на 1 пине обязательно? Вроде же один порт.
Первый скетч не мерцает.
ocr = map(i2cValue, 0, 254, 245, 10);
Второй есть смысл проверять?
Синхронизация на первой ноге не обязательно. У меня плата на первую ногу разведена, так что так получилось.
Второй скетч это проверка идеи, что во всём виновато железо. Можно так и так.
Подобрать в map() значения нужно. Хотя для i2c я не понимаю зачем. Значения можно сразу нужные писать. Разве что для единообразия, тогда непонятен входной диапазон. Я бы его от 0 до 100 сделал и посылал проценты от полной мощности.
Ну, мапить по нескольким причинам. Края чтобы нормально были, шаг ровнее и ширше :) Мне не только для света, а для нагрева инкубаторов ПИД регулятором. То есть чтобы лампа тепло линейно отдавала по изменению значения. 255 это байт. Байт и в порт слать удобнее и в ШИМе 8 бит разрядность. А на ЕСП82266 есть готовый интерфейс для руления диммером как ШИМ. Я сейчас этот диммер и гоняю в браузере мышкой. Большое спасибо за помощь!
Как думаете, стоит ли плавности добавить в код? Ну чтобы не скачком менялас яркость, а плавно при изменении значения?
Если рулите лампочками, то прыжок от 0 максимума всегда плохо. Если на секунду затянуть включение то вероятность выхода из строя ламп накаливания резко уменьшается. Т.е. да, было бы не плохо.
#define PULSE 2 //trigger pulse width (counts)
Объясните пожалуйста, что подключаем к PULSE 2 не совсем понятно... 1 провод на аппаратное прерывание это PCINT2 или 7 нога тини, PCINT3 или 2я нога на управление семистором, 3 на землю.... там питание тоже ясно... что за trigger pulse width (counts) и к чему его цеплять?
Это не цеплять. Это честная длина импульса зажигания тиристора в тиках таймера. Счётчик таймера после срабатывания переставляется на это число до конца счёта.
Господа, а ведь на этой тиньке возможно и 4-канальный диммер запилить, если ресет вырубить! Реально?
Реально, если Вам есть чем её программировать с вырубленным ресетом. Я его регулярно вырубаю, чтобы пин освободить.
Вырубить ресет в финальной прошивке и пользоваться. Ну или вернуть ресет при надобности высоковольтным программатором. Я делал, не сложно. Я про сам код говорю. Добавить второй байт в i2c обмен для выбора канала и добавить дрыг пинами для диммера. Вроде так.
С используемым алгоритмом больше двух каналов использовать невозможно. Нужно полностью переписать программу. Если задействовать нулевой таймер, то можно максимум два канала по этому алгоритму. Для обеспечения окончания запуска тиристора счетчик таймера переписывается на пред конечное значение, поэтому его не получится использовать для другого канала. Всего два таймера. Каналов можно сделать только два. Или полностью переписать алгоритм.
Да, тут по переполнению счетчика, но можно ведь сделать просто по достижению какого-то отсчета. Ну как у http://cyber-place.ru/showthread.php?t=525
Да, можно.
Кто программу писать будет? Та, что из ссылки не пойдёт. Сильно менять надо.
Использовать такой же алгоритм. Только как потом счетчик сбрасывать? Просто по детектору обнулять и считать какой пин когда включить? Если бы я в этом железе тини понимал...
Спасибо, около недели вынашивал мысль как сделать подобное устройство, а тут всё готовое.
Господа, может кто возьмется на 4 канала переписать? А то у меня никак со временем свободным, а тут вникать надо в архитектуру. Боюсь не скоро руки дойдут.
А точно та либа?
А точно та либа?
Дайте ссылку пожалуйста на ту, с которой у Вас всё работает.
https://goo.gl/xMztB2
Тут все есть. Смотрите V3 и там есть готовый hex с адресом 41.
Я сегодня попробую вернуться к аналоговому управлению. Должно оно и ШИМ рулиться.
https://goo.gl/xMztB2
Тут все есть. Смотрите V3 и там есть готовый hex с адресом 41.
Я сегодня попробую вернуться к аналоговому управлению. Должно оно и ШИМ рулиться.
Спасибо, и всё же был благодарен бы за ссилочку на библиотеку. Или архив с ней.
Должно оно и ШИМ рулиться.
Думаю только надо на входе АЦП RC цепочку добавить, или я ошибаюсь и хватит обычного усреднения?
Ну вот там по ссылочке 10 сверху файлик и есть библиотека. TinyWire-master.zip называется.
А RC цепочка предусмотрена на плате. А как же. И усреднение скользящее в коде имеется. Все там есть, надо только ошибку мерцания подправить и можно пробовать.
Ну вот там по ссылочке 10 сверху файлик и есть библиотека. TinyWire-master.zip называется.
А RC цепочка предусмотрена на плате. А как же. И усреднение скользящее в коде имеется. Все там есть, надо только ошибку мерцания подправить и можно пробовать.
Я вот так и не разгадал почему мерцает, смотрел осциллографом и видно как МК порой включает симистор чучуть позднее или чучуть раньше чем нужно. Почему так я хз.
Вопрос по тому что код не компилируется снят. С гугла попал на Вашу тему, товарищ dimax как всегда внёс ясность в ситуацию, за что ему спасибо большое.
Добавить поддержку ATtiny25/45/85 проще простого:
https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json
Так а под какую плату компилировали изначально? Это же само собою разумеется, сперва доску выбрать, потом под нее код компилировать.
Так а под какую плату компилировали изначально? Это же само собою разумеется, сперва доску выбрать, потом под нее код компилировать.
Изначально под дигиспарк и юсб загрузчиком, мой прокол.
А что делает ножка PULSE?
Ответ в сообщении 69.
Так это не порт даже. Предлагаю для ясности назвать пины PB* в исходниках. К стати, если разлочить порт ресет, то обращаясь к нему просто через цифру 5 ничего не будет, он неразмечен в ядре, а вот через PB5 - запросто.
Ах да, и ещё, для удобной отладки я сносить загрузчик дигиспарка не стал, ядро Micronucleus позволяет прошивать даже hex-файлы. Просто лень собирать ВВ программатор, ибо после разлочки ресета только ВВ программатор или загручкик.
А прерывание на USB?
А прерывание на USB?
Загрузчик работает пару секунд, потом глохнет и передаёт штурвал главной прошивке :)
То есть я откомпилил hex-файл при варианте без загрузчика, но при помощи дигиспаркового загрузчика прошил hex-файл во flash микроконтроллера, и теперь могу и работать с PB5 и прошиваться по юсб. Я знаю толк в извращениях, если кратко. После отладки, когда код заработает так как мне нужно я полностью откажусь от дигиспарк, использовать буду один микроконтроллер в дип корпусе.
С PB5 и я могу работать :)
Шить через загрузчик по USB hex файл... это надо придумать еще такое.
Короче я посчитал таки ноги и понял что 4-канала не выходит никак. Будем делать на свободных ногах выбор адеса. Как раз 4 варианта. Вот.
То есть я откомпилил hex-файл при варианте без загрузчика
не пробовал сравнить хексы с загрузчиком и без?
Шить через загрузчик по USB hex файл... это надо придумать еще такое.
http://digistump.com/board/index.php/topic,160.msg160.html#msg160
Шить через загрузчик по USB hex файл... это надо придумать еще такое.
http://digistump.com/board/index.php/topic,160.msg160.html#msg160
Капитан Очевидность - твой родственник?