目次
前
次
実回路
手持ちの部品を利用し、実際の回路は
次のようにしました。
インバータとして、74HC640を利用しています。
また、20MHzの水晶振動子を使っています。
ISP(Incircuit Serial Program)ができるように
6ピンのコネクタをつけてあります。
6ピンコネクタとUSBタイプのライターを接続して
ファームウエアを書込めるようにしました。
LEDとの接続は、次のファームウエアを利用して確認しました。
#include <avr/io.h>
#include <avr/iotn2313.h>
#include <avr/interrupt.h>
#define OFF 0
#define ON OFF+1
typedef unsigned char UBYTE ;
typedef unsigned short UWORD ;
typedef signed char SBYTE ;
typedef signed short SWORD ;
typedef union {
struct {
unsigned char B0:1;
unsigned char B1:1;
unsigned char B2:1;
unsigned char B3:1;
unsigned char B4:1;
unsigned char B5:1;
unsigned char B6:1;
unsigned char B7:1;
} BIT ;
unsigned char DR ;
} FLAGSP ;
volatile FLAGSP x_flags ;
#define TFLAG x_flags.BIT.B0
volatile UBYTE count ;
volatile UBYTE frq ;
#define NO 0
#define YES NO+1
#define LAST 15
#define MASKFF 0xff
#define MASK0F 0x0f
#define MASKF0 0xf0
#define MASK80 0x80
/*--------------------------------*/
/* Insert user functions protoype */
/*--------------------------------*/
void user_initialize(void);
/*------*/
/* main */
/*------*/
int main(void)
{
/* disable interrupt */
cli();
/* initialize port and variables */
user_initialize();
/* enable interrupt */
sei();
while ( ON ) {
/* timer interrupt handling */
if ( TFLAG == ON ) {
/* clear flag */
TFLAG = OFF ;
/* impress data */
PORTB = count;
/* update counter */
count++ ;
}
}
/* dummy */
return 0 ;
}
/*-----------------------*/
/* Insert user functions */
/*-----------------------*/
void user_initialize(void)
{
/* PORT B */
PORTB = MASKFF ; /* turn off all LEDs */
DDRB = MASKFF ; /* all output */
/* PORT D */
PORTD = 0x01 ; /* all clear */
DDRD = 0b11111110 ; /* oooooooi */
/* initialize flags */
x_flags.DR = 0 ;
/* initialize timer0 */
{
frq = 0 ;
/* select clock source (prescle 1/256) */
TCCR0A = (1 << WGM01) ;
TCCR0B = (1 << CS02) ;
/* clear timer/counter */
TCNT0 = 0 ;
OCR0A = 249 ;
OCR0B = 255 ;
/* Enable Compare match interruption */
TIMSK = (1 << OCIE0A) ;
}
/* others */
count = 0 ;
}
/* TIMER0 interrupt */
ISR(TIMER0_COMPA_vect)
{
/* increment */
frq++ ;
/* count up */
if ( frq == LAST ) {
/* clear flag */
frq = 0 ;
/* set flag */
TFLAG = ON ;
}
}
動作は非常に単純です。
タイマー割込みでフラグをセットし、main関数で
フラグの状態を見ます。
フラグがセットされていれば、カウンタの値をポートB
へ出力し、カウンタをインクリメントします。
実際の動作は、次の写真でみるとわかるでしょう。
ATtiny2313マイコンとBCSの接続をテストする前に
通信インタフェースを用意して、ハードウエアを
テストしました。
テストに利用したファームウエアは、以下です。
#include <avr/io.h>
#include <avr/iotn2313.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#define OFF 0
#define ON OFF+1
#define FOSC 4000000
#define BAUD 9600
#define MYUBRR (FOSC/16/BAUD)-1
typedef unsigned char UBYTE ;
typedef unsigned short UWORD ;
typedef union {
struct {
unsigned char B0:1;
unsigned char B1:1;
unsigned char B2:1;
unsigned char B3:1;
unsigned char B4:1;
unsigned char B5:1;
unsigned char B6:1;
unsigned char B7:1;
} BIT ;
unsigned char DR ;
} FLAGSP ;
volatile FLAGSP x_flags ;
volatile UBYTE cmd ;
#define UFLAG x_flags.BIT.B0
volatile UBYTE sbuf[8] ;
volatile UBYTE sindex ;
#define NO 0
#define YES NO+1
#define MASKFF 0xff
#define MASK0F 0x0f
#define MASKF0 0xf0
#define MASK80 0x80
const prog_char msg_h[] PROGMEM = "? help" ;
const prog_char msg_l[] PROGMEM = "L control light LED" ;
const prog_char msg_lh[] PROGMEM = " L1 or L0" ;
const prog_char msg_a[] PROGMEM = "A set monitor LEDs" ;
const prog_char msg_ah[] PROGMEM = " exmaple A12 Afa" ;
const prog_char msg_p[] PROGMEM = "P send pulse" ;
/*--------------------------------*/
/* Insert user functions protoype */
/*--------------------------------*/
void user_initialize(void);
UBYTE usart_get_hex(UBYTE x);
void usart_putchar(UBYTE x);
void usart_puts(UBYTE *x);
void usart_crlf(void);
void usart_help(void);
/*------*/
/* main */
/*------*/
int main(void)
{
UBYTE tmp ;
/* initialize port and variables */
user_initialize();
/* enable interrupt */
sei();
/* endless loop */
while ( ON ) {
/* command interpreter */
if ( UFLAG ) {
/* clear flag */
UFLAG = OFF ;
/* get command */
cmd = *(sbuf+0) ;
/* help */
if ( cmd == '?' ) { usart_help() ; }
/* clear */
if ( cmd == 'L' ) {
if ( *(sbuf+1) == '1' ) { PORTD |= (1 << 3) ; }
else { PORTD &= ~(1 << 3) ; }
}
/* send string to LEDs */
if ( cmd == 'A' ) {
tmp = usart_get_hex( *(sbuf+1) ) ;
tmp <<= 4 ;
tmp |= usart_get_hex( *(sbuf+2) ) ;
PORTB = tmp ;
}
/* send pulse */
if ( cmd == 'P' ) {
PORTD |= (1 << 4) ;
tmp <<= 4 ;
PORTD &= ~(1 << 4) ;
}
}
}
/* dummy */
return 0 ;
}
/*-----------------------*/
/* Insert user functions */
/*-----------------------*/
void user_initialize(void)
{
UWORD tmp ;
/* PORT B */
PORTB = 0x00 ; /* all clear */
DDRB = MASKFF ; /* all output */
/* PORT D */
PORTD = 0x00 ; /* all clear */
DDRD = 0b0011110 ; /* iiiooooi */
/* initialize flags */
x_flags.DR = 0 ;
/* initialize UART */
{
/* initialize index */
sindex = 0 ;
/* set Baud Rate Registers */
tmp = MYUBRR ;
UBRRH = (UBYTE)((tmp >> 8) & MASKFF) ;
UBRRL = (UBYTE)(tmp & MASKFF) ;
/* Enable receive interrupt , receive module and transmit module */
UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << RXCIE);
}
}
/* USART receive interrupt */
ISR(USART_RX_vect)
{
volatile UBYTE ch ;
/* get 1 charactor */
ch = UDR ;
/* store */
*(sbuf+sindex) = ch ;
/* update */
sindex++ ;
/* judge */
if ( ch == '\r' ) {
UFLAG = ON ;
sindex = 0 ;
}
}
UBYTE usart_get_hex(UBYTE x)
{
UBYTE result ;
/* default */
result = 0 ;
if ( '0' <= x && x <= '9' ) { result = x - '0' ; }
if ( 'A' <= x && x <= 'F' ) { result = x - 'A' + 10 ; };
if ( 'a' <= x && x <= 'f' ) { result = x - 'a' + 10 ; };
return result ;
}
void usart_putchar(UBYTE x)
{
while ( !(UCSRA & (1 << UDRE)) ) ;
UDR = x ;
}
void usart_puts(UBYTE *x)
{
while ( *x != '\0' ) {
usart_putchar( *x ) ;
x++ ;
}
usart_crlf();
}
void usart_crlf(void)
{
usart_putchar('\r');
usart_putchar('\n');
}
void usart_help(void)
{
char msg[20] ;
strcpy_P(msg,msg_h) ; usart_puts((UBYTE *)msg) ;
strcpy_P(msg,msg_l) ; usart_puts((UBYTE *)msg) ;
strcpy_P(msg,msg_lh) ; usart_puts((UBYTE *)msg) ;
strcpy_P(msg,msg_a) ; usart_puts((UBYTE *)msg) ;
strcpy_P(msg,msg_ah) ; usart_puts((UBYTE *)msg) ;
strcpy_P(msg,msg_p) ; usart_puts((UBYTE *)msg) ;
}
コマンドインタプリタを用意し、コマンドは
以下としました。
- ? ヘルプ
- L センサー用LEDの点灯、消灯
- A 8個のLEDをビットパタンを16進で与えて点灯
- P BCSボード上のマイコンにパルストリガーを出力
マイクロコンピュータの他に、デジタル回路を利用した
ハードウエアを設計しました。
センサーデータは10usごとに、スキャナ基板から出力されます。
8ビットのセンサー情報にまとめるため、1280usごとにセンサー
データをシフトレジスタに入れます。
センサーデータは、約11msごとに更新される仕様です。
φ1のクロックが100kHzなので、10usごとにカウンタを
インクリメントし、カウンタ出力(Q7)がL→Hになるとき
シフトレジスタにデータを記憶します。
カウンタ出力をシフトレジスタのトリガーに使います。
シフトレジスタの内容は、SHのL→Hトリガーで4ビット
レジスタx2に転送します。利用している74HC175には
反転出力があるので、LED点灯ドライバに使います。
目次
前
次