« 2025年12月 | トップページ | 2026年2月 »

2026年1月

2026年1月25日 (日)

ATtiny3224で裸の32bit周波数カウンタ #2

ATtiny3224で裸の32bit周波数カウンタ
この続きのお話し。

32.768kHzの時計用水晶発振子をつないで1秒を作り、
このタイミングを基準に32bitにしたTCBカウンタから
4バイトの値を読んでHz単位の周波数計測値を得ています。
測定精度の要はこの1秒です。

PA2に1Hzのインプットキャプチャパルスを出して
いるので、この周波数(あるいは周期)を計れば
精度がわかります。
しかし、この信号は方形波じゃなくRTCの桁上が
りパルスで、30.52usの幅(1/32768Hz)しかありま
せん。
デューティ比が極端なので、普通の周波数カウンタ
だと読めません。(読めるのもあるでしょうが)

そこで、RTCの精度を見るため、何か良い方法はな
いものかと考えてみました。
  RTCの周波数が分かるデューティ比50%に
  近い方形波
を出力できれば良いわけです。

まず、問題になるのがポートPB2とPB3に発振子を
つないだせいで生じる他のポートへのしわ寄せです。

「ポート機能の多重化」ということで、この表が
データシートに出ています。
3224a

順番に行きます。
(1) 水晶をつないだことで、USART0のRXDとTXD
  が使えなくなる。
(2) 代替としてPA2とPA3にTXD、RXDを持ってくる。
  そうするとUSART1のTXD、RXDがアウトに。
  14ピンのtiny3224にはPC1、PC2が無いので
  USART1は使えなくなる。
  シリアルが2ch欲しければ20ピンのtiny3224を
  選ぼう。
(3) 同様にSPIも使えなくなる。
(4) PB2のイベント出力Bの代替ポートPB7も14ピン
  のには存在しないので使えない。
(5) RXD0の代替ポートPA2はEVOUTAと共用しているが、
  この代替PA7はOK。
このほか、TCA0のパルス出力もWO2がアウト。
WO0、WO1はI2Cと共通なのでアウトに。

14ピンのチップであれこれしようとすると、悩みます。

こんなことを考えながら、RTC周波数パルスの出力方法を
考えます。

<イベントシステムを使ってPITのパルスを出す>
発振周波数はRTC=PITなので、PITの分周パルス
をEVOUTAに出せば周波数がわかります。
ただし、PITから引き出せるのはこの表にあるよう、
8つの周波数からしか選べません。
3224b
    最低4Hzで最高が512Hz。
RTCとPITを初期化した後、EVSYSで出力します。

  EVSYS.CHANNEL3        = 0x0B;  // ch3入力:PIT/64 512Hz
EVSYS.USEREVSYSEVOUTA = 4; // ch3出力:EVOUTA(PA2) 出力

これでRTCの発振が元になった方形波がポートに出てきます。
  ※チャンネル指定が奇数と偶数に分かれるので注意
残念ながら生の32.768kHzやジャスト1Hzは得られません。

<タイマーTCA0を使ってPITのパルスを出す>
PITの出力をTCA0のクロック入力につなぎ、「FRQモード」
にしたTCA0で分周して方形波パルスを得ます。

/***** TCA0を使ってRTC周波数を見る  *****/
// PITで得られる最も高い周波数512HzをTCA0のクロックに
// TCA0をFRQモードにして1/2した周波数をWO0(PB0)に出力
// PIT 512Hz (奇数chへ)
EVSYS.CHANNEL3 = 0x0B; // ch3入力:PIT/64 512Hz
EVSYS.USERTCA0CNTA = 4; // ch3出力:TCA0 カウント入力へ
// タイマー TCA0
TCA0.SINGLE.INTCTRL= 0; // 割り込み禁止
TCA0.SINGLE.CTRLA = 0; // TCA0 停止
TCA0.SINGLE.CTRLD = 0; // TCA0 8bit分割停止 16bitに
TCA0.SINGLE.CTRLB = 0b00010001;
// ||||+++--- WGM FRQモードに
// |||+------ ALUPD
// ||+------- CMP0EN WO0出力(PB0 9pin SCLと重なる)
// |+-------- CMP1EN
// +--------- CMP2EN
TCA0.SINGLE.EVCTRL = 0b00000001;
// |||||||+--- CNTAEI Aカウント許可
// ||||+++---- EVACTA ↑でカウント
// |||+------- CNTBEI Bは停止
// +++-------- EVACTB
//TCA0.SINGLE.CMP0 = 1 - 1; // 256HzがWO0に【A】
TCA0.SINGLE.CMP0 = 256 - 1; // 1HzがWO0に 【B】
TCA0.SINGLE.CTRLA = 1; // TCA0イネーブル

これで、PB0=WO0にジャスト1Hzの方形波が出てきます。

チップの外から、RTC周波数を正確に見る方法、こんなところで
しょうか。
もちろん、周波数カウンタの入力に正確な周波数のパルスを入れ、
その測定値から基準周波数を逆算するということも可能ですが、
直接見てみたいものです。

| | コメント (0)

2026年1月23日 (金)

献血カード捨てます 70回だった

引き出しを整理(物色)していたら「献血カード」を発掘。
なんやかんやで10年ほど前に献血をやめてました。
Kk11_20260123123801

70回」できたんで、まぁ、エエでしょ。
記録したので捨てます。


| | コメント (0)

2026年1月22日 (木)

ATtiny3224で裸の32bit周波数カウンタ

tinyAVR2系」のATtiny3224(14pin)。
これに内蔵された2つの16bitタイマー、
TCB0とTCB1が連結できるということで、
32bitの周波数カウンタを試してみました。

こんな回路。
Tiny32241

6pinと7pinに時計用水晶を接続。
ここから1Hzのキャプチャタイミングを得ます。
32bitにしたタイマでパルス入力をカウント。
1Hzサイクルでそのカウント値をキャプチャ。
  周波数計測モードにすると、そのタイミングで
  カウンタをゼロクリアしてくれます。
結果はPA1から9600BPSでシリアル出力。
こんな流れですが、チップのレジスタを操作するので
スケッチはけっこうややこしくなります。

//  ATtiny3224 (14pin) 裸の周波数カウンタ
// 32.768kHz水晶を使用
// TCB0とTCB1を連結して32bitカウント
// PA1 シリアル出力データ 9600BPS
// PA2 キャプチャタイミング RTCによる1Hz
// PA4 測定クロック入力
#define CYC_HZ 1 // キャプチャ繰り返し周波数(Hz)
// 毎秒あたりのキャプチャ回数 (2^n)
// RTC.PER設定値
/***** RTC,PIT busy待ち *****/
// 両方とも0になるのを待つ
void rtcbusy(void) {
while((RTC.STATUS & 0x0F) || // RTC busy ?
(RTC.PITSTATUS & 1)); // PIT busy ?
}
/***** シリアル出力 *****/
void tx(char c)
{
while(!(USART0.STATUS & (1 << 5))); // DREIF 送信できるまで待つ
USART0.TXDATAL = c; // 1文字出力
}
/***** シリアル文字列出力 *****/
void txstr(const char *s)
{
while(*s != '\0'){ // Nullまで
tx(*s); // 1文字出力
s++; // 次文字
}
}
/***** 書式付シリアル出力 *****/
// long値は10桁
void txprintf(const char *s, ...)
{
va_list vp;
char bff[40]; // バッファを確保
va_start(vp,s);
vsnprintf(bff, sizeof bff, s, vp);
txstr(bff);
va_end(vp);
}
/***** SETUP *****/
void setup() {
cli(); // 割込禁止
PORTA.DIR = 0b11101110;
// |||||||+---- PA0 10pin UPDI
// +++++++----- PA4 in, 他 out
PORTB.DIR = 0b00000011;
// |||+---- PB0 9pin out
// ||+----- PB1 8pin out
// |+------ PB2 7pin TOSC2 32.768kHz
// +------- PB3 6pin TOSC1 XTAL
PORTA.PIN4CTRL = PORT_PULLUPEN_bm; // PA4 pull up
// 測定クロック入力
// 32.768kHz XTAL
// _PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, 0x00); // XTALオフ
// while(CLKCTRL.MCLKSTATUS & (1 << 6)); // XOSC32KSの0を待つ
// リセット起動なら↑の手順は不要 いきなりオン↓でOK
_PROTECTED_WRITE(CLKCTRL.XOSC32KCTRLA, 0b00000001); // 発振イネーブル
// || ||+-- ENABLE
// || |+--- RUNSTBY
// || +---- SEL
// ++------ CSUT 1kサイクル
// CSUT 01で16kサイクル、10で32k、11で64kサイクルの起動時間待ち
rtcbusy(); // RTC,PIT ビジー待ち
RTC.CLKSEL = 0b00000010;
// ++---- XOSC32K 32.768kHzHz水晶
RTC.CTRLA = 0b00110001;
// ||||| +---- RTCEN RTC周辺機能許可
// |++++------- CLK_RTC 1/64 →512Hz
// +----------- RUNSTBY
RTC.PER = (512 / CYC_HZ) - 1; // 512/512 →1Hz
RTC.PITCTRLA = 0b01010001;
// |||| +-- PITEN PIT有効
// ++++----- PERIOD 32.768kHz/2048 →16Hz
// イベント制御: TCBクロック入力
EVSYS.CHANNEL0 = 0x44; // ch0入力:PA4
EVSYS.USERTCB0COUNT = 1; // ch0出力:TCB0 クロック
// イベント制御: TCBキャプチャ
// RTCのオーバーフローでキャプチャ
// PA2(EVOUTA)にタイミングを出力
EVSYS.CHANNEL1 = 0x06; // ch1入力:RTC_OVF
EVSYS.USERTCB0CAPT = 2; // ch1出力:TCB0 CAPT入力
EVSYS.USERTCB1CAPT = 2; // ch1出力:TCB1 CAPT入力
EVSYS.USEREVSYSEVOUTA = 2; // ch1出力:EVOUTA(PA2) 出力
// 32bitカウントのためにTCB0のオーバーフローをTCB1のクロックに
EVSYS.CHANNEL2 = 0xA1; // ch2入力:TCB0オーバーフロー出力
EVSYS.USERTCB1COUNT = 3; // ch2出力:TCB1クロック入力
// タイマー TCA0,TCB0,TCB1割り込み禁止
TCA0.SINGLE.INTCTRL = 0;
TCB0.INTCTRL = 0;
TCB1.INTCTRL = 0;
// タイマーTCB0 (下位側)
// RTCのオーバーフローでキャプチャ
// カウントクロックはPA4 EVSYS_USERTCB1COUNTで
TCB0.CTRLA = 0b00001111;
// ||||||+-- ENABLE
// |||+++--- CLKSEL EVENTでクロック
// ||+------ SYNCUPD
// |+------- CASCADE
// +-------- RUNSTBY
TCB0.CTRLB = 0b00000011;
// ||| +++-- CNTMODE 周波数測定
// ||+------ CCMPEN
// |+------- CCMPINIT
// +-------- ASYNC
TCB0.EVCTRL = 0b00000001;
// | | +-- CAPTEI キャプチャ有効
// | +------ EDGE
// +-------- FILTER
// タイマーTCB1 (上位側)
// 32bit動作 EVSYSを通じてTCB0のOVFでカウント
TCB1.CTRLA = 0b00101111;
// ||||||+-- ENABLE
// |||+++--- CLKSEL EVENTでクロック
// ||+------ SYNCUPD
// |+------- CASCADE 連結して32bitカウント
// +-------- RUNSTBY
TCB1.CTRLB = 0b00000011;
// ||| +++-- CNTMODE 周波数測定
// ||+------ CCMPEN
// |+------- CCMPINIT
// +-------- ASYNC
TCB1.EVCTRL = 0b00000001;
// | | +-- CAPTEI キャプチャ有効
// | +------ EDGE
// +-------- FILTER
// シリアル
// 9600BPSでシリアル出力 受信はなし
USART0.CTRLB = 0b01000000;
// || ||||+-- MPCE
// || ||++--- RXMODE
// || |+----- ODME
// || +------ SFDEN
// |+-------- TXEN 送信有効
// +--------- RXEN 受信はしない
USART0.CTRLC = 0b00000011;
// |||||+++-- CHSIZE 8BIT
// ||||+----- SBMODE 1stop
// ||++------ PMODE Parity無し
// ++-------- CMODE 非同期USART
USART0.BAUD = (4L * F_CPU) / 9600L; // 20MHzなら8333
PORTMUX.USARTROUTEA = 0b00000001; // 代替ポート
// ||++-- USART0 TXをPA1に
// ++---- USART1
sei(); // 割込有効
}
// 表示用データ
byte f_disp; // 周波数表示指令
byte cnt_pit; // PITタイミング
// 16Hz upカウント
/***** LOOP *****/
void loop() {
word d0, d1; // TCB0,TCB1 16bitキャプチャ値
uint32_t d; // 32bitデータ
txstr("RTC Test\r\n");
txprintf("%luHz\r\n", F_CPU); // 動作周波数
while(1){
if(TCB0.INTFLAGS & 1){ // キャプチャ? (1Hzサイクル)
TCB0.INTFLAGS = 1;
d0 = TCB0.CCMP; // 1Hzごとのキャプチャデータ
d1 = TCB1.CCMP; // 上位16bit
d = ((uint32_t)d1 << 16) | (uint32_t)d0; // 32bitに
f_disp = 1; // 表示指令
cnt_pit = 0; // PIT 16Hzカウンタクリア
}
if(RTC.PITINTFLAGS & 1){ // PIT 16Hz
RTC.PITINTFLAGS = 1;
cnt_pit++; // PITカウンタ +1
if(cnt_pit >= 18){ // 18/16サイクル
txstr("No clock\r\n"); // クロックなし表示
cnt_pit = 0; // PIT 16Hzカウンタクリア
}
}
if(f_disp){ // 表示タイミング
f_disp = 0;
txprintf("%10luHz\r\n", d); // Hzで
}
}
}

で、分かったこと。
・ATtiny1系のように、
  「クロックがないとキャプチャしてくれない」
 は、大丈夫。クロックがなくてもキャプチャして
 くれるので、何もせずに「0Hz」が出てきます。
・ゼロクリアのタイミングも大丈夫。
 カウントが1つ減るということもありませんで
 した。
・スケッチでは、イベント関連レジスタの構成が
 tiny1系と変わっていました。ややこしい。
   ヘッダーファイル:iotn3224.hを捜索

※tinyAVR1系のATtiny1614での実験
ATtiny1614で(裸の)周波数カウンタ
ATtiny1614で周波数カウンタ:キャプチャタイミング

この↑記事のようにtinyAVR1系で周波数カウンタを
作ろうとすると、けっこうめんどう。
そして、キャプチャタイミングがとクリアのタイミングが
カウントクロックで刻まれるのがなんともあきません。

ということで、周波数カウンタを作るならtinyAVR2系を
どうぞ。
16bitカウンタなら1Hzのゲートで65535Hzがmaxで、
それを越えるカウント値はオーバーフローを見ておか
ないといけません。
それが連結して32bitになると、まぁラクチンに。

・ブレッドボードでの試運転中の様子
Tn24

※自分のクロックを計ってみる
TCB0(下位側)のクロック入力設定をこのように
変えれば、内蔵クロックを計ることができます。

//TCB0.CTRLA        = 0b00001111;  // 外部クロックを計る
// ||||||+-- ENABLE
// |||+++--- CLKSEL EVENTでクロック
// ||+------ SYNCUPD
// |+------- CASCADE
// +-------- RUNSTBY
TCB0.CTRLA = 0b00000001; // ←これに変えてクロック源をCLKPER

そして、Arduino IDEのツール設定を触ります。
Clk22
Clk23
こんな結果。

F_CPU=20000000Hz
19283.520kHz
20045.993kHz
20049.757kHz
20049.887kHz
20049.439kHz
20051.664kHz

F_CPU=16000000Hz
15391.121kHz
16001.330kHz
16002.410kHz
16001.726kHz
16002.778kHz
16001.499kHz
16003.342kHz

F_CPU=10000000Hz
9641.545kHz
10023.248kHz
10024.757kHz
10025.080kHz
10024.272kHz
10022.962kHz

F_CPU=5000000Hz
4824.711kHz
5010.271kHz
5010.384kHz
5009.681kHz
5010.371kHz
5009.503kHz
5009.354kHz

けっこう変動していました。

※RTC用水晶の発振周波数(32.768kHz)を調べたい
 ・ATtiny3224で裸の32bit周波数カウンタ #2

| | コメント (0)

2026年1月21日 (水)

澤田平さんの「鉄砲から見た和時計」を図書館で発見

今月の東成図書館・図書展示 のタイトルが
  「ものづくりの本展」。
今どきの機械や材料、工業技術の解説本がほと
んどなんですが、「おっ!」となったのが、
澤田平さんの 鉄砲から見た和時計   (2024/09発行)

Wat01

調べますと、1996年に出された
  和時計: 江戸のハイテク技術
の再版(+追記)という位置づけのようです。

澤田先生のお家、仕事場から歩いて行ける距離。
次男の「火縄銃」絡みで、あれこれと何度も
お邪魔しています。
  修復途中のあれこれを見せてもらったり、
  博物館での資料展示を手伝ったこともあ
  ります。

この本、ハイテク和時計をゴソゴソしておられる、
ラジオペンチさんに見てもらいたいところ。
  ・和時計の製作:ラジオペンチブログ

※追記
ひょっとして次男が持っているかもっと聞いてみたら、
出てきました。
Wad21
1996年のほうの本でした。
Wad22
澤田先生、直々にいただいたようです。
こちらの方がオリジナル。
印刷がキレイです。


| | コメント (1)

2026年1月15日 (木)

今日の失敗:ABS樹脂ケースに穴を開けたらホルソーが詰まったゾ

ちょいと厚みのあるABS樹脂でできたケース。
  厚さ3mmくらいでしょうか。
これにΦ16のホルソーでコネクタの取り付け穴を
開けました。
穴はキレイに開けれたのですが・・・
  ・・・ホルソーの内側空間が樹脂で詰まっちゃ
     いました。
Jj11
マイナスドライバでツンツンしても外れてくれません。
  ホルソーの側面に貫通穴があるタイプ
  を選ぶべきだったんでしょうね。
  でも、Φ16の手持ちのが(工具箱に昔からある)
  刃に厚みがあるこれだったんです。
結局、リューターを持ってきて、樹脂を削り出し、
ホルソーを救いました。
  ABS樹脂って、冷えたら膨れるのかしら?

で、もう一つ。
比較的最近(といっても3~4年前)に買ったツールで
これ、エエやんなのがHOZANのバリ取りナイフ K-35
Jj12
これで、バリ取り処理作業がラクチンに。
Jj13
これ、まぁ、うまいことバリが削れます。
ケース加工におすすめしておきます。

| | コメント (4)

『Digi-Key』部品購入で助かってます

自転車でDigi-Key荷物を配達しているわけじゃありません。
Dk22
仕事場から家まで荷物を運ぶのに使った段ボールが
たまたま「Digi-Key」からやってきた段ボール。
夕刻、帰宅途中、「スーパー玉出」に寄って
晩ごはんの食材を購入。
駐輪場所に止めた自転車、荷台に乗せたDigi-Keyの
段ボールがあまりに光ってたんでスマホでパチリ。


| | コメント (0)

2026年1月10日 (土)

ATtiny3224のタイマでは・・・言うことを聞かないゾ

ATtiny1614:タイマレジスタの初期設定を見る
この続き。
tinyAVR2系統ATtiny3224(14pin)がやって
きたので同じように確かめてみました。

タイマーは自分で勝手にするから「いらん」っと
したいんですが、TCB1のキャプチャ割り込みが
消せません。
3224_01

ATtiny3224 : timer Disable
TCA0.CTRLA 0B
TCA0.CTRLB 00
TCA0.CTRLD 01
TCA0.INTCTRL 00
TCA0.PER FEFE
TCA0.PERB FFFF
TCB0.CTRLA 00
TCB0.CTRLB 00
TCB0.INTCTRL 00
TCB0.CCMP 0000
TCB1.CTRLA 03
TCB1.CTRLB 00
TCB1.INTCTRL 01   DisableにしてもCAPT割り込みが有効
TCB1.CCMP 270F

かろうじてTCA0にするとTCB1を使わなくしてくれ
ましたけど、あれこれ変えても「みんないらん」が
できませんでした。
  (TCA0以外はTCB1の割り込みが残る)

で、ATtiny3224で『料理するのが楽しみ』という
のが次の2点。

まず、16bitタイマーTCB0とTCB1を連結して
32bitタイマーにするという機能。
Cnt11
周波数カウンタ的用途だと、タイマーの16bit
オーバーフローを気にせずカウントができます。
  1Hzゲートで16bitだと65.535kHzが最大。
  これ以上は何らかの方法で上位桁をソフト
  的に計数しなければならない。

もう一つがIrDAの機能。
Cnt12
ATtiny1614にも装備されていたんですが、
UARTが一つしかないので、試すまでして
いませんでした。
ATtiny3224だとUARTが二つあるので、片方をIrDA
で使ってということが可能になります。


※関連
デジタルテスター「FLUKE 87IV」の赤外線通信ユニット完成
  IrDA制御IC無しでこれが実現できるかと

| | コメント (0)

2026年1月 6日 (火)

ATtiny1614:タイマレジスタの初期設定を見る

AVR1系のATtiny1614(14pin)、Arduino IDEの設定で
タイマの使われ方が変わります。
Sc2

タイマレジスタの内容を表示するプログラムを書いて、
違いを見ました。
こんなスケッチ。

/***** ATtiny1614のタイマレジスタの初期値を見る ******/
// 配列のデータ数を返すマクロ
#define DIMSIZ(a) (sizeof(a)/sizeof(*a))
// チェックしたいレジスタ一覧
typedef struct{
const char *msg; // レジスタ表示名
byte type; // レジスタの読み出しバイト数 0:B,1:W
volatile void *p; // レジスタアドレス
}ST_REG;
ST_REG tmr_tbl[]={
{ "TCA0.CTRLA", 0, &TCA0.SINGLE.CTRLA },
{ "TCA0.CTRLB", 0, &TCA0.SINGLE.CTRLB },
{ "TCA0.CTRLD", 0, &TCA0.SINGLE.CTRLD },
{ "TCA0.INTCTRL", 0, &TCA0.SINGLE.INTCTRL },
{ "TCA0.PER", 1, &TCA0.SINGLE.PER },
{ "TCA0.PERB", 1, &TCA0.SINGLE.PERBUF },
{ "TCB0.CTRLA", 0, &TCB0.CTRLA },
{ "TCB0.CTRLB", 0, &TCB0.CTRLB },
{ "TCB0.INTCTRL", 0, &TCB0.INTCTRL },
{ "TCB0.CCMP", 1, &TCB0.CCMP },
{ "TCB1.CTRLA", 0, &TCB1.CTRLA },
{ "TCB1.CTRLB", 0, &TCB1.CTRLB },
{ "TCB1.INTCTRL", 0, &TCB1.INTCTRL },
{ "TCB1.CCMP", 1, &TCB1.CCMP },
{ "TCD0.CTRLA", 0, &TCD0.CTRLA },
{ "TCD0.CTRLB", 0, &TCD0.CTRLB },
{ "TCD0.CTRLC", 0, &TCD0.CTRLC },
{ "TCD0.CTRLD", 0, &TCD0.CTRLD },
{ "TCD0.INTCTRL", 0, &TCD0.INTCTRL },
};
/***** レジスタの状態出力 *****/
void dispreg(void)
{
byte i;
word d;
char const *ss[]={ // 出力区分
"%02X", // byte
"%04X", // word
};
for(i=0; i<DIMSIZ(tmr_tbl); i++){
switch(tmr_tbl[i].type){ // typeでbyte,wordを区分
case 0: // byte
d = (word)*(byte *)tmr_tbl[i].p;
break;
case 1: // word
d = *(word *)tmr_tbl[i].p;
break;
}
Serial.printf("%-16s", tmr_tbl[i].msg); // レジスタ名
Serial.printf(ss[tmr_tbl[i].type], d); // byte,wordデータ
Serial.println(); // 改行
}
}
/***** SETUP *****/
void setup() {
byte i;
Serial.begin(9600); // PB2(7pin)がTXD出力
for(i=0;i<100;i++){ // 1sec待ち
delayMicroseconds(10000); // 10ms
}
Serial.print("ATtiny1614 : "); // タイトル
Serial.println("timer TCB1");
dispreg(); // レジスタ値表示
}
/***** LOOP *****/
void loop() { // なにもしない
}


3つの状態を調べました。

ATtiny1614 : timer default
TCA0.CTRLA 0B clk_per/64
TCA0.CTRLB 00 出力はオフ
TCA0.CTRLD 01 8bit分割
TCA0.INTCTRL 00 割り込みなし
TCA0.PER FEFE 254,254
TCA0.PERB FFFF
TCB0.CTRLA 00
TCB0.CTRLB 00
TCB0.INTCTRL 00
TCB0.CCMP 0000
TCB1.CTRLA 00
TCB1.CTRLB 00
TCB1.INTCTRL 00
TCB1.CCMP 0000
TCD0.CTRLA 11 内部OSC,1/32,TCD有効
TCD0.CTRLB 00 1傾斜度動作
TCD0.CTRLC 80 波形選択
TCD0.CTRLD 00
TCD0.INTCTRL 01 オーバーフロー割り込み

ATtiny1614 : timer disable
TCA0.CTRLA 0B
TCA0.CTRLB 00
TCA0.CTRLD 01
TCA0.INTCTRL 00
TCA0.PER FEFE
TCA0.PERB FFFF
TCB0.CTRLA 00
TCB0.CTRLB 00
TCB0.INTCTRL 00
TCB0.CCMP 0000
TCB1.CTRLA 00
TCB1.CTRLB 00
TCB1.INTCTRL 00
TCB1.CCMP 0000
TCD0.CTRLA 00
TCD0.CTRLB 00
TCD0.CTRLC 00
TCD0.CTRLD 00
TCD0.INTCTRL 00

ATtiny1614 : timer TCB1
TCA0.CTRLA 0B
TCA0.CTRLB 00
TCA0.CTRLD 01
TCA0.INTCTRL 00
TCA0.PER FEFE
TCA0.PERB FFFF
TCB0.CTRLA 00
TCB0.CTRLB 00
TCB0.INTCTRL 00
TCB0.CCMP 0000
TCB1.CTRLA 03 clk_per/2
TCB1.CTRLB 00 周期割り込み
TCB1.INTCTRL 01 割込許可
TCB1.CCMP 270F =9999(10進)
TCD0.CTRLA 00
TCD0.CTRLB 00
TCD0.CTRLC 00
TCD0.CTRLD 00
TCD0.INTCTRL 00

・タイマの区分に関わらず、TCA0は8bit2分割モード
 でPWM出力用に初期化。
・「default」ならTCD0の割り込みで計時。
・「disable」ならTCB0,TCB1,TCD0は未使用。
・「TCB1」ならTCB0,TCD0は空き。

| | コメント (0)

2026年1月 1日 (木)

ダイソーの110円LEDランプが点灯せず

年末夜警(12月29日,30日の2日間)参加のお土産で
お配りした百均LEDランプ。
L31_20260101165501

その残り物(違う種類も含めて5つあった)に電池を
装着してテスト点灯してみたら1つだけが光りません。
くやしいので(費用は町会費)、原因を探ってみました。

単3電池を入れる側のスイッチ部は異常なし。
L32_20260101165601
スイッチオンで電池のマイナス電圧が外周に出て
きます。
しかし、外部からLED部に電源を供給しても
点灯せず。 (中央の●に電池のプラス極が接触)

LED部を解体。
L33

解体した状態で電源をつないでもダメ。
でも、LED単体では光り、接続するリード線や
コイルも断線していません。

残るは制御(昇圧)IC。
L34
  (青リードに電池のプラス)

ぱっと見はちゃんとつながっています。
ICの不良が原因ならならあきらめるしかないかと思った
のですが、ダメ元でハンダゴテで加熱(追いハンダ)。
L35
すると点灯!
原因は昇圧用ICのハンダ不良だったようです。

 

| | コメント (1)

ジャンクカメラ2台と双眼鏡

正月早々ですが、いただきものの
  「もらってちょうだい」です。

まず、フィルムカメラが2台。
 しかし、残念ながら2台とも動きません。

まず、「CANON QL17」。
レンズシャッター式カメラ。
Cm11_20260101112501

シャッターが動きません。
裏蓋を開けると、モルトプレーンがボロボロと。
Cm12_20260101112501

もう一台が「PENTAX ES2」。
Cm13_20260101112501

こちらは、ミラーアップしたままになっていて、
ファインダーをのぞいても真っ暗け。

Cm14_20260101112601

シャッターは切れてフォーカルプレーン機構は
作動してますが、シャッター速度を変えても
1/60秒で動いているようです。
Bにしてもオープンにならず同じ。

もう一つが双眼鏡
Cm15_20260101112601

メーカー名が「STAR」で「6x9.3」と記されています。
これはちゃんと見えます。
ピント調整は左右別々。
Cm16_20260101112601

右目側にレクチルが見えます。
Cm18
  左右が 50-0-50
  上下が 30-0-30
0が視界の中央で、上下の目盛は左側の20のとこ
ろに付いています。

ググると・・・
・AI による概要
 「双眼鏡 Star 6x9.3」は、
 第二次世界大戦中の旧日本軍が将校や偵察
 兵向けに標準装備としていた軍用双眼鏡の
 モデル名である可能性が高いです。
 一般的な現行製品や市販モデルとしては見
 当たらず、主にミリタリーアンティーク品
 として取引されています。
・主な特徴と情報
  倍率と対物レンズ径: 倍率は6倍、対物レン
 ズの口径は不明ですが、「9.3°」という非
 常に広い実視界(Field of View)を持つこ
 とが特徴です。当時の技術水準では優れた
 広視野を実現しており、戦場での索敵に適し
 ていました。

レンズ径は25mmです。
Cm17
重さ480g。
皮のケースに入っています。

レクチルの意味(使い方)は、どうなんでしょ。
レクチルの目盛が全視界をカバーしてるわけ
ではなく、目盛がない部分が、左右に20~30
目盛分ほどあります。

※満月手前の「お月様」を見てみたら、レクチルの
読みでほぼ「10」。 2目盛り。
月の見かけの角度が約0.5度なので、10で0.5度となる
ようです。


それと・・・
歯科用カメラ:2台 いりませんか?
この中の1台、一眼フィルムカメラの
「京セラのDENTAL-EYE II」も
合わせて引き取ってもらえれば助かります。

どなたかいりませんか?
  ※みんなまとめてもらって欲しい・・・
お代はいつものように「送料+お駄賃」を
「ビール券」で。

メールを記してコメントしてください。

| | コメント (0)

« 2025年12月 | トップページ | 2026年2月 »