ラベル PICkit2 の投稿を表示しています。 すべての投稿を表示
ラベル PICkit2 の投稿を表示しています。 すべての投稿を表示

2015-03-27

EEPROM 24FC256にpickit2で書き込み


もっとリアルな電子オルゴールを作りたいと思い外部のメモリからデータを読み取りPWMでWAVデータを再生する。
してみたい、という安易な希望から始めました。
なかなか簡単には行かなかった。

まず、EEPROMにデータを書き込まないと始まらないのですが苦労しました。
I2Cでpickit2から24FC256にデータを送って書き込むようなのですが、I2Cのエラーになって読み書きできません。
原因は単純で配線が長すぎたようです。
ブレッドボードを使って環境が良くないのに配線が10cm以上有った。
写真のように出来るだけ配線が短くなるようにやり直しをしてやっと書き込めました。

2015-03-22

PICで電子オルゴール No2

前回の続きで基板を見直しをしました。
部品の選定をしてレイアウトを整理しました。


基板の配線は以下の通り。
上から(部品側から)みた図になっています。

回路図は次の通りです。



2015-03-18

PICで電子オルゴール

久々に電子工作をしました。
母校の小学校がとうとう閉校になるので、何か記念になるものを残しておこうと思い校歌を電子オルゴールにしてみました。
PICマイコン12F629と圧電スピーカ、電池といった簡単な構成でできます。
写真にあるものは、CDSをつけて明るくなると鳴り出すように作ったので部品がCDSと抵抗2本が増えています。


開発はmikroBASICを使いました。
ライターはPICKit2。

MikroBasicのライブラリーにSOUNDがあり、音程と長さを指定して音を鳴らすことができます。
PIC12F629にはEEPROMがあります。このEEPROMに音程長さを記憶させておき順に読み込み音楽を演奏させています。
そのままでは音程と長さで4バイト必要になりますが、プログラム内部でドレミと音符の長さのテーブルを持ち、EEPROMにはその番号のみで上位4ビットで長さ、下位4ビットで音程の番号を表現させました。

EEPROMの内容は校歌なので載せてもと思い、ソースのみを公開します。
休符の扱いがわからずDelayで表現しています。
Delayはライブラリーで実装されておらず、パラメータに変数が使えないので4分休符のみのコーディングです。
調子に乗ってコーディングしていたら、プログラムエリアが足りなくなりました。
SOUNDとEEPROMのライブラリーで結構メモリーを食ってしまっているようです。



program MUSIC
'                             0   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15
'                             R   C   C#  D   D#  E   F   F#  G   G#  A   A#  B   C   C#  D
  const doremi as word[16]= (  0,262,277,294,311,330,349,370,392,415,440,466,494,523,554,587)
'                 tempo=120
'                              0    1    2    3    4    5    6    7    8  9
'                              1    2.   2    4.   4    8.   8   16.   16
  const onpu   as word[9]= (2000,1500,1000,0750,0500,0375,0250,0188,0125)

' Declarations section
sub procedure init_rtn
  GPIO = 0
  CMCON = 000111
  TRISIO = 000000
  'ANSEL = 000000

  Sound_Init(GPIO, 2)

end sub

main:

  dim eromdt as byte
  dim takapt as byte
  dim nagapt as byte
  dim takasa as word
  dim nagasa as word
  dim yasumi as word
  dim i as byte

  init_rtn

  while true
    i=0                         'EPROM READ POINTER
    while < 127                 'EPROM MAC ADDRESS 128
      eromdt = EEPROM_Read(i)   'DATA READ FROM EPROM
      if eromdt = $FF then      'DATA VALUE FF is END of DATA
        i =128                  'Exit Loop When set 128
      else
        takapt = eromdt and $0f 'DATA low4bit is SOUND Pitch
        nagapt = eromdt >> 4    'DATA High4bit is SOUND Length
        if takapt = 0 then
          'select case nagapt
          '  case 4
              Delay_ms(500)
          '  case 2
          '    delay_ms(1000)
          '  case 0
          '    delay_ms(2000)
          'end select
        else
          takasa = doremi[takapt]'Pitch Table
          nagasa = onpu[nagapt]
          Sound_Play(takasa,nagasa)
          Delay_ms(16)
        end if
      end if
      i=i+1
    wend
    
    'ENTRY SLEEP '
     GPIO =0
     OPTION_REG = 000000
     INTCON = %10001000'
     NOP
     NOP
     asm
       sleep
     end asm
     NOP
     NOP
    'RESUME SLEEP
     INTCON = 000000

  wend

end.



2012-10-07

メモリー制限のないHI-TECH C で12F629を使う

いままでPICはmikroBASICを使っていましたが、ちょっと凝ったプログラムを組むと2kの壁にぶつかり思うようにできていませんでした。
そこで、無償のMAPLABで使える無償でメモリー制限の無いHI-TECH C とC18を使ってみるもとにしました。

CONFIGとか初期設定がPIC毎に重要になってくるので、覚書としてブログに投稿しています。

まずは手持ちのPICを 12F629を試してみることにしました。
Googleで検索して調べながらしましたが、どうもHI-TECH CのバージョンによりCONFIGビットの書き方が違うようでかなり悩みました。検索すると古いバージョンのサンプルが多いようです。

__CONFIG(UNPROTECT & MCLRDIS & BORDIS & PWRTEN & WDTDIS & INTIO) ;
このパターンは古いバージョンとなり、ソースの先頭に
#define _LEGACY_HEADERS
が必要になります、このおまじないをつければ、古いバージョンのソースが使えます。

ここでつかったサンプルソースは新しいバージョンのCONFIGです。
#define _LEGACY_HEADERSは必要ないのでコメントにしています。

ソースは以下の通りです。

 
// test001.c
//#define _LEGACY_HEADERS
 
#include "pic.h"
#include  // Required to interface with delay routines
 
#ifndef _XTAL_FREQ  
// Unless already defined assume 4MHz system frequency  
// This definition is required to calibrate __delay_us() and __delay_ms()  
#define _XTAL_FREQ 4000000
#endif


 
__CONFIG(CP_OFF & BOREN_OFF & MCLRE_OFF & PWRTE_OFF & WDTE_OFF & FOSC_INTRCIO); //Idoling current 0.06uA
 
void main(void){
  int i;
 
  GPIO=0;
  CMCON = 0b00000111;
  TRISIO = 0b00000000;
  //ANSEL = 0x00;  

  while(1){
    for (i=0;i<5 p="p">      GPIO=0b00111111;
      __delay_ms(30);
      GPIO=0b00000000;
      __delay_ms(70);
    }
     __delay_ms(50);
 
    for (i=0;i<2 nbsp="nbsp" p="p">      GPIO=0b00111111;
      __delay_ms(30);
      GPIO=0b00000000;
      __delay_ms(170);
    }
  __delay_ms(500);
 }

}


2010-10-30

PICkit2購入


前から欲しいと思っていたのですが秋月で部品を購入するときに衝動買いをしてしまいました。
これにピン配列変換ケーブル、ICテストクリップ、ブレッドボードを追加購入して使っています。


PICkit2はICSP方式なので書き込みアダプターを自作するなどして皆さんは使われているようですね。

自分の場合はPICに合わせてPICkit2とICテストクリップをつなげてPICをそのクリップで挟んで書き込みをしています。
ブレッドボードテスト回路を組んでPICをブレッドボードにつけたままできるようになり便利に使っています。

もちろん、PICkit2とブレッドボードを直接つなげてもできるのですが、つけたり外したりが楽なのでクリップを使っています。
また実装した後でもICSP用のピンを用意しなくても挟むだけで書き換えができます。

回路設計は面倒になりますが、実装した後でも書き換えができるのは便利ですね。