したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | メール | |

PICのプログラムについて

10よさく:2013/02/28(木) 22:27:13
igotenさん、度々ありがとうございます。
読んでから大分色々自分で考えてみました。
割込みの場合はこの場合内部割込みでいいんですよね?

11igoten:2013/03/01(金) 07:53:26
タイマー割り込みです。
この場合はTMR0が良いと思います。

12よさく:2013/03/01(金) 10:40:04
おはようございます。
割込みの時間が永いような気もしますが、何となくで書いて見ました。
宜しくお願いします。
// LED 点滅 調光プログラム
// PIC 12F683 LED 点滅,調光プログラム
// タイマー割り込みを使用せず、ディレータイムを使用する。
//
// A/D 入力ポート : GP0,1
// LED 出力ポート : GP2
//
// HI-TECH C Compiler for PIC10/12/16 MCUs (Lite Mode) V9.83
//

#define _LEGACY_HEADERS
#include <htc.h>
#define _XTAL_FREQ 4000000
//delay タイムを使うので、動作周波数 4Mhzにセットする。

__CONFIG ( INTIO & WDTDIS & PWRTEN & MCLRDIS );

void tenmetu_timer ( unsigned char tm ) { // 点滅時間 Time = 200ms * (A/D 変換データ)
while ( tm-- ) {
__delay_ms (200);
}
}
unsigned int counter = 0;
unsigned int value; //A/D 読値 10ビット
unsigned int adc_read(unsigned char ch){
//右詰め、電源基準、A/D有効化 
ADCON0 = 0b10000101 ; //GP1
GODONE = 1;
while(GODONE);
return ((ADRESH << 8) + ADRESL) ;
}
void main (void) {
TMR0 = 0x9c;//タイマーセット
T0IF = 0;//タイマー0割り込みフラグクリア
T0IE = 1;//タイマー0割り込み許可
GIE = 1;//全体割り込み許可

unsigned int value; //A/D 読値 10ビット
unsigned char count;

ANSEL = 0b00010011; // ADCS:8 Tosc, ANS3=0, ANS2=0, ANS1=1, ANS0=1
TRISIO = 0b00000011; // I/O ポート GP0,1:input, GP2,3,4,5:output
GPIO = 0;

while(1){

if(count == 255)
value = (adc_read(3)) >> 2; // A/Dの読み込み

if(count < value)
GPIO2 = 1;
else
GPIO2 = 0;

count++;
}//ここまで調光
}

interrupt timer0()
{
T0IF = 0;//タイマー0割り込みフラグクリア
TMR0 = 0x9c;//タイマー再セット

if((++counter)==100){

ADCON0 = 0b00000001;// GP0
GPIO = 0;
int i;

for(i=0; i<=1; ++i){
__delay_us (25); // A/D 充電待ち
GODONE = 1; // A/D 変換開始
while(1){
if ( !GODONE ) {
GPIO2 = 1; // LED 点灯
tenmetu_timer ( ADRESH );

GPIO2 = 0; // LED 消灯
tenmetu_timer ( ADRESH );
break;
}
}
}
while(1){
GPIO2 = 1; // LED 点灯
}
}//ここまで点滅周期(仮にON/OFF2回その後ONで終了)
counter = 0;
}

13よさく:2013/03/01(金) 10:56:12
見直しましたが、これだと1秒毎に点滅動作するってなってますね。
色々すみません。

14よさく:2013/03/01(金) 12:50:33
自分自身いまいち内容を理解していないと思ってます。
簡単だと思ってたんですが、ロジックを考えるって難しいですね。
引き出しがない分結構行き詰りました。

15igoten:2013/03/01(金) 13:51:59
先ず
mainの外で
char flg = 0;
宣言する。

mainの初めで
//タイマを20msecに設定
TMR0 = 0x64; //100を設定
OPTION = 0x07; //内部クロック, 1/256
  T0IE = 1;//タイマー0割り込み許可
  GIE = 1;//全体割り込み許可

タイマー0を20msecに設定する

更に
if((count < value) && (flg == 1) )
GPIO2 = 1;
else
  GPIO2 = 0;

として調光と点滅をさせる


割り込みの中は
interrupt timer0()
{
int value;
static char tcount = 0;
ADCON0 = 0x81 + (0 << 2 ); //ADチャンネル選択
__delay_us (25);
GODONE = 1;
while(GODONE);
value = ((ADRESH << 8) + ADRESL) >> 2;
if(tcount < value)
flg = 1;
else
flg = 0;
tcount++;
T0IF = 0;
}

デバックしていないのでバグがあるかもしれませんが。

これで20mSecから20m x 256secの点滅となります。
実際の点滅の見えるのは200mSec位からでしょうが。

16よさく:2013/03/02(土) 09:19:04
おはようございます。igotenさん、ソースありがとうございます。
少しずつですが、理解しているつもりです。
ただ、最終的にはまだ??で書いてますが、これでいいのでしょうか?
一応デバッグは通ってますが、やはりチャンネルの切り替えが理解していません。

//

#define _LEGACY_HEADERS
#include <htc.h>
#define _XTAL_FREQ 4000000
//delay タイムを使うので、動作周波数 4Mhzにセットする。

__CONFIG ( INTIO & WDTDIS & PWRTEN & MCLRDIS );

char flg = 0;

void tenmetu_timer ( unsigned char tm ) { // 点滅時間 Time = 200ms * (A/D 変換データ)
while ( tm-- ) {
__delay_ms (200);
}
}
unsigned int counter = 0;
unsigned int value; //A/D 読値 10ビット
unsigned int adc_read(unsigned char ch){
//右詰め、電源基準、A/D有効化 
ADCON0 = 0b10000101 ; //GP1
GODONE = 1;
while(GODONE);
return ((ADRESH << 8) + ADRESL) ;
}
void main (void) {
//タイマを20msecに設定
TMR0 = 0x64; //100を設定
OPTION = 0x07; //内部クロック, 1/256
T0IE = 1;//タイマー0割り込み許可
GIE = 1;//全体割り込み許可

unsigned int value; //A/D 読値 10ビット
unsigned char count;

ANSEL = 0b00010011; // ADCS:8 Tosc, ANS3=0, ANS2=0, ANS1=1, ANS0=1
TRISIO = 0b00000011; // I/O ポート GP0,1:input, GP2,3,4,5:output
GPIO = 0;

while(1){

if(count == 255)
value = (adc_read(3)) >> 2; // A/Dの読み込み

if((count < value) && (flg == 1)){
GPIO2 = 1;

}else if(flg ==0){
int i;
for(i=0; i<=1; ++i){
__delay_us (25); // A/D 充電待ち
GODONE = 1; // A/D 変換開始
while(1){
if ( !GODONE ) {
GPIO2 = 1; // LED 点灯
tenmetu_timer ( ADRESH );

GPIO2 = 0; // LED 消灯
tenmetu_timer ( ADRESH );

break;
}
}
}
while(1){
GPIO2 = 1; // LED 点灯
}
counter = 0;
}//ここまで点滅周期(仮にON/OFF2回その後ONで終了)

else
GPIO2 = 0;

count++;
}//ここまで調光
}

interrupt timer0()
{
int value;
static char tcount = 0;
ADCON0 = 0x81 + (0 << 2 ); //ADチャンネル選択
__delay_us (25);
GODONE = 1;
while(GODONE);
value = ((ADRESH << 8) + ADRESL) >> 2;
if(tcount < value)
flg = 1;
else
flg = 0;
tcount++;
T0IF = 0;
}

17よさく:2013/03/03(日) 18:11:14
何度もすみません。色々調べながらやっていますが、flagをどう使っていいのかが想像できなくて、
色々書き込んでは悩んでいます。
一個前のソースは間違いに気付いたので、こういう内容かな?ってことでまた書いてみました。
教えて頂いたので、何とか完成したいと思ってます。
宜しくお願いします。

#define _LEGACY_HEADERS
#include <htc.h>
#define _XTAL_FREQ 4000000
//delay タイムを使うので、動作周波数 4Mhzにセットする。

__CONFIG ( INTIO & WDTDIS & PWRTEN & MCLRDIS );

char flg = 0;

void tenmetu_timer ( unsigned char tm ) { // 点滅時間 Time = 200ms * (A/D 変換データ)
while ( tm-- ) {
__delay_ms (200);
}
}


unsigned int value; //A/D 読値 10ビット

unsigned int adc_read(unsigned char ch){
//右詰め、電源基準、A/D有効化 
ADCON0 = 0b10000101 ; //GP1
GODONE = 1;
while(GODONE);
return ((ADRESH << 8) + ADRESL) ;
}
void main (void) {

//タイマを20msecに設定→10ms?
TMR0 = 0x64; //100を設定
OPTION = 0x07; //内部クロック, 1/256
T0IE = 1;//タイマー0割り込み許可
GIE = 1;//全体割り込み許可

unsigned int value; //A/D 読値 10ビット
unsigned char count;

ANSEL = 0b00010011; // ADCS:8 Tosc, ANS3=0, ANS2=0, ANS1=1, ANS0=1
TRISIO = 0b00000011; // I/O ポート GP0,1:input, GP2,3,4,5:output
GPIO = 0;

while(1){

if(count == 255)
value = (adc_read(1)) >> 2; // A/Dの読み込み

if((count < value) && (flg == 1)){
GPIO2 = 1;

int i;
for(i=0; i<=1; ++i){
__delay_us (25); // A/D 充電待ち
GODONE = 1; // A/D 変換開始
while(1){
if ( !GODONE ) {

tenmetu_timer ( ADRESH );

GPIO2 = 0; // LED 消灯
tenmetu_timer ( ADRESH );

break;
}
}
}
while(1){
GPIO2 = 1; // LED 点灯
}
}else{
GPIO2 = 0;
}
}
}
interrupt timer0()
{
int value;
static char tcount = 0;
ADCON0 = 0x81 + (0 << 2 ); //ADチャンネル選択
__delay_us (25);
GODONE = 1;
while(GODONE);
value = ((ADRESH << 8) + ADRESL) >> 2;
if(tcount < value)
flg = 1;
else
flg = 0;
tcount++;
T0IF = 0;
}

18igoten:2013/03/04(月) 17:34:21
申し訳ない。
ただ今出張中ですので回答はもう少し待ってください。
私が書いたソースは割り込みを用いたもので、割り込みの中で
フラグを設定してそれに応じてLEDのON/OFFをしています。

19よさく:2013/03/04(月) 18:02:36
いえいえ、こちらこそ申し訳ないです。
ご面倒をお掛けしているのは私ですので。
ただ、自分自身あまり知識がないので、少し込み入った変更を加えると
??になってデバッグ通せないので・・

20igoten:2013/03/11(月) 10:12:03
さてどこから行きましょうか。
私のお勧めは、まず一冊私と同じ参考書を購入してはどうかと言うことです。
技術評論社
「8ピンPICマイコンの使い方が良くわかる本」
私はbookOffOnLineで買いました。
又は「C言語で始めるPICマイコン」 Ohmusha
これなら500円で売ってます。
私と同じ本があればどこを読めばいいのかアドバイスが
し易いのですが。
いかがでしょうか?

21よさく:2013/03/11(月) 10:29:41
igotenさん、おはようございます。
実は「PICマイコンの基礎」というのは図書館で借りてまして、
それ見ながらやっています。ほぼ「8ピン〜」の内容と同じみたいです。
一度は目を通してみようと思っていますが、まだ貸し出し中で。

プログラムの方はあれから色々調べてやっていますが、なかなか・・
デバッグは通るんですけど、思った動作しないので。
困りました(笑

22よさく:2013/03/20(水) 13:05:35
igotenさん、こんにちわ。
未だに格闘しています(笑
仰っていた「8ピンPICマイコンの使い方が良くわかる本」
を借りてきて、ざっくり読んでいます。
また、お時間があれば相談に乗ってください。

23igoten:2013/03/20(水) 13:14:49
良いですよ。^^
先ずその本の3章「タイマ割り込みの使い方」を
読んで下さい。
出来れば3-4-1の「点滅制御の仕方」をそのままやってみてください。

24<削除>:<削除>
<削除>

25<削除>:<削除>
<削除>

27スーパーコピー日本時計:2019/05/15(水) 16:49:20
スーパーコピー - スーパーコピー
※お写真ではわかりにくい点が御座いまし
たらお気軽にお問い合わせくださいませ。
■実物写真、付属品を完備しております。
■迅速、確実にお客様の手元にお届け致します。
■低価格を提供すると共に、品質を絶対保証しております。
■商品の交換と返品ができます。


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板