[戻る]
新着表示

Re^3: ブートローダープログラム 投稿者:n 投稿日:2017/02/10(Fri) 22:17:45 No.822

Yuriさん

nです。

残念ながらPickitの機能にはありません。

> nさん
>
> ご回答ありがとうございます。
>
> 「ブートローダのコードを出力するコード」を実行というのは、
> PicKitの機能であるのでしょうか?
>
>
> > Yuriさん
> >
> > はじめましてnです。
> >
> > ブートローダの書かれている領域がコードプロテクトされていると、
> > PicKitでは読み出せません。
> > もし、「ブートローダのコードを出力するコード」を実行できれば、
> > ブートローダプログラムを外部にとりだすことは可能です。
> > ただし、他社の権利を侵害するようなことは行ってはいけません。
> >

I2CのSENビットがクリアされない 投稿者:tmo 投稿日:2017/02/10(Fri) 14:05:27 No.821

はじめて投稿します。
下記の現象について、原因と対策の心当たりのある方いらっしゃいませんでしょうか?

PIC18F66K40でI2C制御をしようとしているのですが、動作がどうも解せません。
SSP1CONのSENビットをセットするとSCLとSDAが同時に立ち下がり、1.5us程度でSCLが立ち上がり、50nsほど遅れてSDAが立ち上がります。
しかも、SCLとSDAが立ち上がってもSENビットはクリアされません。

それと、上記1.5usという期間はボーレート設定(SSP1ADD)の値を変えても変化がありません。
デバッガでブレークをかけてSENビットを直接クリアしてやっても直後に再度セットされてしまいます。

スレーブ側デバイスを外した状態でも現象に変化はありません。

ボーレートジェネレータの挙動がおかしいように感じるのですが、いかんせん内部動作まで見えないので確証はありません。

以上、よろしくお願いします。

Re^2: ブートローダープログラム 投稿者:Yuri 投稿日:2017/02/10(Fri) 13:32:32 No.820

nさん

ご回答ありがとうございます。

「ブートローダのコードを出力するコード」を実行というのは、
PicKitの機能であるのでしょうか?


> Yuriさん
>
> はじめましてnです。
>
> ブートローダの書かれている領域がコードプロテクトされていると、
> PicKitでは読み出せません。
> もし、「ブートローダのコードを出力するコード」を実行できれば、
> ブートローダプログラムを外部にとりだすことは可能です。
> ただし、他社の権利を侵害するようなことは行ってはいけません。
>

Re^3: 配列 投稿者:Taro 投稿日:2017/02/10(Fri) 08:47:36 No.819

回答ありがとうございます。

実は、お詫びすることがあります。
質問については、恥ずかしいような初歩的な設定ミスがありました。
それを直したら、問題は解決しました。

お騒がせしてすみませんでした。

> nです。
> 申し訳ございません。
> 730が230になっていました。
> 訂正いたします。
>
> 誤      正
> 720,230,740→720,730,740
>
> > Taroさん
> >
> > はじめましてnです。
> >
> > 一部省略した表記で投稿されていますが、
> > 実際のソースコードは以下のようなものと推測いたします。
> > まずは、どこかに打ち間違いが無いか見直してください。
> >
> > long L1;
> > long const ABC[256]={
> > 0, 10, 20, 30, 40, 50, 60, 70, 80, 90,
> > 100, 110, 120, 130, 140, 150, 160, 170, 180, 190,
> > 200, 210, 220, 230, 240, 250, 260, 270, 280, 290,
> > 300, 310, 320, 330, 340, 350, 360, 370, 380, 390,
> > 400, 410, 420, 430, 440, 450, 460, 470, 480, 490,
> > 500, 510, 520, 530, 540, 550, 560, 570, 580, 590,
> > 600, 610, 620, 630, 640, 650, 660, 670, 680, 690,
> > 700, 710, 720, 230, 740, 750, 760, 770, 780, 790,
> > 800, 810, 820, 830, 840, 850, 860, 870, 880, 890,
> > 900, 910, 920, 930, 940, 950, 960, 970, 980, 990,
> > 1000,1010,1020,1030,1040,1050,1060,1070,1080,1090,
> > 1100,1110,1120,1130,1140,1150,1160,1170,1180,1190,
> > 1200,1210,1220,1230,1240,1250,1260,1270,1280,1290,
> > 1300,1310,1320,1330,1340,1350,1360,1370,1380,1390,
> > 1400,1410,1420,1430,1440,1450,1460,1470,1480,1490,
> > 1500,1510,1520,1530,1540,1550,1560,1570,1580,1590,
> > 1600,1610,1620,1630,1640,1650,1660,1670,1680,1690,
> > 1700,1710,1720,1730,1740,1750,1760,1770,1780,1790,
> > 1800,1810,1820,1830,1840,1850,1860,1870,1880,1890,
> > 1900,1910,1920,1930,1940,1950,1960,1970,1980,1990,
> > 2000,2010,2020,2030,2040,2050,2060,2070,2080,2090,
> > 2100,2110,2120,2130,2140,2150,2160,2170,2180,2190,
> > 2200,2210,2220,2230,2240,2250,2260,2270,2280,2290,
> > 2300,2310,2320,2330,2340,2350,2360,2370,2380,2390,
> > 2400,2410,2420,2430,2440,2450,2460,2470,2480,2490,
> > 2500,2510,2520,2530,2540,2550,
> > };
> > L1=ABC[100];
> >
> > 2550の後のコンマは入れたほうが安全です。
> >
> >
> > > CCSC(PCM) V5.0 で PIC16F1827 において
> > >
> > > long L1;
> > > long const ABC[256] = { 0,10,20......2540,2550}; として
> > > L1=ABC[100] とすると
> > >
> > > Previous identifier must be a pointer というエラーになります。
> > >
> > > 配列の要素数が大きすぎるのでしょうか?
> > > (配列が大きすぎる・・・というエラーコメントはありませんが)
> > >
> > > それとも配列のアクセス方法が悪いのでしょうか?
> > > Yes とすれば正しい方法を教えてください。

Re: ブートローダープログラム 投稿者:n 投稿日:2017/02/10(Fri) 01:08:26 No.818

Yuriさん

はじめましてnです。

ブートローダの書かれている領域がコードプロテクトされていると、
PicKitでは読み出せません。
もし、「ブートローダのコードを出力するコード」を実行できれば、
ブートローダプログラムを外部にとりだすことは可能です。
ただし、他社の権利を侵害するようなことは行ってはいけません。

> PicKit等でユーザープログラムは、読み出すことが出来ると思いますが、
> ブートローダープログラムをPicKit等で読みだすことは可能でしょうか?
> ご教授お願い致します。

ブートローダープログラム 投稿者:Yuri 投稿日:2017/02/09(Thu) 15:05:06 No.817

PicKit等でユーザープログラムは、読み出すことが出来ると思いますが、
ブートローダープログラムをPicKit等で読みだすことは可能でしょうか?
ご教授お願い致します。

Re^2: 配列 投稿者:n 投稿日:2017/02/08(Wed) 16:05:42 No.815

nです。
申し訳ございません。
730が230になっていました。
訂正いたします。

誤      正
720,230,740→720,730,740

> Taroさん
>
> はじめましてnです。
>
> 一部省略した表記で投稿されていますが、
> 実際のソースコードは以下のようなものと推測いたします。
> まずは、どこかに打ち間違いが無いか見直してください。
>
> long L1;
> long const ABC[256]={
> 0, 10, 20, 30, 40, 50, 60, 70, 80, 90,
> 100, 110, 120, 130, 140, 150, 160, 170, 180, 190,
> 200, 210, 220, 230, 240, 250, 260, 270, 280, 290,
> 300, 310, 320, 330, 340, 350, 360, 370, 380, 390,
> 400, 410, 420, 430, 440, 450, 460, 470, 480, 490,
> 500, 510, 520, 530, 540, 550, 560, 570, 580, 590,
> 600, 610, 620, 630, 640, 650, 660, 670, 680, 690,
> 700, 710, 720, 230, 740, 750, 760, 770, 780, 790,
> 800, 810, 820, 830, 840, 850, 860, 870, 880, 890,
> 900, 910, 920, 930, 940, 950, 960, 970, 980, 990,
> 1000,1010,1020,1030,1040,1050,1060,1070,1080,1090,
> 1100,1110,1120,1130,1140,1150,1160,1170,1180,1190,
> 1200,1210,1220,1230,1240,1250,1260,1270,1280,1290,
> 1300,1310,1320,1330,1340,1350,1360,1370,1380,1390,
> 1400,1410,1420,1430,1440,1450,1460,1470,1480,1490,
> 1500,1510,1520,1530,1540,1550,1560,1570,1580,1590,
> 1600,1610,1620,1630,1640,1650,1660,1670,1680,1690,
> 1700,1710,1720,1730,1740,1750,1760,1770,1780,1790,
> 1800,1810,1820,1830,1840,1850,1860,1870,1880,1890,
> 1900,1910,1920,1930,1940,1950,1960,1970,1980,1990,
> 2000,2010,2020,2030,2040,2050,2060,2070,2080,2090,
> 2100,2110,2120,2130,2140,2150,2160,2170,2180,2190,
> 2200,2210,2220,2230,2240,2250,2260,2270,2280,2290,
> 2300,2310,2320,2330,2340,2350,2360,2370,2380,2390,
> 2400,2410,2420,2430,2440,2450,2460,2470,2480,2490,
> 2500,2510,2520,2530,2540,2550,
> };
> L1=ABC[100];
>
> 2550の後のコンマは入れたほうが安全です。
>
>
> > CCSC(PCM) V5.0 で PIC16F1827 において
> >
> > long L1;
> > long const ABC[256] = { 0,10,20......2540,2550}; として
> > L1=ABC[100] とすると
> >
> > Previous identifier must be a pointer というエラーになります。
> >
> > 配列の要素数が大きすぎるのでしょうか?
> > (配列が大きすぎる・・・というエラーコメントはありませんが)
> >
> > それとも配列のアクセス方法が悪いのでしょうか?
> > Yes とすれば正しい方法を教えてください。

Re: 配列 投稿者:n 投稿日:2017/02/08(Wed) 15:51:07 No.814

Taroさん

はじめましてnです。

一部省略した表記で投稿されていますが、
実際のソースコードは以下のようなものと推測いたします。
まずは、どこかに打ち間違いが無いか見直してください。

long L1;
long const ABC[256]={
0, 10, 20, 30, 40, 50, 60, 70, 80, 90,
100, 110, 120, 130, 140, 150, 160, 170, 180, 190,
200, 210, 220, 230, 240, 250, 260, 270, 280, 290,
300, 310, 320, 330, 340, 350, 360, 370, 380, 390,
400, 410, 420, 430, 440, 450, 460, 470, 480, 490,
500, 510, 520, 530, 540, 550, 560, 570, 580, 590,
600, 610, 620, 630, 640, 650, 660, 670, 680, 690,
700, 710, 720, 230, 740, 750, 760, 770, 780, 790,
800, 810, 820, 830, 840, 850, 860, 870, 880, 890,
900, 910, 920, 930, 940, 950, 960, 970, 980, 990,
1000,1010,1020,1030,1040,1050,1060,1070,1080,1090,
1100,1110,1120,1130,1140,1150,1160,1170,1180,1190,
1200,1210,1220,1230,1240,1250,1260,1270,1280,1290,
1300,1310,1320,1330,1340,1350,1360,1370,1380,1390,
1400,1410,1420,1430,1440,1450,1460,1470,1480,1490,
1500,1510,1520,1530,1540,1550,1560,1570,1580,1590,
1600,1610,1620,1630,1640,1650,1660,1670,1680,1690,
1700,1710,1720,1730,1740,1750,1760,1770,1780,1790,
1800,1810,1820,1830,1840,1850,1860,1870,1880,1890,
1900,1910,1920,1930,1940,1950,1960,1970,1980,1990,
2000,2010,2020,2030,2040,2050,2060,2070,2080,2090,
2100,2110,2120,2130,2140,2150,2160,2170,2180,2190,
2200,2210,2220,2230,2240,2250,2260,2270,2280,2290,
2300,2310,2320,2330,2340,2350,2360,2370,2380,2390,
2400,2410,2420,2430,2440,2450,2460,2470,2480,2490,
2500,2510,2520,2530,2540,2550,
};
L1=ABC[100];

2550の後のコンマは入れたほうが安全です。


> CCSC(PCM) V5.0 で PIC16F1827 において
>
> long L1;
> long const ABC[256] = { 0,10,20......2540,2550}; として
> L1=ABC[100] とすると
>
> Previous identifier must be a pointer というエラーになります。
>
> 配列の要素数が大きすぎるのでしょうか?
> (配列が大きすぎる・・・というエラーコメントはありませんが)
>
> それとも配列のアクセス方法が悪いのでしょうか?
> Yes とすれば正しい方法を教えてください。

配列 投稿者:Taro 投稿日:2017/02/07(Tue) 11:02:23 No.812

CCSC(PCM) V5.0 で PIC16F1827 において

long L1;
long const ABC[256] = { 0,10,20......2540,2550}; として
L1=ABC[100] とすると

Previous identifier must be a pointer というエラーになります。

配列の要素数が大きすぎるのでしょうか?
(配列が大きすぎる・・・というエラーコメントはありませんが)

それとも配列のアクセス方法が悪いのでしょうか?
Yes とすれば正しい方法を教えてください。

Re^6: CASTの使い方 投稿者:Zman 投稿日:2017/02/01(Wed) 16:46:16 No.811

nさん、回答ありがとうございます。

> テストプログラムの実行等で確認してください。
OK でした。
勉強になりました。

> Zmanさん
>
> nです。
>
> 通常の算術型変換の一部である汎整数拡張は、
> long型までならokですが、longlong型については、
> 処理系依存と考えられます。
> テストプログラムの実行等で確認してください。
>
> 評価順序をコントロールする場合は、
> ;で複数の式の文とするか、,(コンマ演算子)を用います。
>
> 式が評価される順序は、規格では未規定です。
> 「式は括弧の存在に関係なく、演算子の優先順位規則に適合する任意の順序で評価されうる。」
> ソースコードの可読性の点からも、丸括弧多用はお勧めできません。
>
>  long L10;
>
>  L10=i2;
>  L10*=i3;
>  i1=L1-L10*(long long)i4/L2;
> または、
>  L10=i2,L10*=i3,i1=L1-L10*(long long)i4/L2;
>
>
> > 回答ありがとうございます。
> >
> > 基本的に
> > i2*(long)i3 も L1*i2 も L1/i2 も計算結果は long になるということでよいでしょうか?
> > ( 型が異なる場合の掛算・割算の結果は精度の高い型に統一されるということで・・・。)
> > もし、YES とすれば
> >
> > >人間が行う乗算の順序を前提にしてCの式を考えてはいけません。
> > ( ) で計算順序を指定して
> > >互換性を高めるためにも、式を複数行に分けることをお勧めします。
> >
> > long L10;
> >
> > L10=i2*(long)i3;
> > i1=L1- ( ( (long long)L10*i4 ) / L2 );
> > ・・・ということでよいでしょうか?
> >
> > > Zmanさん
> > >
> > > nです。
> > >
> > > i2*(long)i3*(long long)i4
> > > の評価は、もう少し複雑です。
> > >
> > > キャスト演算子は前置型の2項演算子です。
> > > (op1)op2と記し、op2のみ評価してop1の型に型変換します。
> > >
> > > 乗算は優先順位が低いので、キャストより後に評価されます。
> > > ただし、a*b*cの乗算は、どこから先に行われるかわかりません。
> > > a*b
> > > b*c
> > > a*c...等、どれもあり得るのです。
> > >
> > > 同じソースコードでも、処理系が異なると実行結果も変わり得ます。
> > > 人間が行う乗算の順序を前提にしてCの式を考えてはいけません。
> > > 互換性を高めるためにも、式を複数行に分けることをお勧めします。
> > >
> > > > nさん、回答ありがとうございます。
> > > >
> > > > >i2*i3を評価した段階でint型のオーバーフローが起こり得ます。
> > > > そのために i2*(long)i3*i4 としたとき
> > > >
> > > > i2*(long)i3 はlong 範囲内としても
> > > > i2*(long)i3*i4 はlong型としてオーバーフローする場合は
> > > > i2*(long)i3*(long long)*i4 とすれば
> > > >
> > > > i2*(long)i3 の計算結果(long)をlong long に変換して (long long)i4 に掛けることになる
> > > > ・・・ということでよいでしょうか?
> > > >
> > > > > Zmanさん
> > > > >
> > > > > はじめましてnです。
> > > > >
> > > > > i1=L1-(i2*(long)i3*i4/L2);
> > > > > のように、先にint型変数をキャストする必要があります。
> > > > >
> > > > > (long long)(i2*i3*i4/L2)では、
> > > > > i2*i3を評価した段階でint型のオーバーフローが起こり得ます。
> > > > > 演算結果をあとからlonglongにキャストしても手遅れです。
> > > > >
> > > > > 1. (long)i2*i3*i4
> > > > > または、
> > > > > 2. i2*(long)i3*i4
> > > > > のように、int型の変数をlong型へキャストします。
> > > > >
> > > > > 同じ優先順位の演算の評価順序は、処理系依存なので、
> > > > > 2のほうが安全です。
> > > > >
> > > > >
> > > > > > CCSCコンパイラ(PCM)でキャストを使うときの考え方を教えてください。
> > > > > >
> > > > > > int i1,i2,i3,i4;
> > > > > > long L1,L2;
> > > > > >
> > > > > > i1=L1-(i2*i3*i4/L2);
> > > > > >
> > > > > > の計算をするとき
> > > > > > ただし、実際の値としては
> > > > > > (i2*i3*i4/L2)はlong範囲内
> > > > > >  L1-(i2*i3*i4/L2)はint範囲内
> > > > > > になるものとします。
> > > > > >
> > > > > > 1. (i2*i3*i4) がlong範囲を超える場合
> > > > > >   i1=L1-(long long)(i2*i3*i4/L2)
> > > > > > i2,i3,i4,L2 は (long long)に自動変換されて計算される
> > > > > >   
> > > > > > 2. (i2*i3*i4) がlong範囲内の場合
> > > > > > (i2*i3*i4/L2) においてL2がlongなのでi2,i3,i4はlongに自動変換されて計算されるので
> > > > > > i1=L1-(i2*i3*i4/L2)
> > > > > >
> > > > > > ・・・でよいでしょうか?
> > > > > > 間違いがありましたら、ご指摘をお願いします。

| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |

- WebForum -