Таймер оттайки для холодильника Indesit ТЭУ-01-х (ТИМ-01)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Выполнен на TINY13A, пятаки для программирования имеются, прошивки не нашёл.
Попробуем накидать для него прошивку.
Так как первый пост не редактируется, оформил таблицу по работе разных модификаций таймера и размещу в следующем посте.
Информацию брал отсюда. Будем пробовать ремонтировать )))

 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Таблица:

 

 

Исполнение

 

Продолжительность холодильного режима, Тхр.ч.

 

Продолжительность режима активной оттайки , Тао.мин.

 

Продолжительность режима пассивной оттайки , Тпо.мин.

Режим,

в который таймер переходит при включении

ТИМ-01.11

8

Не ограничивается

2

ХР

ТИМ-01С

8

Не ограничивается

2

АО

ТИМ-01Н

12

Не ограничивается

2

АО

ТИМ-01Ф-2

2

15

0

ХР

ТИМ-01Ф-3

3

30

0

ХР

ТИМ-01Ф-8

8

10

0

ХР

ТИМ-01Т-2

2

15

0

ХР

ТИМ-01Т-3

3

30

0

ХР

ТИМ-01Т-8

8

10

0

ХР

ТИМ-01С-1

8

<=40

2

АО

ТИМ-01H-1

12

<=40

2

АО

ТИМ-01.11-1

8

<=40

2

ХР

ТИМ-01

 

 

 

 

ТЭУ-01-1

8

Опр.тепл.рел. но <=40

10

ХР t=-10C в АО

ТЭУ-01-2FW1

12

Опр.тепл.рел. но <=40

10

ХР t=-10C в АО

ТЭУ-01-3FW2

 

Опр.тепл.рел. но <=40

10 (по факту 8)

ХР t=-10C в АО

ТЭУ-01-8

 

 

 

 

ТЭO-02

12 (заявлено)

Опр.тепл.рел. но <=40

10

ХР t=-10C в АО

 

Прошивки будут тут, просьба не комментировать!!!

ТЭУ-01-2  прошивка, взято здесь описание алгоритма - тут
HEX

:020000020000FC
:1000000009C072C058C01895189518953CC018952D
:1000100058C018950FE90DBF86D000E815E006BD61
:1000200016BD479A01E005BD00E205BF0AE308BB23
:1000300001E007BBA4D002E00FBD07E003BF09EF5A
:1000400006BF0EE008BF04E009BF80E061D0A72F23
:1000500081E05ED0B72F82E05BD070FB7E7F72BF05
:1000600036F4743118F4129708F4C09A7CD005B7AE
:100070000C7F026005BFAA9A00E60ABF0BBF7AD0C8
:1000800078948895FECFDF93CF930F930FB7119697
:10009000ED01C09906C0C058D64140F064D0C09A66
:1000A00005C0C851D04010F05ED0C0980FBF0F916E
:1000B000CF91DF9118950F930FB746D00FBF0F91D7
:1000C00018950F930FB74AD090E080E07A2F13D0A5
:1000D00081E07B2F10D082E072B77E7FC099716083
:1000E0000AD00FBF0F9118950F930FB73CD0C09A4D
:1000F0000FBF0F911895E199FECF0F930FB79CBBDF
:100100008EBB7DBBF894E29AE19A0FBF0F910895E0
:10011000E199FECF0F930FB7F8948EBBE09A7DB3B1
:100120000FBF0F9108950F931F930FB7F894A895E1
:1001300014B7177F14BF11B5186111BD177E11BD1B
:100140000FBF1F910F9108955F9351E0A89553FD44
:1001500050625772506C51BD5F9108955F9350E0AB
:1001600051BD5F9108950F9300E002BFBB27AA27FE
:100170000F9108950F9300E008BD0F9108950F931C
:0A01800001E808BDF0DF0F910895BB
:00000001FF

EEP
 

:03000000000000FD
:00000001FF

1) Основная прошивка во флэш имеет расширение *.hex
2) Прошивка EEPROM: *.eep.

Значения для фьюзов:
lfuse 0x6A (все по-умолчанию)
hfuse 0xFB (BOD level 2.7V, остальное по умолчанию)

Если шить через простой программатор usbasp, то строки запуска avrdude могут выглядеть так
avrdude.exe -p t13 -c usbasp -B 8kHz -P usb -U flash:w:Timer_TEU.hex:a
avrdude.exe -p t13 -c usbasp -B 8kHz -P usb -U eeprom:w:Timer_TEU.eep:a
avrdude.exe -p t13 -c usbasp -B 8kHz -u -U lfuse:w:0x6A:m
avrdude.exe -p t13 -c usbasp -B 8kHz -u -U hfuse:w:0xFB:m
Эти строки можно скопировать в bat-файл и запускать из директории, где лежит прошивка и avrdude

Средствами IDE на ядре microCore может так:
 

// Настройка фьюзов
// Fuse High Byte = 11111011 (0xFB)
// SELFPRGEN = 1 (Self Programming Disabled)
// DWEN = 1      (debugWire disabled, if enabled SPI low voltage programming is impossible)
// BODLEVEL1 = 0 (Brown-out Detector trigger level = 2.7V)
// BODLEVEL0 = 1 (Brown-out Detector trigger level = 2.7V)
// RSTDISBL = 1  (External Reset enabled, if disabled SPI low voltage programming is impossible)

// Fuse Low Byte = 01101010 (0x6A)
// SPIEN = 0  (Serial Programming enabled, if disabled low and high voltage programming is impossible)
// EESAVE = 1 (EEPROM is not preserved through Chip Erase)
// WDTON = 1  (Watchdog Timer is not locked to be reset source, it can be set-up by software)
// CKDIV8 = 0 (CLKPR = 3 upon start: divide clock by 8)
// SUT1 = 1   (Slowly rising power: additional 64 ms for start-up time)
// SUT0 = 0   (Slowly rising power: additional 64 ms for start-up time)
// CKSEL1 = 1 (Clock source internal 9.6 MHz)
// CKSEL0 = 0 (Clock source internal 9.6 MHz)

#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <util/delay.h>
//#include <avr/eeprom.h>      // не забываем подключить
#include <EEPROM.h>

#define  freezer  0x00       //; freeser mode
#define  heater   0x01       //; heater mode
#define  _1min    12         //; 1 min const
#define  _1hour   60*_1min   //; 1 hour const
#define  _2min    2*_1min    //; 2 min const
#define  _8min    8*_1min    //; 8 min const
#define  _8hour   8*_1hour   //; 8 hour const
#define ac_tick   15/0,02    //; количество 20-ти миллисекундных тиков за 15 секунд
#define xp_tick   8*60*60/15 //; количество 15 секундных тиков в 8-часах работы
#define po_tick   10*60/15   //; количество 15 секундных тиков за 10 минут
#define ao_tick   40*60/15   //; количество 15 секундных тиков за 40 минут


volatile int schetchik = 0; // считает в 15 секундных интервалах
volatile int ac_schetchik = 0;
bool ac_flag = 0;
bool btn_flag = 0;
volatile byte work_mode = 0; // 0 - рабочий режим, 1 - активная оттайка, 2 - пассивная оттайка

// Прерывания
// INT0 обрабатывает нажатие кнопки (настраивать INPUT_PULLUP)
// PCINT2 (настраивать INPUT)

ISR(INT0_vect) {
  // наш код обработки нажатия кнопки принудительного оттаивания
  if (!btn_flag) // еще не было нажатия кнопки
  {
    btn_flag = 1;
    digitalWrite(0, HIGH); // включим реле оттайки
    schetchik = 0;         // сбросим счетчик в ноль
    work_mode = 1;
    EEPROM.write(2, work_mode);
  }
}

// Обработчик прерывания PCINT0
ISR(PCINT0_vect)
{
  ac_schetchik++;
  if (ac_schetchik >= ac_tick) {
    ac_flag = 1; // увеличить счетчик в EEPROM
    ac_schetchik = 0;
  }
}

//Функции (с) Кэп
void EEPROM_write(int uiAddress, char ucData)
{
  while (EECR & (1 << EEWE)); /*Ждать завершения предыдущей записи*/
  EEAR = uiAddress; /*Проинициализировать регистры*/
  EEDR = ucData;
  EECR |= (1 << EEMWE); /*Установить флаг EEMWE*/
  EECR |= (1 << EEWE); /*Начать запись в EEPROM*/
}

char EEPROM_read(int uiAddress)
{
  while (EECR & (1 << EEWE)); /*Ждать завершения предыдущей записи*/
  EEAR = uiAddress; /* Проинициализировать регистр адреса*/
  EECR |= (1 << EERE); /*Выполнить чтение*/
  return EEDR;
}

void EEPROMWriteInt(int p_address, int p_value) // принимает 2 параметра, адресс и число 0...65534
{ // забирает 2 ячейки, так что использовать ячейки 0, 2, 4, 6...
  byte lowByte = ((p_value >> 0) & 0xFF);
  byte highByte = ((p_value >> 8) & 0xFF);
  EEPROM_write(p_address, lowByte);
  EEPROM_write(p_address + 1, highByte);
}

int EEPROMReadInt(int p_address) //Считывает число в диапазоне 0...65534
{ // использует 2 ячейки, так что считывает ячейки 0, 2, 4, 6...
  byte lowByte = EEPROM_read(p_address);
  byte highByte = EEPROM_read(p_address + 1);
  return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);
}

void setup() {
  DDRB = 0b00000001;    // pinMode(0, OUTPUT);
  PORTB &= ~(1 << PB0); // digitalWrite(0, LOW);
  pinMode(1, INPUT);    // D1 PB1 (ATTINY13A - Attiny13)
  PORTB |= (1 << PB1);  // D1 - INPUT_PULLUP
  pinMode(2, INPUT);    // D2 PB2 (ATTINY13A - Attiny13)

  // Настройка прерываний
  // Инициализация INT0 и PCINT0
  cli(); // Запрещаем прерывания на время изменения WDE и WDP
  MCUCR = _BV(ISC01) | _BV(ISC00);  // FALLING
  // RISING - 11, LOW - 00,HIGH - 01,  FALLING - 10

  GIMSK |= (1 << PCIE) | _BV(INT0); // Разрешаем внешние прерывания PCINT0, INT0
  PCMSK |= (1 << PB2)/* | (1<<PB1)*/; // Разрешаем по маске прерывания на ноге (PCINT2)
  sei();                            // Разрешаем прерывания глобально: SREG |= (1<<SREG_I)

  // восстанавливаем значение счетчика и режим работы
  work_mode = EEPROM.read(2);
  schetchik = EEPROMReadInt(0);
}

void loop() {
  work_mode = EEPROM.read(2);
  // Раз в 15 секунд пишем счетчик в EEPROM
  if (ac_flag) {
    schetchik++;
    EEPROMWriteInt(0, schetchik);
    ac_flag = 0;
  }
  if (work_mode == 0) {
    if (schetchik >= xp_tick /*8 часов */)
    {
      // включить режим активной оттайки
      digitalWrite(0, HIGH);
      work_mode = 1;
      EEPROM.write(2, work_mode);
      schetchik = 0;      // запущен таймер активной оттайки
    }
  }
  if (work_mode == 1) {
    if (schetchik >= ao_tick /*8 часов */)
    {
      work_mode = 2;
      EEPROM.write(2, work_mode);
      schetchik = 0;      // запущен таймер пассивной оттайки
    }
  }
  if (work_mode == 1) {
    if (schetchik >= po_tick /*8 часов */)
    {
      btn_flag = 0;
      work_mode = 0;
      EEPROM.write(2, work_mode);
      schetchik = 0;      // запущен таймер пассивной оттайки
      digitalWrite(0, LOW); // переключиться в режим охлаждения
    }
  }
}

Контроль температуры в холодильнике удобно вести залив на ESP8266 c парой-тройкой подключенных датчиков этот скетч:
PS определение номеров датчиков DS18B20 не требуется, SSID и пароль установить по вашему роутеру WI-FI.

 

// https://lastminuteengineers.com/multiple-ds18b20-esp8266-nodemcu-tutorial/
// модифицирован для работы по индексу датчика, не требуется определение серийного номера
// 29.08.2021 добавлен NTP клиент
// 01.09.2021 добавлено обновление через сеть (OTA)
// в скетчи нужно добавлять библиотеку ArduinoOTA.h
// в setup() -  ArduinoOTA.begin(); в loop() -  ArduinoOTA.handle();
// 03.09.2021 добавлена опция по установке разрешения на датчики

#include <NTPClient.h>
//#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <OneWire.h>
#include <DallasTemperature.h>

const long utcOffsetInSeconds = 10800;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
volatile uint32_t my_millis;

// Define NTP Client to get time
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", utcOffsetInSeconds);


// Data wire is plugged into port D2 on the ESP8266
#define ONE_WIRE_BUS D2

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

float tempSensor1, tempSensor2, tempSensor3;
/* ОПРЕДЕЛЕНО ПРОГРАММОЙ - DS18B20_DIRECT_TEST
  uint8_t sensor1[8] = { 0x28, 0x40, 0x3E, 0xD5, 0x04, 0x00, 0x00, 0x53 };
  uint8_t sensor2[8] = { 0x28, 0x1F, 0x43, 0xD6, 0x04, 0x00, 0x00, 0x50 };
  uint8_t sensor3[8] = { 0x28, 0x61, 0x64, 0x12, 0x04, 0x00, 0x00, 0x59 };
*/

/* Введите свои SSID и пароль
   const char* ssid = "YourNetworkName";  // Enter SSID here
   const char* password = "YourPassword";  //Enter Password here
*/

const char* ssid = "Open";  // SSID
const char* password = "123456789"; // пароль не менее 9 символов
ESP8266WebServer server(80);

void handle_OnConnect() {
  sensors.requestTemperatures();
  // tempSensor1 = sensors.getTempC(sensor1);
  tempSensor1 = (float)sensors.getTempCByIndex(0);
  // tempSensor2 = sensors.getTempC(sensor2);
  tempSensor2 = (float)sensors.getTempCByIndex(1);
  // tempSensor3 = sensors.getTempC(sensor3);
  tempSensor3 = (float)sensors.getTempCByIndex(2);

  server.send(200, "text/html", SendHTML(tempSensor1, tempSensor2, tempSensor3));
}

void handle_NotFound() {
  server.send(404, "text/plain", "Опс!!! Ошибочка вышла");
}

String SendHTML(float tempSensor1, float tempSensor2, float tempSensor3) {
  String ptr = "<!DOCTYPE html>";
  ptr += "<html>";
  ptr += "<head><meta http-equiv='Content-Type' content='text/html, charset=utf-8' />";
  ptr += "<title>ESP8266 Монитор температуры</title>";
  ptr += "<meta name='viewport' content='width=device-width, initial-scale=1.0'>";
  ptr += "<link href='https://fonts.googleapis.com/css?family=Open+Sans:300,400,600' rel='stylesheet'>";
  ptr += "<style>";
  ptr += "html { font-family: 'Open Sans', sans-serif; display: block; margin: 0px auto; text-align: center;color: #444444;}";
  ptr += "body{margin-top: 50px;} ";
  ptr += "h1 {margin: 50px auto 30px;} ";
  ptr += ".side-by-side{display: table-cell;vertical-align: middle;position: relative;}";
  ptr += ".text{font-weight: 600;font-size: 19px;width: 200px;}";
  ptr += ".temperature{font-weight: 300;font-size: 50px;padding-right: 15px;}";
  ptr += ".living-room .temperature{color: #3B97D3;}";
  ptr += ".bedroom .temperature{color: #F29C1F;}";
  ptr += ".kitchen .temperature{color: #26B99A;}";
  ptr += ".superscript{font-size: 17px;font-weight: 600;position: absolute;right: -5px;top: 15px;}";
  ptr += ".data{padding: 10px;}";
  ptr += ".container{display: table;margin: 0 auto;}";
  ptr += ".icon{width:82px}";
  ptr += "</style>";
  ptr += "</head>";

  // AJAX
  ptr += "<script>\n";
  ptr += "setInterval(loadDoc,1000);\n";
  ptr += "function loadDoc() {\n";
  ptr += "var xhttp = new XMLHttpRequest();\n";
  ptr += "xhttp.onreadystatechange = function() {\n";
  ptr += "if (this.readyState == 4 && this.status == 200) {\n";
  ptr += "document.body.innerHTML =this.responseText}\n";
  ptr += "};\n";
  ptr += "xhttp.open(\"GET\", \"/\", true);\n";
  ptr += "xhttp.send();\n";
  ptr += "}\n";
  ptr += "</script>\n";

  ptr += "<body>";
  ptr += "<h1>ESP8266 Монитор температуры</h1>";
  ptr += "<div class='container'>";
  ptr += "<div class='data living-room'>";
  ptr += "<div class='side-by-side icon'>";
  ptr += "<svg enable-background='new 0 0 65.178 45.699'height=45.699px id=Layer_1 version=1.1 viewBox='0 0 65.178 45.699'width=65.178px x=0px xml:space=preserve xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink y=0px><polygon fill=#3B97D3 points='8.969,44.261 8.969,16.469 7.469,16.469 7.469,44.261 1.469,44.261 1.469,45.699 14.906,45.699 ";
  ptr += "14.906,44.261 '/><polygon fill=#3B97D3 points='13.438,0 3,0 0,14.938 16.438,14.938 '/><polygon fill=#3B97D3 points='29.927,45.699 26.261,45.699 26.261,41.156 32.927,41.156 '/><polygon fill=#3B97D3 points='58.572,45.699 62.239,45.699 62.239,41.156 55.572,41.156 '/><path d='M61.521,17.344c-2.021,0-3.656,1.637-3.656,3.656v14.199H30.594V21c0-2.02-1.638-3.656-3.656-3.656";
  ptr += "c-2.02,0-3.657,1.636-3.657,3.656v14.938c0,2.021,1.637,3.655,3.656,3.655H61.52c2.02,0,3.655-1.637,3.655-3.655V21";
  ptr += "C65.177,18.98,63.54,17.344,61.521,17.344z'fill=#3B97D3 /><g><path d='M32.052,30.042c0,2.02,1.637,3.656,3.656,3.656h16.688c2.019,0,3.656-1.638,3.656-3.656v-3.844h-24";
  ptr += "L32.052,30.042L32.052,30.042z'fill=#3B97D3 /><path d='M52.396,6.781H35.709c-2.02,0-3.656,1.637-3.656,3.656v14.344h24V10.438";
  ptr += "C56.053,8.418,54.415,6.781,52.396,6.781z'fill=#3B97D3 /></g></svg>";
  ptr += "</div>";
  ptr += "<div class='side-by-side text'>Гостиная</div>";
  ptr += "<div class='side-by-side temperature'>";
  ptr += (float)tempSensor1;
  //  ptr += (int)tempSensor1;
  ptr += "<span class='superscript'>&deg;C</span></div>";
  ptr += "</div>";
  ptr += "<div class='data bedroom'>";
  ptr += "<div class='side-by-side icon'>";
  ptr += "<svg enable-background='new 0 0 43.438 35.75'height=35.75px id=Layer_1 version=1.1 viewBox='0 0 43.438 35.75'width=43.438px x=0px xml:space=preserve xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink y=0px><g><path d='M25.489,14.909H17.95C13.007,14.908,0,15.245,0,20.188v3.688h43.438v-3.688";
  ptr += "C43.438,15.245,30.431,14.909,25.489,14.909z'fill=#F29C1F /><polygon fill=#F29C1F points='0,31.25 0,35.75 2.5,35.75 4.5,31.25 38.938,31.25 40.938,35.75 43.438,35.75 43.438,31.25 ";
  ptr += "43.438,25.375 0,25.375   '/><path d='M13.584,11.694c-3.332,0-6.033,0.973-6.033,2.175c0,0.134,0.041,0.264,0.105,0.391";
  ptr += "c3.745-0.631,7.974-0.709,10.341-0.709h1.538C19.105,12.501,16.613,11.694,13.584,11.694z'fill=#F29C1F /><path d='M30.009,11.694c-3.03,0-5.522,0.807-5.951,1.856h1.425V13.55c2.389,0,6.674,0.081,10.444,0.728";
  ptr += "c0.069-0.132,0.114-0.268,0.114-0.408C36.041,12.668,33.34,11.694,30.009,11.694z'fill=#F29C1F /><path d='M6.042,14.088c0-2.224,3.376-4.025,7.542-4.025c3.825,0,6.976,1.519,7.468,3.488h1.488";
  ptr += "c0.49-1.97,3.644-3.489,7.469-3.489c4.166,0,7.542,1.801,7.542,4.025c0,0.17-0.029,0.337-0.067,0.502";
  ptr += "c1.08,0.247,2.088,0.549,2.945,0.926V3.481C40.429,1.559,38.871,0,36.948,0H6.49C4.568,0,3.009,1.559,3.009,3.481v12.054";
  ptr += "c0.895-0.398,1.956-0.713,3.095-0.968C6.069,14.41,6.042,14.251,6.042,14.088z'fill=#F29C1F /></g></svg>";
  ptr += "</div>";
  ptr += "<div class='side-by-side text'>Спальня</div>";
  ptr += "<div class='side-by-side temperature'>";
  ptr += (float)tempSensor2;
  //   ptr += (int)tempSensor2;
  ptr += "<span class='superscript'>&deg;C</span></div>";
  ptr += "</div>";
  ptr += "<div class='data kitchen'>";
  ptr += "<div class='side-by-side icon'>";
  ptr += "<svg enable-background='new 0 0 48 31.5'height=31.5px id=Layer_1 version=1.1 viewBox='0 0 48 31.5'width=48px x=0px xml:space=preserve xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink y=0px><circle cx=24.916 cy=15.75 fill=#26B99A r=15.75 /><path d='M14.917,15.75c0-5.522,4.478-10,10-10c2.92,0,5.541,1.26,7.369,3.257l1.088-1.031";
  ptr += "c-2.103-2.285-5.106-3.726-8.457-3.726c-6.351,0-11.5,5.149-11.5,11.5c0,3.127,1.252,5.958,3.277,8.031l1.088-1.031";
  ptr += "C16.011,20.945,14.917,18.477,14.917,15.75z'fill=#FFFFFF /><path d='M45.766,2.906c-1.232,0-2.232,1-2.232,2.234v11.203c0,0,2.76,0,3,0v12H48v-12V2.906";
  ptr += "C48,2.906,46.035,2.906,45.766,2.906z'fill=#26B99A /><path d='M6.005,2.917v5.184c0,0.975-0.638,1.792-1.516,2.083V2.917H3.021v7.267c-0.878-0.29-1.516-1.107-1.516-2.083";
  ptr += "V2.917H0v5.458c0,1.802,1.306,3.291,3.021,3.592v16.376H4.49v-16.38c1.695-0.318,2.979-1.8,2.979-3.588V2.917H6.005z'fill=#26B99A /></svg>";
  ptr += "</div>";
  ptr += "<div class='side-by-side text'>Кухня</div>";
  ptr += "<div class='side-by-side temperature'>";
  ptr += (float)tempSensor3;
  //   ptr += (int)tempSensor3;
  ptr += "<span class='superscript'>&deg;C</span></div>";
  ptr += "</div>";
  ptr += "</div>";
  ptr += "</body>";
  ptr += "</html>";
  return ptr;
}

void setup() {
  Serial.begin(115200);
  delay(100);
  sensors.begin();
  sensors.setResolution(12); // уст. разрешение градусника 9, 10, 11, или 12 bit
  // 12 - шаг 0,06С 11 - шаг 0.125C 10 - шаг 0,25С
  Serial.println("Connecting to ");
  Serial.println(ssid);

  //connect to your local wi-fi network
  WiFi.begin(ssid, password);
  //check wi-fi is connected to wi-fi network
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected..!");
  Serial.print("Got IP: ");
  Serial.println(WiFi.localIP());
  server.on("/", handle_OnConnect);
  server.onNotFound(handle_NotFound);
  server.begin();
  Serial.println("HTTP server started");

  timeClient.begin();
  my_millis = millis();

  ArduinoOTA.begin();
}

void loop() {
  ArduinoOTA.handle();

  server.handleClient();
  if (millis() - my_millis >= 777) {
    timeClient.update();
    /*
        Serial.print(daysOfTheWeek[timeClient.getDay()]);
        Serial.print(", ");
        Serial.print(timeClient.getHours());
        Serial.print(":");
        Serial.print(timeClient.getMinutes());
        Serial.print(":");
        Serial.println(timeClient.getSeconds());
    */
    Serial.print(daysOfTheWeek[timeClient.getDay()]);
    Serial.print(", ");
    Serial.println(timeClient.getFormattedTime());

    my_millis = /*my_millis + 1000; /*/millis();
  }
}

 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Упрощённая схема включения с термореле по двухточечной схеме:

слабое место девайса - выпрямитель, резисторы номиналом 47 Ом по схеме реализованы на двух последовательно включенных резисторах номиналом по 27 Ом.
При проверке неработающего девайса обнаружено, что они выгорели.
Плёночные конденсаторы 0,33 x 400V имели фактическую ёмкость 0,07 и 0,12 микрофарады.
По типоразмеру однозначно не 400 а 250 вольт. Attiny13A исправна, осталось проверить на доступность скачивания прошивки, если мк не "защёлкнут", выложу.

 

Kakmyc
Offline
Зарегистрирован: 15.01.2018

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

меняное работает месяц-два и даёт дуба...терзаем сомнениями, просится диод последовательно с резистором 1 Мом (первая нога реле)
PS оригинальное реле находил за 1400=

Green
Offline
Зарегистрирован: 01.10.2015

У меня дохлый где-то валяется. Причём, дохлая именно Тини13.

-NMi-
Offline
Зарегистрирован: 20.08.2018

Получается, что дохнет именно по питанию?

Green
Offline
Зарегистрирован: 01.10.2015

Сложно сказать. Мне принесли в ремонт, выпаял Тини13 - никаких позывов на чип детект... А уж из за чего - хз.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

Сложно сказать. Мне принесли в ремонт, выпаял Тини13 - никаких позывов на чип детект... А уж из за чего - хз.

у меня на новых тиньках кодик 0000, дохлые или залоченные? из 10 штук - 2 точно, одна не проверялась

на аналоговый вход напряжение поступает с размахом до 6 вольт, что не есть хорошо...
оказалось, что так задумывалось, переменное напряжение внутренними диодами ограничивается и просчитывается каждый 20 миллисекундный отрезок времени, от него работают счетчики.
Автор альтернативной разработки использует WDT таймер который с интервалом в 5 секунд скидывает в EEPROМ
накопительный счетчик. Исходя из таблицы счетчиков должно быть три XP, AO и PO режимов.

 

 

Green
Offline
Зарегистрирован: 01.10.2015

Напряжение не является проблемой, если имеет высокое внутреннее сопротивление. Я 220 подаю на вход через 1,5 мом и ничё.)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

Напряжение не является проблемой, если имеет высокое внутреннее сопротивление. Я 220 подаю на вход через 1,5 мом и ничё.)

там через мегаом + делитель 30ком на землю, надо вскрыть и посмотреть, что именно вышло из строя...
не поленился быстренько  сделал приборчик для проверки, комплектующие в 800 рублей обошлись, теперь можно и тестером пройтись, что там выходит из строя и почему

Green
Offline
Зарегистрирован: 01.10.2015

ua6em пишет:

не поленился быстренько  сделал приборчик для проверки...


Ну да, "внутреннее" там не к месту.
Насколько это актуально? Мне холодильщики только однажды приносили этот таймер для оттайки.
Хотя, после переустановки кондиционера, я стал им должен всю жизнь.) 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

ua6em пишет:

не поленился быстренько  сделал приборчик для проверки...


Ну да, "внутреннее" там не к месту.
Насколько это актуально? Мне холодильщики только однажды приносили этот таймер для оттайки.
Хотя, после переустановки кондиционера, я стал им должен всю жизнь.) 

я вчера ТИМ-1 починил, сопли в пайках были, подчистил, поставил, работает, холодильщики жеж гонят полную пургу, сказали надо поменять реле оттайки, термореле, термостат и мозги, дескать оно там всё привязывается к мозгам )))
Разводят бабушек и дедушек пенсионеров на бабки, так как железяки без самого ремонта уже выходили на 10 тыр. Модель INDESIT BIA18NF то-есть самая простая, вентилятор обдува на движке 220 вольт, аналогичный как в проигрывателях 3-го класса ...
Да, ты сильно в них веришь, что далеко от истины, свой кондей (LG) починили сами, плата там сложная, износ контактной группы реле оттайки был в результате перемерзал...

По неисправности ТЭУ-01-3, сгорели резисторы цепи выпрямителя +24 и +5, обведены на рисунке.

замена резисторов, вместо +24 вольта чуть более 8, вместо +5 вольт чуть более 2.5 вольта, видимо не зря погорели, в точках электролитов сопротивление более 200 ком, непонятки )))

b707
Offline
Зарегистрирован: 26.05.2017

Резистор - пассивный элемент, сам по себе не горит.
Что касается ремнтников, что разводят - на мой взгляд как минимум половина и сами не знают, как оно устроено - вот и меняют все подряд, пока не повезет.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

-NMi-
Offline
Зарегистрирован: 20.08.2018

Даушь, пяток деталек )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

-NMi- пишет:
Даушь, пяток деталек )))

и не говори...очень странная схема...я о питании

Pyotr
Offline
Зарегистрирован: 12.03.2014

ua6em пишет:

и не говори...очень странная схема...я о питании

Для таких случаев мне нравятся "последовательные источники питания". Эт я только что придумал название. По науке не знаю как это называется. Вот набросал схему.

Реле нужно выбирать на большее напряжение, например 24-42 В и можно выше - ток удержания будет ниже.

С1 такой емкости, чтоб ток через него был больше тока удержания реле.

При срабатывании реле ток на источник +5В потечет через обмотку реле. В противном случае-через VD2.

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Схему холодильника желательно не менять )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Толком еще ничего не написал, а скетч уже: )))

Скетч использует 858 байт (83%) памяти устройства. Всего доступно 1024 байт.
Глобальные переменные используют 28 байт динамической памяти.

сменил ядро на MicroCore, поинтересней вышло:
Скетч использует 584 байт (57%) памяти устройства. Всего доступно 1024 байт.
Глобальные переменные используют 21 байт (32%) динамической памяти, оставляя 43 байт для локальных переменных. Максимум: 64 байт.
 

Pyotr
Offline
Зарегистрирован: 12.03.2014

ua6em пишет:

Упрощённая схема включения с термореле по двухточечной схеме:

слабое место девайса - выпрямитель, резисторы номиналом 47 Ом по схеме реализованы на двух последовательно включенных резисторах номиналом по 27 Ом.
При проверке неработающего девайса обнаружено, что они выгорели.
Плёночные конденсаторы 0,33 x 400V имели фактическую ёмкость 0,07 и 0,12 микрофарады.
По типоразмеру однозначно не 400 а 250 вольт. Attiny13A исправна, осталось проверить на доступность скачивания прошивки, если мк не "защёлкнут", выложу.

 

Резисторы могли выгореть только из-за неисправных пленочных конденсаторов. Если уж ставить пленочные, то только на 630 В. А резисторы можно и поменьше номиналом поставить.

Так и не понял для чего резистор 3.9 кОм и диод последовательно с ним? Если только это стабилитрон так изобразили? 

Реле на сколько вольт?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

реле на 24 вольта, конденсаторы плёночные по схеме на 400 вольт, по маркировке тоже, но по типоразмеру, хоть наши К73-17, хоть китайские максимум 250 вольт, работал много с плёночными конденсаторами местного производства (Карачаевск) проблем вообще никогда не было, плёнка там была японская, а то что могут терять ёмкость для меня вообще открытие )))

На 630 вольт по высоте в реле не войдут...кстати по даташиту наши должны держать перенапряжение в 1.5 раза 1 минуту, то-есть 400 вольтовых настоящих достаточно

Предполагаю, что диод с резистором 3.9 килоом - погасить дугу или переходные процессы на контактах реле
 

Pyotr
Offline
Зарегистрирован: 12.03.2014

Бывает индусский код, а бывают индусские схемы)))

Всеж думаю последовательно с резистором 3.9кОм стабилитрон вольт так на 30. Это чтоб электролит 22х100В не пукнул.

Если при работе компрессора срабатывает реле, то выброс ЭДС с компрессора фигачит через через RC, цепь питания реле, и МК может достаться. И какой там величины выброс, и сколько кому достанется - вот вопрос. Но похоже достается всем))

При замкнутом реле RC цепочки запаралелены - типа увеличить ток по питанию этого реле. Зачем? Реле сработало, и для его удержания нужен ток в четверть от номинала... Так что одни вопросы.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Pyotr пишет:

... Так что одни вопросы.

опишу как оно работает, в этой схеме запитка реле оттайки от сети 220 вольт осуществляется через две цепи

1. Фаза, через реле терморегулятора TH1 приходит на контакт 3 реле оттайки с  контакта 3 имеем  первую RC цепь питания выпрямителя реле (+24V) и с выхода 1-й RC цепи запитывается выпрямитель +5 вольт питания контроллера. Контакт 3 реле оттайки НЗ контактом замыкает цепь питания компрессора (контакт 2 реле оттайки)
2-я RC цепь с выхода первой цепи приходит на контакт 4 реле оттайки и далее через нагреватель сопротивлением 240 ом на тепловое реле TR тэна испарителя.
2. При тёплом включении температура тэна испарителя >+8C  контакты теплового реле TR разомкнуты и реле оттайки обесточено. Включается компрессор, вентилятор обдува испарителя и холодильник начинает набирать режим.
3. При достижении температуры -10С контакты реле TR замыкаются образуя в средней цепи делителя (RC1) - (RC2)  переменное напряжение амплитудой до 110 вольт, начинают работать оба выпрямителя +24 вольта и +5 вольт
4. Между выводами 1 и 2 реле оттайки TR появляется полное напряжение сети 220 вольт, через делитель 1Мом - 30Ком (порядка 6 вольт) поступает на вывод AC1 микроконтроллера.
5. По наличию этого напряжения при первом включении включается реле оттайки, снимается фаза с контакта 2 реле оттайки и через рабочую обмотку компрессора на второй контакт реле оттайки (общий провод контроллера) подтягивается нулевой провод сети 220 вольт )))

То-есть нулевой провод подтягивается на общий провод контроллера или через тэн оттайки или через рабочую обмотку компрессора

Далее всё по циклограмме!

Да, скорее всего для ограничения выбросов на выпрямителе +24V в цепи RD должен быть стабилитрон, маркировки на диоде нет, по внешнему виду стабилитрон на 5,1 вольта, этот диод и диод в цепи реле одинаковы
 

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

по аналогичной схеме построены холодильники Stinol, Indesit, Ariston

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Pyotr пишет:

 Это чтоб электролит 22х100В не пукнул.

кстати, с электролитами всё очень не просто, купил целый ряд электролитов, для того, чтобы можно было быстро отремонтировать разные БП с ШИМ контроллерами, лежали они так себе, лежали целый год, полез в коробочку, а все раздулись, как от перенапряжения...марки RUBICON однако, полез посмотреть, что там не так, других вариантов, что нарушена химия электролита на ум не пришло...в ответственных БП ставим Хитачи, только найти их сложно

Pyotr
Offline
Зарегистрирован: 12.03.2014

ua6em пишет:

опишу как оно работает, в этой схеме запитка реле оттайки от сети 220 вольт осуществляется через две цепи

1. Фаза, через реле терморегулятора TH1 приходит на контакт 3 реле оттайки с  контакта 3 имеем  первую RC цепь питания выпрямителя реле (+24V) и с выхода 1-й RC цепи запитывается выпрямитель +5 вольт питания контроллера. Контакт 3 реле оттайки НЗ контактом замыкает цепь питания компрессора (контакт 2 реле оттайки)
При обесточеном реле оттайки фаза на земле контроллера и первая RC цепь бездействует.

2-я RC цепь с выхода первой цепи приходит на контакт 4 реле оттайки и далее через нагреватель сопротивлением 240 ом на тепловое реле TR тэна испарителя.
При обесточеном реле оттайки и разомкнутых контактах TR вторая RC цепь тоже бездействует. При работе компрессора схема обесточена.
2. При тёплом включении температура тэна испарителя >+8C  контакты теплового реле TR разомкнуты и реле оттайки обесточено. Включается компрессор, вентилятор обдува испарителя и холодильник начинает набирать режим.
3. При достижении температуры -10С контакты реле TR замыкаются образуя в средней цепи делителя (RC1) - (RC2)  переменное напряжение амплитудой до 110 вольт, начинают работать оба выпрямителя +24 вольта и +5 вольт
4. Между выводами 1 и 2 реле оттайки TR появляется полное напряжение сети 220 вольт, через делитель 1Мом - 30Ком (порядка 6 вольт) поступает на вывод AC1 микроконтроллера.
5. По наличию этого напряжения при первом включении включается реле оттайки, снимается фаза с контакта 2 реле оттайки и через рабочую обмотку компрессора на второй контакт реле оттайки (общий провод контроллера) подтягивается нулевой провод сети 220 вольт )))
При вкл реле оттайки на пине АС1 МК пропадает напряжение.

То-есть нулевой провод подтягивается на общий провод контроллера или через тэн оттайки или через рабочую обмотку компрессора
Скажу так: земля МК до вкл реле оттайки сидит на фазе, а после срабатывания реле соединяется с нулем через обмотку компрессора. Такая "плавающая земля".

Далее всё по циклограмме!

Да, скорее всего для ограничения выбросов на выпрямителе +24V в цепи RD должен быть стабилитрон, маркировки на диоде нет, по внешнему виду стабилитрон на 5,1 вольта, этот диод и диод в цепи реле одинаковы
 

 

Дополнил, если правильно все понял.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Pyotr пишет:

Дополнил, если правильно все понял.

Теперь можно попробовать накидать скелет скетча. )))

При первом включении  или включении после разморозки с отключением электропитания контакты реле TR разомкнуты - это будет одна циклограмма, при работе в штатном режиме оттаивания контакты реле TR остаются замкнутыми, регулятор температуры даже в минимальном положении при гистерезисе порядка 8 градусов не должен уходить из области отрицательных температур, а если говорить о запасе то пожалуй не более -12 градусов цельсия!?

Всё таки оттаивание как мне кажется не должно выводить реле TR в режим размыкания контактов...
проверил, TR замкнуто при подаче питания сразу включается режим оттаивания на 10 минут, через 10 минут реле отпускает и включается компрессор... Да уж...

Логика работы странная )))
 

Будем пробовать так:

Исходное TR разомкнуто:

1. Подаём питание
2. Включается компрессор
3. Имитируем срабатывание TR
4. Включается режим оттаивания (на 10 минут)
5. Имитируем размыкание TR (ранее 10 минутного цикла нагревания) - реле оттаивания
    остаётся в замкнутом   положении на 10 минут  компрессор и нагреватель оттаивателя обесточены
6.  Через 10 минут включается компрессор
7.  Имитируем TR переведя в режим замыкания, компрессор продолжает работать
8. Снимаем питание имитирую срабатывание термореле установки температуры.
9. Подаём питание - включается компрессор
10. Имитируем многократное срабатывание термореле - при каждом срабатывании включается компрессор,
      по видимому вошёл в режим отсчёта времени между оттаиваниями, реле TR оставляю замкнутым

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Из исходного: Проблемы начались при отключении питания, после чего испаритель полностью перемёрз.
Магическая кнопка нажатие которой доступно через технологическое отверстие в реле оттайки полностью перезапускает цикл работы реле оттайки.
Сервис мануала нет, но выходит как-то так )))

Выходит, что 8 часов, это 8 часов работы компрессора, как только это время накопится включится режим оттайки?!

Если раз в минуту писать в епром на сколько времени хватит?

PS реле переходит в рабочий режим при выходе из пассивного режима (TR разомкнуто, питание на реле поступает через рабочую обмотку компрессора, отработан временной отрезок пассивного режима)

Pyotr
Offline
Зарегистрирован: 12.03.2014

ua6em пишет:

Выходит, что 8 часов, это 8 часов работы компрессора, как только это время накопится включится режим оттайки?!

Я тоже так думаю. При отключеном компрессоре питание на схему не подается, и время простоя компрессора отследить невозможно.

ua6em пишет:

Если раз в минуту писать в епром на сколько времени хватит?

Не менее чем на 100 000 минут))

Можно считать количество включений компрессора. 

 

Pyotr
Offline
Зарегистрирован: 12.03.2014

Как я представляю алгоритм.

STEP_1: 
только включился и работает компрессор (К). Появилось питание МК.
Если контакты TR замкнуты - продолжаем считать время работы К
если разомкнуты - было длительное откл. электричества или прошла оттайка - считаем время работы К сначала.
Если насчитали 8 ч, переходим на STEP_2

STEP_2: 
контакты TR замкнуты, К работает. 
Включаем реле оттайки, одновременно отключая К. 
Если контакты TR разомкнулись, переходим на STEP_3

STEP_3: 
Ждем время пассивной оттайки 2-10 мин. 
переходим на STEP_4

STEP_4: 
Сброс времени работы К. Отключаем реле оттайки.  Питание пропадает. К сам включается. Контакты TR разомкнуты.

После замыкания контактов TR питание МК появится и начнется STEP_1.

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

я уже тут всю голову изломал...не выходит каменный цветок...если писать в еепром можно напороться на сбой при отключении питания...вот недаром он у меня два раза перемёрз...возможно конечно глючит TR, там биметалл, контакт мог и пригореть за время эксплуатации...единственное радует, что таких attiny13 у меня целый десяток, сегодня собрал переходник, шьётся на ура из IDE...

теперь хочу попробовать считать программу их тиньки, может не закрыта? осталось найти какой GUI поддерживает ARDUINO AS ISP

PS интересно, в полностью перемёрзшем холодильнике TR может быть разомкнуто? (t > -12C)

 прошивку выложил в первом посте

Ещё немного букв найдено на просторах:
Циклограмма работы таймера примерно следующая:
1) При включении теплого холодильника датчик разомкнут, таймер обесточен, реле таймера в обесточенном состоянии замыкает компрессор. В этот момент кнопку нажимать бесполезно
2) Когда температура в камере опустилась до -10, датчик замыкается, на таймер поступает питание (через входной резистивно-емкостной делитель по цепи датчик-ТЭН), и таймер начинает считать полуволны синуса от сети 50Гц. Этот этап заканчивается, когда таймер насчитал 8 часов. Этот этап можно принудительно закончить, если нажать кнопку.
3) Когда прошло 8 часов после замыкания датчика (или после нажатия на кнопку), микроконтроллер включает режим оттайки. При этом он включает реле, переключая питание с компрессора на ТЭН. Полуволны синуса сети при этом не поступают на вход микроконтроллера, и он не ведет отсчет, хотя сам микроконтроллер запитан и удерживает реле включенным. Этот этап продолжается до момента размыкания датчика при +10 градусах.
(или срабатывания таймера 40 минут) -дополнено
4) Когда достигнута температура +10 на датчике, он размыкается. Таймер по-прежнему запитан, так как, начиная с этапа 3, ноль идет через низкоомные обмотки неработающего компрессора, а питание через две резистивно-емкостные ветви, которые при включенном реле параллелятся (а не делят питание) для увеличения мощности питания при включенном реле (оно потребляет гораздо больше остальной части схемы). До размыкания датчика, т.е. на этапе 3, он замыкал синус сети на ноль, и микроконтроллер ничего не считал. На этапе 4 датчик разомкнут, ТЭН поэтому обесточен, и через пассивный ТЭН синус проходит на вход микроконтроллера, который по ним отсчитывает 2 мин (время пассивной оттайки, когда и ТЭН обесточен, и компрессор еще не запущен).(время пассивной оттайки10 минут) дополнено
5) Когда истекло время пассивной оттайки, микроконтроллер выключает реле, включая таким образом компрессор и одновременно обесточивая самого себя, потому что питание не может поступать ни через компрессор, который в работе, ни через цепь датчик-ТЭН, потому что датчик разомкнут. Этап 5 – это на самом деле этап 1 выше, цикл повторяется. Всего 4 этапа: 1 и 2 заморозка, причем на этапе 1 нет питания на таймере; этап 3 – активная оттайка, когда включен ТЭН; этап 4 – пассивная оттайка, когда уже выключен ТЭН, но еще не включен компрессор

-NMi-
Offline
Зарегистрирован: 20.08.2018

Пиши в еепром секциями и все будет хорошо.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

-NMi- пишет:
Пиши в еепром секциями и все будет хорошо.

почитал форумы, конденсатор питания держит порядка 150 миллисекунд, при тактовой 300 килогерц, если определять пропадание питания за 80 миллисекунд, 70 миллисекунд достаточно чтобы записать счетчик в епром

Pyotr
Offline
Зарегистрирован: 12.03.2014

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

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

Обратите внимание на то, что двигатель таймера питается не напрямую от источника, а через нагреватель оттайки. Сопротивление двигателя значительно больше сопротивления нагревателя, поэтому при последовательном их включении практически вся мощность будет выделяться на двигателе, оставляя нагреватель холодным. 

Система работает в таком режиме недолго, около 10 минут. Обычно, этого времени хватает, чтобы испаритель достаточно охладился и контакты дефрост-термостата замкнулись.

Система находится в режиме охлаждения, таймер подает питание на компрессор и вентилятор. Испаритель уже достаточно охладился, поэтому контакты дефрост-термостата замкнуты.

Система перешла в режим оттайки. Таймер снял питание с компрессора и вентилятора и подал его на нагреватель оттайки. Испаритель пока имеет низкую температуру, поэтому контакты дефрост-термостата замкнуты.

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

http://nofrost.ru/ru/diagrams/standard_feedback

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

видимо да, было просто и со вкусом )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

А вот интересно, может ли attiny13a в глубоком сне от электролита 22мкф продержаться 8 часов

SAB
Offline
Зарегистрирован: 27.12.2016

Ионистор поставь, точно продержится

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em пишет:

А вот интересно, может ли attiny13a в глубоком сне от электролита 22мкф продержаться 8 часов

Не думаю.

rkit
Offline
Зарегистрирован: 23.11.2016

ua6em пишет:

А вот интересно, может ли attiny13a в глубоком сне от электролита 22мкф продержаться 8 часов

135 секунд

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

ua6em пишет:

А вот интересно, может ли attiny13a в глубоком сне от электролита 22мкф продержаться 8 часов

Не думаю.

это было в описании, что без питания сохраняет предыдущее состояние в течении 8 часов, одно дело пишет в епром, но при чем тут 8 часов тогда )))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em пишет:
это было в описании

Описание делал писатель-фантаст на аутсорсинге. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

ua6em пишет:
это было в описании

Описание делал писатель-фантаст на аутсорсинге. 

мастер по ремонту холодильников скорее )))
При цене в 500 рублей ремонт конечно практического смысла не имеет, но вот при разборе схемы и принципа работы - логика построения программы интересна (как задачи Евгения). Есть логические косяки обойти которые я пока в принципе не понимаю как, а интересно, я так понимаю разработчик оригинального девайса из Орла...

Неплохо было бы услышать начальника транспортного цеха...

Счетчик наработки сперва хотел сделать на миллис, но увидел, что предлагают считать тики сети...
Но это не главное, а вот поведение программы при внезапном отключении сети и обесточивании девайса...как обеспечить возврат в точку вылета из программы...только накапливать счетчики и вид операции в епром...альтернативы не вижу...тут засада с этими тиньками...перестали читаться...придётся подключить тяжёлую артиллерию...ChipProg-48  ))) (их есть у меня, но на работе)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Битва таймеров продолжается, еще один боец:

Таймер электронный ТЭО-02

 

Таймер электронный ТЭО-02 ( аналог таймера ТИМ-1), который применяется для автоматического управления оттайкой испарителя бытовых холодильников с системой No Frost.
Принцип работы таймера

Если контакты термореле разомкнуты, то при подаче питания запустится компрессор. Температура опускается до замыкания контактов теплового реле. Как только они замкнутся, таймер переводится в режим оттайки и находится в режиме оттайки до размыкания контактов теплового реле. (но не более 40 минут - кажется) После этого переходит в режим «пассивной» оттайки на 3 мин (10мин - по измерениям). Затем включается холодильный режим и работой компрессора управляет терморегулятор, а таймер отсчитывает 12 часов работы компрессора. Если на таймер в течении предыдущих 4-8 часов подавалось питание, то он не перейдет в режим оттайки, даже если контакты теплового реле будут разомкнуты. Для того что бы он перешел в режим оттайки, необходимо нажать на кнопку перед подачей питания на схему.

 

ЗЫ проверяю заявленные характеристики, немного не сходится с описанием. Питание схемы организовано по контактам 1-2 потребляет 2ма

В рабочий режим переходит после отработки режима пассивной оттайки .

 

YRK
Offline
Зарегистрирован: 20.08.2021

Выполняя просьбу UA6EM, привожу исходный код программы для таймера оттайки

 
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

YRK пишет:

Выполняя просьбу UA6EM, привожу исходный код программы для таймера оттайки

Код на ассемблере, ниже, адаптировать под IDE выше моих возможностей

;
; Holodilnik_ASM.asm
;
;CLK < 4 MHz
;
; Program followes the next conventions about GPR:
; R0-R15  used as variables (0<=d<=31: ADC,ADD,AND,ASR,BLD,BST,CLR,COM, CP,CPC,CPSE,DEC,ELPM,EOR, IN,INC,
;                                    LAC,LAS,LAT, LD,LDS,LPM,LSL,LSR,MOV,MUL, NEG, OR, POP,ROL,ROR,SBC,SUB)
; R16-R20 used as intermediate variables (16<=d<=31: ANDI, CBR, CPI, LDI, LDS, MULS, ORI, SBCI, SBR, SER, SUBI)
; R21-R25 used by subroutines as formal parameters
; R26-R27 used as 16-bit counter X
; R28-R31 used as two 16-bit indirect address register pointers Y, Z
;
;Fuse High Byte = 11111011 (0xFB)
;SELFPRGEN = 1 (Self Programming Disabled)
;DWEN = 1      (debugWire disabled, if enabled SPI low voltage programming is impossible)
;BODLEVEL1 = 0 (Brown-out Detector trigger level = 2.7V)
;BODLEVEL0 = 1 (Brown-out Detector trigger level = 2.7V)
;RSTDISBL = 1  (External Reset enabled, if disabled SPI low voltage programming is impossible)
;
;Fuse Low Byte = 01101010 (0x6A)
;SPIEN = 0  (Serial Programming enabled, if disabled low and high voltage programming is impossible)
;EESAVE = 1 (EEPROM is not preserved through Chip Erase)
;WDTON = 1  (Watchdog Timer is not locked to be reset source, it can be set-up by software)
;CKDIV8 = 0 (CLKPR = 3 upon start: divide clock by 8)
;SUT1 = 1   (Slowly rising power: additional 64 ms for start-up time)
;SUT0 = 0   (Slowly rising power: additional 64 ms for start-up time)
;CKSEL1 = 1 (Clock source internal 9.6 MHz)
;CKSEL0 = 0 (Clock source internal 9.6 MHz)

.include <tn13adef.inc>

.equ	freezer = 0x00		; freeser mode
.equ	heater  = 0x01		; heater mode

.equ	_1min   = 12		; 1 min const
.equ	_1hour	= 60*_1min	; 1 hour const

;.equ	_2min   = 2*_1min	; 2 min const
.equ	_8min   = 8*_1min	; 8 min const
.equ	_8hour	= 8*_1hour	; 8 hour const

.ESEG
.ORG	0x20
CNT_5sec:	.dw 0x0000	; clear timer-counter in EEPROM
MODE:		.db freezer	; set MODE = freezer


.CSEG

rjmp RESET			; Reset Handler
rjmp EXT_INT0		; IRQ0 Handler
rjmp PCINT  		; Pin Change interrupt Handler
reti;rjmp TIM0_OVF		; Timer0 Overflow Handler
reti;rjmp EE_RDY 		; EEPROM Ready Handler
reti;rjmp ANA_COMP		; Analog Comparator Handler
rjmp TIM0_COMPA 	; Timer0 CompareA Handler
reti;rjmp TIM0_COMPB 	; Timer0 CompareB Handler
rjmp WATCHDOG		; Watchdog Interrupt Handler
reti;rjmp ADC_INTR		; ADC Conversion Handler


RESET: ; Main program start

	; Set Stack Pointer to top of RAM
	ldi		r16, low(RAMEND)
	out		SPL,r16 


	; ------------------------------WDT settings------------------------------

	rcall	WDT_off		; switch off watchdog reset


	; --------------------------Power down settings---------------------------

	; Main Clock prescaler setup (timed sequence)
	ldi		r16, 0x80
	ldi		r17, 5    ; set divider to 2^5=32 (CLK=9.6MHz/32=0.3 MHz)
	out		CLKPR,r16 ; set Clock Prescaler Change Enable (CLKPCE) bit
	; Got 4 cycles to set the new Clock Prescale value from here
	out		CLKPR,r17 ; set Clock Prescale Factor (1-8) to 2^r17

	; Power Off Comparator for reduction of the power consumption
	sbi		ACSR, ACD ; set ACD bit in Comparator Control and Status Register

	; Power Off ADC for reduction of the power consumption
	ldi		r16,   1  ; set PRADC bit in...
	out		PRR, r16  ; ...Power Reduction Register

	; Sleep mode setup
	ldi		r16,   (1<<SE)		; allow sleep mode
	out		MCUCR,	r16


	; -------------------------------PortB setup------------------------------

	; set pull-up on PB1 input to use the KEY1
	ldi		r16,	(1<<PB1) | (1<<PB3) | (1<<PB4) | (1<<PB5)
	out		PORTB,	r16

	; set PB0 as output (freeser mode by default), PB1-PB5 are inputs
	ldi		r16,	1<<PB0
	out		DDRB,	r16


	; ------------------------------Timer0 setup------------------------------

	rcall	Timer_STOP	; stop and clear Timer0 

	; setup Timer0 mode
	ldi		r16,      2 ; load mode 2 (Clear Timer on OCRA Match) to...
	out		TCCR0A, r16 ; ...Timer/Counter Control Register A
	
	; set Timer0 to 50Hz pulse counting
	ldi		r16,      7 ; load CS0[2:0]=7 (Clock on T0 rising edge) to...
	out		TCCR0B, r16 ; ...Timer/Counter Control Register B
	
	; set Timer0 period overflow to 250 (250/50Hz=5sec)
	ldi		r16,    249 ; load TOP value (T0max-1) to...
	out		OCR0A,  r16 ; ...match A Register
	
	; clear Timer0 interrupt flags
	ldi		r16,   0x0E ; load a logic ones to...
	out		TIFR0,  r16 ; ...Timer/Counter 0 Interrupt Flag Register
	
	; set mask for Timer0 interrupts
	ldi		r16, 1<<OCIE0A; enable OCIE0A interrupt with...
	out		TIMSK0,    r16; ...Timer/Counter Interrupt Mask Register
	

	; ------------------------------Check EEPROM------------------------------

	; Read 5sec interval counter low byte
	ldi		r24, CNT_5sec
	rcall	EEPROM_read	
	mov		XL,	r23

	; Read 5sec interval counter high byte
	ldi		r24, CNT_5sec+1
	rcall	EEPROM_read	
	mov		XH,	r23

	; Read TCNT0
	ldi		r24,	MODE
	rcall	EEPROM_read	
	bst		r23,	0		; store mode to T-flag
	cbr		r23,	1		; clear LSB, because...
	out		TCNT0,	r23		; ...only even TCNT0 value is saved

	brtc	EEPROM_Cheked	; if MODE == freeze, jump over heater mode set up

	; It's heater mode is saved in EEPROM.
	; Check if it is active or passive heater mode.
	; If active mode was aborted, switch to heater mode.
	; In the case Timer and Counter are zero both, otherwise it's the passive
	; mode. Passive mode must be ignored. So freeze mode must be retained, 
	; but Timer & Counter data are ignored (cleared)

	;cpi		r23,	0
	;brne	Incorrect_Mode	; if TCNT0 != 0, jump over heater mode set up
	cpi		r23,	20
	brsh	Incorrect_Mode	; if TCNT0 >= 20, jump over heater mode set up

	;sbiw	XH:XL,	0
	;brne	Incorrect_Mode	; if X != 0, jump over heater mode set up
	sbiw	XH:XL,	2
	brsh	Incorrect_Mode	; if X >= 2, jump over heater mode set up

	sbi		PORTB,	0		; switch to heater mode

Incorrect_Mode:
	rcall	Timer_CLEAR		; clear Timer

EEPROM_Cheked:


	; ------------------------External interrupts setup-----------------------
	; May be pause here to wait for relay toggles? How long?

	; INT0 mode setup
	in		r16,	MCUCR
	andi	r16,	~3		; clear INT0 interrupt mode field
	ori		r16,	2		; falling edge INT0 interrupt
	out		MCUCR,	r16

	; PC interrupt mode setup
	sbi		PCMSK,	PCINT2	; PB2 pin change interrupt enable

	ldi		r16,	(1<<INT0) |	(1<<PCIE)	; define external interrupts...
	out		GIFR,	r16						; ...reset their flags and...
	out		GIMSK,	r16						; ...enable by mask


	rcall	Timer_RUN	; start Timer0 

	sei					; Enable interrupts

	
INFINITE: 
	sleep
	rjmp INFINITE ; infinite background cycle
   


TIM0_COMPA:	; compare event happens every 5 sec. if Timer0 is run

	push	YH
	push	YL
	push	r16
	in		r16, SREG	; store SREG value to Stack

	adiw	XH:XL, 1	; increment counter X by 5 sec.
	movw	YH:YL, XH:XL; get copy of counter X

	sbic	PORTB, PB0	; if MODE == heater...
	rjmp	Wait_Heater ; ...jump to heater timeout waiting


Wait_Freeze: 

	; Compare counter against _8hour
	subi YL, low(_8hour)	; Subtract low byte
	sbci YH, high(_8hour)	; Subtract with carry high byte
	brlo End_of_CMP			; if (YH:YL < _8hour), jump to End_of_CMP

	; If  (YH:YL >= _8hour)...
	rcall	Timer_CLEAR		; ...clear Timer
	sbi		PORTB, 0		; ...switch to heater mode
	rjmp	End_of_CMP		; jump to End_of_CMP


Wait_Heater: 

	; Compare counter against _8min
	subi YL, low(_8min)		; Subtract low byte
	sbci YH, high(_8min)	; Subtract with carry high byte
	brlo End_of_CMP			; if (YH:YL < _8min), jump to End_of_CMP

	; If  (YH:YL >= _8min)...
	rcall	Timer_CLEAR		; ...clear Timer
	cbi		PORTB, 0		; ...switch to freezer mode


End_of_CMP: 
	out		SREG, r16	; restore SREG value
	pop		r16
	pop		YL
	pop		YH

	reti


PCINT:	; this ISR is executed every 10ms if 50Hz pulses are present

	push	r16	
	in		r16, SREG		; store SREG value

	rcall	WDT_INT_Enable	; enable WDT interrupt and clear WDT

	out		SREG, r16		; restore SREG value
	pop		r16

	reti


WATCHDOG:	; this ISR is executed once in 32ms after last 50Hz pulse was dissapear

	push	r16
	in		r16, SREG		; store SREG value

	rcall	WDT_INT_Disable	; disable WDT interrupt

	ldi		r25,	0		; Erase & Write to EEPROM...

	ldi		r24, CNT_5sec	; ...5sec interval counter...
	mov		r23, XL			; ...low byte
	rcall	EEPROM_Prog

	ldi		r24, CNT_5sec+1	; ...5sec interval counter...
	mov		r23, XH			; ...high byte
	rcall	EEPROM_Prog

	ldi		r24, MODE		; ...relay mode
	in		r23,	TCNT0	; Save Timer0 bits, but LSB...	 
	cbr		r23,	1		; is cleared to save freezer mode by default
	sbic	PORTB,	PB0		; if "Active Mode" == heater...
	sbr		r23,	1		; ...save heater mode to EEPROM
	rcall	EEPROM_Prog

	out		SREG, r16		; restore SREG value
	pop		r16

	reti


EXT_INT0:	; this ISR is executed when Button is pressed

	push	r16
	in		r16, SREG	; store SREG value

	rcall	Timer_CLEAR	; clear Timer
	sbi		PORTB, 0	; switch to heater mode

	out		SREG, r16	; restore SREG value
	pop		r16

	reti


EEPROM_Prog:  ; r23 - EEPROM data to be written,  
              ; r24 - EEPROM address where to write,
              ; r25 - EEPROM operation: 0x00 - Erase & Write, 0x10 - Only Erase, 0x20 - Only Write.

	; Wait for completion of previous write
	sbic	EECR,EEPE
	rjmp	EEPROM_Prog

	push	r16
	in		r16, SREG	; store SREG value

	out		EECR,  r25 ; Set Programming mode
	out		EEARL, r24 ; Set up address (r24) in address register
	out		EEDR,  r23 ; Write data (r23) to data register

	; Start EEPROM timed sequence
	cli					; disable interrupts during timed sequence
	sbi		EECR, EEMPE ; Write logical one to EEMPE to enable timed operation
	sbi		EECR, EEPE  ; Start EEPROM write by setting EEPE

	out		SREG, r16	; restore SREG value (I-bit)
	pop		r16

	ret


EEPROM_read: ; r23 - EEPROM data to be returned,  r24 - EEPROM address to be read

	; Wait for completion of previous write
	sbic	EECR,EEPE
	rjmp	EEPROM_read

	push	r16
	in		r16, SREG	; store SREG value

	; Read EEPROM at address r24 
	cli					; disable interrupts during timed sequence
	out		EEARL, r24 ; Set up address (r24) in address register
	sbi		EECR, EERE ; Start eeprom read by writing EERE
	in		r23,  EEDR ; Read data from EEPROM data register

	out		SREG, r16	; restore SREG value (I-bit)
	pop		r16

	ret


WDT_off:	; If WDTON fuse is programmed (WDTON = 0), 
			; WDT_off subroutine does nothing. That means WDE is not
			; cleared and WDP is not changed. If WDTON fuse is
			; unprogrammed (WDTON = 1), WDT_off subroutine clears WDE,
			; but WDP is not changed anyway. WDTIE and WDTIF are also
			; not changed anyway.

	push	r16
	push	r17

	in		r16, SREG ; store SREG value

	cli		; Turn off global interrupt
	wdr		; Reset Watchdog Timer

	; Clear WDRF in MCUSR
	in		r17, MCUSR
	andi	r17, ~(1<<WDRF)
	out		MCUSR, r17

	; Write logical one to WDCE and WDE
	; Keep old prescaler setting to prevent unintentional time-out
	in		r17, WDTCR
	ori		r17, (1<<WDCE) | (1<<WDE)
	out		WDTCR, r17
	; Got four cycles to set the new values of WDE or WDP from here

	; Turn off WDT
	cbr		r17,   (1<<WDCE) | (1<<WDE)
	out		WDTCR, r17
	
	out		SREG, r16 ; restore SREG value (I-bit)

	pop		r17
	pop		r16
	
	ret


WDT_INT_Enable: ; enables WDT interrupt with predefined period 
				; input:  r21 -  WDT prescaler value (0-9)

	push	r21

	ldi		r21, 1			; force  WDT time-out to 32ms (4096 WDT oscillator cycles)
	wdr						; Reset Watchdog Timer

	sbrc	r21, 3
	ori		r21, 1<<WDP3
	andi	r21, (1<<WDP3) | 7
	ori		r21, (1<<WDTIF) | (1<<WDTIE)
	out		WDTCR, r21		; Enable WDT interrupt and set WDT prescaler
	
	pop		r21

	ret


WDT_INT_Disable: ; disables WDT interrupt

	push	r21

	ldi		r21, 0
	out		WDTCR, r21
	
	pop		r21

	ret


Timer_CLEAR: ; Timer0 and Counter X are cleared
	
	push	r16
	
	; clear Timer0 
	ldi		r16,      0 ; clear r16...
	out		TCNT0,  r16 ; ...and load Timer/Counter Register

	; clear counter X 
	clr		r27			; clear high byte
	clr		r26			; clear low byte

	pop		r16

	ret


Timer_RUN: ; Timer0 to be run 
	
	push	r16

	ldi		r16,      0 ; clear TSM...
	out		GTCCR,  r16 ; ...and load General Timer/Counter Control Register

	pop		r16

	ret


Timer_STOP: ; stop and clear timer 

	push	r16	

	; stop Timer0 
	ldi		r16,   0x81 ; set TSM = 1; PSR10 = 1...
	out		GTCCR,  r16 ; ...and load General Timer/Counter Control Register

	rcall	Timer_CLEAR	; clear Timer

	pop		r16
	
	ret

 

Green
Offline
Зарегистрирован: 01.10.2015

Как же так! Ведь помнится кто то на Асм х86 писал закрученные драйвера? А тут хорошо структурированный исходник, с которого даже по каментам можно переписать на Си, не?)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

Как же так! Ведь помнится кто то на Асм х86 писал закрученные драйвера? А тут хорошо структурированный исходник, с которого даже по каментам можно переписать на Си, не?)

и хде тут jnz, jz и т.д. )))

PS и таки да, С то я не знаю...

ritten,  
              ; r24 - EEPROM address where to write,
              ; r25 - EEPROM operation: 0x00 - Erase & Write, 0x10 - Only Erase, 0x20 - Only Write.

	; Wait for completion of previous write
	sbic	EECR,EEPE
	rjmp	EEPROM_Prog

 

Green
Offline
Зарегистрирован: 01.10.2015

ua6em пишет:

и хде тут jnz, jz и т.д. )))

А почитать? sbic - Skip if Bit Io Clear... Этот ассемблер примитивный до неприличия.) 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Green пишет:

ua6em пишет:

и хде тут jnz, jz и т.д. )))

А почитать? sbic - Skip if Bit Io Clear... Этот ассемблер примитивный до неприличия.) 

вот так что ли?
 

// Настройка фьюзов
// Fuse High Byte = 11111011 (0xFB)
// SELFPRGEN = 1 (Self Programming Disabled)
// DWEN = 1      (debugWire disabled, if enabled SPI low voltage programming is impossible)
// BODLEVEL1 = 0 (Brown-out Detector trigger level = 2.7V)
// BODLEVEL0 = 1 (Brown-out Detector trigger level = 2.7V)
// RSTDISBL = 1  (External Reset enabled, if disabled SPI low voltage programming is impossible)

// Fuse Low Byte = 01101010 (0x6A)
// SPIEN = 0  (Serial Programming enabled, if disabled low and high voltage programming is impossible)
// EESAVE = 1 (EEPROM is not preserved through Chip Erase)
// WDTON = 1  (Watchdog Timer is not locked to be reset source, it can be set-up by software)
// CKDIV8 = 0 (CLKPR = 3 upon start: divide clock by 8)
// SUT1 = 1   (Slowly rising power: additional 64 ms for start-up time)
// SUT0 = 0   (Slowly rising power: additional 64 ms for start-up time)
// CKSEL1 = 1 (Clock source internal 9.6 MHz)
// CKSEL0 = 0 (Clock source internal 9.6 MHz)

#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h>     // не забываем подключить

#define  freezer  0x00      //; freeser mode
#define  heater   0x01      //; heater mode
#define  _1min    12        //; 1 min const
#define  _1hour   60*_1min  //; 1 hour const
#define  _2min    2*_1min   //; 2 min const
#define  _8min    8*_1min   //; 8 min const
#define  _8hour   8*_1hour  //; 8 hour const

// Прерывания
// INT0 обрабатывает нажатие кнопки (настраивать INPUT_PULLUP)
// PCINT2 (настраивать INPUT)

ISR(INT0_vect) {
  // наш код обработки нажатия кнопки принудитильного оттаивания
}

// Обработчик прерывания PCINT0
ISR(PCINT0_vect)
{
  if ((PINB & (1 << PB2)) == 0 )
  {
    // считаем тики сети
  }
}

ISR(WDT_vect) {
  // Обработчик таймера WDT
}

void WDT_INT_Disable(void) //disables WDT interrupt
{
  /*
  asm volatile(
    "push  r21 \n"
    "ldi   r21, 0 \n"
    "out   WDTCR, r21 \n"
    "pop   r21 \n"
    :::"r21" );
    */
  wdt_disable();
}

void setup() {
  DDRB = 0b00000001;    // pinMode(0, OUTPUT);
  PORTB &= ~(1 << PB0); // digitalWrite(0, LOW);
  pinMode(1, INPUT);    // D1 PB1 (ATTINY13A - Attiny13)
  PORTB |= (1 << PB1);  // D1 - INPUT_PULLUP
  pinMode(2, INPUT);    // D2 PB2 (ATTINY13A - Attiny13)

  // Настройка прерываний
  // WDT стр.48-49 datasheet
  cli(); // Запрещаем прерывания на время изменения WDE и WDP
  
  //инициализация ватчдога
  wdt_reset(); // сбрасываем
  wdt_enable(WDTO_4S);   // разрешаем ватчдог 4 сек
  WDTCR |= (1 << WDTIE); // разрешаем прерывания по ватчдогу. Иначе будет резет.
  
  // Инициализация INT0 и PCINT0
  MCUCR = _BV(ISC01) | _BV(ISC00);  // FALLING
  // RISING - 11, LOW - 00,HIGH -01
  GIMSK |= (1 << PCIE) | _BV(INT0); // Разрешаем внешние прерывания PCINT0, INT0
  PCMSK |= (1 << PB2)/* | (1<<PB1)*/; // Разрешаем по маске прерывания на ноге (PCINT2)
  sei();                            // Разрешаем прерывания глобально: SREG |= (1<<SREG_I)
}

void loop() {

}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Инициализация WDT таймера с моим даташитом что-то не сходится:
 

WDT_INT_Enable: ; enables WDT interrupt with predefined period 
				; input:  r21 -  WDT prescaler value (0-9)

	push	r21

	ldi		r21, 1			; force  WDT time-out to 32ms (4096 WDT oscillator cycles)
	wdr						; Reset Watchdog Timer

	sbrc	r21, 3
	ori		r21, 1<<WDP3
	andi	r21, (1<<WDP3) | 7
	ori		r21, (1<<WDTIF) | (1<<WDTIE)
	out		WDTCR, r21		; Enable WDT interrupt and set WDT prescaler
	
	pop		r21

	ret