«Обоср#ться» и написать правильно одновременно - это талант
Кулон это величина заряда, прошедшего через проводник при силе тока 1 А за время 1 с. Через основные единицы СИ кулон выражается соотношением вида: 1 Кл = 1 А·с. С внесистемной единицей ампер-час кулон связан равенством: 1 Кл = 1/3600 ампер-часа.
Поэтому чтобы получить 1 ампер-час потребуется 3600 Кл. А для 3.6 ампер-час аж целых 12960 Кл.
Боюсь, что и в этом случае часы будут отставать.
Если деассамблировать то, что IDE грузит в микронотроллер, то увидим следующее:
0000084c :
84c: cf 93 push r28
84e: df 93 push r29
850: 00 d0 rcall .+0 ; 0x852 <main+0x6>
852: 00 d0 rcall .+0 ; 0x854 <main+0x8>
854: 00 d0 rcall .+0 ; 0x856 <main+0xa>
856: 1f 92 push r1
858: 1f 92 push r1
85a: cd b7 in r28, 0x3d ; 61
85c: de b7 in r29, 0x3e ; 62
85e: 78 94 sei
860: 84 b5 in r24, 0x24 ; 36
862: 82 60 ori r24, 0x02 ; 2
864: 84 bd out 0x24, r24 ; 36
866: 84 b5 in r24, 0x24 ; 36
868: 81 60 ori r24, 0x01 ; 1
86a: 84 bd out 0x24, r24 ; 36
86c: 85 b5 in r24, 0x25 ; 37
86e: 82 60 ori r24, 0x02 ; 2
870: 85 bd out 0x25, r24 ; 37
872: 85 b5 in r24, 0x25 ; 37
874: 81 60 ori r24, 0x01 ; 1
876: 85 bd out 0x25, r24 ; 37
878: 80 91 6e 00 lds r24, 0x006E ; 0x80006e <TEXT_REGION_LENGTH+0x70006e>
87c: 81 60 ori r24, 0x01 ; 1
87e: 80 93 6e 00 sts 0x006E, r24 ; 0x80006e <TEXT_REGION_LENGTH+0x70006e>
Не понятно для чего значения регистров TCCR0A (0x24) и TCCR0B (0x25) меняются в два захода. Вместо:
in r24, 0x24
ori r24, 0x02
out 0x24, r24
in r24, 0x24
ori r24, 0x01
out 0x24, r24
можно сразу написать:
in r24, 0x24
ori r24, 0x03
out 0x24, r24
Но смысл всех этих, пусть и излишних, манипуляций приводит к тому, что millis() будет отсчитывать не одну миллисекунду, а 256/250 милисекунду.
Насколько я смог разобраться, с помощью в первую очередь, https://www.instructables.com/Command-Line-AVR-Tutorials/, если в setup добавить (переопределить работу Timer/Counter0):
‘’‘asm volatile
( “cli\n”
“ldi r24, 3\n”
“out 0x25, r24\n”
“ldi r24, 249\n”
“out 0x27, r24\n”
“ldi r24, 2\n”
“out 0x24, r24\n”
“sts 0x6E, r24\n”
“sei\n”
);’‘’
то millis() заработает правильно.
Очень хотелось бы получить комментарии специалиста - прав я или нет.
Я думаю, что скорее всего прав.
Потому что в Arduino IDE постоянно из-за этого коррекция миллис происходит. А всё для того, чтобы яркость светлодиода при DAC была не 250, а 255…
А вы абсолютно уверены в том, что ваш дизасемблер правильно отработал, и вы нам текст выложили для исследования на его правоту. Не надо было себя утруждать, надо было просто хекс выложить и задать тот же вопрос )))
Я предполагал, что девайс питается от аккума, который по мере разряда подключается мосфетом к зарядке.
У Вас же девайс питается от сети, а аккум подключается в цепь питания либо при пропадании сети, либо при его разряде ( для подзаряда). Только непонятно как детектится сеть, и как определяется напряжение на аккуме? В схеме этого нет.
Уверен.
Можете сами любой код с millis() деассемблировать с помощью objdump. У меня bat-файл выглядит так:
set project=mega_serial
C:\Users\lashi\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino7\avr\bin\objdump -D %project%.ino.elf > assembler.lst
По скетчу. Я бы сделал так.
В сетапе читаем секунды, запоминаем, снова читаем секунды пока они не поменяют значение, в этот момент запоминаем миллис и новое значение секунд.
Далее в луп начинаем опрашивать rtc только по прошествии 950 мс например. Раньше нет смысла опрашивать rtc. Если поменялись секунды, запоминаем миллис и выводим время на экран.
Миллис будет синхронизироваться rtc. Поменялись секунды- запомнили миллис. Через 950 мс начинаем считывать значение с rtc. Как только поменялись- снова запоминаем миллис.