Attiny85 и прерывание.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Во чего нарыл http://dimmer.readthedocs.io/en/latest/

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Umka, на сайберплейсе есть темка про многоканальный диммер.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Ну там своя либа у них еще. Хотя по отзывам вроде нормально работает.

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

У меня на stm32f1c8t6 восьмиканальный работает. Восхотелось маленькую коробочку на 25тиньке. Вот пытаюсь понять, если в таймере 1 ставлю переполнение по регистру С, какое прерывание должно отрабатывать переполнение? В 328 при установке режима СТС по регистру А срабатывает прерывание А, в 25тиньке СТС по регистру С. Прерывания по С нет. Пытаюсь понять овер будет работать или нет. В даташите не нашёл никаких слов по этому вопросу.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Ну что господа, нету идей больше по стабилизации свечения? Можно впадато в отчаяние и выкидывать кучку готовых плат?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Umka, так я ж вам написал -ограничить OCR. То, что вы считали за 70-80 процентов по факту являлось оверлоадом, т.е. >100% яркости

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Да нет, там же видно прирост яркости, если двинуть ползунок дальше при мерцании. Причем оно бывает и на малой яркости мерцает, просто это не так заметно глазом, а бывает на всем диапазоне регулировки работает без мерцания. Я там уровни подбирал чтобы от совсем темного до совсем яркого ровно двигалось. Не в оверлоаде проблема точно. Что-то с цикличностью таймера происходит. Ограничить верхнюю планку мне еще и лучше в инкубаторах. Чтобы лампы сберечь. Да только не решит это проблему. 

Дмитрий, может я уже вышлю вам готовый блок для препарации? Могу два :) Ну жалко такой проект губить. 

mailumka2(пёс)gmail.com мой мыл, давайте спишемся.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Umka, да нет у меня интереса возится. У меня ДУЕ сейчас в голове :) Если б был интерес, я б написал сразу без уговоров. Тем более усложняет ситуацию тот факт, что тинька не удобна в отладке. По моему наш коллега nic182 заинтересовался, подождите, может чего напишет)

nik182, по поводу #54 малость туплю, не совсем понял в чём затык. Случайно эта темка не поможет?

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

Я разобрался. Конкретно в тиньке в режиме СТС нет прерываня при сбросе счётчика при достижении значения значения регистра С . Есть А В и оверлоад. Оверлоад работает только при достижении значения 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!

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Ура, я что-то подобное и подозревал. 0-90% устроит полностью. Про ядро не понял, оно таймер отбирает?

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

Вот этот скетч у меня не моргает. Обратите внимание - синхронизация на ногу 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);
}

 

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Благодарю, сейчас заценим. А синхронизация именно на 1 пине обязательно? Вроде же один порт.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Первый скетч не мерцает.

ocr = map(i2cValue, 0, 254, 245, 10);

Второй есть смысл проверять?

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

Синхронизация на первой ноге не обязательно. У меня плата на первую ногу разведена, так что так получилось.

Второй скетч это проверка идеи, что во всём виновато железо. Можно так и так. 

Подобрать в map() значения нужно. Хотя для i2c я не понимаю зачем. Значения можно сразу нужные писать. Разве что для единообразия, тогда непонятен входной диапазон. Я бы его от 0 до 100 сделал и посылал проценты от полной мощности.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Ну, мапить по нескольким причинам. Края чтобы нормально были, шаг ровнее и ширше :) Мне не только для света, а для нагрева инкубаторов ПИД регулятором. То есть чтобы лампа тепло линейно отдавала по изменению значения. 255 это байт. Байт и в порт слать удобнее и в ШИМе 8 бит разрядность. А на ЕСП82266 есть готовый интерфейс для руления диммером как ШИМ. Я сейчас этот диммер и гоняю в браузере мышкой. Большое спасибо за помощь!

 

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Как думаете, стоит ли плавности добавить в код? Ну чтобы не скачком менялас яркость, а плавно при изменении значения?

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

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

stalker_kz
Offline
Зарегистрирован: 03.01.2017

#define PULSE 2       //trigger pulse width (counts)

Объясните пожалуйста, что подключаем к PULSE 2 не совсем понятно... 1 провод на аппаратное прерывание это PCINT2 или 7 нога тиниPCINT3 или 2я нога на управление семистором, 3 на землю.... там питание тоже ясно... что за trigger pulse width (counts) и к чему его цеплять?

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

Это не цеплять. Это честная длина импульса зажигания тиристора в тиках таймера. Счётчик таймера после срабатывания переставляется на это число до конца счёта.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Господа, а ведь на этой тиньке возможно и 4-канальный диммер запилить, если ресет вырубить! Реально?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Реально, если Вам есть чем её программировать с вырубленным ресетом. Я его регулярно вырубаю, чтобы пин освободить.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Вырубить ресет в финальной прошивке и пользоваться. Ну или вернуть ресет при надобности высоковольтным программатором. Я делал, не сложно. Я про сам код говорю. Добавить второй байт в i2c обмен для выбора канала и добавить дрыг пинами для диммера. Вроде так.

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

С используемым алгоритмом больше двух каналов использовать невозможно. Нужно полностью переписать программу. Если задействовать нулевой таймер, то можно максимум два канала по этому алгоритму. Для обеспечения окончания запуска тиристора счетчик таймера переписывается на пред конечное значение, поэтому его не получится использовать для другого канала. Всего два таймера. Каналов можно сделать только два. Или полностью переписать алгоритм. 

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Да, тут по переполнению счетчика, но можно ведь сделать просто по достижению какого-то отсчета. Ну как у http://cyber-place.ru/showthread.php?t=525

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

Да, можно.

Кто программу писать будет? Та, что из ссылки не пойдёт. Сильно менять надо.    

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

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

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Спасибо, около недели вынашивал мысль как сделать подобное устройство, а тут  всё готовое.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Господа, может кто возьмется на 4 канала переписать? А то у меня никак со временем свободным, а тут вникать надо в архитектуру. Боюсь не скоро руки дойдут.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013
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'

 

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

А точно та либа?

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Umka пишет:

А точно та либа?


Дайте ссылку пожалуйста на ту, с которой у Вас всё работает.

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

https://goo.gl/xMztB2

Тут все есть. Смотрите V3 и там есть готовый hex с адресом 41.

Я сегодня попробую вернуться к аналоговому управлению. Должно оно и ШИМ рулиться.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Umka пишет:

https://goo.gl/xMztB2

Тут все есть. Смотрите V3 и там есть готовый hex с адресом 41.

Я сегодня попробую вернуться к аналоговому управлению. Должно оно и ШИМ рулиться.


Спасибо, и всё же был благодарен бы за ссилочку на библиотеку. Или архив с ней.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Umka пишет:

Должно оно и ШИМ рулиться.

Думаю только надо на входе АЦП RC цепочку добавить, или я ошибаюсь и хватит обычного усреднения?

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Ну вот там по ссылочке 10 сверху файлик и есть библиотека. TinyWire-master.zip называется. 

А RC цепочка предусмотрена на плате.  А как же. И усреднение скользящее в коде имеется. Все там есть, надо только ошибку мерцания подправить и можно пробовать.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Umka пишет:

Ну вот там по ссылочке 10 сверху файлик и есть библиотека. TinyWire-master.zip называется. 

А RC цепочка предусмотрена на плате.  А как же. И усреднение скользящее в коде имеется. Все там есть, надо только ошибку мерцания подправить и можно пробовать.


Я вот так и не разгадал почему мерцает, смотрел осциллографом и видно как МК порой включает симистор чучуть позднее или чучуть раньше чем нужно. Почему так я хз.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Вопрос по тому что код не компилируется снят. С гугла попал на Вашу тему, товарищ dimax как всегда внёс ясность в ситуацию, за что ему спасибо большое.

Добавить поддержку ATtiny25/45/85 проще простого:

https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json

 

 

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Так а под какую плату компилировали изначально? Это же само собою разумеется, сперва доску выбрать, потом под нее код компилировать. 

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Umka пишет:

Так а под какую плату компилировали изначально? Это же само собою разумеется, сперва доску выбрать, потом под нее код компилировать. 


Изначально под дигиспарк и юсб загрузчиком, мой прокол.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

А что делает ножка PULSE?

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

Ответ в сообщении 69.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

nik182 пишет:
Это не цеплять. Это честная длина импульса зажигания тиристора в тиках таймера. Счётчик таймера после срабатывания переставляется на это число до конца счёта.

Так это не порт даже. Предлагаю для ясности назвать пины PB* в исходниках. К стати, если разлочить порт ресет, то обращаясь к нему просто через цифру 5 ничего не будет, он неразмечен в ядре, а вот через PB5 - запросто.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Ах да, и ещё, для удобной отладки я сносить загрузчик дигиспарка не стал, ядро Micronucleus позволяет прошивать даже hex-файлы. Просто лень собирать ВВ программатор, ибо после разлочки ресета только ВВ программатор или загручкик.

 

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

А прерывание на USB?

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Umka пишет:

А прерывание на USB?


Загрузчик работает пару секунд, потом глохнет и передаёт штурвал главной прошивке :)

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

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

Umka
Umka аватар
Offline
Зарегистрирован: 19.10.2012

С PB5 и я могу работать :)

Шить через загрузчик по USB hex файл... это надо придумать еще такое.

Короче я посчитал таки ноги и понял что 4-канала не выходит никак. Будем делать на свободных ногах выбор адеса. Как раз 4 варианта. Вот.

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

HWman пишет:

То есть я откомпилил hex-файл при варианте без загрузчика

не пробовал сравнить хексы с загрузчиком и без?

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Umka пишет:

Шить через загрузчик по USB hex файл... это надо придумать еще такое.


http://digistump.com/board/index.php/topic,160.msg160.html#msg160

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

HWman пишет:

Umka пишет:

Шить через загрузчик по USB hex файл... это надо придумать еще такое.


http://digistump.com/board/index.php/topic,160.msg160.html#msg160

Капитан Очевидность - твой родственник?