日々の記録

ほどよく書いてきます。

ATTiny13AのADC機能を使う

2013年07月29日 15時31分15秒 | その他雑記
ATTiny13Aという8ピンマイコンを使ってみる。

ADコンバータがちゃんと使えるかの確認。
最終的には8bit程度の分解能で十分なので、左詰で上位8ビットの読み出ししかしませんが、
10bit ADCに変更するのも十分可能でしょう。

ArduinoっぽくAnalogReadという関数にしてみた。


/*
* _20130729_ATTiny13A_ADC.c
*
* Created: 2013/07/29 13:48:05
* Author: makoto
 
ATTiny13A Pin割り振り
1:PB5 RESET ADC0 →出力端子に設定しちゃうとリセット出来なくなるので使わない
2:PB3 CLKI ADC3
3:PB4 ADC2
4:GND
5:PB0 MOSI OC0A
6:PB1 MISO OC0B
7:PB2 SCK ADC1
8:VCC
 
*/

#include <avr/io.h>
unsigned char AnalogRead8bit(unsigned char Ch)
{
//8bit分解能で十分なのを前提に設定を行っている。
 
//デジタル入出力からの切り離し
DIDR0
= (0<<ADC0D) //ADC0ピンの切り離し。しかし、ADC0はリセット端子になってるから設定しちゃダメ
| (0<<ADC1D) //同ADC1
| (1<<ADC2D) //同・・
| (0<<ADC3D); //同・・
 
ADMUX
= (0<<REFS0) //Reference: 0でVCC参照, 1で1.1V内部電圧源
| (1<<ADLAR) //ADC Left Adjust Result: 1にセットすると左詰で結果を出してくる
| (Ch); //ADMUX1, ADMUX0で入力チャンネルを選べる 00から11までADC0からADC3まで対応
 
ADCSRA
= (1<<ADEN) //ADC enable
| (1<<ADSC) //ADC Start Conversion 1にすると変換開始
| (0<<ADATE) //ADC Auto Trigger Enable (for Continuous Conversion)
| (0<<ADIF) //ADC Interrupt Flag 変換完了すると1になるらしい
| (0<<ADIE) //ADC Interrupt Enable 変換完了したときに割り込み許可
| (0b100); //Clock Division: ADコンバータはクロック50-200kHzで性能がよい
//分周は0のとき2、それ以上の時2^n分周 1.2MHz(Default)のとき16分周(100)で75kHz。9.6MHzのとき128分周(111)で75kHz
 
loop_until_bit_is_set(ADCSRA,ADIF); //ADIFビットが1になるまでムダループ
return ADCH;
}
 
unsigned int AnalogRead(unsigned char Ch)
{
//10bit分解能用ルーチン
 
//デジタル入出力からの切り離し
DIDR0
= (0<<ADC0D) //ADC0ピンの切り離し。しかし、ADC0はリセット端子になってるから設定しちゃダメ
| (0<<ADC1D) //同ADC1
| (1<<ADC2D) //同・・
| (0<<ADC3D); //同・・
 
ADMUX
= (0<<REFS0) //Reference: 0でVCC参照, 1で1.1V内部電圧源
| (0<<ADLAR) //ADC Left Adjust Result: 1にセットすると左詰で結果を出してくる
| (Ch); //ADMUX1, ADMUX0で入力チャンネルを選べる 00から11までADC0からADC3まで対応
 
ADCSRA
= (1<<ADEN) //ADC enable
| (1<<ADSC) //ADC Start Conversion 1にすると変換開始
| (0<<ADATE) //ADC Auto Trigger Enable (for Continuous Conversion)
| (0<<ADIF) //ADC Interrupt Flag 変換完了すると1になるらしい
| (0<<ADIE) //ADC Interrupt Enable 変換完了したときに割り込み許可
| (0b100); //Clock Division: ADコンバータはクロック50-200kHzで性能がよい
//分周は0のとき2、それ以上の時2^n分周 1.2MHz(Default)のとき16分周(100)で75kHz。9.6MHzのとき128分周(111)で75kHz
 
loop_until_bit_is_set(ADCSRA,ADIF); //ADIFビットが1になるまでムダループ
return ADC;
}
int main(void)
{
//PB4(ADC2)からアナログ値を読み込み、PB0からPB3に4ビット表示。
DDRB = 0b1111; //出力端子設定
while(1)
{
PORTB = AnalogRead8bit(2) >> 4; //アナログ値読み込みとビットシフト
}
}
 




Atmel Studio 6.1を使っています。

以上のコードをコンパイルすると74バイト。コードの割にはでかくね?
コメント (4)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

鉛電池のパルス充電器

2013年07月21日 23時00分59秒 | その他雑記
バイクのバッテリーの元気がなくなってきている。最近エンジン始動せず、立ち往生気味になることがある。

部屋に持ち帰り、電源装置から充電すると1A流しているだけなのに17Vくらいまですぐに電圧が上がってしまう。コレはなんかまずいかも・・・

電池の内部抵抗が大きいのだろうと思ったので、パルス的な電流で充電するといいよ、みたいな話を思い出してやってみることに。



回路はLM555タイマICを使った簡単な回路。
コメント (4)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ATTiny13Aでニコン一眼レフのリモコンを作る

2013年07月15日 16時11分20秒 | その他雑記
AVRマイコンに8ピンのATTiny13Aというものがある。秋月電子で一つ50円(前は120円だった)なので、お手軽簡単8ピンマイコン。
メモリ容量は1kBでRAMが32バイトだが、リモコンくらいできちゃうわけですね。

8ピンマイコンで、4つのピンからロータリーエンコーダー入力を受け付けるとする。
ただ、PB0,PB2,PB3,PB4の4つで、PB1を飛ばさないといけない。

0b1101でマスクしてから、1を加算して、1ビット右にシフトするとキレイに並ぶ。

RoratySwitchPosition = ( (PINB & 0b1101) + 1 ) >> 1

だろうか。これで0からFまで入力を受け付けられる。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Nikon DSLR IR Remote

2013年07月14日 23時56分47秒 | その他雑記
ニコンのデジカメのシャッター、リモコンで動かせるのだが、
マイコンでコントロールできてしまえば、インターバル撮影できるようになる。
D7000かD7100なら繰り返し撮影できるらしいんだけどね。

あとは好みの繰り返しループを。
_delay_us()が引数に変数を渡せないらしいと知ってびっくりした。

マイコンはATTiny13Aを使おうと思っているので、足は8本、電源で2本、リセット端子が1つ、赤外線リモコンへの端子が1本、残りは4本の脚。
4本の足を使えば2^4=16パターンの作れる。

/*
* _20130714_tiny13a_nikon_remote.c
*
* Created: 2013/07/14 16:28:42
* Author: user
*/

#define F_CPU 1200000
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
DDRB = 0b00000010; // 出力方向にする
TCCR0A = 0b00000011; //まずは出力なしでカウンターを回す

TCCR0B = 0b00001001;
OCR0A = 31; // (( 1.2MHz / 38kHz ) / 1(分周) ) - 1 = 30.6
OCR0B = 11; // duty比を1/3にする ( 1.2MHz / 38kHz ) / 3 = 10.5

while(1)
{
TCCR0A = 0b100011; _delay_us( 2000);
TCCR0A = 0b000011; _delay_us(27850);
TCCR0A = 0b100011; _delay_us( 390);
TCCR0A = 0b000011; _delay_us( 1580);
TCCR0A = 0b100011; _delay_us( 410);
TCCR0A = 0b000011; _delay_us( 3580);
TCCR0A = 0b100011; _delay_us( 400);
TCCR0A = 0b000011; _delay_us(63200);
}
}
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ニコンリモコンコード覚え書き

2013年07月10日 23時55分48秒 | その他雑記
60日間更新しないどなんかダメらしい。

38kHzのduty 1/3で
ON 2.0ms
OFF 27.8ms
ON 0.5ms
OFF 1.5ms
ON 0.5ms
OFF 3.5ms
ON 0.3ms
PAUSE 63ms

の繰り返しらしい。
Nikonのリモコンをいじるコードとのこと。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする