トピック関連記事
48時間以内の記事は New Mark で表示されます
Re: 続続続続ーPWM
件数が一杯になったので新しくしました。

> static unsigned int adc[4] = {0}; − adc[4]の意味?

別の書き方だと
static unsigned int adc[4]={0,0,0,0};
です。
ローカル変数は何も入れないと、元々その位置に書かれている数値になってしまいます。
外部変数なら何も入れなくても0に初期化されます。

> adc[(++num)&3] = adconv();
これも別の書き方なら
num=num+1;
adc[num&0b11]=adconv();
です。
num++;
if(num%4=0)num=0;
adc[num]=adconv();
でも同じです。やっている事は特に違いはありません。
毎回要素の[0]→[1]→[2]→[3]→ 番目になるように切り替えています。
で、次の行でそのADCの4つを足しています。
本体のtargetはその次の行の40.2で割る事で出るのですけど、別の変数を用意するのも面倒なので
そうしています。つまり、4つ足したときはまだ、targetはtarget値(MACHが出力しているワイパー位置)では無いです。

目標のワイパー位置がtargetで、実際のワイパー位置がx9c_valです。
目標の方が大きければupさせて、目標の方が少なければdowmさせています。

> 以下のように、adconv()関数をmain関数の後につけましたが、どうもうまくつながりません。
これはどういった意味でしょうか?コンパイルできないという事ですか?

LEDの動作については、それを考慮したものになっていません。書いてある通りにMACHからの信号→X9Cの操作というだけです。
猛牛ロック 2019/06/03(Mon) 01:35 No.1528
Re: 続続続続ーPWM
maboさんへ、
デジタル可変抵抗ですが、自分は
データシートだと、100ワイパーtapとなっていて、最小で40Ω残るとなっている。
1タップは、10kΩ/1024/100タップ。
なので、、100で割るという考えはいいと思いますが、
最小40Ω残るとある点がちょっと気になります。
10Ω−0.4kΩを100で割る制御となるんでしょうけど。ML4に使ったら、どうなるかは、実機(ML4)で試しましょう。
No1388を頭の隅に入れておきます。


> A+=A
は,
 A=A+1
と同じ意味で,表記方法が違うだけです


代入演算子というそうですね。 代入という表記がやっとわかりました。
でも、A+=A → A=A+Aとなるのでは??


LCDの使い方はまだ分かりませんが、気にはなっていました。憧れです。
今やっていることが理解できたら、と思います。 とりあえず、お気に入りに保存。


***************
猛牛ロックさんへ
自分にとって、本当の難しいと思います。 でも、慣れることと思って反復しています。

プログラムができてきましたが、INCピン(RB3)はプルダウンでよろしいでしょうか?


39〜50行目の事が薄っすらとわかってきました。でもでも、、、解釈ですが、
配列要素0番時のadocnv値を0番時のtargetに代入,
次に、1番時のadoconv値を,1番時のtargetと0番時のtargetに加算、続けて3番時、4番時とtargetを加算すると読めるが?
仮にそうであっても、
43行目が難しい、+=が代入演算子であれば、
公式A+=Bに当てはめるとA=A+Bのはず、targetを加算するという前記の内容となるのか?

**** 追記 ***
そうか分かった、for分の次に来る{}を端折ってあって、実のところ、{target+=adc[i]}なんだ、多分、であれば、そうかもしれない!
でも、コンパイルできません。


プログラムですが、以下の通り考えましたが、コンパイル不可です。
恐縮ですが、見て頂けませんでしょうか、ギブ状態です。お助け願いますm(__)m

/*RB4で電圧読み取り*/
//RB4が汎用出力14番_SEC基板ポート2のSL-18の1番ピン(出力端子)を入力端子として受ける
//
//INCピン(RB3)はプルダウン
//
//PIC16F1827 Configuration Bit Settings
// CONFIG1
#pragma config FOSC = INTOSC // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = ON // Power-up Timer Enable (PWRT enabled)
#pragma config MCLRE = OFF // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = ON // Internal/External Switchover (Internal/External Switchover mode is enabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is enabled)
// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF // PLL Enable (4x PLL disabled)
#pragma config STVREN = OFF // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
#pragma config BORV = LO // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = OFF // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
#include <xc.h>
#include <stdlib.h>
#include <math.h>
// クロック周波数指定
// (__delay_ms()関数が必要としているため)
#define _XTAL_FREQ
// プロトタイプ宣言
unsigned int adconv(void); //ADC読み込み関数


//外部変数
char x9c_val;//ワイパ位置
int inc;
int ud;
//デバイス初期化関数
void x9c_init(void) {
ud = 0;
for (char i = 0; i < 99; i++) {
inc = 0;
__delay_us(1);
inc = 1;
__delay_us(500);
}
x9c_val = 0;
}
//U/D_up関数
void x9c_up(void) {
int ud = 1;
int inc = 0;
__delay_us(1);
int inc = 1;
if (x9c_val < 99)x9c_val++;
//次の上げ下げは500us空ける
}
//U/Ddown関数
void x9c_dowm(void) {
ud = 0;
inc = 0;
__delay_us(1);
inc = 1;
if (x9c_val > 0)x9c_val--;
//次の上げ下げは500us空ける
}
//メイン関数
void main() {
OPTION_REGbits.nWPUEN = 0; //内部プルアップ有効
OSCCON =
PORTA = 0x00; //全てLo
PORTB = 0x00; //全てLo
ANSELA = 0b00000000; //全てデジタルI/Oとする
ANSELB = 0b00010000; // 可変抵抗の電圧読み込み用にRB4のみアナログ
// 入出力設定
TRISA = 0b00000000; // RA全て出力
TRISB = 0b00010000; //RB4 可変抵抗用ADC用入力端子
// ADコンバータ設定
ADCON0 = 0b00100001; // アナログ変換情報設定(RB4から読込む)
ADCON1 = 0b11010000; // 読取値は右寄せ、A/D変換クロックはFOSC/16、VDDをリファレンスとする
//変数宣言



while (1) {
static unsigned int adc[4] = {0};
static char num = 0;
unsigned int target = 0;
adc[(++num)&3] = adconv();
for (char i = 0; i < 4; i++)target += adc[i];
target /= 40.93;

if (target > x9c_val)x9c_up();
else if (target < x9c_val)x9c_down();
_delay_ms(1);
}
}
// アナログ値の変換と読込み処理関数
unsigned int adconv() {

GO_nDONE = 1; // アナログ値読取り開始指示
while (GO_nDONE); // 読取り完了まで待つ
return ADRES;
}

追記
デジタル可変抵抗につけようかと思う比反転のオペアンプです。
利得1倍にしようかと思います。

TR   2019/06/03(Mon) 07:48 No.1530
Re: 続続続続ーPWM
incピンはプルする必要はありません。繋げば良いです。
もしプルするとしても、普通は通常時のH=プルアップですね。

1.
udとincの扱いが違います。これは変数では無く、LATレジスタです。

#define inc LATB3
#define ud LATA3

の2行を前半に入れてください。

そして、それに伴って、
int inc;
int ud;
のような箇所は消してください。

int ud = 1;
のような箇所も
ud=1;
です。(intは消してください) 実際は
LATA3=1;
をしたいわけです。


2.
> while (1) {
の前に
x9c_init();
を入れてください。

3.
私のケアレスミスです。
x9c_dowm  →  x9c_down
_delay_ms  →  __delay_ms

これでコンパイルは通ると思います。
※付いていても問題はありませんけど、私の方は
#include <stdlib.h>
#include <math.h>
は必要ありません。

*****************************

adc[(++num)&3] = adconv();
は↑で説明した通りです。
毎回来た時にnumが1増えますからそれと&3を取って、0〜3の範囲にしています。
来るたびにadc[1]→adc[2]→と変わります。
繰り替えすので、一番古い位置に新しいADC値を入れる事になります。

for (char i = 0; i < 4; i++)target += adc[i];
は、for文を取ると
target=target+adc[0];
target=target+adc[1];
target=target+adc[2];
target=target+adc[3];
です。
実際はその上で
unsigned int target = 0;
をしていますから、ここに入る前はtargetは0になっています。なので、
target=adc[0]+adc[1]+adc[2]+adc[3];
と同じです。
猛牛ロック   2019/06/03(Mon) 13:06 No.1531
Re: 続続続続ーPWM
コンパイルできましたが、動作しません!?
RB3が点灯したままです。
これで、正常でしょうか?

RA3は、増加時でに点灯、減時に消灯、これで正常でしょうか?
RA3は、多少、ふらふらしている感じです。
具体的には、VRが停止したままだと、ONになっています。
TR   2019/06/03(Mon) 13:22 No.1532
Re: 続続続続ーPWM
RA3は、増加時でに点灯、減時に消灯、これで正常でしょうか?
RA3は、多少、ふらふらしている感じです。
具体的には、VRが停止したままだと、ONになっています。

プログラム中に
//INCピン(RB3)はプルダウン
の記述があったので、このピンがincピンだと思い、
#define inc LATB3
としました。
incピンは平時HIGHです。
なので、プルアップ抵抗は必要では無いし、付けるとしてもプルアップ抵抗、と言いました。
勿論、これはクロックピンに相当しますから、上げ下げする時に動きます。

なので、凡そ予定通りの動きです。
ちゃんと動いているかは実際の抵抗値で計測してください。
猛牛ロック   2019/06/03(Mon) 14:23 No.1533
Re: 続続続続ーPWM
#define inc LATB3
#define ud LATA3


void x9c_dowm(void) {
ud = 0;
inc = 0;
__delay_us(1);
inc = 1;

if (x9c_val > 0)x9c_val--;
//次の上げ下げは500us空ける
}


INCは、マニュアルでは、上方から下方へダウンしているので、
プログラムを逆にするのでは?


inc = 0;    1に変更
__delay_us(1);
inc = 1;    0に変更


追記
&3とありますが、
ビット演算子のことですか?
TR   2019/06/03(Mon) 14:41 No.1534
Re: 続続続続ーPWM
maboさん、
猛牛ロックさんへ

今回のプログラム、もっと熟読します。
で、
もう少し頑張ろうかと思います。
ADコンバートした値などを、ご紹介くださったモニターで確認することはできますか?
http://akizukidenshi.com/catalog/g/gP-00038/
TR   2019/06/03(Mon) 15:03 No.1535
Re: 続続続続ーPWM
勿論そのLCDに表示する事も可能ですけど、
私はデバック用ならI2Cタイプをお薦めします。
使用ピンが少ないので対応し易いです。

もっと簡易的ならTM1637チップの7セグです。
https://www.amazon.co.jp/dp/B07FL5Y9ND/

でも、今の段階はまだPCが近くですよね?
そのままMPLAB Xのデバックで表示させた方が良いのではないかと思います。


**********
> INCは、マニュアルでは、上方から下方へダウンしているので、
> プログラムを逆にするのでは?
>
>
> inc = 0;    1に変更
> __delay_us(1);
> inc = 1;    0に変更

違います。変えては駄目です。ここに入る前、つまり平常時がHIGHです。
incピンを下げて、1usその状態を保って、highにして、500us待ちます。
※待つのはループの1msで実現させています。
上下を決めるのは、incを0にした瞬間のudピンの状態です。
猛牛ロック   2019/06/03(Mon) 15:22 No.1536
Re: 続続続続ーPWM
adc[(++num)&3] = adconv();


これの&3、&はビット演算子でしょうか?
教わった中で、ビットをマスク処理したときに使いました。
でも、1を返しました。
&3の3は何なのでしょうか?



KKHMF 4デジタル表示モジュールLED明るさ調節可能 時計付き

商品を見ました。
ピンの機能に、「DIOはデータ入力出力ピン,」
とありました。
これに繋ぐとどんなことができるのでしょうか?
プログラムは簡単なのでしょうか?
簡単なサイトがありますか?

+++++
今気が付いたのですが、
プログラムにCSピンを制御することが抜けています。
どうしたらよいでしょうか??


追記
3を2進数にしたら11でした。
なので、
    0 0        0 1
    1 1        1 1
    0 0        0 1

10進数     0           1


猛牛ロックさん、凄い!!
TR   2019/06/03(Mon) 15:57 No.1537
Re: 続続続続ーPWM
> これの&3、&はビット演算子でしょうか?
そうです。

> 教わった中で、ビットをマスク処理したときに使いました。
> でも、1を返しました。
これもマスク処理です。内容が1なので1を返したのでしょう。
次のループ時には2を返すはずです。

> &3の3は何なのでしょうか?
3は3です。0b11でも0x03でも同じです。
この場合は0b11の方が判りやすいでしょう。
つまり、下位2ビットだけ取り出しています。

> これに繋ぐとどんなことができるのでしょうか?
単なる4桁の7セグです。7セグなので主に数値しか表示できません。
特別な事はインターフェイスが2本になって、簡単に繋げられる、という事だけです。
※これを2つ使って、目標回転数(上段)と実際の回転数(下段)を表示させたらいいのでは?と思っていたものです。
実物は小さいですけどね。

> プログラムは簡単なのでしょうか?
まぁ、出来る事が簡単(数字だけ)な事だけなので、キャラクタ液晶よりかは簡単な制御(コマンド)です。

サイトに関しては検索したことが無いので判りませんけど、有名なモジュールなので山ほどあるかと思います。
猛牛ロック   2019/06/03(Mon) 16:38 No.1538
Re: 続続続続ーPWM
+++++
今気が付いたのですが、
プログラムにCSピンを制御することが抜けています。
どうしたらよいでしょうか??
TR   2019/06/03(Mon) 16:53 No.1539
Re: 続続続続ーPWM
え?今更ですか?

CSピンは制御しない=LOWで固定じゃないんですか?
猛牛ロック   2019/06/03(Mon) 17:20 No.1540
Re: 続続続続ーPWM
了解です。

ということは、
プログラムで
PORTA = 0x00; //全てLo
PORTB = 0x00; //全てLo
この記載で足りるということですか?

そうであれば、PICの入力ピンか出力ピンに繋ぐということですよね?


追記
マニュアルに拘りました。
それに、x9c103のピンも何処かに繋げておいた方が
安定するとも思いました。


その他には、GNDでしょうか?
TR   2019/06/03(Mon) 17:43 No.1541
Re: 続続続続ーPWM
デジタル可変抵抗の結線図です。
一応、猛牛ロックさんから教えて頂いたように、オペアンプも付けました。
ローパスフィルターですが、様子見にしました。
デジタル可変抵抗は、今頃、お舟でしょうか。
来たら、一応テストをしてみます。

猛牛ロックさん、maboさん、大変ありがとうございました。
改めて、C言語にお強いと思いました。
なんでも、こなせて大変うらやましいです。
自分も、今回の件を、もっと読み込みたいと思います。
しかし、複合演算や、配列も関数と組み合わされて、大変難しかったです。

何か、気になったら、ご指摘願います。

CSは、GNDにしました。UDにも、オペアンプはつけます。

TR   2019/06/03(Mon) 21:19 No.1542
Re: 続続続続ーPWM
TRさん,猛牛ロックさん,こんばんは。

********TRさんへ********
TRさん,猛牛ロックさんのプログラムで,ちょっと。

LEDで点滅の動作を確認するには,

void x9c_up(void) {
int ud = 1;
*****
int inc = 0;
*****
__delay_us(1);
int inc = 1;
if (x9c_val < 99)x9c_val++;
//次の上げ下げは500us空ける
}

の****の部分に,__delay_ms(100);
とか,挿入すると,確認できると思います。
点滅の具合は,数値の増減で,いかようにもできるかも。

それと,
>ADコンバートした値などを、ご紹介くださったモニターで確>認することはできますか?
http://akizukidenshi.com/catalog/g/gP-00038/

確認できます。私は,LCDで確認してます。

XIDEでも確認できるのでしょうが,面倒というか,やり方が

よく分からないとこもあるので,実機で確認してます。

猛牛ロックさんは,I2Cのものをご紹介くださってますが,

私にには,ちょっと,設定が面倒で,未だ使ってない状態です。

私が取り上げたものなら,表示のライブラリーがありますので,比較的容易にできます。

特別な設定等もありません。あるとすれば,使用するピン
を #define で指定するだけです。

それと,1542の配線図ですが,SECさんからの入力に,
抵抗とコンデンサーはないようです。

これないと,PWMがデジタルのまま入ります。



******猛牛ロックさんへ******
今日,PWMの出力に抵抗とコンデンサーを入れたのを

オシロで確認したり,ADCで取り込んだりしてみました。

22kと10μFですが,リップルとスパイク?等あるみたいでした。

フェライト入れても変化なしでした。

mabo   2019/06/03(Mon) 22:04 No.1543
Re: 続続続続ーPWM
maboさん、こんばんは。

点滅の件、ありがとございます。
あくまでも確認用ですね。


>私が取り上げたものなら,表示のライブラリーがありますので,比較的容易にできます。

特別な設定等もありません。あるとすれば,使用するピン
を #define で指定するだけです。

AD値などを確認できるのでしょうか?
済みませんが、URLを教えてください。


ローパスフィルターを入れない理由は、
自分の場合、ML4の可変抵抗の代わりに、デジタル可変抵抗を入れ替えるので、
うまくいったら、ローパスフィルターなしで行けるかもと思いました。

maboさんの場合は、自分と違って、
maboさんの場合は、
SEC基板、もしくは、smoothstepperからのPWM信号をモーターのインターフェースに繋ぐので、
PWMから、DC ボルトのアナログにしたかったという点でしたよね?

ただ、リップルとか、スパイクとかは、ネット検索しましたが、よくわかりませんでした。
余計な電流という程度の理解です。


追伸
maboさんのプログラムですが、言われたとおりに変えたつもりですが、
どうして動作しなかったのかわからなくて、大変残念です。
若し、理由が分かれば教えてください。
No1519です。
TR   2019/06/03(Mon) 22:24 No.1544
Re: 続続続続ーPWM
TRさん,LCDのライブラリーのURLちょっと失念です。

私の使ってるのアップしておきます。

http://mabo52.sakura.ne.jp/files/lcd-h.txt

http://mabo52.sakura.ne.jp/files/lcd-c.txt

使い方等は,下記見るとプログラムでてますので,

http://physics.cocolog-nifty.com/weblog/2012/07/post-b055.html

参考になるかと。

このファイル,コンパイルするとワーニングがでますが,

大丈夫です。

それぞれ,lcd.h lcd.c にして使ってください。


それと,

>自分の場合、ML4の可変抵抗の代わりに、デジタル可変抵抗を入れ替えるので、
>うまくいったら、ローパスフィルターなしで行けるかもと思いました。

これ,ちょっと違うかと思います。

MACHからの信号を受け取るのに,今回の私や猛牛ロックさんのプログラムは,

AD変換で受け取ってますので,抵抗とコンデンサーいれて,
直流変換してあげないと,受け取ることでないと思います。

猛牛ロックさんの言われたように,デジタルでそのまま受け取ってもいいのですが,

MACHから出てるPWMをそのままうけとるとなると,
PWMのDUTY比を計算しなければ,デジタルポテンショメーターの抵抗への換算できませんので,

外部割り込みやtimer割り込みで,サンプリングするなど,

手順がちょっと,面倒になるかと思います。

MACHからのPWMで直接モーターをコントロールできれば,
問題ないのですが。

今回は,間にデジタルポテンショメーターが入るので。
mabo   2019/06/03(Mon) 22:59 No.1545
Re: 続続続続ーPWM
maboさんおはようございます。
早速に、ご紹介くださった ↓ を拝見しました。
http://physics.cocolog-nifty.com/weblog/2012/07/post-9765.html
液晶のSD1602から、PICにつながっているRB0,RB1,RB2,RB3があります。
PIC側の端子を変えるにはどうしたらよいでしょうか?

下記タイトルプログラムを見ると、itoa(str,tmp,10);
lcd_clear(); //表示クリア
lcd_goto(0); //カーソルを0行目の先頭に移動する
lcd_puts(str);
lcd_puts("mV");
この部分が怪しい??


使い方の確認ですが、
PICを写真のように結線し、PICにプログラムを書き込めばOKでしょうか?

必要なものは、
SD1602と液晶のコントラスト調整用にSD1602のVO端子に10kオームの
可変抵抗をつなぐだけみたいですが、よろしいでしょうか?




  プログラムタイトル
/************************************
16F88 HI-TECH C v.9.83
RA0(AN0)の入力電圧をA/D変換してLCDに表示する
************************************/
 略





それと、maboooooさんの ↓のプログラムと、ご紹介くださったPICに書き込むプログラムは
内容が違うようですけど、どういった使い分けをするのでしょうか?

http://mabo52.sakura.ne.jp/files/lcd-h.txt

http://mabo52.sakura.ne.jp/files/lcd-c.txt


そうか、maboさんのは、プロトタイプ宣言をした関数なんだ。
例えば、LCDをクリアしたいとすれば、次の関数を宣言するんだ ↓
* lcd_clear - &#8218;k&#8218;b&#8218;c&#402;&#8218;&#402;W&#402;…&#129;[&#402;&#8249;&#8218;&Igrave;‰&aelig;&#8211;&Ecirc;&#8218;&eth;&#143;&Aacute;&#8218;&middot;&#143;&#710;&#8212;&#157; *
*******************************************************************************/
void lcd_clear(void){
LCD_RS = 0 ;
lcd_write(0x01) ; // Clear Display : ‰&aelig;&#8211;&Ecirc;‘S‘&Igrave;&#8218;&Eacute;20H&#8218;&Igrave;&frac12;&Iacute;&szlig;°&frac12;&#8218;&Aring;&#8226;\&#381;&brvbar;&#129;A¶°&iquest;&Ugrave;&#8218;&Iacute;col=0,row=0&#8218;&Eacute;&#710;&Uacute;“&reg;
__delay_ms(2) ; // LCD&#8218;&ordf;&#143;&#710;&#8212;&#157;(1.53ms)&#8218;&middot;&#8218;&eacute;&#8218;&Igrave;&#8218;&eth;‘&Ograve;&#8218;&iquest;&#8218;&Uuml;&#8218;&middot;
}



でも、文字化けが凄いけど、気にしなくてOK??
TR   2019/06/04(Tue) 07:25 No.1546
Re: 続続続続ーPWM
TRさん,猛牛ロックさん,おはようございます。

TRさん,使い方ですが,まず

 lcd-h.txt→→lcd.h

 lcd-c.txt→→lcd.c

のように名前を変更してください。

文字化けは,ブラウザの表示で,エンコーディングの設定かえてみてください。

この二つのファイルが使うときに必要になりますが,この二つのファイルはいじりません。

適当な場所に保存しておいてください。私は,二つとも,
main.cと同じ場所に置いてあります。

XIDEで,次の操作をしてください。

main.cがおいてあると思いますが,

 Source Files を右クリック
  ↓
 Add Existing Item

で,lcd.c を選択して,Source Files にlcd.cを
付け加えてください。

同じように,Header Files を右クリック,Add Existing Item
で,lcd.hを加えてください。

あとは,main.c に下記のような必要な関数を書き加え
コンパイルすれば,LCDが使えるようになります。

lcd_init();lcd初期化
lcd_clear(); //表示クリア
lcd_goto(0); //カーソルを0行目の先頭に移動する
lcd_setCursor(0,0)
lcd_puts(str);
lcd_puts("mV")

文字化けだとういうことで,こちらに貼り付けて見ます。

使うピンを変更するには,lcd.cの

#define LCD_RS RA1
#define LCD_EN RA3
#define LCD_D4 RB4
#define LCD_D5 RB5
#define LCD_D6 RB6
#define LCD_D7 RB7

の部分を変更します。

表示するには,文字の操作が必要になりますので,

前回紹介した,PICのお勉強 さんのHPのプログラム
参考にしてみてください。

itoa(str,hozon,10);

が必要です。

ーーーーlcd.hーーーー
/*
* LCD interface header file
* See lcd.c for more info
*/

/* write a byte to the LCD in 4 bit mode */



extern void lcd_write(unsigned char);

/* Clear and home the LCD */

extern void lcd_clear(void);

/* write a string of characters to the LCD */

extern void lcd_puts(const char * s);

/* Go to the specified position */

//extern void lcd_goto(unsigned char);

extern void lcd_goto(unsigned char);

/* intialize the LCD - call before anything else */

extern void lcd_init(void);

extern void lcd_putch(char);

extern void lcd_setCursor(int,int);

/* Set the cursor position */

#define lcd_cursor(x) lcd_write(((x)&0x7F)|0x80)


ーーーーーlcd.cーーーー
#include <stdlib.h>
#include <pic.h>
#include <htc.h> // delay用

#define _XTAL_FREQ 8000000

#include "lcd.h"

/*******************************************************************************
* 異なるピンを使う場合はここを変更する *
*******************************************************************************/

#define LCD_RS RA1
#define LCD_EN RA3
#define LCD_D4 RB4
#define LCD_D5 RB5
#define LCD_D6 RB6
#define LCD_D7 RB7

#define LCD_STROBE() ((LCD_EN=1),(LCD_EN=0))

/*******************************************************************************
* 秋月LCDピン配列 *
*******************************************************************************/
//LCD_RS・・・4
//LCD_EN・・・6
//LCD_D4・・・11
//LCD_D5・・・12
//LCD_D6・・・13
//LCD_D7・・・14
/*******************************************************************************
* lcd_write-LCDにデータを送信 *
*******************************************************************************/
void lcd_write(unsigned char c){
// 送信データのバイト列上位4ビットを処理
LCD_D4 = ( ( c >> 4 ) & 0x01 ) ;
LCD_D5 = ( ( c >> 5 ) & 0x01 ) ;
LCD_D6 = ( ( c >> 6 ) & 0x01 ) ;
LCD_D7 = ( ( c >> 7 ) & 0x01 ) ;
LCD_STROBE() ;
// 送信データのバイト列下位4ビットを処理
LCD_D4 = ( ( c ) & 0x01 ) ;
LCD_D5 = ( ( c >> 1 ) & 0x01 ) ;
LCD_D6 = ( ( c >> 2 ) & 0x01 ) ;
LCD_D7 = ( ( c >> 3 ) & 0x01 ) ;
LCD_STROBE() ;
}

/*******************************************************************************
* command- LCDにコマンドを発行する処理 *
*******************************************************************************/
void command(unsigned char c){
LCD_RS = 0 ;
LCD_D4 = ( ( c ) & 0x01 ) ;
LCD_D5 = ( ( c >> 1 ) & 0x01 ) ;
LCD_D6 = ( ( c >> 2 ) & 0x01 ) ;
LCD_D7 = ( ( c >> 3 ) & 0x01 ) ;
LCD_STROBE() ;
}
/*******************************************************************************
* lcd_clear - LCDモジュールの画面を消す処理 *
*******************************************************************************/
void lcd_clear(void){
LCD_RS = 0 ;
lcd_write(0x01) ; // Clear Display : 画面全体に20Hのスペースで表示、カーソルはcol=0,row=0に移動
__delay_ms(2) ; // LCDが処理(1.53ms)するのを待ちます
}

/*******************************************************************************
* lcd_setCursor - LCDモジュール画面内のカーソル位置を移動する処理 *
* col : 横(列)方向のカーソル位置(0-15) *
* row : 縦(行)方向のカーソル位置(0-1) *
********************************************************************************/
void lcd_setCursor(int col, int row){
int row_offsets[] = { 0x00, 0x40 } ;

LCD_RS = 0 ;
lcd_write(0x80 | (col + row_offsets[row])) ; // Set DDRAM Adddress : 00H-0FH,40H-4FH
}
/*******************************************************************************
* lcd_putc - LCDにデータを1バイト出力する処理 *
* c : 出力する文字データ *
*******************************************************************************/
void lcd_putc(char c){
LCD_RS = 1 ; // RSの制御信号線をセットします
lcd_write( c ) ; // LCDにデータの送信
}

/*******************************************************************************
* lcd_goto - Go to the specified position *
* c : 出力する文字データ *
*******************************************************************************/
void lcd_goto(unsigned char pos){
LCD_RS = 0;
lcd_write(0x80+pos);
}

/*******************************************************************************
* lcd_puts - LCDに文字列データを出力する処理(文字列をNULL(0x00)まで繰返し出力)*
* s : 出力する文字列のデータ *
*******************************************************************************/
void lcd_puts(const char * s){
LCD_RS = 1 ; // RSの制御信号線をセットします
while(*s) lcd_write(*s++) ;
}

/*******************************************************************************
* lcd_init - LCDの初期化処理 *
*******************************************************************************/
void lcd_init(){
LCD_RS = 0 ;
LCD_EN = 0 ;

__delay_ms(30) ; // 電源ON後15msまで待ってから初期化

// LCDの立上げ時のチェックデータ(イニシャライズ処理用)を設定
command(0x03) ;
__delay_ms(10) ;
command(0x02) ;
// LCDにコマンドを発行します
lcd_write(0x28) ; // function set : データ線は4本・表示は2行・フォントは5x8ドット
lcd_write(0x0c) ; // display control: 画面表示はON・カーソル表示はOFF・カーソル点滅はOFF
lcd_clear() ; // Clear Display : 画面をクリアし、カーソル位置はcol=0,row=0
lcd_write(0x06) ; // entry mode set : 文字を表示した次にカーソルを移動するを指示
}
mabo   2019/06/04(Tue) 08:32 No.1548
Re: 続続続続ーPWM
追記です。

「PICのお勉強」 さんのプログラムや,

結線仕方を参考になるかと思います。

別なプログラムで,LCDを使うのには,

同じように,lcd.c と lcd.h を付け加えます。

main.cのプログラムから,この二つを参照する形です。

main.cの先頭には,

 #include "lcd.h"

を書いてください。

プロジェクトにきちんと付け加えられていれば,

いつものようにコンパイルすると,二つのcのプログラムが
それぞれコンパイルされて,一つになります。

蛇足ですが,チャージポンプの回路,LCDに組み込むと,
3V〜5Vの範囲で使えるようになりますが,

ちょっと,面倒です。

http://mabo52.sakura.ne.jp/index.php?e=1202

mabo   2019/06/04(Tue) 08:52 No.1549
Re: 続続続続ーPWM
猛牛ロックさん、おはようございます。
細かい点ですみません。
21行目 次の上げ下げは500マイクロs空けると有りますが、48行目で、1マイクロsとなっているので、齟齬?
TR   2019/06/04(Tue) 10:33 No.1550

処理 記事No 暗証キー

- JoyfulNote v6.02 -
++ Edited by Hamel ++