Atmega328pu-ph что за зверь?
- Войдите на сайт для отправки комментариев
Вс, 26/07/2020 - 15:23
Всем привет. Прошу помощи тех, кто встречался с данными МК с такой маркировкой. Дело в том что дудкой они отказываются шиться, даже фьюзы не читаются. Одним словом посылает нафиг и пишет это
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
Но там по сути ничего.
Подцепи его по SPI, прочитай ID и фьюзы. Запость сюдой. Подумаю.
1000 извинений, но я видимо чего-то не понял или не так написал. Я цепляю его через usbasp программатор по тому же spi. Работаю avrdude_prog 3.3. Фьюзы не читаются, а как считать id не знаю.
Значит либо процу хана, либо не правильно подключил.
SPI это mosi/miso/sck/res и + и - питание 5 Вольт.
ID проца - это несколько байт (2 или 3, не помню) для ТОЧНОГО определения проца при программировании.
Подключение верное, потому что подсовываю ему нормальную мегу328-ау. Все читается. Это значит что мое подключение верное. Меня смущает строчка avrdude.exe: warning: cannot set sck period. Я не могу ничего прочитать по SPI потому что этот SPI не заводится. Ни фьюзы, ни флэш, ничего. ID читается по какому-то другому протоколу?
процессор новый? еще не использовали?
смущает строчка avrdude.exe: warning: cannot set sck period.
Подключение верное, потому что подсовываю ему нормальную мегу328-ау. Все читается.
Значит процу пипец. Выкинь.
Как уже отметили надо снизить частоту SPI. Если прошивка в USBasp новая то можно в командной строке дописать значение скорости, если старая то только перемычкой на плате USBasp
у самого такой проц, прошить фьюзы не смог НО:
использую программатор ардуино "arduino AS ISP"
установил MiniCore с гитхаба
variant "328P/328PA"
Bootloader "нет"
BOD 2,7v
Clock " 1MHz internal"
compiler LTO - disabled
на плате ранее стояла атмега8, заменил на этот. Пару раз пробовал зашить- ничего не получилось. Полазил лупой и увидел непропай. после недолгой работы паяльником все заработало. т.к. мне частоты достаточно и кварца нет, оставил как есть.
Как уже отметили надо снизить частоту SPI. Если прошивка в USBasp новая то можно в командной строке дописать значение скорости, если старая то только перемычкой на плате USBasp
Процы взял из ленты. Всего их 7 штук. Попробовал 3, ни с одним ничего не получилось. Попробовал с перемычкой на jp3. Без результатов.
Процы взял из ленты. Всего их 7 штук. Попробовал 3, ни с одним ничего не получилось. Попробовал с перемычкой на jp3. Без результатов.
попробуй чего-нить залить как я в посте 9 написал,
Попробовал с перемычкой на jp3. Без результатов.
Ну дак вышли "советчикам" с перемычкой по паре перемычек почтой. Пусть в левое и правое вставят, мошт мосх паявицца.
Все твои "игры" со скоростями - фуфло полное. Нормальные программаторы и без этой перемычки могут менять скорость обмена по шине. Кроме "дудки" есть ещё по крайней мере пара-тройка БЕСПЛАТНЫХ программаторов под твой "свисток". Пробуй их. Задача твоя прочитать либо ид либо фузы. Без них никак.
Ну про платные программаторы я не буду, хотя и такие есть в природе.
Это какие например? Яндекс по запросу выдает только дудку и в качестве альтернатив целое нихрена.
Не слушай этого балабола, он ничего не знает про программаторы :)
Это какие например? Яндекс по запросу выдает только дудку и в качестве альтернатив целое нихрена.
Фигово, что ты думаешь только яндексом, фигово.
Давай сделаем проще - пусть тебе пока "перемычечные" будут давать советы и как тебе надоест, я дам для посмотреть через тимвьювер мой ноутбук и покажу ТРИ бесплатных программатора и платный. Устроит?
Процы взял из ленты. Всего их 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
у меня тоже не шились, пока паяльником не прошел, теперь и фьюзы меняются и скетчи принимает.
к сожалению в программировании я слабоват, в основном мой друг профессор Тыков и интернет.
еще момент, у меня для программирования Нано - фьюзы меняю заливкой загрузчика, код заливаю Arduino as ISP - любое действие получается со второго раза (после появления ошибки, любой), подряд, без всяких ресетов и передергивания шнурков. Уже несколько лет такая проблема, о ней знаю и не парюсь.
ИДЭ 1.8.3
slider, Гриша
Большое спасибо, Буду пробовать. К сожалению результаты смогу сообщить не раньше выходных.
Покупал тут https: //aliexpress.ru/item/33042649983.html
Фото к сожалению не сделал, но он точь в точь как на фото по ссылке, которую я скинул в первом посте.
хрень какая-то, может кто может чего подсказать по этому процессору? вот результаты после прошивки бутлоудера, для установки фьюзов
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; } } //-----конец--установки --времени----- } // ---------конец---корректировки----времени---------UPD. похоже дело не в бабине.... на НАНО с кварцем 16 датчики работают... без кварца на 8ке и 328й ничерта не получается :(((((( запросы вижу, а результат жопа... осциллом вижу ответ от датчика, а в адресе одни нули :((( завтра попробую продолжить... если получится...
Веселье продолжается.
Я прошил последней прошивкой USBasp. Но теперь вместо прежней ошибки стала вылетать вот эта:
dizzel, 99% проблем при прошивке МК - плохой контакт (пайка/разъёмы, итп) 1% -плохое питание.
PS: Цифры конечно условны :)
Ну вот смотрите:
Я подпаялся на плату напрямую с напаянным мк. С новой прошивкой он пишет target doesn't answer. 1
Если влить старую прошивку в АСП то cannot set sck period.
А обычно я заливаю все с помощью вот такой конструкции
При чем если взять диповую 328 и вставить ее в левую плату то все шикарно видится. И в этой же конструкции qfp-шная 8-мая мега видится.
dizzel, возможно проблема с переходником. На них кстати были жалобы. Я б взял, да припаял заведомо хороший МК к обычному переходнику. Ну и с другим программатором (Arduino as ISP хотя б) тоже не мешало проверить.
dizzel, возможно проблема с переходником.
Так я ж подпаялся проводками, на первом фото. Результат 0.
Я б взял, да припаял заведомо хороший МК к обычному переходнику.
Ну мега8 же видится/шьется. Чем не заведомо хороший мк?
Ну и с другим программатором (Arduino as ISP хотя б) тоже не мешало проверить.
Ардуиной пробовал шить. Ругается на чип айди. Не может прочесть предполагаю.
Ардуиной пробовал шить. Ругается на чип айди. Не может прочесть предполагаю.
Ругается на неправильный или там сплошные нули? Какой именно device signature показывало?
вот я выпаял 8 и поставил 328 - и нифига, потому что хреново припаял и даже с лупой ничего не было видно. Взял тонкое жало и прогрел аккуратно ноги и все пошло - причина простая, окислы на ногах.
Ругается на неправильный или там сплошные нули? Какой именно device signature показывало?
Гриша, я уже и в плате это чудо пытаюсь шить с непосредственно запаяным мк и через переходник и так и сяк. Завтра впаяю на плату другой мк и попробую цепануться. Но я все ноги прозванивал и они звонятся. Поэтому большого смысла в этом нет.
Сдается мне что надо ваять фуз доктор.
dizzel, дудка кривой версии - не знает 328P.
Любопытно. Дайте пожалуйста ссылочку на некривую версию или подскажите как найти.
Любопытно. Дайте пожалуйста ссылочку на некривую версию или подскажите как найти.
а чего, НАНО под рукой нет? или УНО, любой под USB
и код ошибки лучше копировать и в под спойлер, как скетч вставкой кода.
Ничего не понял. Чего НАНО, чего любой под USB? Яснее пожалуйста. Но если вы про прошивку Arduino as ISP, то тремя сообщениями выше я выложил то что мне пишет ИДЕ.
Да и дудка кстати видит 328p в дип исполнении, а вот мои qfp ни по чем. Мистика. Либо чипаки сами мертвее мертвого либо там фьюзы неправильные.
Да и дудка кстати видит 328p в дип исполнении, а вот мои qfp ни по чем. Мистика. Либо чипаки сами мертвее мертвого либо там фьюзы неправильные.
вот эту тему прочитайте полностью может чего полезное найдете... особо когда до поста 25 дойдете.
Прочитал. И что я там должен был прочесть? То что у человека сигнатура была не та из-за того что он один проводок не туда запаял? Я своей связкой из свистка, платы-адаптера и переходника 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-ом посте посоветовали. Но я думаю все это безрезультатно. Попутно делаю фьюздоктора. Может он мне споможет.
Скажите какой командной строкой дудка вытаскивает сигнатуру?
Завтра попробую повоевать как вы в 9-ом посте посоветовали. Но я думаю все это безрезультатно. Попутно делаю фьюздоктора. Может он мне споможет.
тогда еще пост 20, там скриншот и под первым спойлером результаты прошивки бута. Еще раз - у меня даже со второго раза не всегда шьет - тупо ничего не делая сразу запускаю повторную попытку...
самую первую попытку делайте на 1МГц внутренний.
в настройках поставьте галочку - выводить все сообщения (сообщения компилятора - все)... если я ничего не перепутал...
Итак способ номер 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: 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.dizzel, действительно, похоже на проблемы с конкретными МК. Есть смысл прекратить эксперименты, и собрать паралельный программатор.
Ну может ещё всё таки последний эксперимент -запаять все кондёры по питанию.
у ардуины проблемы с программаторами USBASP у меня были аналогичные проблемы... Много времени потратил и нервов.
Разработчики сознательно подменили оригинальный avrdude.exe на свой собственный, найдите оригинал и замените фруиновскую дудку, она фейковая (размеры avrdude одной и той же версии не совпадали с оригиналом), можно скачать из моего архивчика оригинал: https://vk.cc/axVSra
Проблема решилась раз и навсегда, модифицированные версии не помню с какой версии пошли но сначала точно было все нормально.
Написал заметку по этому делу: https://vk.com/izhadapter?w=wall-73481857_1700 Так же тут описание как выставить скорости без перемычек в среде ардуино.
Итак. Победа!
Подвесил 12мгц кварц. И оба проца прочитались. Из первой партии с индексом PH. Его удалось без проблем сбросить на дефолт и зашить прошивку.
А вот из второй партии с индексом AU. Оказались еще и с установленными лок битами. Я их убираю, говорю дудке "шей", а она вылетает с ошибкой, и при последующем чтении микрухи лок биты на месте. Короче надо повозится и если не получится доделать фьюз доктор.
Короче у кого такие проблемы как у меня - вешайте внешний кварц и пробуйте. 8мгц, 12мгц, 16мгц и т.п.
Спасибо всем кто откликнулся.
Или нормальный программатор использовать, у которого есть внешнее тактирование для чипа.
Итак. Победа!
Подвесил 12мгц кварц. И оба проца прочитались.
тюююю...
Я думал вы давно внешний такт подключили... Когда покупаете МК на Али - они часто приходят прошитые под внешний осциллятор