「ATtiny13を使用したプログラマブル・ディバイダ」の版間の差分
提供:泣かないでゆり子
ナビゲーションに移動検索に移動 (ページの作成:「==C言語コード== <pre> →* DeviderCounter.c * * Created: 2016/02/11 1:00:41 * Author: 市川ゆり子: /* Programmable Divider by tiny13 + DIP SW --Fuses-...」) |
(+概要 +画像3枚) |
||
| 1行目: | 1行目: | ||
| + | [[ファイル:Divider ATtiny13.JPG|サムネイル|ブレッドボードに実装して開発.左からCD4046B(VCO)、ATtiny13(本ディバイダ)、AT90S2313(未使用)、DIPスイッチ(分周比設定)、謎の7セグメント。]] | ||
| + | [[ファイル:Divider Wave.JPG|サムネイル|ディバイダの入出力波形。上から入力波形、出力波形(10μS/DIV)、その下は拡大(遅延掃引、2 | ||
| + | μS/DIV)、垂直軸感度は5V/DIV。]] | ||
| + | [[ファイル:DivideN Count.JPG|サムネイル|周波数カウンタで測った分周比。DIPスイッチを7に合わせた時のもの。1/70ピッタリ♡]] | ||
| + | |||
| + | PLL ICの4046で周波数シンセサイザを作ろうと思って、その前フリとしてATtiny13内蔵のカウンタでプログラマブル・ディバイダ(1/Nディバイダ)を作ってみた♡ DIPスイッチで分周比を設定できちゃう~♪ | ||
| + | |||
==C言語コード== | ==C言語コード== | ||
<pre> | <pre> | ||
2016年2月23日 (火) 13:06時点における版
PLL ICの4046で周波数シンセサイザを作ろうと思って、その前フリとしてATtiny13内蔵のカウンタでプログラマブル・ディバイダ(1/Nディバイダ)を作ってみた♡ DIPスイッチで分周比を設定できちゃう~♪
C言語コード
/*
* DeviderCounter.c
*
* Created: 2016/02/11 1:00:41
* Author: 市川ゆり子
*/
/*
Programmable Divider by tiny13 + DIP SW
--Fuses--
HIGH: 0xFD LOW:0x7A
SPIEN *
BODLEVEL 1V8
SUT_CKSEL INTRCOSC_9MHZ6_14CK_64MS
--PIN Connection--
1 RESET: N/C
2 PB3: DIP SW bit 4
3 PB4: DIP SW bit 2
4 GND: GND
5 OC0A: Divider signal out
6 PB1: DIP SW bit 1
7 T0: Divider signal in
8 Vcc: +5V
*/
#include <avr/io.h>
char readDIPsw();
int main(void)
{
//Peripheral initialize.
DDRB = 0b00100001; //DDRB0,5 is out. other is in.
PORTB = 0b00011010; //PORTB1,3.4 pull up.
OCR0A = (unsigned int) 0; //init Counter Compare Register
TCCR0A = (1 << COM0A0) + (1 << WGM01); //OC0A pin Toggle, CTC counter mode.
TCCR0B = (1 << CS01) + (1 << CS02); //Counter clock source T0 pin (external).
while(1)
{
OCR0A = 5 * readDIPsw(); //Read DIP SW and set it to Compare Register.
}
}
//Read DIP SW state and return it.
char readDIPsw() {
char bit0 = ~(PINB >> PINB1) & 0x01; //Read PINB1 state.
char bit1 = ~(PINB >> PINB3) & 0x01; //Read PINB3
char bit2 = ~(PINB >> PINB4) & 0x01; //Read PINB4
return (bit2 << 2) | (bit1 << 1) | bit0; //Joining bits.
}