fix: an alarm's interrupt could be turned on and never off, and nothing tested any of it
`set_alarm1/2`'s `enable_interrupt = false` did nothing at all - it skipped the control-register write rather than clearing A1IE/A2IE - and there was no other way to clear them, so an alarm armed once with its interrupt on drove INT/SQW for good. It is `alarm_interrupt::off` now and it clears the bit, with `listen_alarm1/2()` and `mute_alarm1/2()` beside it for a caller that arms once and changes its mind later. The bare bool went with it (rule 37): `set_alarm1(at, rate, false)` said nothing at the point of use. `bool SetWeekday` was the same shape one level up - `device<bus, false>` names nothing - and its two writers disagreed about what it meant: `write_date` skipped the weekday register, `write_clock` stamped a placeholder 1 into it, so a program that turned the maintenance off still had the register overwritten and no way to set it. `weekday_source::external` now means the register is the program's, in both writers. test/consteval.cpp is the battery this driver never had, over the arithmetic that has no bus in it: the BCD round trip across every representable value and its nibble layout, the hours register in both formats including all four noon/midnight cases, Sakamoto's weekday against six calendar dates (leap day, the day after it, and 2100's missing leap), and both alarms' rate encodings transcribed against 19-5170 Table 2 - including that alarm 2's masks sit one place below alarm 1's, which is the property that makes one distribution loop wrong for the other. Red-green: two assertions fire on a flipped DY bit. Beside it, one decode rather than two: `read_clock` and `read_time` spelled the seconds/minutes/hours triplet out separately (rule 6). Every image byte-identical on both chips in both modes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
21
README.md
21
README.md
@@ -25,7 +25,26 @@ cmake --build --preset attiny85-generated
|
||||
```
|
||||
|
||||
Presets cover attiny85/atmega328p in both libavr modes (generated and
|
||||
reflect). The legacy yazoalfa-based driver lives on the `master` branch.
|
||||
reflect); `ctest` runs the consteval battery over the BCD, the hours
|
||||
register's two formats, the weekday and the alarm rate encodings. The legacy
|
||||
yazoalfa-based driver lives on the `master` branch.
|
||||
|
||||
The weekday register is derived from the date by default. A program that
|
||||
assigns its own meaning to the device's 1..7 takes ownership of it, and no
|
||||
write here touches it:
|
||||
|
||||
```cpp
|
||||
using rtc = ds3231::device<bus, ds3231::weekday_source::external>;
|
||||
```
|
||||
|
||||
An alarm arms its INT/SQW output unless told otherwise, and can be muted and
|
||||
re-wired without re-arming:
|
||||
|
||||
```cpp
|
||||
auto quiet = rtc::set_alarm2(at, ds3231::alarm2_rate::minutes_match,
|
||||
ds3231::alarm_interrupt::off);
|
||||
auto again = rtc::listen_alarm2();
|
||||
```
|
||||
|
||||
## Atmel Studio
|
||||
|
||||
|
||||
Reference in New Issue
Block a user