2006年11月12日

1線データ転送 7segDriver STEP1

実用プログラムサンプル第3弾は、ATTiny2313を使用した7SegmentLEDのDriverとしました。
秋月では、7SegmentLEDをなんと10個¥100で売っています。1個当たり¥10です。
ダイナミックスキャンで6桁、8桁の数字表示をすることも可能ですが、ノイズの点からスタティック表示も興味がありました。
しかし、スタティック表示には専用のドライバーICがあるのですが、価格的には、LEDの価格に反して非常に高いのが一般的です。
ここでは、秋月で1個¥120で入手できるようになった、ATTiny2313を使用することにしました。
更にTiny2313になって内蔵OSCが使用できるようになったため、汎用ポートが全部で17本使用できるようになっており、表示するデータを1本の線で送れるようになれば、1個のATTiny2313で2個の7SegmentLEDを駆動できるようになるため、これにトライしてみました。
これによって、1桁¥70+αでスタティック表示ができるようになります。しかも接続線はデータ転送用の線と5VとGNDの3本のみです。
実験を行うのにも、7SegmentLEDの配線はうっとうしいので、とりあえず8桁まで可能な基板を作ってみました。
本当は、両面もしくはスルーホール基板であれば、楽なのですが、アマチュア的には作るのが大変なので、両面をイメージして、片面で作りました。両面をイメージしたというのは、表にLED、裏にマイコンを実装してパターンは片面ですが、実装は両面という擬似両面です。
(写真参照:マイコンは2個のみ実装して4桁表示の状態)
回路図は、6桁の状態で書かれています。
データを転送して数字表示が変化する様子も小さい映像ですがアップしてみました。


DSC00767.jpg  DSC00768.jpg

DSC00767.jpg

MOV00770.MPG



整理できていませんが、現時点のプログラムは下記の通りです。

[Program]

Dim Bitcnt As Byte
Dim Indata As Byte
Dim Dispflg As Bit
Dim Serdata As Byte
Dim Dispdata As Byte
Dim Dispaddress As Byte
Dim Data7seg_u As Byte
Dim Data7seg_la As Byte
Dim Data7seg_ld As Byte

Dim Timecnt As Byte
Dim Cntmode As Byte
Dim Bittimecnt As Byte
Dim Bittimecnt2 As Byte


Ddra = &B00000011
Porta = &B00000000
Ddrd = &B01111011
Portd = &B00000100
Ddrb = &B11111111
Portb = &B00000000

Wait 3
Porta = &B11111111
Portd = &B11111111
Portb = &B11111111
Wait 1



Bitcnt = 0
Indata = 0
Serdata = 0
Dispflg = 0
Cntmode = 1
Timecnt = 0

Config Timer0 = Timer , Prescale = 1
On Ovf0 Ck_cnt
Enable Timer0
Enable Interrupts




Main:



If Dispflg = 1 Then
Dispflg = 0
Dispaddress = Serdata And &B00001110
Dispdata = Serdata And &B11110000
Rotate Dispaddress , Right , 1
Rotate Dispdata , Right , 4

If Dispaddress = 2 Then
Data7seg_la = Lookup(dispdata , 7seg_la)
Data7seg_ld = Lookup(dispdata , 7seg_ld)
Porta = Data7seg_la And &B00000011
Portd = Data7seg_ld And &B11111111

End If

If Dispaddress = 3 Then
Data7seg_u = Lookup(dispdata , 7seg_u)
Portb = Data7seg_u

End If

End If

Waitms 3


Goto Main



Ck_cnt:

Gosub Ck_cnt2

Return

Ck_cnt2:

Incr Timecnt
If Timecnt > 60 Then Cntmode = 1

If Cntmode = 1 Then Gosub Mode1
If Cntmode = 2 Then Gosub Mode2
If Cntmode = 3 Then Gosub Mode3
If Cntmode = 4 Then Gosub Mode4

Return

'******************************************************************************
'* MODE2
'******************************************************************************
Mode1:

If Pind.2 = 0 Then
Timecnt = 0
Cntmode = 2
End If

Return

'******************************************************************************
'* MODE2
'******************************************************************************
Mode2:

Incr Timecnt
If Pind.2 = 1 Then
Bittimecnt2 = Timecnt - 1
Shift Timecnt , Right , 1
Bittimecnt = Timecnt
Timecnt = 0
Cntmode = 3
End If
Return

'******************************************************************************
'* MODE3
'******************************************************************************
Mode3:
Incr Timecnt

If Timecnt >= Bittimecnt Then
Indata = Pind.2

If Indata = 1 Then
Serdata = Serdata Or &B00000001
End If

If Indata = 0 Then
Serdata = Serdata And &B11111110
End If

Rotate Serdata , Right , 1
Incr Bitcnt

Timecnt = 0
Cntmode = 4
End If

Return


'******************************************************************************
'* MODE4
'******************************************************************************
Mode4:

Incr Timecnt

If Timecnt >= Bittimecnt2 Then
Indata = Pind.2
Timecnt = 0

If Indata = 1 Then
Serdata = Serdata Or &B00000001
End If

If Indata = 0 Then
Serdata = Serdata And &B11111110
End If

Rotate Serdata , Right , 1
Incr Bitcnt

If Bitcnt = 8 Then
Bitcnt = 0
Timecnt = 0
Cntmode = 0
Dispflg = 1
End If

End If

Return

'******************************************************************************

'******************************************************************************
'* 7Seg Data
'******************************************************************************

7seg_la:
Data &B11111100 , &B11111101 , &B11111111 , &B11111101 , &B11111100 , &B11111100 , &B11111100 , &B11111101 , &B11111100 , &B11111100
7seg_ld:
Data &B01001000 , &B01111001 , &B01000000 , &B01010000 , &B01110001 , &B01010010 , &B01000010 , &B01111000 , &B01000000 , &B01010000
7seg_u:
Data &B00001100 , &B11001111 , &B10011000 , &B10001010 , &B01001011 , &B00101010 , &B00101000 , &B10001111 , &B00001000 , &B00001010
この記事へのコメント
Posted by at 2007年01月21日 13:16
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/1707963

この記事へのトラックバック

基盤実装?基板実装?
Excerpt: 基盤実装と基板実装、間違えやすいですが基板実装が正しいですね。 基盤実装(基板実装)業界に大きな変化がありました。基盤実装(基板実装)で起こる問題とは?
Weblog: 基盤実装?基板実装?
Tracked: 2006-12-15 17:32