atmega8も出荷時設定では内蔵1MHz動作なので、ヒューズビットを切り替えなければ9600bpsでシリアル通信する事はできない。
TINY2313のヒューズビット切り替えと同じノリで切り替えれた。
と17ページ
を見るとわかる通り、下位バイトのCKSEL3-0を書き換えると動作クロックが変わる。
ELMさんのライターで
>avrsp -rf
するとヒューズビットが読める
Detected device is ATmega8
Low: 11100001
High:11-11001
Cal: 185 184 181 183
なので
>avrsp -fl11100100
すると8MHzにできた。
MEGA8のTXDをADM3202に接続してシリアル通信できた。→ソースコード(avrgcc)
TINY2313もMEGA8もシリアル通信ができないので、おかしいなーと思ってたら内部クロック1MHzがデフォルトで有効になっていた。
1MHzだと9600bpsで送信するのには足りないので、フューズビットを4MHz動作に書き換える必要がある。
ELMライターで
>avrsp -rf
とすると
Low: 01100010
High:11-11111
Ext: ——-1
Cal: 108
と出るが、TINY2313のデータシートの105ページを見ると
下位バイトの7ビット目が「システムクロック8分周選択」なので、
>avrsp -fl11100010
と上書きしてやったら、4MHz動作に切り替わった。
これでUART(USART)で9600bps出すのに十分な速度が出るようになったので、TXDをADM3202に接続し
シリアル通信成功。ソースコード
(ちなみにこのRS232C-UART変換基盤はDNPに3個ぐらい転がっている)
やっとビット演算関連がわかった。
記念にcbiとsbiをマクロ定義したので書いておく。
#define sbi(PORT,BIT) PORT|=_BV(BIT) // PORTの指定BITに1をセット
#define cbi(PORT,BIT) PORT&=~_BV(BIT) // PORTの指定BITをクリア
これでWinAVR20050214で消えてたsbiとcbiが使えるようになる。
sbi(PORTB, PB1); // PB1だけ点灯
cbi(PORTB, PB1); // PB1だけ消灯
アセンブラのsbiやcbiとは違うけど。