FC2カウンター

現在の訪問者数

現在の閲覧者数:

カレンダー

06 | 2017/07 | 08
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -

プロフィール

剣菱P

Author:剣菱P
剣菱Pと申します。
性別:男
年齢:27
二兎を追って一兎も得られないタイプ

マイコンやプログラミング、ニコニコ動画、雑記等
方向性は見えずとも、ちょっとずつ更新していく予定です!

リンクフリーです。
こんなブログでよかったらよろしくお願いしま~す。

公開メール kenbishiP@gmail.com

検索フォーム

最新記事

最新コメント

カテゴリ

メールフォーム

名前:
メール:
件名:
本文:

月別アーカイブ

最新トラックバック

リンク

ブロとも一覧

ブロとも申請フォーム

ランキング

ランキング参加中です。気が向いたらクリックしてあげてください。


にほんブログ村 その他趣味ブログへ
にほんブログ村 その他趣味ブログ 趣味の工作へ

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

さっそくサーボを動かす これでどうだ!»

コメント

CCP1&CCP2でサーボ制御

はじめまして。kanoと申します。

趣味で、今サーボの複数制御について、学習していますところ、そむてっく様のこのログが目に留まり、    大変参考にさせて頂いてます。そこで、Drive servo16 11.txtを部分変更して、ソースコードをコンパイル、  書込み、動作試験を行うが、予想通りそんなに旨くいく筈等無く、サーボは、ピクリともいたしません。    コード構成について問題ない見たいに思えるのですが、何処に問題があるのでしょうか?
そこで、ぶしつけで大変失礼になりますが、もしお許しなら、下記コードの検証からご指南いただけます様願ってやみません。

#include <16f873a.h>
#fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP
#use delay(CLOCK=20000000)
#define ZERO_P 53036
#define CENTER 60036



unsigned int select = 0;

unsigned long data1[8] =
{ CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER};
unsigned long data2[8] =
{ CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER};
#int_timer1
void isr1()
{
set_timer1(0xCF2C);
CCP_1 = data1[select];
CCP_2 = data2[select];

switch(select){
case 0 : output_high(PIN_C0);output_high(PIN_B0);break;

case 1 : output_high(PIN_C1);output_high(PIN_B1);break;

case 2 : output_high(PIN_C2);output_high(PIN_B2);break;

case 3 : output_high(PIN_C3);output_high(PIN_B3);break;

case 4 : output_high(PIN_C4);output_high(PIN_B4);break;

case 5 : output_high(PIN_C5);output_high(PIN_B5);break;

case 6 : output_high(PIN_C6);output_high(PIN_B6);break;

case 7 : output_high(PIN_C7);output_high(PIN_B7);break;

default : output_high(PIN_C0);output_high(PIN_B0);

}
select++;
if(select >= 8) select = 0;
}

void ccp1_isr()
{
output_c(0x00);
}


void ccp2_isr()
{
output_b(0x00);
}


void main()
{
set_tris_b(0x00);
set_tris_c(0x00);

setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
set_timer1(0xCF2C);
setup_ccp1(CCP_COMPARE_INT);
setup_ccp2(CCP_COMPARE_INT);

  enable_interrupts(INT_CCP1);
enable_interrupts(INT_CCP2);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);

output_c(0x00);
output_b(0x00);

while(1){
    data1[0] = CENTER;
data2[0] = CENTER;
data1[1] = CENTER;
data2[1] = CENTER;
data1[2] = CENTER;
data2[2] = CENTER;
delay_ms(1000);
data1[0] = CENTER + 3500;
data2[0] = CENTER + 3500;
data1[1] = CENTER + 3500;
data2[1] = CENTER + 3500;
data1[2] = CENTER + 3500;
data2[2] = CENTER + 3500;
delay_ms(1000);

data1[0] = CENTER;
data2[0] = CENTER;
data1[1] = CENTER;
data2[1] = CENTER;
data1[2] = CENTER;
data2[2] = CENTER;
delay_ms(1000);

data1[0] = CENTER - 3500;
data2[0] = CENTER - 3500;
data1[1] = CENTER - 3500;
data2[1] = CENTER - 3500;
data1[2] = CENTER - 3500;
data2[2] = CENTER - 3500;
delay_ms(1000);
}

}

2010.07.18 | URL | kano #- [ edit ]



kano様こんなブログを見ていただいてありがとうございます。
まず、誠に申し訳ないのですが、ちょっと前に書いたプログラムなので、何をしていたか少し思い出させてくださいw

ひとつ思ったのですが、はじめにCCP1だけで試してみてうまく行ったでしょうか?

ではこれからコードを見てみます

お力になれなかったら申し訳ありません。

2010.07.18 | URL | そむてっく #vTm8BAGM [ edit ]



kano様 ひとつ発見しました

まずは

void ccp1_isr()
{
output_b(0x00);
}

このコード部分はコンペアマッチで値をクリアする部分なので、
割り込みの処理なのです

つまりCCP1の割り込み命令を宣言せねばなりません

ってことで
#int_ccp1
void ccp1_isr(){
output_b(0x00);

}
が正解ですね

まだ動かなかったら遠慮せず聞いてください

といっても自分は素人なんであまり力になれないっすけどw

2010.07.18 | URL | そむてっく #vTm8BAGM [ edit ]



ccp1&ccp2制御試験結果

そむてっく 様

人生は重荷を背負って坂を上るが如しと言われます。
本当に、此れまで長く重く苦しい日々でした。

そんな時、そむてっく様からの救い手を差し伸べられ
今やっと背中の重荷が取れた感じです。

何か、今年の夏は暑さ知らずに乗りきれそうです。
おっとすみません 余談が過ぎました。

本件について、本当にありがとうございました。
ご教示どおり、割込み命令宣言を挿入した事で
サーボは、指示通り元気よく首振りしております。
只々、感謝の気持ちでいっぱいです。

PICの世界はとてつもなく広く奥深い世界ですね。

これからも、そむてっく様ブログを、
励みに精進したいと思います。


2010.07.19 | URL | kano #- [ edit ]



いやぁ、無事に解決したようでよかったですw

こちらこそ少しでもお力になれたようでうれしいです。

僕もまだまだ勉強不足なのでお互い精進していきましょう

では、またなにかありましたら~

コメントですとあまり気がつかないかもしれないので、直接メールくださっても問題ないですよ~

2010.07.20 | URL | そむてっく #zV8CHFJQ [ edit ]



コメントの投稿













管理者にだけ表示を許可する

ついにデバッグ完了(;∇;)


ついに、ついに 問題を解決

長かった、苦しかった。多くの戦友を失った。
しかし、我々人類は機械との戦争に勝利したのだ!


本当に手間を取らされた

おそらくCCSに問題があったのだろう。

まったく、やってくれたぜ


今回の問題は
100の桁がオーバーフローを起こしても次のビットにその情報が届いていない。

ならば手動で届けてやろう!

100の桁を10倍して tmpという変数に代入する

そしてtmpを10で割って100の桁に戻す

100の桁を10倍して1000の桁にすることで 強制的に上位8ビットを使用し
その後10で割って元に戻すことで、上位ビットと下位ビットの関連付けを強制的に行いました。

正直この方法も苦し紛れに試してみたんですが、うまいこと機能してくれてよかったです。

無事にこれで解決! かなりうれしい。


あと角度を指定する変数をregとしていたんですが、radとするつもりだったものを
なぜか間違えていたので 修正
送信側プログラム
Command_send_1_1.txt
受信側プログラム
Drive_servo16_1_1.txt


もうコンパイラのバグでうまくいかないとかはまじで勘弁ですな

スポンサーサイト

さっそくサーボを動かす これでどうだ!»

コメント

CCP1&CCP2でサーボ制御

はじめまして。kanoと申します。

趣味で、今サーボの複数制御について、学習していますところ、そむてっく様のこのログが目に留まり、    大変参考にさせて頂いてます。そこで、Drive servo16 11.txtを部分変更して、ソースコードをコンパイル、  書込み、動作試験を行うが、予想通りそんなに旨くいく筈等無く、サーボは、ピクリともいたしません。    コード構成について問題ない見たいに思えるのですが、何処に問題があるのでしょうか?
そこで、ぶしつけで大変失礼になりますが、もしお許しなら、下記コードの検証からご指南いただけます様願ってやみません。

#include <16f873a.h>
#fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP
#use delay(CLOCK=20000000)
#define ZERO_P 53036
#define CENTER 60036



unsigned int select = 0;

unsigned long data1[8] =
{ CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER};
unsigned long data2[8] =
{ CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER,CENTER};
#int_timer1
void isr1()
{
set_timer1(0xCF2C);
CCP_1 = data1[select];
CCP_2 = data2[select];

switch(select){
case 0 : output_high(PIN_C0);output_high(PIN_B0);break;

case 1 : output_high(PIN_C1);output_high(PIN_B1);break;

case 2 : output_high(PIN_C2);output_high(PIN_B2);break;

case 3 : output_high(PIN_C3);output_high(PIN_B3);break;

case 4 : output_high(PIN_C4);output_high(PIN_B4);break;

case 5 : output_high(PIN_C5);output_high(PIN_B5);break;

case 6 : output_high(PIN_C6);output_high(PIN_B6);break;

case 7 : output_high(PIN_C7);output_high(PIN_B7);break;

default : output_high(PIN_C0);output_high(PIN_B0);

}
select++;
if(select >= 8) select = 0;
}

void ccp1_isr()
{
output_c(0x00);
}


void ccp2_isr()
{
output_b(0x00);
}


void main()
{
set_tris_b(0x00);
set_tris_c(0x00);

setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
set_timer1(0xCF2C);
setup_ccp1(CCP_COMPARE_INT);
setup_ccp2(CCP_COMPARE_INT);

  enable_interrupts(INT_CCP1);
enable_interrupts(INT_CCP2);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);

output_c(0x00);
output_b(0x00);

while(1){
    data1[0] = CENTER;
data2[0] = CENTER;
data1[1] = CENTER;
data2[1] = CENTER;
data1[2] = CENTER;
data2[2] = CENTER;
delay_ms(1000);
data1[0] = CENTER + 3500;
data2[0] = CENTER + 3500;
data1[1] = CENTER + 3500;
data2[1] = CENTER + 3500;
data1[2] = CENTER + 3500;
data2[2] = CENTER + 3500;
delay_ms(1000);

data1[0] = CENTER;
data2[0] = CENTER;
data1[1] = CENTER;
data2[1] = CENTER;
data1[2] = CENTER;
data2[2] = CENTER;
delay_ms(1000);

data1[0] = CENTER - 3500;
data2[0] = CENTER - 3500;
data1[1] = CENTER - 3500;
data2[1] = CENTER - 3500;
data1[2] = CENTER - 3500;
data2[2] = CENTER - 3500;
delay_ms(1000);
}

}

2010.07.18 | URL | kano #- [ edit ]



kano様こんなブログを見ていただいてありがとうございます。
まず、誠に申し訳ないのですが、ちょっと前に書いたプログラムなので、何をしていたか少し思い出させてくださいw

ひとつ思ったのですが、はじめにCCP1だけで試してみてうまく行ったでしょうか?

ではこれからコードを見てみます

お力になれなかったら申し訳ありません。

2010.07.18 | URL | そむてっく #vTm8BAGM [ edit ]



kano様 ひとつ発見しました

まずは

void ccp1_isr()
{
output_b(0x00);
}

このコード部分はコンペアマッチで値をクリアする部分なので、
割り込みの処理なのです

つまりCCP1の割り込み命令を宣言せねばなりません

ってことで
#int_ccp1
void ccp1_isr(){
output_b(0x00);

}
が正解ですね

まだ動かなかったら遠慮せず聞いてください

といっても自分は素人なんであまり力になれないっすけどw

2010.07.18 | URL | そむてっく #vTm8BAGM [ edit ]



ccp1&ccp2制御試験結果

そむてっく 様

人生は重荷を背負って坂を上るが如しと言われます。
本当に、此れまで長く重く苦しい日々でした。

そんな時、そむてっく様からの救い手を差し伸べられ
今やっと背中の重荷が取れた感じです。

何か、今年の夏は暑さ知らずに乗りきれそうです。
おっとすみません 余談が過ぎました。

本件について、本当にありがとうございました。
ご教示どおり、割込み命令宣言を挿入した事で
サーボは、指示通り元気よく首振りしております。
只々、感謝の気持ちでいっぱいです。

PICの世界はとてつもなく広く奥深い世界ですね。

これからも、そむてっく様ブログを、
励みに精進したいと思います。


2010.07.19 | URL | kano #- [ edit ]



いやぁ、無事に解決したようでよかったですw

こちらこそ少しでもお力になれたようでうれしいです。

僕もまだまだ勉強不足なのでお互い精進していきましょう

では、またなにかありましたら~

コメントですとあまり気がつかないかもしれないので、直接メールくださっても問題ないですよ~

2010.07.20 | URL | そむてっく #zV8CHFJQ [ edit ]



コメントの投稿













管理者にだけ表示を許可する


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。