目次

実回路

 手持ちの部品を利用し、実際の回路は
 次のようにしました。



 インバータとして、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) ;
}

 コマンドインタプリタを用意し、コマンドは
 以下としました。

 マイクロコンピュータの他に、デジタル回路を利用した
 ハードウエアを設計しました。



 センサーデータは10usごとに、スキャナ基板から出力されます。
 8ビットのセンサー情報にまとめるため、1280usごとにセンサー
 データをシフトレジスタに入れます。

 センサーデータは、約11msごとに更新される仕様です。

 φ1のクロックが100kHzなので、10usごとにカウンタを
 インクリメントし、カウンタ出力(Q7)がL→Hになるとき
 シフトレジスタにデータを記憶します。
 カウンタ出力をシフトレジスタのトリガーに使います。

 シフトレジスタの内容は、SHのL→Hトリガーで4ビット
 レジスタx2に転送します。利用している74HC175には
 反転出力があるので、LED点灯ドライバに使います。


目次

inserted by FC2 system