上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--.--.-- -- l スポンサー広告 l top

やっぱり年越しそばまで特にすることもないので、ソフトをタイマー割り込み方に変えました。



ちょっと見てたら簡単に変えられそうだったし。









下が今なおしたソフトです。タイマー1割り込みで、lcdstateの状態でセグメントと位相を判断してLCD制御を行います。



メインからはSet_Num()で表示周波数を、Set_Band()でバンドを設定すれば後は勝手に表示します。



やっつけっぽいコードですが、スピードがいるわけでもないのでこのまま使おうかと思います。



#include "P24FJ64GA004.h"



//config
_CONFIG2(0xF9FC);
_CONFIG1(0x3F7F);



unsigned int coldata[3];
unsigned int lcdstate;



//main loop
int main(void)
{



   unsigned int i,j;



   lcdstate =0;



   //Setup clock
   OSCCON = 0x11C0;  // FRCPLL
   CLKDIV =  0x0030;  // 1MIPS SETTING



   //IO PORT SETTING
AD1PCFG = 0xffff; // Analog input disable
TRISA = 0x000f; // All output (Will be changed)
TRISB = 0x0000; // All output
TRISC = 0x0000; // All output



// INITIALIZE
coldata[0] = 0;coldata[1] = 0;coldata[2] = 0;
Set_Num(1234);    // 4桁で周波数を指定
Set_Band(1);  // バンド指定 0=AM / 1=SW / 2=FM



    // タイマ1の設定 
    PR1 = 300;   
    T1CON = 0b1000000000110000;
    IEC0bits.T1IE = 1; // タイマ1割り込み許可



   //メインループ 周波数・バンド変化



   while(1){
for (i=0;i<=2;i++) {
  for (j=0;j<9999;j++) {
   Set_Num(j);
   Set_Band(i);
   Wait_Time(10);
  }
}
   }
}



// NUMERIC SET 4桁の数字を一気にバッファにセットする



void Set_Num(unsigned int num){
coldata[0] &= 0x0000;coldata[1] &= 0x0001;coldata[2] = 0xe000;
Set_1digit(3,num/1000);
Set_1digit(2,(num%1000)/100);
Set_1digit(1,(num%100)/10);
Set_1digit(0,num%10);



}



// BAND SET SW/AM/FM MHz/KHz/少数点 インジケータをセットする



void Set_Band(unsigned int band){
if (band ==0) { coldata[2] &= 0x1ffe;
     coldata[0] &= 0x0924;
     coldata[0] |= 0x2001;     // AM KHz 小数点以下なし
     coldata[1] &= 0x1ffe;    
}               
if (band ==1) { coldata[2] &= 0x1ffe;
     coldata[0] &= 0x0924;;
     coldata[0] |= 0x8010;     // SW MHz 小数点以下2桁
     coldata[1] |= 0x0001;    
}             
if (band ==2) { coldata[2] &= 0x1ffe;
     coldata[0] &= 0x0924;
     coldata[0] |= 0x0408;     // FM MHz 小数点以下1桁
     coldata[1] |= 0x0001;    
}               
}



// NUMERIC SET 1桁の数字をセットするルーチン



void Set_1digit(unsigned int col,unsigned int num){
unsigned int wk1,wk2,wk3;
wk1 = 0;wk2=0;wk3=0;
switch (num) {           // 0-9す数字に合わせてセグメントデータを設定
  case 0: wk3 =0x07;wk2=0x05;wk1=2;break;
  case 1: wk3 =0x01;wk2=0x01;wk1=0;break;
  case 2: wk3 =0x03;wk2=0x06;wk1=2;break;
  case 3: wk3 =0x03;wk2=0x03;wk1=2;break;
  case 4: wk3 =0x05;wk2=0x03;wk1=0;break;
  case 5: wk3 =0x06;wk2=0x03;wk1=2;break;
  case 6: wk3 =0x06;wk2=0x07;wk1=2;break;
  case 7: wk3 =0x03;wk2=0x01;wk1=0;break;
  case 8: wk3 =0x07;wk2=0x07;wk1=2;break;
  case 9: wk3 =0x07;wk2=0x03;wk1=2;break;
  deafult: break;
}
coldata[0]=coldata[0] | (wk1 << (col*3+1));
coldata[1]=coldata[1] | (wk2 << (col*3+1));
coldata[2]=coldata[2] | (wk3 << (col*3+1));
}



// SEGMENT CONTROL ここでLCDを制御



void __attribute__((interrupt, auto_psv))
   _T1Interrupt(void)
{
unsigned int wk;



wk = coldata[lcdstate/2];



if ((lcdstate%2)==0) {
  PORTB = wk ^ 0xffff;      // オンするセグメントを0Vにする
  PORTA = 0xffff;
  switch (lcdstate/2) {        // Col選択 選択したColだけ1をドライブ(3V)
   case 0 :        // それ以外はフロート(1.5V)
     TRISA = 0xfffe;break;
   case 1 :
     TRISA = 0xfffd;break;
   case 2 :
     TRISA = 0xfeff;break;
   default :break;
  }
}else{
  PORTB = wk;         // オンするセグメントを3Vにする
  PORTA = 0x0000;        // 選択したColを0Vに。それ以外は1.5Vのまま
}
lcdstate++;
if (lcdstate>5) {
  lcdstate =0;
}
   IFS0bits.T1IF = 0;// 割り込みフラグクリア
}



// WAIT LOOP 適当なウェイトルーチン



void Wait_Time(unsigned int t) {
int t0,t1;
for (t0=0;t0<t;t0++) {
  for (t1=0;t1<100;t1++) {
  }
}
}



 ただいま雪国に帰省中です。外は荒れてて出かける気にもならないし、新年もちょっと年始の挨拶回りしたらとくにやることもないです。テレビは面白くないし。ネット環境も遅くていまいち。





 酒飲んで寝てるだけでは体にも心にもよくないので、この正月はDSPラジオ基板の方に手を出そうかと思います。





それではまたです。


スポンサーサイト
2012.12.31 Mon l ラジオ l コメント (0) トラックバック (0) l top

その2です。前回の回路で、とにかく表示だけテストするソフトを組んでみました。



Dscf1481  動作はこんな感じです。



仕様として以下を考慮しています。



 ・周波数4桁表示



 ・AM/SW/FMアイコンの表示



 ・AM時はKHzアイコン、SW/FM時はMHzアイコンの表示



 ・AM時は小数点なし、SW時は小数点2桁、FM時は小数点1桁表示



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





#include "P24FJ64GA004.h"



void Set_Lcd(unsigned int) ;



//config
_CONFIG2(0xF9FC);
_CONFIG1(0x3F7F);



unsigned int coldata[3];



//main loop
int main(void)
{



   unsigned int i,t;



   //Setup clock
   OSCCON = 0x11C0;  // FRCPLL
   CLKDIV =  0x0030;  // 1MIPS SETTING



   //IO PORT SETTING
AD1PCFG = 0xffff; // Analog input disable
TRISA = 0x000f; // All output (Will be changed)
TRISB = 0x0000; // All output
TRISC = 0x0000; // All output



// INITIALIZE
coldata[0] = 0;coldata[1] = 0;coldata[2] = 0;
Set_Num(1234);    // 4桁で周波数を指定
Set_Band(1);  // バンド指定 0=AM / 1=SW / 2=FM



   //Test Loop テストなのでとりあえず適当なループ。後でタイマー割り込みにする。
   while(1){
for (i=0;i<=2;i++) {
  Set_Lcd(i);
}
   }
}



// NUMERIC SET 4桁の数字を一気にバッファにセットする



void Set_Num(unsigned int num){
coldata[0] &= 0xf9db;coldata[1] &= 0x0001;coldata[2] = 0xe000;
Set_1digit(3,num/1000);
Set_1digit(2,(num%1000)/100);
Set_1digit(1,(num%100)/10);
Set_1digit(0,num%10);



}



// BAND SET SW/AM/FM MHz/KHz/少数点 インジケータをセットする



void Set_Band(unsigned int band){
if (band ==0) { coldata[2] &= 0x1ffe;
     coldata[0] &= 0x0924;
     coldata[0] |= 0x2001;     // AM KHz 小数点以下なし
     coldata[1] &= 0x1ffe;    
}               
if (band ==1) { coldata[2] &= 0x1ffe;
     coldata[0] &= 0xfff6;
     coldata[0] |= 0x8010;     // SW MHz 小数点以下2桁
     coldata[1] |= 0x0001;    
}             
if (band ==2) { coldata[2] &= 0x1ffe;
     coldata[0] &= 0x0924;
     coldata[0] |= 0x0408;     // FM MHz 小数点以下1桁
     coldata[1] |= 0x0001;    
}               
}



// NUMERIC SET 1桁の数字をセットするルーチン



void Set_1digit(unsigned int col,unsigned int num){
unsigned int wk1,wk2,wk3;
wk1 = 0;wk2=0;wk3=0;
switch (num) {           // 0-9す数字に合わせてセグメントデータを設定
  case 0: wk3 =0x07;wk2=0x05;wk1=2;break;
  case 1: wk3 =0x01;wk2=0x01;wk1=0;break;
  case 2: wk3 =0x03;wk2=0x06;wk1=2;break;
  case 3: wk3 =0x03;wk2=0x03;wk1=2;break;
  case 4: wk3 =0x05;wk2=0x03;wk1=0;break;
  case 5: wk3 =0x06;wk2=0x03;wk1=2;break;
  case 6: wk3 =0x06;wk2=0x07;wk1=2;break;
  case 7: wk3 =0x03;wk2=0x01;wk1=0;break;
  case 8: wk3 =0x07;wk2=0x07;wk1=2;break;
  case 9: wk3 =0x07;wk2=0x03;wk1=2;break;
  deafult: break;
}
coldata[0]=coldata[0] | (wk1 << (col*3+1));
coldata[1]=coldata[1] | (wk2 << (col*3+1));
coldata[2]=coldata[2] | (wk3 << (col*3+1));
}



// SEGMENT CONTROL ここでLCDを制御



void Set_Lcd(unsigned int seg) {



int i;
unsigned int wk;



wk = coldata[seg];
PORTB = wk ^ 0xffff;      // オンするセグメントを0Vにする
PORTA = 0xffff;
switch (seg) {        // Col選択 選択したColだけ1をドライブ(3V)
  case 0 :        // それ以外はフロート(1.5V)
     TRISA = 0xfffe;break;
  case 1 :
     TRISA = 0xfffd;break;
  case 2 :
     TRISA = 0xfeff;break;
  default :break;
}
Wait_time(100);        // 適当なウェイト 後でタイマー割り込みにする



PORTB = wk;         // オンするセグメントを3Vにする
PORTA = 0x0000;        // 選択したColを0Vに。それ以外は1.5Vのまま



Wait_time(100);        // 適当なウェイト 後でタイマー割り込みにする
}



// WAIT LOOP 適当なウェイトルーチン



void Wait_time(unsigned int t) {
int t0,t1;
for (t0=0;t0<t;t0++) {
  for (t1=0;t1<100;t1++) {
  }
}
}



今回はテストなので本当に表示するだけです。タイマー割り込み型にしないと他になにもできないですね。











実は下にあるAitendoのDSPラジオIC基板を別に買ってあるので、年明けにそれと組み合わせてデジタル表示のマルチバンドDSPラジオにしようと思っています。



Dscf1472



今年もあと2時間ちょっとなので、このへんで。



それではまたです。


2012.12.31 Mon l ラジオ l コメント (0) トラックバック (0) l top

2012年も終わりですね。今年は後半業務多忙で、29日ぎりぎりまで仕事になりましたが、なんとか課題もほぼクリアでき、年越しできるようになりました。





今日は暇が出来たので、今年のハンダ付け納めとして久しぶりに工作してました。



ものは少し前に買ってあったAidtendoのラジオ用LCDです。



Dscf1470 面白そうだなと思って購入していましたが、



さてデータシートにピン定義はありますが、どう動かしたものか。かなり迷いました。



そういえば今まで使ったLCDはIOとしてデータを読み書きするものばかりで、直接制御というのは今回初めてでした。TN液晶は確か電圧を印加する、ただの直流だと劣化するから交流っぽく制御する、と何かで読んだことはありましたが、具体的なところがちょっと。。。











ネットで調べたところ、こちらのページに大変詳しい解説がありようやく分かりました。



ものすごく簡単に言うとCol端子を0、1.5V、3Vの3レベルで振って、Seg端子を1,0制御するのです。



このページの解説はAVR用ですが、やることはPICでも同じだな、と思いまして、以前使ったマルツのPIC24Fボードを取り出して配線しました。



回路図はこんな感じ。PA0,1,8でCOL0-2を制御します。(1,0,Hizの組み合わせで、0V,1.5V、3Vを作ります。分圧抵抗はHiZ=Input設定のときに1.5Vとするためです。)



Seg端子はPB0-15で制御するようにしました。Seg16,17は空いています。これは、



LCDのピン定義から、ここにアサインされているセルは表示しなくてもいいかな、と考えたためrです。その代わり、Seg18は使っています。これはここにアサインされているSWアイコンを表示したかったからです。



Radiolcd



長くなりそうなので、この次の記事でソフトを解説します。



それではまたです。




2012.12.31 Mon l ラジオ l コメント (0) トラックバック (0) l top

以前、学研の科学が「科学脳」として復活という記事を書きました



その後フォローです。



初刊の「水溶液キット」は本屋で探しまわって確認いたしました。



手に取ってみて、ある程度感慨はありましたが、電気系じゃないしちょっとなあ、



と思い購入はしませんでした。すみません。



今学研のホームページを見たら、「電気ピカピカ」なる2刊目が先週でたようです。



電気系ではあるけど、LEDと豆電球らしいし、どうかなあ。



まずは本屋で見てみたいと思います。



(正直言いますとやっぱり子供向けなので、初版の見ても感慨だけではちょっと買えませんでした。だから「大人の科学」が有るわけで。)



早くラジオを出してほしいところです。それなら即買いです。



いまならゲルマラジオでなく3端子ラジオICくらいついたりして。



それではまたです。








2012.12.11 Tue l 技術トピック l コメント (0) トラックバック (0) l top

CESは今年の1月の話ですからちょっと旧聞になります。3Dプリンタが以外と身近になってきたという動画です。



10年以上前に光造形で試作モックアップ作るようなことをやったことが有りますが、結構なお金と時間がかかりました。



さすが21世紀、いつのまにかホームプリンタになってしまったのですね。











こういうのが一般家庭に普及したら、メーカはどうなっちゃうんでしょうね。





さすがに電子回路は無理そうなので、基板とデザインデータとソフトだけが流通して、あとは各家庭で好きなデザインで家電品を作ってしまうとか。





回路が入らない普通の道具、食器とか、洗面道具とか、アクセサリとか、おもちゃとか、文房具とか、ならすぐにでも置き換えできそうですね。





 物を流通させるよりも、必要なところにデータだけ送って、現地で製造するのは社会全体の効率も良いです。素材がリサイクル可能ならさらにお得ですね。





 21世紀になっても意外と世の中変わらないな、と思っていましたが、こういう感じで地味に地味に、しかし足元から大きく変わっていくのかな、などと考えてしまいました。









それではまたです。


2012.12.10 Mon l 技術的動画 l コメント (0) トラックバック (0) l top

What a technology....really great.とありましたので、何だろうと思い見てみました。



立木をでっかい移植ゴテみたいなもんでそのまますくい取って、移動して別のところに



植え付ける、という車両型の機械ですね。





なかなか面白いです。










ところで移植先の穴はどうやって掘ったのでしょうか?



二台あれば、一台で移植先の土をすくい取っておいて、二台目で木ごとすくって移動、



そのあとに一台目の土を木のあった跡の穴にそのまま置いてしまえばよいですが、



単純にショベルカー等であらかじめ掘ってあったのかな?





それではまたです。




2012.12.09 Sun l 技術的動画 l コメント (0) トラックバック (0) l top
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。