Atmega328pu-ph что за зверь?

dizzel
Offline
Зарегистрирован: 21.03.2016

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

Cформированная командная строка:
avrdude.exe -p m328p -c usbasp -P usb  -U lock:r:lock.hex:r -U hfuse:r:hfuse.hex:r -U lfuse:r:lfuse.hex:r -U efuse:r:efuse.hex:r
avrdude.exe: warning: cannot set sck period. please check for usbasp firmware update.
avrdude.exe: error: programm enable: target doesn't answer. 1 
avrdude.exe: initialization failed, rc=-1
             Double check connections and try again, or use -F to override
             this check.
avrdude.exe done.  Thank you.
 
Подскажите что с ними не так и как теперь быть? В гугле инфы очень мало. Нашел только такую тему https://www.avrfreaks.net/forum/fake-atmega328p
Но там по сути ничего.
-NMi-
Offline
Зарегистрирован: 20.08.2018

Подцепи его по SPI, прочитай ID и фьюзы. Запость сюдой. Подумаю.

dizzel
Offline
Зарегистрирован: 21.03.2016

1000 извинений, но я видимо чего-то не понял или не так написал. Я цепляю его через usbasp программатор по тому же spi. Работаю avrdude_prog 3.3. Фьюзы не читаются, а как считать id не знаю.

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

Значит либо процу хана, либо не правильно подключил.

SPI это mosi/miso/sck/res и + и - питание 5 Вольт.

ID проца - это несколько байт (2 или 3, не помню) для ТОЧНОГО определения проца при программировании.

dizzel
Offline
Зарегистрирован: 21.03.2016

Подключение верное, потому что подсовываю ему нормальную мегу328-ау. Все читается. Это значит что мое подключение верное. Меня смущает строчка avrdude.exe: warning: cannot set sck period. Я не могу ничего прочитать по SPI потому что этот SPI не заводится. Ни фьюзы, ни флэш, ничего. ID читается по какому-то другому протоколу?

Гриша
Offline
Зарегистрирован: 27.04.2014

процессор новый? еще не использовали?

Feofan
Offline
Зарегистрирован: 28.05.2017

dizzel пишет:

смущает строчка avrdude.exe: warning: cannot set sck period.

JP1 (Slow SCK) понижает частоту. Или обновлять FW USBasp. https://www.fischl.de/usbasp/

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

dizzel пишет:

Подключение верное, потому что подсовываю ему нормальную мегу328-ау. Все читается.

Значит процу пипец. Выкинь.

yuhenotix@2p-ma...
Offline
Зарегистрирован: 09.06.2019

Как уже отметили  надо снизить частоту SPI. Если прошивка в USBasp новая то можно в командной строке   дописать значение скорости, если старая то только перемычкой на плате  USBasp 

Гриша
Offline
Зарегистрирован: 27.04.2014

у самого такой проц, прошить фьюзы не смог НО:

использую программатор ардуино "arduino AS ISP"

установил MiniCore с гитхаба

variant "328P/328PA"

Bootloader "нет"

BOD 2,7v

Clock " 1MHz internal"

compiler LTO - disabled

на плате ранее стояла атмега8, заменил на этот. Пару раз пробовал зашить- ничего не получилось. Полазил лупой и увидел непропай. после недолгой работы паяльником все заработало. т.к. мне частоты достаточно и кварца нет, оставил как есть. 

Izvekoff
Offline
Зарегистрирован: 02.03.2020

yuhenotix@2p-mail.com пишет:

Как уже отметили  надо снизить частоту SPI. Если прошивка в USBasp новая то можно в командной строке   дописать значение скорости, если старая то только перемычкой на плате  USBasp 

dizzel
Offline
Зарегистрирован: 21.03.2016

Процы взял из ленты. Всего их 7 штук. Попробовал 3, ни с одним ничего не получилось. Попробовал с перемычкой на jp3. Без результатов.

Гриша
Offline
Зарегистрирован: 27.04.2014

dizzel пишет:

Процы взял из ленты. Всего их 7 штук. Попробовал 3, ни с одним ничего не получилось. Попробовал с перемычкой на jp3. Без результатов.

попробуй чего-нить залить как я в посте 9 написал, 

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

dizzel пишет:

Попробовал с перемычкой на jp3. Без результатов.

Ну дак вышли "советчикам" с перемычкой по паре перемычек почтой. Пусть в левое и правое вставят, мошт мосх паявицца.

Все твои "игры" со скоростями - фуфло полное. Нормальные программаторы и без этой перемычки могут менять скорость обмена по шине. Кроме "дудки" есть ещё по крайней мере пара-тройка БЕСПЛАТНЫХ программаторов под твой "свисток". Пробуй их. Задача твоя прочитать либо ид либо фузы. Без них никак.

Ну про платные программаторы я не буду, хотя и такие есть в природе.

dizzel
Offline
Зарегистрирован: 21.03.2016
Я попробовал переделать ардуинку в программатор, но она при попытке прошить  с какого-то перепугу вообще ничего не определяет. Ни плохие, ни хорошие, ни другие мк. С этим надо еще разобраться почему так.
 
 Т.к. голова квадратная то пока отложил в сторону.
 
На днях попробую обновить прошивку в свистке, но для этого мне нужно разобраться почему моя ардуина не может в программирование по ИСП (хотя раньше могла, я шил с нее тиньки)

-NMi- пишет:
Кроме "дудки" есть ещё по крайней мере пара-тройка БЕСПЛАТНЫХ программаторов под твой "свисток". Пробуй их.

Это какие например? Яндекс по запросу выдает только дудку и в качестве альтернатив целое нихрена.

yuhenotix@2p-ma...
Offline
Зарегистрирован: 09.06.2019

Не  слушай  этого балабола, он ничего не знает про программаторы :)

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

dizzel пишет:

Это какие например? Яндекс по запросу выдает только дудку и в качестве альтернатив целое нихрена.

Фигово, что ты думаешь только яндексом, фигово.

Давай сделаем проще - пусть тебе пока "перемычечные" будут давать советы и как тебе надоест, я дам для посмотреть через тимвьювер мой ноутбук и покажу ТРИ бесплатных программатора и платный. Устроит?

slider
Offline
Зарегистрирован: 17.06.2014

dizzel пишет:

Процы взял из ленты. Всего их 7 штук. Попробовал 3, ни с одним ничего не получилось. Попробовал с перемычкой на jp3. Без результатов.

из ленты ? 
они вроде ж пластмассовом черном прямоугольном кейсе . 
а фотографию микроконтроллера что не приложили ? и где покупали ?

тоже не шились новые atmega328p u-th atmega328pu-th купленные в россии
решилось так http://arduino.ru/forum/apparatnye-voprosy/atmega328pb-u-chem-chrevato#comment-536135   ( USBtinyISP )

// если не поможет попробуйте на крайняк параллельное программирование - Atmega fusebit doctor 
// или возможно это просто битый чип

fake atmega328p

Гриша
Offline
Зарегистрирован: 27.04.2014

у меня тоже не шились, пока паяльником не прошел, теперь и фьюзы меняются  и скетчи принимает.

к сожалению в программировании я слабоват, в основном мой друг профессор Тыков и интернет.

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

ИДЭ 1.8.3

dizzel
Offline
Зарегистрирован: 21.03.2016

slider, Гриша

Большое спасибо, Буду пробовать. К сожалению результаты смогу сообщить не раньше выходных.

Покупал тут https: //aliexpress.ru/item/33042649983.html

Фото к сожалению не сделал, но он точь в точь как на фото по ссылке, которую я скинул в первом посте.

Гриша
Offline
Зарегистрирован: 27.04.2014

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


avrdude: Version 6.3-20190619
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "D:\ardu\arduino-1.8.12-portable\portable\packages\MiniCore\hardware\avr\2.0.5/avrdude.conf"

         Using Port                    : COM4
         Using Programmer              : stk500v1
         Overriding Baud Rate          : 19200
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : STK500
         Description     : Atmel STK500 Version 1.x firmware
         Hardware Version: 2
         Firmware Version: 1.18
         Topcard         : Unknown
         Vtarget         : 0.0 V
         Varef           : 0.0 V
         Oscillator      : Off
         SCK period      : 0.1 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: erasing chip
avrdude: reading input file "0x3f"
avrdude: writing lock (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude: 1 bytes of lock written
avrdude: verifying lock memory against 0x3f:
avrdude: load data lock data from input file 0x3f:
avrdude: input file 0x3f contains 1 bytes
avrdude: reading on-chip lock data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 1 bytes of lock verified
avrdude: reading input file "0b11111101"
avrdude: writing efuse (1 bytes):

Writing | ################################################## | 100% -0.00s

avrdude: 1 bytes of efuse written
avrdude: verifying efuse memory against 0b11111101:
avrdude: load data efuse data from input file 0b11111101:
avrdude: input file 0b11111101 contains 1 bytes
avrdude: reading on-chip efuse data:

Reading | ################################################## | 100% 0.02s

avrdude: verifying ...
avrdude: 1 bytes of efuse verified
avrdude: reading input file "0xd6"
avrdude: writing hfuse (1 bytes):

Writing | ################################################## | 100% 0.03s

avrdude: 1 bytes of hfuse written
avrdude: verifying hfuse memory against 0xd6:
avrdude: load data hfuse data from input file 0xd6:
avrdude: input file 0xd6 contains 1 bytes
avrdude: reading on-chip hfuse data:

Reading | ################################################## | 100% 0.01s

avrdude: verifying ...
avrdude: 1 bytes of hfuse verified
avrdude: reading input file "0xe2"
avrdude: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.01s

avrdude: 1 bytes of lfuse written
avrdude: verifying lfuse memory against 0xe2:
avrdude: load data lfuse data from input file 0xe2:
avrdude: input file 0xe2 contains 1 bytes
avrdude: reading on-chip lfuse data:

Reading | ################################################## | 100% 0.00s

avrdude: verifying ...
avrdude: 1 bytes of lfuse verified

avrdude done.  Thank you.


avrdude: Version 6.3-20190619
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "D:\ardu\arduino-1.8.12-portable\portable\packages\MiniCore\hardware\avr\2.0.5/avrdude.conf"

         Using Port                    : COM4
         Using Programmer              : stk500v1
         Overriding Baud Rate          : 19200
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : STK500
         Description     : Atmel STK500 Version 1.x firmware
         Hardware Version: 2
         Firmware Version: 1.18
         Topcard         : Unknown
         Vtarget         : 0.0 V
         Varef           : 0.0 V
         Oscillator      : Off
         SCK period      : 0.1 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "D:\ardu\arduino-1.8.12-portable\portable\packages\MiniCore\hardware\avr\2.0.5/bootloaders/optiboot_flash/bootloaders/atmega328p/8000000L/optiboot_flash_atmega328p_UART0_9600_8000000L_B5.hex"
avrdude: writing flash (32768 bytes):

Writing | ################################################## | 100% 0.00s

avrdude: 32768 bytes of flash written
avrdude: verifying flash memory against D:\ardu\arduino-1.8.12-portable\portable\packages\MiniCore\hardware\avr\2.0.5/bootloaders/optiboot_flash/bootloaders/atmega328p/8000000L/optiboot_flash_atmega328p_UART0_9600_8000000L_B5.hex:
avrdude: load data flash data from input file D:\ardu\arduino-1.8.12-portable\portable\packages\MiniCore\hardware\avr\2.0.5/bootloaders/optiboot_flash/bootloaders/atmega328p/8000000L/optiboot_flash_atmega328p_UART0_9600_8000000L_B5.hex:
avrdude: input file D:\ardu\arduino-1.8.12-portable\portable\packages\MiniCore\hardware\avr\2.0.5/bootloaders/optiboot_flash/bootloaders/atmega328p/8000000L/optiboot_flash_atmega328p_UART0_9600_8000000L_B5.hex contains 32768 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% -0.00s

avrdude: verifying ...
avrdude: 32768 bytes of flash verified
avrdude: reading input file "0x0f"
avrdude: writing lock (1 bytes):

Writing | ################################################## | 100% 0.02s

avrdude: 1 bytes of lock written
avrdude: verifying lock memory against 0x0f:
avrdude: load data lock data from input file 0x0f:
avrdude: input file 0x0f contains 1 bytes
avrdude: reading on-chip lock data:

Reading | ################################################## | 100% -0.00s

avrdude: verifying ...
avrdude: 1 bytes of lock verified

avrdude done.  Thank you.

скрин настройки:

тестовый скетч, на атмега8 работает нормально, а на этой хрене не могу ничего получить от DS18B20... осциллографом вижу факт передачи данных, даже тайминги ресета соответствуют даташиту. Не могу получить адрес датчиков ну и все вытекающее выход по ошибке ERR=1 (строка 190). в выводе адреса одни нули :( строка 160.


/*
 * тест DS18B20 на saa1064
 * 
 * Device 0 Address: 28 FF 17 B1 61 18 02 53  - на 5 порту -  OneWire  ds(5);
 * Device 0 Address: 28 FF 5C C1 61 18 02 62  - на 6 порту - OneWire  ds(6);

 */

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

#include <Wire.h>   // enable I2C bus
#include <OneWire.h>

OneWire  ds(5);          // Линия 1-Wire будет на этом выходе

byte saa1064 = 0x70 >> 1; // define the I2C bus address for our SAA1064 (pin 1 to GND) ****

//  адрес           1   2   3   4    5    6    7   8    9   10    11     12
//  значение     0  1   2   3   4    5    6    7   8    9    -   пустота     
byte digits[12]={63, 6, 91, 79, 102, 109, 125,  7, 127, 111, 64,    0    };

//int digits[12]={63, 6, 91, 79, 102, 109, 125,  7, 127, 111, 64,    0,       57, 94, 121, 113};
// these are the byte representations of pins required to display each digit 0~9 then A~F

byte Dt1, Dt2, Dt3, Dt4; // цифирки на табло т.е. сегменты 


volatile int      SignBit = 0;            // знак температуры
volatile int      Tc_100 = 100;       // умножено на 100 целочисленное значение температуры, т.е. запятая "подвинута >>" на 2 знака 
volatile byte     ERR = 0;            // ошибка при обращении к датчику  (отключил за ненадобностью)
volatile boolean  readnew = 0;        // признак получения новой температуры, необходимо сбрасывать после обработки !!!!!!!!
volatile byte     tick_tempr = 0;         // 0-255 - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
volatile boolean  part = 0;               // часть кода до/после запроса на конвертацию
unsigned long previousMillis1t = 0;

void setup()
{
//  Serial.begin(9600); 

  Wire.begin(); // start up I2C bus
  // turns on dynamic mode and adjusts segment current to 12mA
  Wire.beginTransmission(saa1064);
  Wire.write(B00000000); // this is the instruction byte. Zero means the next byte is the control byte
  Wire.write(B01000111); // control byte (dynamic mode on, digits 1+3 on, digits 2+4 on, 12mA segment current
  Wire.endTransmission();
    delay(500);

        Wire.beginTransmission(saa1064);
      Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
      Wire.write(digits[2]); //            //d2
      Wire.write(digits[3]); //            //d3 
      Wire.write(digits[4]); //            //d4
      Wire.write(digits[1]); //            //d1
      Wire.endTransmission();  
    delay(1000);
}


void loop() {  // loop ++++++++++++++++++++++++++++++++++++++++++++

  GETTEMP ();        // получаем температуру

  
 if ( readnew == 1 )   //    получили температуру - здесь отправить ее на табло
    {      
          if (SignBit !=0) { Dt1 = 10; } // знак температуры
          else {Dt1 = 11; }               // или нет знака

       Dt2 = ((Tc_100)/1000%10);
       Dt3 = ((Tc_100)/100%10);
       Dt4 = ((Tc_100)/10%10);    
          
      readnew =0;
      Wire.beginTransmission(saa1064);
      Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
      Wire.write(digits[Dt2]); //            //d2
      Wire.write(digits[Dt3]+128); //        //d3 рисуем точку разделитель
      Wire.write(digits[Dt4]); //            //d4
      Wire.write(digits[Dt1]); //            //d1
      Wire.endTransmission();

//      Serial.print("   Temperature: ");
//       if (SignBit !=0) { Serial.print(" -");}
//                          Serial.print(Tc_100);
//                          Serial.println(" ");
 delay (5000);              
    }
   
   

 if ( ERR != 0 )   //    если получили ошибку датчика температуры
    {   

            Dt1 = 11;
            Dt3 = 11;
            Dt4 = 11;    
        if ( ERR == 1 ) 
       {
            Dt2 = 1;                   // цифра 1
//      Serial.println(" ERR == 1");
       }
        if ( ERR == 2 ) 
       {
            Dt2 = 2;                   // цифра 2
//      Serial.println(" ERR == 2");      
       }
        if ( ERR == 3 ) 
       {
            Dt2 = 3;                   // цифра 3
//      Serial.println(" ERR == 3");  
       }

      Wire.beginTransmission(saa1064);
      Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
      Wire.write(digits[Dt2]); //            //d2
      Wire.write(digits[Dt3]); //            //d3 
      Wire.write(digits[Dt4]); //            //d4
      Wire.write(digits[Dt1]); //            //d1
      Wire.endTransmission();

      delay (1000);       

      Wire.beginTransmission(saa1064);
      Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
      Wire.write(digits[10]); //            //d2
      Wire.write(digits[10]); //            //d3 
      Wire.write(digits[10]); //            //d4
      Wire.write(digits[10]); //            //d1
      Wire.endTransmission();
    
    delay (1000);  

    
    }
  
} // and of  loop ---------------------------------------------------------------
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~



// температура 1 датчика. начало++++++++++++++++++++++++++++++++++++++++++++++++++
void GETTEMP ()
{
  byte present = 0;
  byte data[12];
  byte addr[8]={0, 1, 2, 3, 4, 5, 6, 7};
  unsigned long currentMillis1t = millis();


if (part != 0 && currentMillis1t - previousMillis1t >= 500) 
  {
    previousMillis1t = currentMillis1t;
    tick_tempr++;
  }
   
 if (part == 0 && readnew == 0) // запрос на преобразование, до получения данных из датчика
 {   
  if (!ds.search(addr)) 
    {
for (int i = 0; i < 8; i++)
{


      Wire.beginTransmission(saa1064);
      Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
      Wire.write(digits[11]); //            //d2
      Wire.write(digits[11]); //            //d3 
      Wire.write(digits[11]); //            //d4
      Wire.write(digits[10]); //            //d1
      Wire.endTransmission();
        delay (500);  
        
       Dt1 = 11;
       Dt2 = ((addr[i])/1000%10);
       Dt3 = ((addr[i])/100%10);
       Dt4 = ((addr[i])/10%10);    
          
      Wire.beginTransmission(saa1064);
      Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
      Wire.write(digits[Dt2]); //            //d2
      Wire.write(digits[Dt3]+128); //        //d3 рисуем точку разделитель
      Wire.write(digits[Dt4]); //            //d4
      Wire.write(digits[Dt1]); //            //d1
      Wire.endTransmission();
    delay (2000);  
}
      ds.reset_search();
      ERR=1;
      delay(250);
      return;
    }
  if (OneWire::crc8( addr, 7) != addr[7]) 
    {
//     Serial.print("CRC is not valid!\n"); //CRC is used for data transfer validation  !!!!!!!!!!!!!!!!!!!!!!!!
     ERR=2;
     return;
    }
  
  if (addr[0] != 0x28) 
    {
//      Serial.print("Device is not a DS18B20  device.\n"); /// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1!!!!!!!!!!!!!!!
      ERR=3;
      return;
    }
   ERR=0;
  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);   // Запускаем конвертацию
  tick_tempr = 0;  // запускаем таймер преобразования с этого момента
  part = 1;
  previousMillis1t = currentMillis1t;
 } // and   запрос на преобразование, до получения данных из датчика

 
  if (part != 0 && tick_tempr >= 10) //если прошло больше  ( > 1 секунды)
  {                                 // подробности в даташите!!!!!!!!!!
  
  present = ds.reset();
  ds.select(addr); 

  ds.write(0xBE);    // Считываем ОЗУ датчика  

  for (byte i = 0; i < 9; i++)    // Обрабатываем 9 байт
  {     data[i] = ds.read();   }
  
  // Высчитываем температуру :)

  int TReading;
  TReading = (data[1] << 8) + data[0];
  
   SignBit = TReading & 0x8000;      // Проверяем дубак там или нет
   if (SignBit)                      // Если на улице дубак :)
   { TReading = (TReading ^ 0xffff) + 1;  }

   Tc_100 = (6 * TReading) + TReading / 4;     // Умножаем на (100 * 0.0625) или 6.25
                                               // т.е. убираем 4 лишних бита                                         
   readnew = 1;  
   part = 0;   
   tick_tempr = 0;
}
}
//----------------------------------конец получения температуры
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

изначально был код с часами и установкой с 2х кнопок, часы работают превосходно...

/* ---
 * 20.11.2018 закомментил блок яркости, попытка устранить перегрев SAA1064 - повисает
 * 02.04.2018 добавил яркость на А2 переменником            
 * 
 * не много причесал 24.12.2017
 * исправлен, дополнен, на 11,09,2017 это последний код
 * запись в часы по нажатию кнопки
 * если отнять или прибавить минуту ожидание подтверждения  100 сек
 * если нажал кнопку - запись в часы.
 * если установка времени - для записи мигают все сегменты около 100 сек или 
 * запись по окончанию мигания  
 * легко помещается в атмегу8
 */


/*
 * часы ds3231  and saa1064 - работает :)
 * добавил DS18B20 
 * убрал получение температуры из часов *(в коробке тепло)
 * удалил дни недели - тут они не нужны
 * 
 * 
 * небольшая памятка
 * //T(sec)(min)(hour)(dayOfWeek)(dayOfMonth)(month)(year)
 * //T(00-59)(00-59)(00-23)(1-7)(01-31)(01-12)(00-99)
 * //Example: 02-Feb-09 @ 19:57:11 for the 3rd day of the week -> T1157193020209
 * 
 */
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
                                     //#include "class_BUTTON.h"  // для обработки кнопок класс старый, но рабочий... мне хватает его
                                                                  // вставил в этот код

#include <Arduino.h>
class BUTTON {
public:
//================================================================
static const byte bounce_              =   50; // длительность отслеживания дребезга.
static const byte doubleclick_         =  200; // длительность отслеживания двойного клика.
static const unsigned long timer_      = 3000; // длительность отслеживания неактивности.
static const unsigned int retention_   = 1000; // длительность отслеживания нажатия и удержания.
//================================================================
boolean click_down;
boolean click_up;
boolean doubleclick;
boolean timer;
boolean retention;
//=================================
unsigned long m;
boolean  p;
boolean  b;
boolean dc;
byte     c;
boolean  t;
boolean  r;
//=================================
byte _pb;
//=================================
BUTTON(byte pb) {
_pb = pb;
pinMode(_pb, INPUT);
digitalWrite(_pb, 1);
//====
click_down      = 0;
click_up        = 0;
doubleclick     = 0;
timer           = 0;
retention       = 0;
//====
m  =      millis();
p  = digitalRead(_pb);
b  =                0;
dc =                0;
c  =                0;
t  =                0;
r  =                0;
//====
}

void read() {
//=======================================================
unsigned long nm =      millis();
boolean       np = digitalRead(_pb);
//=================
boolean nb  = 0;
boolean ndc = 0;
boolean nt  = 0;
boolean nr  = 0;
//================
click_down  = 0;
click_up    = 0;
doubleclick = 0;
timer       = 0;
retention   = 0;
//=================
if (np != p) {p = np; m = nm; }
//=======================================================
if (nm - m > bounce_) {nb = 1;}
if (nm - m > doubleclick_) {ndc = 1;}
if (ndc != dc) {dc = ndc; if (dc == 1) {c = 0;}}
if (nb != b) {b = nb;
if (p == 0 && b == 0) {click_down = 1;
++c;      if (c == 2) {c = 0; doubleclick = 1;}
}
if (p == 1 && b == 1) {click_up = 1;}
}
//=======================================================
if (nm - m > timer_) {nt = 1;}
if (nt != t) {t = nt;
if (p == 1 && t == 1) {timer = 1;}
}
//=======================================================
if (nm - m > retention_) {nr = 1;}
if (nr != r) {r = nr;
if (p == 0 && r == 1) {retention = 1;}
}
//=======================================================
}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

#include <Wire.h>   // enable I2C bus
#include "class_noDELAY.h"
#include <OneWire.h>

OneWire  ds(5);          // Линия 1-Wire будет на этом выходе

#define DS3231_I2C_ADDRESS 104
byte saa1064 = 0x70 >> 1; // define the I2C bus address for our SAA1064 (pin 1 to GND) ****

//  адрес        1  2   3   4   5    6    7    8   9   10   11     12
//  значение     0  1   2   3   4    5    6    7   8    9    -   пустота     
byte digits[12]={63, 6, 91, 79, 102, 109, 125,  7, 127, 111, 64,    0    };

//int digits[12]={63, 6, 91, 79, 102, 109, 125,  7, 127, 111, 64,    0,       57, 94, 121, 113};
// these are the byte representations of pins required to display each digit 0~9 then A~F

byte D1, D2, D3, D4, Dt1, Dt2, Dt3, Dt4; // цифирки на табло т.е. сегменты 
byte seconds, minutes, hours;

byte D11, D22, D33, D44; //для установки времени в RTC

byte ii = 10; // обращение к часам (обращаемся сразу)
byte ik = 0;  // переключение между градусником и часами
byte dd = 0;  // частота обновления saa1064


boolean tt=0; // мигаем запятой на табло

noDELAY nD_11;  // for test !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

volatile int    SignBit;        // знак температуры
volatile int    Tc_100 = 100;   // умножено на 100 целочисленное значение температуры, т.е. запятая "подвинута >>" на 2 знака 
// byte            ERR = 0;      // ошибка при обращении к датчику  (отключил за ненадобностью)
 boolean         readnew = 0;   // признак получения новой температуры, необходимо сбрасывать после обработки !!!!!!!!
 byte        tick_tempr; // 0-255 - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 boolean         part; // часть кода до/после запроса на конвертацию
 unsigned long   previousMillis1t = 0;


  BUTTON BUTTON_01(8); // объявляем объект класса BUTTON кнопку с именем BUTTON_01, подключенную к пину (в скобках).
  BUTTON BUTTON_02(9); // объявляем объект класса BUTTON кнопку с именем BUTTON_02, подключенную к пину  (в скобках).
  noDELAY nD_01; // вспом.  генератор  // объявление объекта класса noDELAY с именем nD_01.
//  noDELAY nD_02; // главный генератор  // объявление объекта класса noDELAY с именем nD_02.
//  int led1 = 8;  //  светик работы кнопки 1 на пульте 
//  int led2 = 9;  //  светик работы кнопки 2 на пульте
  boolean bp11 = 0;  // кнопка 1
  boolean bp21 = 0;  // кнопка 2
  byte    bp31 = 0;  // переменная  для циклов кнопок 
  
  byte i1  = 0; // в кнопках
  int i2 = 0;  // в кнопках
  byte i3 = 0;  // установка времени
  boolean  var2; // мигаем разделителем и часами в настройках
  boolean  var3; // мигаем разделителем и часами в настройках, не хотел, но добавил :))))


void setup()
{
  Wire.begin();
//  Serial.begin(9600);
  //set control register to output square wave on pin 3 at 1Hz
  Wire.beginTransmission(DS3231_I2C_ADDRESS); // 104 is DS3231 device address
  Wire.write(0x0E); // 
  Wire.write(B00000000);
  Wire.write(B10001000);
  Wire.endTransmission();

  delay(500);
  // turns on dynamic mode and adjusts segment current to 12mA
  Wire.beginTransmission(saa1064);
  Wire.write(B00000000); // this is the instruction byte. Zero means the next byte is the control byte
  Wire.write(B01000111); // control byte (dynamic mode on, digits 1+3 on, digits 2+4 on, 12mA segment current
  Wire.endTransmission();

  nD_11.start();
  nD_01.start();   // for test !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

      pinMode(6,INPUT);//define button interface as input для разрядов и входа в режим програмирования
      pinMode(7,INPUT);//define button interface as input для установки чисел в разрядах
}


void loop() {  // loop ++++++++++++++++++++++++++++++++++++++++++++
/*
 int op;
 byte opi, opi2;
 op = analogRead (A2); 
 op = map(op, 0, 1023, 1, 4);
 opi = byte (op);
 if (opi != opi2)
 {
  opi2 = opi;
switch (opi) 
    {
    case 1:
      //выполняется, когда var равно 1
  Wire.beginTransmission(saa1064);
  Wire.write(B00000000); // this is the instruction byte. Zero means the next byte is the control byte
  Wire.write(B00010111); // control byte (dynamic mode on, digits 1+3 on, digits 2+4 on, 12mA segment current
  Wire.endTransmission();
      break;
    case 2:
      //выполняется когда  var равно 2
   Wire.beginTransmission(saa1064);
  Wire.write(B00000000); // this is the instruction byte. Zero means the next byte is the control byte
  Wire.write(B00100111); // control byte (dynamic mode on, digits 1+3 on, digits 2+4 on, 12mA segment current
  Wire.endTransmission();   
      break;
    case 3:
      //выполняется когда  var равно 3
  Wire.beginTransmission(saa1064);
  Wire.write(B00000000); // this is the instruction byte. Zero means the next byte is the control byte
  Wire.write(B01000111); // control byte (dynamic mode on, digits 1+3 on, digits 2+4 on, 12mA segment current
  Wire.endTransmission();    
      break;
  }
 }
*/

  BOTTONPRESSED1 (); // обработка нажатий цикл 1 (на выходе ребультат в переменной bp31 = 1 или 2 или 3, после использования скинуть в 0)
                     // запрос на редактирование времени
  BOTTONPRESSED2 (); // обработка нажатий цикл 2 (на выходе  bp31=4 - добавить 1 минуту, 5-отнять, 6 - установть, после использования скинуть в 0)
                     // подтверждение, что вы хотите время поправить и что именно поправить 
  BOTTONPRESSED3 (); // установка или корректировка времени

 if (bp31==0)  // ----------- если кнопки не нажаты -----------
 { 
  
  GETTEMP ();        // получаем температуру
  
  nD_11.read(500); // шаги выполнения проги.
//  nD_11.read(200); // шаги выполнения проги.

  if (nD_11.push_tick)  
  {
    ii++;     // обращение к часам
    ik++;     // переключение между градусниками и часами
    tt= !tt;  // мигаем разделителем
    dd++;     // частота обновления saa1064    
  }

  if (ii >= 2) //  ii * nD_11.read - интервал обращения к часам
  {
       if ( bp11 == 1 || bp21 == 1) {return;}
       get3231Date();
       D1 = ((hours)/10%10);
       D11= D1;
       D2 = ((hours)%10);
       D22= D2;
       D3 = ((minutes)/10%10);
       D33= D3;
       D4 = ((minutes)%10);      
       D44= D4;
       ii=0;    
  }

  if (ik <= 7 && dd >=1) 
  {
  if ( bp11 == 1 || bp21 == 1) {return;}
  if (tt==1)   {    displayDigitsWD();  }
  if (tt==0)   {     displayDigitsD();  } 
  dd=0; 
  }

 if (ik >= 8 && dd >= 1)
 {
     if ( bp11 == 1 || bp21 == 1) {return;}
 if ( readnew == 1 )   //    получили температуру - здесь отправить ее на табло
    {
      
          if (SignBit !=0) { Dt1 = 10; } // знак температуры
          else {Dt1 = 11; }               // или нет знака

       Dt2 = ((Tc_100)/1000%10);
       Dt3 = ((Tc_100)/100%10);
       Dt4 = ((Tc_100)/10%10);    
          
      readnew =0;

    }
      Wire.beginTransmission(saa1064);
      Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
      Wire.write(digits[Dt2]); //            //d2
      Wire.write(digits[Dt3]+128); //        //d3 рисуем точку разделитель
      Wire.write(digits[Dt4]); //            //d4
      Wire.write(digits[Dt1]); //            //d1
      Wire.endTransmission();
  dd=0;
 }

 if (ik >= 14) { ik=0;} // закрыли цикл переключения градусник часы

/////  Serial.print("   Temperature: "); Serial.print(get3231Temp());Serial.print("; ");
//////  Serial.println(get3231Register(0x0F));
 }
} // and of  loop ---------------------------------------------------------------
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// for 3231 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}

void set3231Date()
{ 
//T(sec)(min)(hour)(dayOfWeek)(dayOfMonth)(month)(year)
//T(00-59)(00-59)(00-23)(1-7)(01-31)(01-12)(00-99)
//Example: 02-Feb-09 @ 19:57:11 for the 3rd day of the week -> T1157193020209
/*
  seconds = (byte) ((Serial.read() - 48) * 10 + (Serial.read() - 48)); // Use of (byte) type casting and ascii math to achieve result.  
  minutes = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
  hours   = (byte) ((Serial.read() - 48) *10 +  (Serial.read() - 48));
*/
// ***  seconds ;  
// ***  minutes ;
// ***  hours   ;
  
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0x00);  // начало записи с нулевого байта
  Wire.write(decToBcd(seconds));
  Wire.write(decToBcd(minutes));
  Wire.write(decToBcd(hours));
  Wire.endTransmission();
}


void get3231Date()
{
  // send request to receive data starting at register 0
  Wire.beginTransmission(DS3231_I2C_ADDRESS); // 104 is DS3231 device address
  Wire.write(0x00); // start at register 0
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 3); // request 3 bytes (смотри в даташите - назначение байтов )

  if(Wire.available()) { 
    seconds = Wire.read();   // get seconds первый байт
    minutes = Wire.read();   // get minutes второй байт
    hours   = Wire.read();   // get hours третий байт
       
    seconds = (((seconds & B11110000)>>4)*10 + (seconds & B00001111)); // convert BCD to decimal
    minutes = (((minutes & B11110000)>>4)*10 + (minutes & B00001111)); // convert BCD to decimal
    hours   = (((hours   & B00110000)>>4)*10 + (hours   & B00001111)); // convert BCD to decimal (assume 24 hour mode)

  }
  else {
    //oh noes, no data!
  }
}
    //and  for 3231 -------------------------------------------------------
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~




// for  saa1064  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

void displayDigitsWD() // рисовать время без точки 
// тупо не таскать это кусок в ЛУУПе
{
   Wire.beginTransmission(saa1064);
   Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
   Wire.write(digits[D2]); // digit 1 (RHS)      //d2
   Wire.write(digits[D3]); // digit 2            //d3
   Wire.write(digits[D4]); // digit 3            //d4
   Wire.write(digits[D1]); // digit 4 (LHS)      //d1
   Wire.endTransmission();
}
void displayDigitsD()// рисовать время с точки 
// тупо не таскать это кусок в ЛУУПе
{
   Wire.beginTransmission(saa1064);
   Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
   Wire.write(digits[D2]+128); // digit 1 (RHS)      //d2
   Wire.write(digits[D3]); // digit 2            //d3
   Wire.write(digits[D4]); // digit 3            //d4
   Wire.write(digits[D1]); // digit 4 (LHS)      //d1
   Wire.endTransmission();
}

// and for saa1064  --------------------------------------------------------------

// температура 1 датчика. начало++++++++++++++++++++++++++++++++++++++++++++++++++
void GETTEMP ()
{
  byte present = 0;
  byte data[12];
  byte addr[8];
  volatile unsigned long currentMillis1t = millis();

//  if (currentMillis1t - previousMillis1t >= 500)   
if (currentMillis1t - previousMillis1t >= 500) 
  {
    previousMillis1t = currentMillis1t;
    tick_tempr++;
  }
   
 if (part == 0 && readnew == 0) // запрос на преобразование, до получения данных из датчика
 {   
  if (!ds.search(addr)) {
      ds.reset_search();
//      ERR=1;
      return;
  }
  if (OneWire::crc8( addr, 7) != addr[7]) {
//     Serial.print("CRC is not valid!\n"); //CRC is used for data transfer validation  !!!!!!!!!!!!!!!!!!!!!!!!
//      ERR=2;
      return;
  }
  
  if (addr[0] != 0x28) {
//      Serial.print("Device is not a DS18B20  device.\n"); /// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1!!!!!!!!!!!!!!!
//      ERR=3;
      return;
  }
//  ERR=0;
  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);   // Запускаем конвертацию
  tick_tempr = 0;  // запускаем таймер преобразования с этого момента
  part = 1;
  previousMillis1t = currentMillis1t;
 } // and   запрос на преобразование, до получения данных из датчика

 
  if (part == 1 && tick_tempr >= 10) //если прошло больше  ( > 1 секунды)
  {                                 // подробности в даташите!!!!!!!!!!
  
  present = ds.reset();
  ds.select(addr); 

  ds.write(0xBE);    // Считываем ОЗУ датчика  

  for (byte i = 0; i < 9; i++)    // Обрабатываем 9 байт
  {     data[i] = ds.read();   }
  
  // Высчитываем температуру :)

  int TReading;
  TReading = (data[1] << 8) + data[0];
  
   SignBit = TReading & 0x8000;      // Проверяем дубак там или нет
   if (SignBit)                      // Если на улице дубак :)
   { TReading = (TReading ^ 0xffff) + 1;  }

   Tc_100 = (6 * TReading) + TReading / 4;     // Умножаем на (100 * 0.0625) или 6.25
                                               // т.е. убираем 4 лишних бита                                         
   readnew = 1;  
   part = 0;   
   tick_tempr = 0;
}
}
//----------------------------------конец получения температуры
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 //--------------------------------------------+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  // ---------------начало - обработка нажатий цикл 1------------------------------------------------
  void BOTTONPRESSED1 () // начало - обработка нажатий цикл 1 
  {
    
  BUTTON_01.read(); // обновляем состояние переменных кнопки BUTTON_01.
  BUTTON_02.read(); // обновляем состояние переменных кнопки BUTTON_02.
  
    if (bp31==0)
    {
      if (BUTTON_01.retention) { bp11 = 1;}  //что-то делаем при нажатии и удержании в течении определённого времени
      if (BUTTON_02.retention) { bp21 = 1;}  //что-то делаем при нажатии и удержании в течении определённого времени
  
      if ( bp11 == 1 || bp21 == 1)
      {   
       nD_01.start();
       nD_01.read(100); // время мерцания в цикле 1
//       nD_01.read(30); // время мерцания в цикле 1       
      
        if (nD_01.push_tick)   
        {  
          i1++;  
          displayDigitsD(); 
        }            
 
        if ( i1 >= 6 ) {i1=0;}  // выкинул из лишнего for              
//              if (bp11 == 1 || bp21 ==1 )   
//                   {   if ( i1 >= 6 ) {i1=0;}  }                  
//              if (bp11 ==1 && i1 == 1)  {digitalWrite(led1, 1);}
//              else                      {digitalWrite(led1, 0);}
//              if (bp21 ==1 && i1 == 4)  {digitalWrite(led2, 1);}
//              else                      {digitalWrite(led2, 0);}
    
              if (nD_01.push_tick && i1 == 5)  {   i2++;    } 
       
             if (i2 >= 5) 
              {
               if (bp11==1 && bp21==0) {bp31=1;} //нажата только кн1
               if (bp11==0 && bp21==1) {bp31=2;} //нажата только кн2
               if (bp11==1 && bp21==1) {bp31=3;} //нажаты обе кнопки             
                
               i2 = 0;
               i1 = 0;
               bp11 = 0;
//               digitalWrite(led1, 0);
               bp21 = 0;
//               digitalWrite(led2, 0);
               nD_01.stop();
              }                 
        }        
    }}  // конец - обработка нажатий цикл 1 (на выходе ребультат в переменной bp31 = 1 или 2 или 3)
  // --------------------------------------------------------------------------------------------
  
  void BOTTONPRESSED2 () // --------------начало - обработка нажатий цикл 2------------------------
  { // зажигаем диоды, ждем подтверждения команды - выкинул из кода, он не влез в восьмерку  
    if (bp31 >= 1 && bp31 <= 3)
    {
//      BUTTON_01.read(); // обновляем состояние переменных кнопки BUTTON_01.
//      BUTTON_02.read(); // обновляем состояние переменных кнопки BUTTON_02.

                 
                 nD_01.start();
                 nD_01.read(40000);                
//                 nD_01.read(100000); // повисли на 100 сек, ждем подтверждения времени
                                     // если нажал, таймер скинулся  
                 
               if (nD_01.push_tick)   //сбросим режим настройки если его не подтвердить
               {
                 nD_01.stop();
                 bp31=0;
               }   
      

      //обработка подтверждения команды--------+-+

     if (bp31==1) 
             {
                if (BUTTON_01.click_down)
                {
                  nD_01.stop();
                  bp31=4; // отнять 1 минуту               
                }    
             } 
        if (bp31==2) 
             {
                if (BUTTON_02.click_down)
                {
                  nD_01.stop();
                  bp31=5; // прибавить 1 минуту               
                }   
             }         
         if (bp31==3) 
             {
                if (BUTTON_01.click_down || BUTTON_02.click_down) // 
                {
                  nD_01.stop();
                  bp31=6; // установить время
                  i2=1; // установить курсор на не более 3, иначе глюк (см код ниже) 
                  i3=0;             
                }
             } 
    } 
  } // конец - обработка нажатий цикл 2 (на выходе ребультат в переменной bp31==4 - отнять 1 минуту, 5-прибавить, 6 - установть)
  //----------------------------------------------------------------------------------------------------------------------
    void BOTTONPRESSED3 () // -------------корректировка времени---------
    {
      if (bp31==4)   // -----ОТнять минуту-----
         {
                 nD_01.start();
//                 nD_01.read(500);   
                 nD_01.read(500);
                 if (nD_01.push_tick)   
                 { 
                  i1++; 
                  var2= !var2;
                  }
                     if (i2==0)
                        {                
                         get3231Date();  // получил свежие:  seconds , minutes , hours    
                         }               
                 if (minutes >= 1 && minutes <= 59)
                   {
//~~~~~~~~~~~~~ лень переписывать этот узел, led  и кнопку выкинул - а остатки  условий остались~~~~~~~~~~~`~`                 
                     if (i2==0) {  i2=1; } // лень переписывать 
//                     if (i2==1 && i1>=0 && i1 <=40)
                     if ( i2==1 )
                     {
//                      digitalWrite(led1, 1);
//                      if (BUTTON_01.click_down)
 //                     {
                        minutes= minutes - 1;    //--------------отняли 1 минуту
                        seconds = 1;
                        i2=2;        
//                      }   
                     }
                     if(i2==2) // запись в часы
                       {
                                set3231Date(); // отняли минуту, записали в чип
//                                digitalWrite(led1, 1);
//                                digitalWrite(led2, 0); 
                                i2=3;      // уходим в ожидание                           
                       }
                      if (i2==3)
                      {
// ***                      D11=(clock.hour)/10%10;      //десятки часа
// ***                      D22=(clock.hour)%10;         // единицы часа            
// ***                      D33=(clock.minute)/10%10;    //десятки минут
// ***                      D44=(clock.minute)%10;       // единицы минут      
                            get3231Date();  // получил свежие:  seconds , minutes , hours  
                            D1 = ((hours)/10%10);
                            D2 = ((hours)%10);
                            D3 = ((minutes)/10%10);
                            D4 = ((minutes)%10);      

                        if (var2==1) 
                        {
                           displayDigitsD();                         
// ***                        Write_MBI5026((digits[(D22)]), (digits[(D11)]), (digits[(D44)]), (digits[(D33)]));  

                         }
                        if (var2==0)
                        {
// ***                         Write_MBI5026(64, 64, 64, 64);  
                            Wire.beginTransmission(saa1064);
                            Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
                            Wire.write(digits[10]); // digit 1 (RHS)      //d2
                            Wire.write(digits[10]); // digit 2            //d3
                            Wire.write(digits[10]); // digit 3            //d4
                            Wire.write(digits[10]); // digit 4 (LHS)      //d1
                            Wire.endTransmission();
                        }
                      }

                     if (i1>= 10) // ожидание, чтобы не тыкали часто
                     {                       
//                       digitalWrite(led1, 0);
//                       digitalWrite(led2, 0);
                       i1=0; 
                       i2=0;   
                       nD_01.stop();
                       bp31=0;                      
                     }                    
                   } 
                   if (minutes == 0 && i2 == 0) 
                     { 
                     i1=0;
//                     digitalWrite(led1, 0);
//                     digitalWrite(led2, 0);
                     nD_01.stop();
                     bp31=0;
                     }
         } // ---конец ---ОТнять ----минуту-----------
         
   if (bp31==5)   // -----ДОбавить--- минуту-----
         {
                 nD_01.start();
                 nD_01.read(500);
//                 nD_01.read(500);   
                 if (nD_01.push_tick)  
                 { 
                  i1++; 
                  var2= !var2;
                  }                 
                     if (i2==0)
                        {               
                            get3231Date();  // получил свежие:  seconds , minutes , hours  
//                            D1 = ((hours)/10%10);
//                            D2 = ((hours)%10);
//                            D3 = ((minutes)/10%10);
//                            D4 = ((minutes)%10); 
                         }               
                 if (minutes >= 0 && minutes <= 58)
                   {
                     if (i2==0) {  i2=1; }
 //~~~~~~~~~~~~~ лень переписывать этот узел, led  и кнопку выкинул - а остатки  условий остались~~~~~~~~~~~`~`   
//                     if (i2==1 && i1>=0 && i1 <=40)
                     if (i2==1)
                     {
//                      digitalWrite(led2, 1);
//                      if (BUTTON_02.click_down)
//                      {
                        minutes = minutes + 1;    //--------------добавили 1 минуту
                        seconds = 1;
//                        digitalWrite(led1, 0);
                        i2=2;        
//                      }   
                     }
                     if(i2==2) // запись в часы
                       {

                                set3231Date(); // добавили минуту, записали в чип

//                                digitalWrite(led1, 0);
//                                digitalWrite(led2, 1); 
                                i2=3;      // уходим в ожидание                           
                       }
                      if (i2==3)
                      {

                          get3231Date();  // получил свежие:  seconds , minutes , hours  
                            D1 = ((hours)/10%10);
                            D2 = ((hours)%10);
                            D3 = ((minutes)/10%10);
                            D4 = ((minutes)%10); 
// ***                      D11=(clock.hour)/10%10;      //десятки часа
// ***                      D22=(clock.hour)%10;         // единицы часа            
// ***                      D33=(clock.minute)/10%10;    //десятки минут
// ***                      D44=(clock.minute)%10;       // единицы минут      

                        if (var2==1) 
                        {
                           displayDigitsD();                         
                         }
                        if (var2==0)
                        {
                            Wire.beginTransmission(saa1064);
                            Wire.write(1); // instruction byte - first digit to control is 1 (right hand side)
                            Wire.write(digits[10]); // digit 1 (RHS)      //d2
                            Wire.write(digits[10]); // digit 2            //d3
                            Wire.write(digits[10]); // digit 3            //d4
                            Wire.write(digits[10]); // digit 4 (LHS)      //d1
                            Wire.endTransmission();
                        }                                              
                      }

                     if (i1>= 10) // ожидание, чтобы не тыкали часто
                     {                       
//                       digitalWrite(led1, 0);
//                       digitalWrite(led2, 0);
                       i1=0; 
                       i2=0;   
                       nD_01.stop();
                       bp31=0;                      
                     }                    
                   } 
                   if (minutes==59 && i2==0) 
                     { 
                     i1=0;
                     i2=0;
                     nD_01.stop();
                     bp31=0;
                     }
         } // ---конец ---ДОбавить ----минуту-----------   
      //----------------------------------------------------   
   if (bp31==6)   // -----установить---время-------      
     {
         nD_01.start();
         nD_01.read(500);
//         nD_01.read(500);   
         if (nD_01.push_tick)   
       {  
       i1++;
       var3= !var3;   // мигаем при настройке
       }
                      if (BUTTON_01.click_down)
                      {
                        i1=0;
                        i2++;              // перемещение по символам
                        if (i2>=5) {i2=0;}
                      }
                      if (BUTTON_02.click_down)
                      {
                        i1=0;
                        i3++;              // установка времени...
                      }
//                      if (BUTTON_02.click_up)   {  digitalWrite(led2, 0);   }  
           if (i2==0 && i3==1)  // десятки часов --установка---значений-----разрядов----
                {
                  i3=0;
                  D11++;
                  if (D11>=3) {D11=0;}
                }           
           if (i2==1 && i3==1)  // единицы часов
                 {
                   i3=0;
                   D22++;
                   if (D11 != 2)
                       {
                         if (D22 >= 10) {D22=0;}
                       }
                   if (D11 == 2)
                        {
                          if (D22 >= 4) {D22=0;}
                        }    
                  }     
            if (i2==2 && i3==1)     //десятки минут
                  {
                   i3=0;
                   D33++;
                   if (D33 >= 6)      { D33=0; }                    
                  }
            if (i2==3 && i3==1)     //десятки минут
                  {
                   i3=0;
                   D44++;
                   if (D44 >= 10)    {   D44=0; }                    
                  }  // ----конец----установки---значений----разрядов---часов---------   

            if (i2==4 && i3==1)     //// записать в часы если нажать кн2
                  {         
                      if (BUTTON_02.click_down)    
                      {
                      i1=202; //смотри код ниже
                      }
                  }
                  
          if (var3==1 && i2==0)    // начало----мигаем при установке
               {
// ***                Write_MBI5026( 0, (digits[(D11)]), 0, 0);
                  Wire.beginTransmission(saa1064);
                  Wire.write(1); // instruction byte - first digit to control is 1 
                  Wire.write(digits[10]); // digit 1 (RHS)      //d2
                  Wire.write(digits[10]); // digit 2            //d3
                  Wire.write(digits[10]); // digit 3            //d4
                  Wire.write(digits[D11]); // digit 4 (LHS)      //d1
                  Wire.endTransmission();
               }         
          if (var3==1 && i2==1)    
               {
// ***                Write_MBI5026( (digits[(D22)]), 0, 0, 0);     
                  Wire.beginTransmission(saa1064);
                  Wire.write(1); // instruction byte - first digit to control is 1 
                  Wire.write(digits[D22]); // digit 1 (RHS)      //d2
                  Wire.write(digits[10]); // digit 2            //d3
                  Wire.write(digits[10]); // digit 3            //d4
                  Wire.write(digits[10]); // digit 4 (LHS)      //d1
                  Wire.endTransmission();               
               }          
           if (var3==1 && i2==2)    
               {
// ***                Write_MBI5026( 0, 0, 0, (digits[(D33)]));        
                  Wire.beginTransmission(saa1064);
                  Wire.write(1); // instruction byte - first digit to control is 1 
                  Wire.write(digits[10]); // digit 1 (RHS)      //d2
                  Wire.write(digits[D33]); // digit 2            //d3
                  Wire.write(digits[10]); // digit 3            //d4
                  Wire.write(digits[10]); // digit 4 (LHS)      //d1
                  Wire.endTransmission();               
               }         
          if (var3==1 && i2==3)    
               {
// ***                Write_MBI5026( 0, 0, (digits[(D44)]), 0);              
                  Wire.beginTransmission(saa1064);
                  Wire.write(1); // instruction byte - first digit to control is 1 
                  Wire.write(digits[10]); // digit 1 (RHS)      //d2
                  Wire.write(digits[10]); // digit 2            //d3
                  Wire.write(digits[D44]); // digit 3            //d4
                  Wire.write(digits[10]); // digit 4 (LHS)      //d1
                  Wire.endTransmission();         
               }
          if (var3==1 && i2==4)    
               {
// ***                Write_MBI5026( 0, 0, (digits[(D44)]), 0);              
                  Wire.beginTransmission(saa1064);
                  Wire.write(1); // instruction byte - first digit to control is 1 
                  Wire.write(8); // digit         //d2
                  Wire.write(8); // digit             //d3
                  Wire.write(8); // digit             //d4
                  Wire.write(8); // digit       //d1
                  Wire.endTransmission();         
               }               
          if (var3==0)    
               {
// ***                Write_MBI5026( (digits[(D22)]), (digits[(D11)]), (digits[(D44)]), (digits[(D33)]));  
                  Wire.beginTransmission(saa1064);
                  Wire.write(1); // instruction byte - first digit to control is 1 
                  Wire.write(digits[D22]+128); // digit 1 (RHS)  //d2
                  Wire.write(digits[D33]); // digit 2            //d3
                  Wire.write(digits[D44]); // digit 3            //d4
                  Wire.write(digits[D11]); // digit 4 (LHS)      //d1
                  Wire.endTransmission();                     
               }      /// конец-----мигаем при установке-------
     if (i1 >= 200)
         {
//                     D1=(D11*10 + D22);  // не прокатило
//                     D2=(D33*10 + D44);  // не прокатило сократить код
           if ((D11*10 + D22) >= 24 )
              {
                D11=0;
                D22=0;
              }
           if ((D33*10 + D44) >= 60 )
               {
                 D33=0;
                 D44=0;
               }   

                    seconds = 1 ;  
                    minutes = (D33*10 + D44);
                    hours   = (D11*10 + D22);
                    set3231Date();

// ***                          clock.fillByYMD(2015,01,01);// (2013,1,19) Jan 19,2013  
// ***                          clock.fillByHMS((D1),(D2),30);// (15,28,30) 15:28 30"
// ***                          clock.fillDayOfWeek(SUN);// (SAT) Saturday (SUN MON TUE WED THU FRI SAT) 
// ***                          clock.setTime();//write time to the RTC chip  
                      i1=0;
                      i2=0;
                      i3=0;
//                     digitalWrite(led1, 0);
//                     digitalWrite(led2, 0);
                     nD_01.stop();
                     bp31=0;                      
               
         }             
     } //-----конец--установки --времени-----      
  } // ---------конец---корректировки----времени---------
  
  
  



 

Гриша
Offline
Зарегистрирован: 27.04.2014

UPD. похоже дело не в бабине.... на НАНО с кварцем 16 датчики работают... без кварца на 8ке и 328й ничерта не получается :(((((( запросы вижу, а результат жопа... осциллом вижу ответ от датчика, а в адресе одни нули :((( завтра попробую продолжить... если получится...  

dizzel
Offline
Зарегистрирован: 21.03.2016

Веселье продолжается.

Я прошил последней прошивкой USBasp. Но теперь вместо прежней ошибки стала вылетать вот эта:

avrdude.exe: error: program enable: target doesn't answer. 1 
avrdude.exe: initialization failed, rc=-1
             Double check connections and try again, or use -F to override
             this check.
 
При чем вынимаю чип, вставляю вместо него например мегу и все зашивается. НО после перепрошивки свистка меги8 и тини85 читаются ТОЛЬКО с джампером jp3.
 
А самое веселое в том, что я купил у другого продавца 328-ых с нормальной маркировкой AU так они тоже пишут это))))
avrdude.exe: error: program enable: target doesn't answer. 1
 
Чувствую себя полным дураком. Че происходит?)
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

dizzel, 99% проблем при прошивке МК - плохой контакт (пайка/разъёмы, итп)  1% -плохое питание.

PS: Цифры конечно условны :)

dizzel
Offline
Зарегистрирован: 21.03.2016

Ну вот смотрите:

Я подпаялся на плату напрямую с напаянным мк. С новой прошивкой он пишет target doesn't answer. 1

Если влить старую прошивку в АСП то cannot set sck period.

А обычно я заливаю все с помощью вот такой конструкции

При чем если взять диповую 328 и вставить ее в левую плату то все шикарно видится. И в этой же конструкции qfp-шная 8-мая мега видится.

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

dizzel, возможно проблема с переходником. На них кстати были жалобы. Я б взял, да припаял заведомо хороший МК к обычному переходнику. Ну и с другим программатором (Arduino as ISP хотя б) тоже не мешало проверить.

dizzel
Offline
Зарегистрирован: 21.03.2016

dimax пишет:

dizzel, возможно проблема с переходником.

Так я ж подпаялся проводками, на первом фото. Результат 0.

dimax пишет:

Я б взял, да припаял заведомо хороший МК к обычному переходнику.

Ну мега8 же видится/шьется. Чем не заведомо хороший мк?

dimax пишет:

Ну и с другим программатором (Arduino as ISP хотя б) тоже не мешало проверить.

Ардуиной пробовал шить. Ругается на чип айди. Не может прочесть предполагаю.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

dizzel пишет:

Ардуиной пробовал шить. Ругается на чип айди. Не может прочесть предполагаю.

Ругается на неправильный или там сплошные нули? Какой именно device signature показывало?

Гриша
Offline
Зарегистрирован: 27.04.2014

вот я выпаял 8 и поставил 328 - и нифига, потому что хреново припаял и даже с лупой ничего не было видно. Взял тонкое жало и прогрел аккуратно ноги и все пошло - причина простая, окислы на ногах.   

dizzel
Offline
Зарегистрирован: 21.03.2016

Jeka_M пишет:

Ругается на неправильный или там сплошные нули? Какой именно device signature показывало?

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

Сдается мне что надо ваять фуз доктор.

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

dizzel, дудка кривой версии - не знает 328P.

dizzel
Offline
Зарегистрирован: 21.03.2016

Любопытно. Дайте пожалуйста ссылочку на некривую версию или подскажите как найти.

Гриша
Offline
Зарегистрирован: 27.04.2014

dizzel пишет:

Любопытно. Дайте пожалуйста ссылочку на некривую версию или подскажите как найти.

а чего, НАНО под рукой нет? или УНО, любой под USB

Гриша
Offline
Зарегистрирован: 27.04.2014

и код ошибки лучше копировать и в под спойлер, как скетч вставкой кода. 

dizzel
Offline
Зарегистрирован: 21.03.2016

Ничего не понял. Чего НАНО, чего любой под USB? Яснее пожалуйста. Но если вы про прошивку Arduino as ISP, то тремя сообщениями выше я выложил то что мне пишет ИДЕ.

Да и дудка кстати видит 328p в дип исполнении, а вот мои qfp ни по чем. Мистика. Либо чипаки сами мертвее мертвого либо там фьюзы неправильные. 

Гриша
Offline
Зарегистрирован: 27.04.2014

dizzel пишет:

Да и дудка кстати видит 328p в дип исполнении, а вот мои qfp ни по чем. Мистика. Либо чипаки сами мертвее мертвого либо там фьюзы неправильные. 

вот эту тему прочитайте полностью    может чего полезное найдете... особо когда до поста 25 дойдете.

dizzel
Offline
Зарегистрирован: 21.03.2016

Прочитал. И что я там должен был прочесть? То что у человека сигнатура была не та из-за того что он один проводок не туда запаял? Я своей связкой из свистка, платы-адаптера и переходника dip-qfp прошил не одну 328-ую.

Как это связано со мной? Может у меня уже шарики за ролики, ну уж извините меня, мозг просто пухнет..

Еще раз. Купил 10 ATmega328p-AU (так обещал продавец) в qfp корпусе. В итоге мне приходят две AU, одна TW, остальные PH. Первые три (AU и TW) без проблем прошиваются. А на PH затык. Убираю PH вставляю мегу8/мегу16/тини85 все определяется. То есть все у меня соединено правильно. У меня стойкое ощущение что свисток не может завести камень, не может он добится от мк ответа на простой вопрос - кто ты? Не то что свистка не устроил ответ, он ответа вообще не получает.

Обновил прошивку в свистке. Не помогло, мега328-ПХ все также шлет, и вместо этого теперь мега8 и тини85 шьются только с джампером JP3. На хрена козе такой баян?

Но тут происходит интересная вещь. В кратчайшие сроки (рак на горе свистнул) ко мне приезжает еще 10 камней и все с маркировкой ATmega328p-AU тоже qfp. Я потирая руки, бегу к программатору, а он посылает меня к такой-то матери и с этими процами. Тут у меня начинается полная прострация.

Я уже и короткими проводками подпаивался как советуют не помогло. Я скармливал ему диповые и мегу8, мегу328. Все сжирает сволочь, а эти не хочет.

Завтра попробую повоевать как вы в 9-ом посте посоветовали. Но я думаю все это безрезультатно. Попутно делаю фьюздоктора. Может он мне споможет.

Скажите какой командной строкой дудка вытаскивает сигнатуру? 

Гриша
Offline
Зарегистрирован: 27.04.2014

dizzel пишет:

Завтра попробую повоевать как вы в 9-ом посте посоветовали. Но я думаю все это безрезультатно. Попутно делаю фьюздоктора. Может он мне споможет.

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

самую первую попытку делайте на 1МГц внутренний. 

в настройках поставьте галочку - выводить все сообщения (сообщения компилятора - все)... если я ничего не перепутал...

dizzel
Offline
Зарегистрирован: 21.03.2016

Итак способ номер 9. Скачал миникоре. Выставил настройки вот так:

Каждый раз при записи загрузчика считывается в сигнатуре мусор. Сейчас ffff00 в след раз ff00ff и тд.

avrdude: Device signature = 0xffff00
avrdude: Expected signature for ATmega328P is 1E 95 0F
         Double check chip, or use -F to override this check.

Подключено все вот так. АРДУИНО -> плата -> переходник dip-qfp. Далее распиновка к каким пинам на дуине я все это подключаю.

Ничего не меняя вставляю мегу8.

Меняю настройки.

И все читается все записывается.

avrdude: Device signature = 0x1e9307 (probably m8)

 

dizzel
Offline
Зарегистрирован: 21.03.2016

Чуть не забыл на проблемный мк дудка выдает вот это. Скопировал целиком:

avrdude: Version 6.3-20190619
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "C:\Users\user\AppData\Local\Arduino15\packages\MiniCore\hardware\avr\2.0.5/avrdude.conf"

         Using Port                    : COM4
         Using Programmer              : stk500v1
         Overriding Baud Rate          : 19200
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no       1024    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     32768  128    256  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : STK500
         Description     : Atmel STK500 Version 1.x firmware
         Hardware Version: 2
         Firmware Version: 1.18
         Topcard         : Unknown
         Vtarget         : 0.0 V
         Varef           : 0.0 V
         Oscillator      : Off
         SCK period      : 0.1 us

avrdude: AVR device initialized and ready to accept instructions

Ошибка при записи загрузчика.
Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0xff0000
avrdude: Expected signature for ATmega328P is 1E 95 0F
         Double check chip, or use -F to override this check.

avrdude done.  Thank you.

Попробовал с напаянным мк в плату прошиться. Результат тотже.

А вот результат прошивки меги168 на этой же плате.

avrdude: Version 6.3-20190619
         Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
         Copyright (c) 2007-2014 Joerg Wunsch

         System wide configuration file is "C:\Users\user\AppData\Local\Arduino15\packages\MiniCore\hardware\avr\2.0.5/avrdude.conf"

         Using Port                    : COM4
         Using Programmer              : stk500v1
         Overriding Baud Rate          : 19200
         AVR Part                      : ATmega168
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53
         Memory Detail                 :

                                  Block Poll               Page                       Polled
           Memory Type Mode Delay Size  Indx Paged  Size   Size #Pages MinW  MaxW   ReadBack
           ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
           eeprom        65    20     4    0 no        512    4      0  3600  3600 0xff 0xff
           flash         65     6   128    0 yes     16384  128    128  4500  4500 0xff 0xff
           lfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           hfuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           efuse          0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           lock           0     0     0    0 no          1    0      0  4500  4500 0x00 0x00
           calibration    0     0     0    0 no          1    0      0     0     0 0x00 0x00
           signature      0     0     0    0 no          3    0      0     0     0 0x00 0x00

         Programmer Type : STK500
         Description     : Atmel STK500 Version 1.x firmware
         Hardware Version: 2
         Firmware Version: 1.18
         Topcard         : Unknown
         Vtarget         : 0.0 V
         Varef           : 0.0 V
         Oscillator      : Off
         SCK period      : 0.1 us

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.02s

avrdude: Device signature = 0x1e9406 (probably m168)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
         To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "C:\Users\user\AppData\Local\Arduino15\packages\MiniCore\hardware\avr\2.0.5/bootloaders/empty/empty.hex"
avrdude: writing flash (2 bytes):

Writing | ################################################## | 100% 0.21s

avrdude: 2 bytes of flash written
avrdude: verifying flash memory against C:\Users\user\AppData\Local\Arduino15\packages\MiniCore\hardware\avr\2.0.5/bootloaders/empty/empty.hex:
avrdude: load data flash data from input file C:\Users\user\AppData\Local\Arduino15\packages\MiniCore\hardware\avr\2.0.5/bootloaders/empty/empty.hex:
avrdude: input file C:\Users\user\AppData\Local\Arduino15\packages\MiniCore\hardware\avr\2.0.5/bootloaders/empty/empty.hex contains 2 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.11s

avrdude: verifying ...
avrdude: 2 bytes of flash verified
avrdude: reading input file "0x0f"
avrdude: writing lock (1 bytes):

Writing | ################################################## | 100% 0.02s

avrdude: 1 bytes of lock written
avrdude: verifying lock memory against 0x0f:
avrdude: load data lock data from input file 0x0f:
avrdude: input file 0x0f contains 1 bytes
avrdude: reading on-chip lock data:

Reading | ################################################## | 100% 0.01s

avrdude: verifying ...
avrdude: 1 bytes of lock verified

avrdude done.  Thank you.

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

dizzel, действительно, похоже на проблемы с конкретными МК. Есть смысл прекратить эксперименты, и собрать паралельный программатор

Ну может ещё всё таки последний эксперимент -запаять все кондёры по питанию.

yuhenotix@2p-ma...
Offline
Зарегистрирован: 09.06.2019

у  ардуины  проблемы с программаторами USBASP у меня были аналогичные проблемы... Много времени потратил и нервов.

Разработчики сознательно    подменили оригинальный avrdude.exe на  свой собственный, найдите оригинал и замените  фруиновскую дудку, она фейковая (размеры   avrdude   одной и той же версии не совпадали с оригиналом), можно  скачать из моего архивчика оригинал: https://vk.cc/axVSra

Проблема решилась раз и навсегда,  модифицированные версии не  помню с какой версии пошли но сначала точно было все нормально.

 

Написал заметку  по этому делу: https://vk.com/izhadapter?w=wall-73481857_1700 Так  же   тут описание  как  выставить скорости без перемычек в среде ардуино.

dizzel
Offline
Зарегистрирован: 21.03.2016

Итак. Победа!

Подвесил 12мгц кварц. И оба проца прочитались. Из первой партии с индексом PH. Его удалось без проблем сбросить на дефолт и зашить прошивку.

А вот из второй партии с индексом AU. Оказались еще и с установленными лок битами. Я их убираю, говорю дудке "шей", а она вылетает с ошибкой, и при последующем чтении микрухи лок биты на месте. Короче надо повозится и если не получится доделать фьюз доктор.

Короче у кого такие проблемы как у меня - вешайте внешний кварц и пробуйте. 8мгц, 12мгц, 16мгц и т.п.

Спасибо всем кто откликнулся.

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

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

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

dizzel пишет:

Итак. Победа!

Подвесил 12мгц кварц. И оба проца прочитались.

тюююю...

Я думал вы давно внешний такт подключили... Когда покупаете МК на Али - они часто приходят прошитые под внешний осциллятор