2014年5月24日土曜日

7.195MHz AM TRX

既に公開済みの7.195MHz AM受信部、送信部、Front-end filterをまとめたTRXである。固定周波数のため、ボリューム、Filter on/offスイッチしか無く、シンプル。Front-end filterは、挿入損失が5dB~6dB有るため、損失を補う目的でプリアンプ(MAR6)を追加。MAR6は、約20dBのゲインがあり、ゲイン過多となっている。10dBのアンプにすべきである。 
ケースは、ジャンクを加工して再利用したが、タカチ YM-180相当。 
回路図である。送信部、受信部、フィルター部をまとめて書き直した。   

2014年5月11日日曜日

7MHz front-end X'tal filter

7.2MHz水晶発振子を使ったフロントエンドX'talフィルタである。このフィルタは、JA9CDE栃谷OMがシュミレーションし、設計したものである。中心周波数 7.195MHzでAM運用に特化しており、近傍のノイズに有効である。FRMSを見ながらインダクタを調整し、63.5uHで中心周波数7.195MHzに合わせる事が出来た。主要部品は、aitendoからIFTコア(4個100円)と水晶発振子7.2MHz(10本100円)を入手した。全パーツで数百円である。

 
FRMSの測定結果である。
 中心周波数 7.195MHz
 帯域 7.2kHZ 
















                      
回路図である。
可変インダクタ63.5uHと無差別に選んだ7.2MHz水晶発振子で2台作り、問題なく特性が得られた。
LA1600 3pin水晶発振方式の回路と組合せ試験を行った。その結果、フロントエンド フィルタが有効に動作している様だが、親機のフィルタが甘い(帯域15kHZ)ため、効果があるものの、十分とまでの結果には至らなかった。
親機フィルタを6kHz帯域にすべきであろう。






 

基板寸法 24x72  

2014年5月2日金曜日

7.195MHz AM Transmitter

7.195MHz AM送信機である。回路は、一部定数が異なるものの、RNRさんと同じ。変調部は、CB機ジャンクからIC、コンデンサ、ヒートシンク、変調トランスを流用した。この為、送信部のみ基板設計した。キャリア出力は、使用部品を考慮し、4Wに調整(QRP機)した。 
ユニバーサルボードで組んだ変調基板である。変調トランスの詳細不明であった為、実測すると8Ω:16Ωであった。5Wクラスのトランスを入手する場合の参考になれば幸いだ。  
2段のLPFである。2次高調波(14MHz)があまい。   
RNRさんの改造している部分を含めたシュミレーション結果だ。ただ、コイルと並列のコンデンサは、120pFがベターであろ。(採用した定数)  
VXOコイルは、固定インダクターを意識し68uHに調整して動作確認済だが、60uH位がベター。出力調整用抵抗150Ωは、0Ω(ジャンパ接続時) RF Out 5Wとなった。QRP機を目指すのであれば、部品の個体差を考慮し、3W~4W位に調整するのが良いと思う。  
基板寸法 49x72            

2014年4月7日月曜日

LA1600 7.195MHz AM Receiver

3月公開のLA1600 3pin水晶発振方式を応用したAM受信機で、RF(2SK241)+LA1600回路構成である。HC-49(HC-18uと同形)と22uを組み合わせて、7.65MHzの水晶を誤差裕度内で発振(7.65058MHz)させる事が出来た。
2m位の室内ビニール線アンテナで受信確認できた。15kHZ帯域フィルターを使ったが、AMに適した帯域の物を使うべきであろう。 
回路図である。LA1600 3pin水晶発振実験と何ら変わる事はないが、インダクターを10uから22uに変更した位である。AM 1波専用なので、水晶発振周波数が、フィルター中心周波数誤差裕度内であれば、何ら問題ない。  
基板サイズ 47x66。Download siteにpcbeファイルとBMPファイルをuploadしてあるので、必要であれば使ってください。   

2014年3月18日火曜日

LA1600 3pin X'tal OSC

LA1600の内部がブラックボックスの為か、web検索しても3pinで水晶を発振した事例がヒットしなかった。そこで、3Pinを使って水晶が発振するか実験を行った。左図は、LA1600のブロック図で規格表からの抜粋である。この図から3pinのLC回路を水晶発振子に置き換えれば水晶が発振するのでは?と考えた。 
実験を行った回路である。インダクターは、初回の試験で10uHでHC-49S/10.24MHzが見事発振した。その後、1uH~100uHまで換えたが、10.24MHzの水晶発振子を使う場合、10uHがベターであった。ただ、固定インダクターを使った場合の話である。







発振周波数
 10MHz(9.99MHz)~12MHz(12.8MHz)まで手持ちの水晶発振子で発振が確認できた。ダブルスーパーの局発(LO 10.245MHz)として使えるか確認をした。
 1.X'tal周波数補正なし
  サンプル1 個体静電容量 5.5pF、HC-18U 10.24MHz、発振周波数 10.24513MHz  OK
  サンプル2 個体静電容量 2.8pF、HC-49S 10.24MHz、発振周波数 10.24172MHz 
 2.X'talに5pFパラ
  サンプル1 発振周波数 10.24172MHz
  サンプル2 発振周波数 10.23964MHz
 3.X'talに3pFパラ
  サンプル1 発振周波数 10.24301MHz
  サンプル2 発振周波数 10.24040MHz(HC-49S/10.245MHzであれば、OK?)

実験結果
 固定インダクタ10uHは、10MHz台の発振子と組み合わせる場合、12uH~15uH位に最適値(発振周波数が高いので)と思われる。ただ、小型化を目指すのであれば、固定インダクタ10uHでも悪くはない。(2kHz~5kHZ高く発振するが)27Hz台のオーバートンも発振したが、随分高い周波数であったが、トリマーの挿入、可変インダクタなどで希望する周波数に調整可能と思う。今回の方法で多くの回路が、水晶発振可能と思われる。追試をされたら、公開下さい。



2014年2月28日金曜日

Arduino AD9850 DDS VFO

Arduino UNO R3によるAD9850 DDS VFOである。Arduinoにトライした理由は、BASCOM AVR FREE版で限界を感じ、細かな部分を割愛していた為である。Arduinoは、BASCOMを単純に移植しても、十分なメモリーがある。
公開中のAD9850 DDS VFO Version1.1b相当の機能を盛り込んだプログラムとした。変更点は、ロータリーエンコーダを割り込み処理にした事と、SPLIT機能の周波数制限を行った位である。プログラムは単純なコード変換の為、冗長かも知れない。
UNO R3が、中華サイトで1200円位で買えるので、遊ぶのも面白い。
Arduinoには、閉じた独自の文化が有るようで、参考になれば幸いだ。   
基本的にBASCOM版と同じだが、パターン引き回し都合で、I/O割り付けを替えている。エンコーダは、割り込み処理のため他のI/O割り付けできない。
     










 

基板サイズ 54 x69。
無論、基板はスタッカブルである。












Program

割り込み処理を行っており、ライブラリーが必要。ライブラリーは、プログラムのヘッダーに書いてあるURLから
ダウンロードし、Arduino IDEのスケッチタブのライブラリ使用で設定する。

//////////////////////////////////////////////////////////////////////
//  AD9850 DDS VFO Premixed type program ver.1.0
//
//    Copyright(C)2014.JA2GQP.All rights reserved.
//
//      7.000MHz to 7.200MHz Limitted.
//      (Target frequency = IF frquency + frequency)
//                                                  2014/2/28
//                                                  JA2GQP
//--------------------------------------------------------------------
//  Function
//    1.Upper Heterodyne(Target Frequency = IF Frequency + Frequency)
//    2.RIT Operation(-50kHZ to 50kHZ)
//    3.STEP(100k,10k,1k,100,10)
//    4.Memory Operation is Push RIT
//      (Frequency and Step)
//    5.Protection Operation At The Time Of Transmission
//    6.Channel Memory.Main Channel(Ch0) + 3 Channel(Ch1,Ch2,Ch3)
//    7.Split Operation(7.00MHz to 7.20MHz Limited!)
//--------------------------------------------------------------------
//  Library
//  http://www.buxtronix.net/2011/10/rotary-encoders-done-properly.html
//
//--------------------------------------------------------------------
//  Bug Fix
//    2016/7/10 Fixed erroneous display.(Fnc_Step_Disp)
//////////////////////////////////////////////////////////////////////

#include <LiquidCrystal.h>
#include <rotary.h>
#include <EEPROM.h>

//----------  LCD Pin Assign  ------------------

LiquidCrystal lcd(13, 12, 11, 10, 9, 8);   // RS,R/W,DB4,DB5,DB6,DB7

//----------  Define Constant Value   ----------
                                               
const byte  ENC_A = 2;                     // Encorder A
const byte  ENC_B = 3;                     // Encoeder B
const byte  SW_STEP = 4;                   // STEP Sw
const byte  SW_RIT = 5;                    // RIT Sw
const byte  SW_SPLIT = 6;                  // SPLIT Sw
const byte  SW_TX = 7;                     // TX Sw
const byte  W_CLK = 14;                    // DIO14(A0)
const byte  FQ_UD = 15;                    // DIO15(A1)
const byte  DATA = 16;                     // DIO16(A2)
const byte  SW_CH1 = 17;                   // DIO17(A3)
const byte  SW_CH2 = 18;                   // DIO18(A4)
const byte  SW_CH3 = 19;                   // DIO18(A5)

const long  IF_FRQ = 9996500L;             // IF Frequency
const long  LW_FRQ = 7000000L;             // Lower Limit
const long  HI_FRQ = 7200000L;             // Upper Limit
const long  DEF_FRQ = 7050000L;            // Init Frequency
const long  DEF_STP = 1000L;               // Init STEP
const long  LW_RIT = -50000L;              // RIT Lower Limit
const long  HI_RIT = 50000L;               // RIT Upper Limit
const long  LW_VFO = IF_FRQ + LW_FRQ;      // Vfo Lower Limit
const long  HI_VFO = IF_FRQ + HI_FRQ;      // Vfo Upper Limit
const long  DEF_VFO = IF_FRQ + DEF_FRQ;    // Vfo Default Frequency

const unsigned long  DDS_CLK = 125000000L; // AD9850 Clock
const unsigned long  TWO_E32 = 4294967295L;// 2^32
const byte  DDS_CMD = B00000000;           // AD9850 Command

//----------  EEPROM Memory Address   ----------

const byte  Frq_Eep0 = 0x00;               // Frequency Ch0
const byte  Frq_Eep1 = 0x04;               //           Ch1                                              
const byte  Frq_Eep2 = 0x08;               //           Ch2
const byte  Frq_Eep3 = 0x0c;               //           Ch3

const byte  Stp_Eep0 = 0x10;               // STEP Ch0
const byte  Stp_Eep1 = 0x14;               //      Ch1                                              
const byte  Stp_Eep2 = 0x18;               //      Ch2
const byte  Stp_Eep3 = 0x1c;               //      Ch3

//----------  Encorder Pin Assign(INT)  --------

Rotary r = Rotary(ENC_A,ENC_B);            // 2 = ENC_A,3 = ENC_B

//----------  Memory Assign  -------------------

long Vfo_Dat = 0;                         // VFO Data
long Dds_Dat = 0;                         // DDS Data
long Rit_Dat = 0;                         // RIT Data
long Rit_Datb = 0;                        // RIT Data Old
long Enc_Stp = 0;                         // STEP
long Lng_Wk1 = 0;                         // Long Work1
long Lng_Wk2 = 0;                         // Long Work2

char *Lcd_Dat = "           ";            // Lcd Display Buffer

byte Byt_Chn = 0;                         // Channel SW
byte Byt_Chnb = 0;                        // Channel SW Old
byte Flg_Rit = 0;                         // RIT Flag
byte Flg_Ritb = 0;                        // RIT Flag Old
byte Flg_Tx = 0;                          // TX Flag
byte Flg_Spl = 0;                         // SPLIT Flag

//----------  Initialization  Program  ---------------

void setup(){
  pinMode(SW_STEP,INPUT_PULLUP);
  pinMode(SW_RIT,INPUT_PULLUP);
  pinMode(SW_SPLIT,INPUT_PULLUP);
  pinMode(SW_TX,INPUT_PULLUP);
  pinMode(SW_CH1,INPUT_PULLUP);
  pinMode(SW_CH2,INPUT_PULLUP);
  pinMode(SW_CH3,INPUT_PULLUP);

  lcd.begin(16, 2);                        // LCD 16*2

  PCICR |= (1 << PCIE2);
  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
  sei();                                    // INT Enable

  pinMode(FQ_UD,OUTPUT);
  pinMode(W_CLK,OUTPUT);
  pinMode(DATA,OUTPUT);

  Flg_Tx = 0;
  Flg_Rit = 0;
  Flg_Spl = 0;
 
  lcd.clear();
  Fnc_Chsw();                                // Channel Sw Read
  Byt_Chnb = Byt_Chn;
  Fnc_Eep_Rd();                              // EEPROM Read
}

//----------  Main program  ---------------

void loop() {
  if(Flg_Tx == 0){                          // Tx off?
    if(digitalRead(SW_STEP) == LOW){        // STEP Sw On?
      Fnc_Stp();                            //     Yes,STEP proc.
    }
    if(digitalRead(SW_RIT) == LOW){         // RIT Sw On?
      Fnc_Rit();                            //     Yes,RIT proc.
    }
    if(digitalRead(SW_SPLIT) == LOW){       // SPLIT Sw On?
      Fnc_Spl();                            //     Yes,SPLIT proc.
    }
    Fnc_Chsw();                             // Channel Sw read
   
    if(Byt_Chnb != Byt_Chn){                // Channnel SW Chenge?
      if(Byt_Chnb == 0){                    // Channnel 0?    
        Fnc_Eep_Sav4(Vfo_Dat,Frq_Eep0);     //   Yes,Vfo_Dat Save
        Fnc_Eep_Sav4(Enc_Stp,Stp_Eep0);     //       Enc_Step Save
        Flg_Ritb = Flg_Rit;
        Rit_Datb = Rit_Dat;
        Flg_Rit = 0;
        Flg_Spl = 0;
        Rit_Dat = 0;
      }
     
      if(Byt_Chnb != 0){                    // Other(Ch1-Ch3) Channnel?
        Flg_Rit = 0;
        Flg_Spl = 0;
        if((Byt_Chn == 0) && (Flg_Ritb == 1)){
          Flg_Rit = 1;
          Rit_Dat = Rit_Datb;
        }
      }
       
      Byt_Chnb = Byt_Chn;
      Fnc_Eep_Rd();
    }
  }
  if(digitalRead(SW_TX) == LOW){            // Tx On?
    Flg_Tx = 1;                             //    Yes,Flg_Tx Set
  }
  else{                                    
    Flg_Tx = 0;                            //     No,Flg_Tx Reset              
  }

  if(Flg_Rit == 1){                        // RIT?
    Dds_Dat = Vfo_Dat + Rit_Dat;           //    Yes,Dds_Dat Set
  }
  else{
    Dds_Dat = Vfo_Dat;                     //    No,Dds_Dat Set
  }

  if(Flg_Tx == 1){                         // Tx?
    if(Flg_Spl == 1){                      // SPLIT?
      Dds_Dat = Vfo_Dat + Rit_Dat;         //    Yes,Dds_Dat Set
    }
      else{
        Dds_Dat = Vfo_Dat;                 //    No,Dds_Dat Set
      }
  }
  Fnc_Dds(Dds_Dat);                        // AD9850 DDS Out
  Fnc_Lcd();                               // LCD Display
  delay(100);
}

//----------  Encorder procedure(INT)  ---------------

ISR(PCINT2_vect) {
  unsigned char result = r.process();

  if(Flg_Tx == 0){
    if(result) {  
      if(result == DIR_CW){
        Lng_Wk1 = Vfo_Dat + Enc_Stp;
        Lng_Wk2 = Rit_Dat + Enc_Stp;
      }
      else{
          Lng_Wk1 = Vfo_Dat - Enc_Stp;
          Lng_Wk2 = Rit_Dat - Enc_Stp;
      }      
      if((Flg_Rit == 1) || (Flg_Spl == 1)){
        Rit_Dat = Lng_Wk2;
      }
      else{
        Vfo_Dat = Lng_Wk1;
        Rit_Dat = 0;
      }
      Vfo_Dat = constrain(Vfo_Dat,LW_VFO,HI_VFO);

      if(Flg_Spl == 1){
        Rit_Dat = constrain(Rit_Dat,(LW_VFO - Vfo_Dat),(HI_VFO - Vfo_Dat));
      }
      else{
        Rit_Dat = constrain(Rit_Dat,LW_RIT,HI_RIT);
      }
    }
  }
}

//----------  Function DDS set  ---------------

void Fnc_Dds(double frquency){
  unsigned long wrk = frquency * TWO_E32 / DDS_CLK;
 
  digitalWrite(FQ_UD,LOW);

  shiftOut(DATA,W_CLK,LSBFIRST,wrk);
  shiftOut(DATA,W_CLK,LSBFIRST,(wrk >> 8));
  shiftOut(DATA,W_CLK,LSBFIRST,(wrk >> 16));
  shiftOut(DATA,W_CLK,LSBFIRST,(wrk >> 24));
  shiftOut(DATA,W_CLK,LSBFIRST,DDS_CMD);   // AD9850 command

  digitalWrite(FQ_UD,HIGH);
}

//----------  Function Encorder STEP  ---------

void Fnc_Stp(){
  if(Enc_Stp == 10){                      // Step = 10Hz ?
    Enc_Stp = 100000;                     //   Yes,100khz set
    }
    else{
      Enc_Stp = Enc_Stp / 10;             // Step down 1 digit
      }
//  delay(250);
  Fnc_Step_Disp();
//  Fnc_Lcd();
  while(digitalRead(SW_STEP) == LOW)
    ;
  delay(250);
}

//----------  Function STEP Display  ----------

void Fnc_Step_Disp(){
  lcd.setCursor(0,1);
  switch(Enc_Stp){
    case 10:
      lcd.print("10  ");
      break;
    case 100:
      lcd.print("100 ");
      break;
    case 1000:
      lcd.print("1k  ");
      break;
    case 10000:
      lcd.print("10k ");
      break;
    case 100000:
      lcd.print("100k");
      break;
    default:
      lcd.print("1k  ");
      Enc_Stp = 1000;
      break;
  }
}

//----------  Function String Dot Edit  --------
   
char *Fnc_Dot_Edit(char *str,long n){
  int  i = 0;                           // Write the number
  char *p = str;
  unsigned long  u = abs(n);

  do{
    *p++ = "0123456789"[u % 10];
    u = u / 10;
    i++;
    if((0 != u) && (0 == (i % 3)))
      *p++ = '.';
    }
  while( 0 != u );

  if ( n < 0 )
     *p++ = '-';
   *p = '\0';
   Fnc_Revr( str );
   return str;
}

//----------  Function String Reverse  ---------

void Fnc_Revr(char *str){
  int i,n;
  char c;

  n=strlen(str);
  for(i = 0;i < n / 2;i++){
    c=str[i];
    str[i]=str[n - i - 1];
    str[n - i - 1]=c;
  }
}

//----------  Function Save EEPROM 2byte  ---------

void Fnc_Eep_Sav2(unsigned int value,int address){
  address += 1;
  for(int i = 0;i < 2;i++){
    byte toSave = value & 0xFF;
    if(EEPROM.read(address) != toSave){
      EEPROM.write(address,toSave);
      }
    value = value >> 8;
    address--;
  }
}

//----------  Function Save EEPROM 4byte  ---------

void Fnc_Eep_Sav4(long value,int address){
  address += 3;
  for(int i = 0;i < 4;i++){
    byte toSave = value & 0xFF;
    if(EEPROM.read(address) != toSave){
      EEPROM.write(address,toSave);
      }
    value = value >> 8;
    address--;
  }
}

//----------  Function Load EEPROM 2byte  ---------

unsigned int  Fnc_Eep_Lod2(int address){
  unsigned int value = EEPROM.read(address);
  value = value << 8;
  return value | EEPROM.read(address + 1);
}

//----------  Function Load EEPROM 4byte  ---------

long Fnc_Eep_Lod4(int address){
  long value = 0;
  for(int i = 0;i < 4;i++){
    value = value | EEPROM.read(address);
    if( i < 3){
      value = value << 8;
      address++;
      }
  }
  return value;
}

//----------  Function LCD Display  ---------

void Fnc_Lcd(){
  if(Flg_Tx == 1){
    lcd.setCursor(0,0);
    lcd.print("T");
  }
  else{
    lcd.setCursor(0,0);
    lcd.print(Byt_Chn);
  }
 
  Fnc_Step_Disp();

  if(Flg_Rit == 1){
    lcd.setCursor(5,1);
    lcd.print("R:          ");
    Fnc_Dot_Edit(Lcd_Dat,Rit_Dat);
    lcd.setCursor(7,1);
    lcd.print(Lcd_Dat);
    if((Rit_Dat >= 1000) || (Rit_Dat <= -1000)){
      lcd.print("k");
    }
  }

  if(Flg_Spl == 1){
    lcd.setCursor(5,1);
    lcd.print("X:          ");
    Fnc_Dot_Edit(Lcd_Dat,Rit_Dat);
    lcd.setCursor(7,1);
    lcd.print(Lcd_Dat);
    if((Rit_Dat >= 1000) || (Rit_Dat <= -1000)){
      lcd.print("k");
    }
  }

  if((Flg_Rit == 0) && (Flg_Spl == 0)){
    Fnc_Dot_Edit(Lcd_Dat,Vfo_Dat - IF_FRQ);
    lcd.setCursor(1,0);
    lcd.print(":              ");
    lcd.setCursor(3,0);
    lcd.print(Lcd_Dat);
    lcd.print("MHz");

    lcd.setCursor(5,1);
    lcd.print("     JA2GQP");
  }
}
 

//----------  Function Rit  ---------

void Fnc_Rit(){
  if(Flg_Rit == 0){
    Rit_Dat = 0;
    Flg_Rit = 1;
    Flg_Spl = 0;
    switch(Byt_Chn){
      case 1:
        Fnc_Eep_Sav4(Vfo_Dat,Frq_Eep1);
        Fnc_Eep_Sav4(Enc_Stp,Stp_Eep1);
        break;
      case 2:
        Fnc_Eep_Sav4(Vfo_Dat,Frq_Eep2);
        Fnc_Eep_Sav4(Enc_Stp,Stp_Eep2);
        break;
      case 3:
        Fnc_Eep_Sav4(Vfo_Dat,Frq_Eep3);
        Fnc_Eep_Sav4(Enc_Stp,Stp_Eep3);
        break;
      default:
        Fnc_Eep_Sav4(Vfo_Dat,Frq_Eep0);
        Fnc_Eep_Sav4(Enc_Stp,Stp_Eep0);
        break;
    }
  }
  else{
    Flg_Rit = 0;
  }
  while(digitalRead(SW_RIT) == LOW)
    ;
  delay(250);
}
 
//----------  Function Channel SW Check  ---------

void Fnc_Chsw(){
  if(digitalRead(SW_CH1) == LOW){
    Byt_Chn = 1;
  }
  else if(digitalRead(SW_CH2) == LOW){
    Byt_Chn = 2;
  }
  else if(digitalRead(SW_CH3) == LOW){
    Byt_Chn = 3;
  }
  else{
    Byt_Chn = 0;
  }
}

//----------  Function EEPROM Read  ---------

void Fnc_Eep_Rd(){
  if(Fnc_Eep_Lod4(Frq_Eep0) <= LW_VFO){
    Vfo_Dat = DEF_VFO;
    Fnc_Eep_Sav4(Vfo_Dat,Frq_Eep0);
    Fnc_Eep_Sav4(Vfo_Dat,Frq_Eep1);
    Fnc_Eep_Sav4(Vfo_Dat,Frq_Eep2);
    Fnc_Eep_Sav4(Vfo_Dat,Frq_Eep3);
  }
  else{
    switch(Byt_Chn){
      case 1:
        Vfo_Dat = Fnc_Eep_Lod4(Frq_Eep1);
        break;
      case 2:
        Vfo_Dat = Fnc_Eep_Lod4(Frq_Eep2);
        break;
      case 3:
        Vfo_Dat = Fnc_Eep_Lod4(Frq_Eep3);
        break;
      default:
        Vfo_Dat = Fnc_Eep_Lod4(Frq_Eep0);
        break;
    }
  }
  if(Vfo_Dat <= 0){
    Vfo_Dat = DEF_VFO;
  }
  if(Fnc_Eep_Lod4(Stp_Eep0) <= 0){
    Enc_Stp = DEF_STP;
    Fnc_Eep_Sav4(Enc_Stp,Stp_Eep0);
    Fnc_Eep_Sav4(Enc_Stp,Stp_Eep1);
    Fnc_Eep_Sav4(Enc_Stp,Stp_Eep2);
    Fnc_Eep_Sav4(Enc_Stp,Stp_Eep3);
  }
  else{
    switch(Byt_Chn){
      case 1:
        Enc_Stp = Fnc_Eep_Lod4(Stp_Eep1);
        break;
      case 2:
        Enc_Stp = Fnc_Eep_Lod4(Stp_Eep2);
        break;
      case 3:
        Enc_Stp = Fnc_Eep_Lod4(Stp_Eep3);
        break;
      default:
        Enc_Stp = Fnc_Eep_Lod4(Stp_Eep0);
        break;
    }
  }
  if(Enc_Stp <= 0){
    Enc_Stp = DEF_STP;
  }
}

//----------  Function Split  ---------

void Fnc_Spl(){
  if(Flg_Spl == 0){
    Flg_Spl = 1;
    Flg_Rit = 0;
    Rit_Dat = 0;
  }
  else{
    Flg_Spl = 0;
  }
  while(digitalRead(SW_SPLIT) == LOW)
    ;
  delay(250);
}

2014年1月25日土曜日

Windows8.1 USB

今まで使っていたWindows Vistaが故障した為、Windows8.1を入手した。Atmelのプログラム開発に支障が無い様、Windows8.1の環境整備を行った。


Windows8.1

Microsoft User登録を行う為、ユーザ名を漢字入力すると、Userホルダーが漢字名となり、特に海外S/Wが上手く動かない事がある。この為、半角英語の登録名にする必要がある。
新規にユーザー登録するのであれば何ら問題ないが、登録済みの場合、ユーザ名変更または、他の解決を行えば良い。(内容が理解できないのであれば、再インストールが無難。)



Atmel Studio6.1


AVRISP MKⅡを使う事を前提とした。
Atmel Studio6.1 Update 2.0(build 2730)インストール後、AtmelUSBドライバーWindows8.1対応版をインストールで動作する。
Userホルダーに漢字(2Byte code)が使われている時、AVR書込みを行ったが、途中で止まった。HEXファイルをC:\に置いたら正常書込みが出来た。(Userに漢字を使うべきでない理由だ。)












Arduino IDE

AVRISP MKⅡを使う事を前提とした。
Arduino IDE1.0.5インストールのみで、問題なく動作(LED Blinkテスト)した。
更にArudino Ide for Atmel Studio 6.1をインストールし、Atmel Studio 6.1の統合環境でArudino開発可能となった。
















BASCOM AVR

AVRISP MKⅡを使う事を前提としたが、USBドライバAtmelUSBが上手く動作しない様だ。
他のドライバーを使えば、AVRISP MKⅡも正常に動作する事を確認出来たが、USBaspを使う事にした。
BASCOM AVR DEMO版をインストール。
USBaspをパソコンのUSBに付け、Zadigを実行し、libusb-win32タイプのドライバーをインストールする。AVRISP MKⅡでも、このドライバーで動作する。Atmel Studio6.1では、Zadigのlibusb-win32ドライバーでは動かなかったので、BASCOM AVRのみ、USBaspとした。