[戻る]
過去ログ [ 0001 ]
過去ログ:     ワード検索: 条件: 表示:

タイトル
記事No
投稿日
投稿者
参照先
配列処理の別関数化・・
156
: 15/02/25-22:26
いまい

はじめまして
PICの世界に入ったばかりで初心者です。
今、LEDドットマトリクスに数字などを表示し、まず、「時計」を作ってみようと
チャレンジしています。
今まで16F84Aなどで7セグメントLEDをダイナミックドライブして時計を作る程度の
技術しかありません・・・
今まですべてアセンブラで書いていたのですが、今回からC言語(XC8)を使って
勉強しています。

ところで、今、main関数内の配列処理をmain関数から出して別関数化としようと思って
いるのですが、コンパイルエラーとなり悩んでいます。
簡単な1行計算程度の関数であれば外に出せるのですが、「配列」の処理を別関数に
することが難しく、、イロイロネットや書籍を買ってきて読んで試してるのですが
うまくいきません。。。。
原因がわからずどうしょうもない状態です。
大変恐縮ではありますが、どなたかお知恵をお貸ししていただければ助かります。

簡単に要点を整理すると、

●配列a[16][4]を定義します。
●配列b[8]を配列a[16][4]のうちa[0〜7][0]の場所に別関数を使ってコピーしたい。

見苦しいソースですが以下に記載します。

下記ソースをコンパイルすると、エラーとなり下記のコメントが出ます。

1938-1.c:67: error: (981) pointer required

必要なポインターがない???

基本的に私がポインターをよく理解していないのだと思いますが、本を読んでもよくわからないんです(泣)
具体的対応がわからず・・・・・

ちなみに適当に変数をイロイロ触ってみると

配列コピー関数(別関数部分)の

void copy1(char a)

の部分を

void copy1(char *)

とすると、コンパイル成功となりますが、理由もわからないし、main関数内のコピー関数呼び出し部

「copy1(a);」

の横の行番号に!マークが表示され、コンパイル結果の中に

1938-1.c:82: warning: (359) illegal conversion between pointer types

と表示されています。

申し訳ありませんがどうかご教授お願いします。。。。。


***********************************************
// PIC16F1938 Configuration Bit Settings

// 'C' source line config statements

#include <xc.h>
#define _XTAL_FREQ 12500000 //?????????12.5MH????? ???????

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

// CONFIG1
#pragma config FOSC = HS // Oscillator Selection (HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins)
#pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
#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 = OFF // Brown-out Reset Enable (Brown-out Reset disabled)
#pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)

// CONFIG2
#pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
#pragma config VCAPEN = OFF // Voltage Regulator Capacitor Enable (All VCAP pin functionality is disabled)
#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)


void delay_us(unsigned int time) //1use
{
while(time)
{
__delay_us(1);
time--;
}
}

char a[16][4]={ //a配列宣言
{0x01,0xAA,0xAA,0x10},
{0x02,0x00,0x00,0x10},
{0x04,0x7F,0xFE,0x10},
{0x08,0x40,0x02,0x10},
{0x10,0x40,0x02,0x10},
{0x20,0x7F,0xFE,0x10},
{0x40,0x00,0x00,0x10},
{0x80,0x00,0x00,0x10},
{0x80,0xFF,0xFF,0x01},
{0x40,0x81,0x01,0x02},
{0x20,0x81,0x01,0x04},
{0x10,0x81,0x01,0x08},
{0x08,0xFF,0xFF,0x10},
{0x04,0x00,0x00,0x20},
{0x02,0x00,0x00,0x40},
{0x01,0xAA,0xAA,0x80},
};

const char b[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01} ; //配列b


void copy1(char a) //配列コピーの関数
{
char ss=0;
for(ss=0;ss<8;ss++)
{
a[ss][0]=b[ss];
}
return;
}


void main(void)
{
unsigned char e=0;
unsigned char t=0;
unsigned char i=0;

unsigned char m1=0;
unsigned char m2=0;


copy1(a); //配列コピー関数の呼び出し

PORTA=0;
PORTB=0;
PORTC=0;
TRISA=0x00; //PORTA?ALL???
TRISB=0x00; //PORTB?ALL???
TRISC=0x00; //PORTC?ALL???
ANSELA=0x00; //PORTA?ALL?I/O?
ANSELB=0x00; //PORTB?ALL?I/O?

RC2=1; //OE?H???????


while(1)
{


RC2=1; //OE?H???????
for(e=0;e<8;e++) //??8???????????
{
for(t=0;t<4;t++) //8bit×4???????
{
m1=a[e][t];
m2=a[e+8][t];

for(i=0;i<8;i++)
{
if((m1 & 0x80)!=0)
{RB0=1;}
else
{RB0=0;}


if((m2 & 0x80)!=0)
{
RB5=1;
}
else
{
RB5=0;
}


RC0=1; //CLK H
RC0=0; //CLK L
m1=m1<<1;
m2=m2<<1;
}
}
RC1=1; //LAT H??????
RC1=0; //LAT L
PORTA=e; //A0,A1,A2????????????
RC2=0; //OE?L???????
delay_us(300); //???????300?s
RC2=1; //OE?H???????
PORTA=0; //A0,A1,A2????????????
}
}
}
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: 配列処理の別関数化・・
157
: 15/02/26-14:00
徳井

> はじめまして
> PICの世界に入ったばかりで初心者です。
> 今、LEDドットマトリクスに数字などを表示し、まず、「時計」を作ってみようと
> チャレンジしています。
> 今まで16F84Aなどで7セグメントLEDをダイナミックドライブして時計を作る程度の
> 技術しかありません・・・
> 今まですべてアセンブラで書いていたのですが、今回からC言語(XC8)を使って
> 勉強しています。
>
> ところで、今、main関数内の配列処理をmain関数から出して別関数化としようと思って
> いるのですが、コンパイルエラーとなり悩んでいます。
> 簡単な1行計算程度の関数であれば外に出せるのですが、「配列」の処理を別関数に
> することが難しく、、イロイロネットや書籍を買ってきて読んで試してるのですが
> うまくいきません。。。。
> 原因がわからずどうしょうもない状態です。
> 大変恐縮ではありますが、どなたかお知恵をお貸ししていただければ助かります。
>
> 簡単に要点を整理すると、
>
> ●配列a[16][4]を定義します。
> ●配列b[8]を配列a[16][4]のうちa[0〜7][0]の場所に別関数を使ってコピーしたい。
>
> 見苦しいソースですが以下に記載します。
>
> 下記ソースをコンパイルすると、エラーとなり下記のコメントが出ます。
>
> 1938-1.c:67: error: (981) pointer required
>
> 必要なポインターがない???
>
> 基本的に私がポインターをよく理解していないのだと思いますが、本を読んでもよくわからないんです(泣)
> 具体的対応がわからず・・・・・
>
> ちなみに適当に変数をイロイロ触ってみると
>
> 配列コピー関数(別関数部分)の
>
> void copy1(char a)
>
> の部分を
>
> void copy1(char *)
>
> とすると、コンパイル成功となりますが、理由もわからないし、main関数内のコピー関数呼び出し部
>
> 「copy1(a);」
>
> の横の行番号に!マークが表示され、コンパイル結果の中に
>
> 1938-1.c:82: warning: (359) illegal conversion between pointer types
>
> と表示されています。
>
> 申し訳ありませんがどうかご教授お願いします。。。。。
>
>
> ***********************************************
> // PIC16F1938 Configuration Bit Settings
>
> // 'C' source line config statements
>
> #include <xc.h>
> #define _XTAL_FREQ 12500000 //?????????12.5MH????? ???????
>
> // #pragma config statements should precede project file includes.
> // Use project enums instead of #define for ON and OFF.
>
> // CONFIG1
> #pragma config FOSC = HS // Oscillator Selection (HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins)
> #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
> #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
> #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 = OFF // Brown-out Reset Enable (Brown-out Reset disabled)
> #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
> #pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
> #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)
>
> // CONFIG2
> #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
> #pragma config VCAPEN = OFF // Voltage Regulator Capacitor Enable (All VCAP pin functionality is disabled)
> #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)
>
>
> void delay_us(unsigned int time) //1use
> {
> while(time)
> {
> __delay_us(1);
> time--;
> }
> }
>
> char a[16][4]={ //a配列宣言
> {0x01,0xAA,0xAA,0x10},
> {0x02,0x00,0x00,0x10},
> {0x04,0x7F,0xFE,0x10},
> {0x08,0x40,0x02,0x10},
> {0x10,0x40,0x02,0x10},
> {0x20,0x7F,0xFE,0x10},
> {0x40,0x00,0x00,0x10},
> {0x80,0x00,0x00,0x10},
> {0x80,0xFF,0xFF,0x01},
> {0x40,0x81,0x01,0x02},
> {0x20,0x81,0x01,0x04},
> {0x10,0x81,0x01,0x08},
> {0x08,0xFF,0xFF,0x10},
> {0x04,0x00,0x00,0x20},
> {0x02,0x00,0x00,0x40},
> {0x01,0xAA,0xAA,0x80},
> };
>
> const char b[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01} ; //配列b
>
>
> void copy1(char a) //配列コピーの関数
> {
> char ss=0;
> for(ss=0;ss<8;ss++)
> {
> a[ss][0]=b[ss];
> }
> return;
> }
>
>
> void main(void)
> {
> unsigned char e=0;
> unsigned char t=0;
> unsigned char i=0;
>
> unsigned char m1=0;
> unsigned char m2=0;
>
>
> copy1(a); //配列コピー関数の呼び出し
>
> PORTA=0;
> PORTB=0;
> PORTC=0;
> TRISA=0x00; //PORTA?ALL???
> TRISB=0x00; //PORTB?ALL???
> TRISC=0x00; //PORTC?ALL???
> ANSELA=0x00; //PORTA?ALL?I/O?
> ANSELB=0x00; //PORTB?ALL?I/O?
>
> RC2=1; //OE?H???????
>
>
> while(1)
> {
>
>
> RC2=1; //OE?H???????
> for(e=0;e<8;e++) //??8???????????
> {
> for(t=0;t<4;t++) //8bit×4???????
> {
> m1=a[e][t];
> m2=a[e+8][t];
>
> for(i=0;i<8;i++)
> {
> if((m1 & 0x80)!=0)
> {RB0=1;}
> else
> {RB0=0;}
>
>
> if((m2 & 0x80)!=0)
> {
> RB5=1;
> }
> else
> {
> RB5=0;
> }
>
>
> RC0=1; //CLK H
> RC0=0; //CLK L
> m1=m1<<1;
> m2=m2<<1;
> }
> }
> RC1=1; //LAT H??????
> RC1=0; //LAT L
> PORTA=e; //A0,A1,A2????????????
> RC2=0; //OE?L???????
> delay_us(300); //???????300?s
> RC2=1; //OE?H???????
> PORTA=0; //A0,A1,A2????????????
> }
> }
> }

ちょっと前に同じ内容で書き込みされたと思いますが、
ポインタとか使ったり読み出したりするのは何故なんですか?
値の保持から考えると、EEPROMで読み書きした方が良いのではないかと思います。
それとドットマトリックスなら、いくらでもPICでの製作例はあると思います。
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^2: 配列処理の別関数化・・
158
: 15/02/26-16:21
いまい

マトリクスを制御するのに配列しかないと思いました。
16&#10005;32のマトリクスなので8&#10005;8の配列をつかい8エリアに区分して、16&#10005;32に貼り付けて使おうと考えています。
貼り付ける変数は時計だと秒単位で変化するので、別に時計プログラムで作成した変数を貼り付けるイメージです。
また、picでのLEDマトリクス制御のサンプルをネットて調べましたが、
16&#10005;32程度の作成例は少なく、また、cでサンプルがソースなどがありませんでした。
8&#10005;8程度のものは見つかりましたが大半がアセンブラでした。
cの技術が無いことが原因なのですが、配列を関数化する例がほとんど探せませんでしたー
すいません





> > はじめまして
> > PICの世界に入ったばかりで初心者です。
> > 今、LEDドットマトリクスに数字などを表示し、まず、「時計」を作ってみようと
> > チャレンジしています。
> > 今まで16F84Aなどで7セグメントLEDをダイナミックドライブして時計を作る程度の
> > 技術しかありません・・・
> > 今まですべてアセンブラで書いていたのですが、今回からC言語(XC8)を使って
> > 勉強しています。
> >
> > ところで、今、main関数内の配列処理をmain関数から出して別関数化としようと思って
> > いるのですが、コンパイルエラーとなり悩んでいます。
> > 簡単な1行計算程度の関数であれば外に出せるのですが、「配列」の処理を別関数に
> > することが難しく、、イロイロネットや書籍を買ってきて読んで試してるのですが
> > うまくいきません。。。。
> > 原因がわからずどうしょうもない状態です。
> > 大変恐縮ではありますが、どなたかお知恵をお貸ししていただければ助かります。
> >
> > 簡単に要点を整理すると、
> >
> > ●配列a[16][4]を定義します。
> > ●配列b[8]を配列a[16][4]のうちa[0〜7][0]の場所に別関数を使ってコピーしたい。
> >
> > 見苦しいソースですが以下に記載します。
> >
> > 下記ソースをコンパイルすると、エラーとなり下記のコメントが出ます。
> >
> > 1938-1.c:67: error: (981) pointer required
> >
> > 必要なポインターがない???
> >
> > 基本的に私がポインターをよく理解していないのだと思いますが、本を読んでもよくわからないんです(泣)
> > 具体的対応がわからず・・・・・
> >
> > ちなみに適当に変数をイロイロ触ってみると
> >
> > 配列コピー関数(別関数部分)の
> >
> > void copy1(char a)
> >
> > の部分を
> >
> > void copy1(char *)
> >
> > とすると、コンパイル成功となりますが、理由もわからないし、main関数内のコピー関数呼び出し部
> >
> > 「copy1(a);」
> >
> > の横の行番号に!マークが表示され、コンパイル結果の中に
> >
> > 1938-1.c:82: warning: (359) illegal conversion between pointer types
> >
> > と表示されています。
> >
> > 申し訳ありませんがどうかご教授お願いします。。。。。
> >
> >
> > ***********************************************
> > // PIC16F1938 Configuration Bit Settings
> >
> > // 'C' source line config statements
> >
> > #include <xc.h>
> > #define _XTAL_FREQ 12500000 //?????????12.5MH????? ???????
> >
> > // #pragma config statements should precede project file includes.
> > // Use project enums instead of #define for ON and OFF.
> >
> > // CONFIG1
> > #pragma config FOSC = HS // Oscillator Selection (HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins)
> > #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
> > #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
> > #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 = OFF // Brown-out Reset Enable (Brown-out Reset disabled)
> > #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
> > #pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
> > #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)
> >
> > // CONFIG2
> > #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
> > #pragma config VCAPEN = OFF // Voltage Regulator Capacitor Enable (All VCAP pin functionality is disabled)
> > #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)
> >
> >
> > void delay_us(unsigned int time) //1use
> > {
> > while(time)
> > {
> > __delay_us(1);
> > time--;
> > }
> > }
> >
> > char a[16][4]={ //a配列宣言
> > {0x01,0xAA,0xAA,0x10},
> > {0x02,0x00,0x00,0x10},
> > {0x04,0x7F,0xFE,0x10},
> > {0x08,0x40,0x02,0x10},
> > {0x10,0x40,0x02,0x10},
> > {0x20,0x7F,0xFE,0x10},
> > {0x40,0x00,0x00,0x10},
> > {0x80,0x00,0x00,0x10},
> > {0x80,0xFF,0xFF,0x01},
> > {0x40,0x81,0x01,0x02},
> > {0x20,0x81,0x01,0x04},
> > {0x10,0x81,0x01,0x08},
> > {0x08,0xFF,0xFF,0x10},
> > {0x04,0x00,0x00,0x20},
> > {0x02,0x00,0x00,0x40},
> > {0x01,0xAA,0xAA,0x80},
> > };
> >
> > const char b[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01} ; //配列b
> >
> >
> > void copy1(char a) //配列コピーの関数
> > {
> > char ss=0;
> > for(ss=0;ss<8;ss++)
> > {
> > a[ss][0]=b[ss];
> > }
> > return;
> > }
> >
> >
> > void main(void)
> > {
> > unsigned char e=0;
> > unsigned char t=0;
> > unsigned char i=0;
> >
> > unsigned char m1=0;
> > unsigned char m2=0;
> >
> >
> > copy1(a); //配列コピー関数の呼び出し
> >
> > PORTA=0;
> > PORTB=0;
> > PORTC=0;
> > TRISA=0x00; //PORTA?ALL???
> > TRISB=0x00; //PORTB?ALL???
> > TRISC=0x00; //PORTC?ALL???
> > ANSELA=0x00; //PORTA?ALL?I/O?
> > ANSELB=0x00; //PORTB?ALL?I/O?
> >
> > RC2=1; //OE?H???????
> >
> >
> > while(1)
> > {
> >
> >
> > RC2=1; //OE?H???????
> > for(e=0;e<8;e++) //??8???????????
> > {
> > for(t=0;t<4;t++) //8bit×4???????
> > {
> > m1=a[e][t];
> > m2=a[e+8][t];
> >
> > for(i=0;i<8;i++)
> > {
> > if((m1 & 0x80)!=0)
> > {RB0=1;}
> > else
> > {RB0=0;}
> >
> >
> > if((m2 & 0x80)!=0)
> > {
> > RB5=1;
> > }
> > else
> > {
> > RB5=0;
> > }
> >
> >
> > RC0=1; //CLK H
> > RC0=0; //CLK L
> > m1=m1<<1;
> > m2=m2<<1;
> > }
> > }
> > RC1=1; //LAT H??????
> > RC1=0; //LAT L
> > PORTA=e; //A0,A1,A2????????????
> > RC2=0; //OE?L???????
> > delay_us(300); //???????300?s
> > RC2=1; //OE?H???????
> > PORTA=0; //A0,A1,A2????????????
> > }
> > }
> > }
>
> ちょっと前に同じ内容で書き込みされたと思いますが、
> ポインタとか使ったり読み出したりするのは何故なんですか?
> 値の保持から考えると、EEPROMで読み書きした方が良いのではないかと思います。
> それとドットマトリックスなら、いくらでもPICでの製作例はあると思います。
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^3: 配列処理の別関数化・・
159
: 15/02/26-20:24
徳井

> マトリクスを制御するのに配列しかないと思いました。
> 16&#10005;32のマトリクスなので8&#10005;8の配列をつかい8エリアに区分して、16&#10005;32に貼り付けて使おうと考えています。
> 貼り付ける変数は時計だと秒単位で変化するので、別に時計プログラムで作成した変数を貼り付けるイメージです。
> また、picでのLEDマトリクス制御のサンプルをネットて調べましたが、
> 16&#10005;32程度の作成例は少なく、また、cでサンプルがソースなどがありませんでした。
> 8&#10005;8程度のものは見つかりましたが大半がアセンブラでした。
> cの技術が無いことが原因なのですが、配列を関数化する例がほとんど探せませんでしたー
> すいません
>
>
>
>
>
> > > はじめまして
> > > PICの世界に入ったばかりで初心者です。
> > > 今、LEDドットマトリクスに数字などを表示し、まず、「時計」を作ってみようと
> > > チャレンジしています。
> > > 今まで16F84Aなどで7セグメントLEDをダイナミックドライブして時計を作る程度の
> > > 技術しかありません・・・
> > > 今まですべてアセンブラで書いていたのですが、今回からC言語(XC8)を使って
> > > 勉強しています。
> > >
> > > ところで、今、main関数内の配列処理をmain関数から出して別関数化としようと思って
> > > いるのですが、コンパイルエラーとなり悩んでいます。
> > > 簡単な1行計算程度の関数であれば外に出せるのですが、「配列」の処理を別関数に
> > > することが難しく、、イロイロネットや書籍を買ってきて読んで試してるのですが
> > > うまくいきません。。。。
> > > 原因がわからずどうしょうもない状態です。
> > > 大変恐縮ではありますが、どなたかお知恵をお貸ししていただければ助かります。
> > >
> > > 簡単に要点を整理すると、
> > >
> > > ●配列a[16][4]を定義します。
> > > ●配列b[8]を配列a[16][4]のうちa[0〜7][0]の場所に別関数を使ってコピーしたい。
> > >
> > > 見苦しいソースですが以下に記載します。
> > >
> > > 下記ソースをコンパイルすると、エラーとなり下記のコメントが出ます。
> > >
> > > 1938-1.c:67: error: (981) pointer required
> > >
> > > 必要なポインターがない???
> > >
> > > 基本的に私がポインターをよく理解していないのだと思いますが、本を読んでもよくわからないんです(泣)
> > > 具体的対応がわからず・・・・・
> > >
> > > ちなみに適当に変数をイロイロ触ってみると
> > >
> > > 配列コピー関数(別関数部分)の
> > >
> > > void copy1(char a)
> > >
> > > の部分を
> > >
> > > void copy1(char *)
> > >
> > > とすると、コンパイル成功となりますが、理由もわからないし、main関数内のコピー関数呼び出し部
> > >
> > > 「copy1(a);」
> > >
> > > の横の行番号に!マークが表示され、コンパイル結果の中に
> > >
> > > 1938-1.c:82: warning: (359) illegal conversion between pointer types
> > >
> > > と表示されています。
> > >
> > > 申し訳ありませんがどうかご教授お願いします。。。。。
> > >
> > >
> > > ***********************************************
> > > // PIC16F1938 Configuration Bit Settings
> > >
> > > // 'C' source line config statements
> > >
> > > #include <xc.h>
> > > #define _XTAL_FREQ 12500000 //?????????12.5MH????? ???????
> > >
> > > // #pragma config statements should precede project file includes.
> > > // Use project enums instead of #define for ON and OFF.
> > >
> > > // CONFIG1
> > > #pragma config FOSC = HS // Oscillator Selection (HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins)
> > > #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
> > > #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
> > > #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 = OFF // Brown-out Reset Enable (Brown-out Reset disabled)
> > > #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
> > > #pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
> > > #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)
> > >
> > > // CONFIG2
> > > #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
> > > #pragma config VCAPEN = OFF // Voltage Regulator Capacitor Enable (All VCAP pin functionality is disabled)
> > > #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)
> > >
> > >
> > > void delay_us(unsigned int time) //1use
> > > {
> > > while(time)
> > > {
> > > __delay_us(1);
> > > time--;
> > > }
> > > }
> > >
> > > char a[16][4]={ //a配列宣言
> > > {0x01,0xAA,0xAA,0x10},
> > > {0x02,0x00,0x00,0x10},
> > > {0x04,0x7F,0xFE,0x10},
> > > {0x08,0x40,0x02,0x10},
> > > {0x10,0x40,0x02,0x10},
> > > {0x20,0x7F,0xFE,0x10},
> > > {0x40,0x00,0x00,0x10},
> > > {0x80,0x00,0x00,0x10},
> > > {0x80,0xFF,0xFF,0x01},
> > > {0x40,0x81,0x01,0x02},
> > > {0x20,0x81,0x01,0x04},
> > > {0x10,0x81,0x01,0x08},
> > > {0x08,0xFF,0xFF,0x10},
> > > {0x04,0x00,0x00,0x20},
> > > {0x02,0x00,0x00,0x40},
> > > {0x01,0xAA,0xAA,0x80},
> > > };
> > >
> > > const char b[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01} ; //配列b
> > >
> > >
> > > void copy1(char a) //配列コピーの関数
> > > {
> > > char ss=0;
> > > for(ss=0;ss<8;ss++)
> > > {
> > > a[ss][0]=b[ss];
> > > }
> > > return;
> > > }
> > >
> > >
> > > void main(void)
> > > {
> > > unsigned char e=0;
> > > unsigned char t=0;
> > > unsigned char i=0;
> > >
> > > unsigned char m1=0;
> > > unsigned char m2=0;
> > >
> > >
> > > copy1(a); //配列コピー関数の呼び出し
> > >
> > > PORTA=0;
> > > PORTB=0;
> > > PORTC=0;
> > > TRISA=0x00; //PORTA?ALL???
> > > TRISB=0x00; //PORTB?ALL???
> > > TRISC=0x00; //PORTC?ALL???
> > > ANSELA=0x00; //PORTA?ALL?I/O?
> > > ANSELB=0x00; //PORTB?ALL?I/O?
> > >
> > > RC2=1; //OE?H???????
> > >
> > >
> > > while(1)
> > > {
> > >
> > >
> > > RC2=1; //OE?H???????
> > > for(e=0;e<8;e++) //??8???????????
> > > {
> > > for(t=0;t<4;t++) //8bit×4???????
> > > {
> > > m1=a[e][t];
> > > m2=a[e+8][t];
> > >
> > > for(i=0;i<8;i++)
> > > {
> > > if((m1 & 0x80)!=0)
> > > {RB0=1;}
> > > else
> > > {RB0=0;}
> > >
> > >
> > > if((m2 & 0x80)!=0)
> > > {
> > > RB5=1;
> > > }
> > > else
> > > {
> > > RB5=0;
> > > }
> > >
> > >
> > > RC0=1; //CLK H
> > > RC0=0; //CLK L
> > > m1=m1<<1;
> > > m2=m2<<1;
> > > }
> > > }
> > > RC1=1; //LAT H??????
> > > RC1=0; //LAT L
> > > PORTA=e; //A0,A1,A2????????????
> > > RC2=0; //OE?L???????
> > > delay_us(300); //???????300?s
> > > RC2=1; //OE?H???????
> > > PORTA=0; //A0,A1,A2????????????
> > > }
> > > }
> > > }
> >
> > ちょっと前に同じ内容で書き込みされたと思いますが、
> > ポインタとか使ったり読み出したりするのは何故なんですか?
> > 値の保持から考えると、EEPROMで読み書きした方が良いのではないかと思います。
> > それとドットマトリックスなら、いくらでもPICでの製作例はあると思います。

16&#10005;32←これなんですか?
8×8ドットとか16×16ドットとかだと思うんですが・・
URLはここに貼れませんが、調べた限りでもC言語で3件コード公開されていました。
先ずは8×8ドットで内容を理解されてから、その先に進んで行った方が良いと思います。
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^4: 配列処理の別関数化・・
160
: 15/02/26-22:24
いまい

配列のコピーは普通にできるのに、なぜmain関数外に出して別関数にするとダメなんだろう………
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^5: 配列処理の別関数化・・
161
: 15/02/27-00:07
徳井

> 配列のコピーは普通にできるのに、なぜmain関数外に出して別関数にするとダメなんだろう………

上で配列型で宣言したら、配列型で呼び出さなければいけないと思います。
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^6: 配列処理の別関数化・・
162
: 15/02/27-00:21
いまい

すいません、、配列型、、

いままでは、main関数内では、main関数に入ってすぐに各変数の方と名前、配列の場合は[]で配列の大きさを指定していました。その後、for分で必要数分だけ(8ビット分)コピーして完了していました。
char a[16][4]←char b[8]
でした。
これでうまく行っていたのですが、このコピー部をmain関数の外に出して別関数にするとにNGとなるんです。
main部の関数を呼び出すcの書き方も悪いのかもしれませんが、コピー部の関数の変数の書き方がおかしいのですか?
具体的には今回のプログラムではどのような箇所の型を合わせる必要があるのでしょうか??……
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: 配列処理の別関数化・・
166
: 15/02/27-20:51
Kuro

> はじめまして
> PICの世界に入ったばかりで初心者です。
> 今、LEDドットマトリクスに数字などを表示し、まず、「時計」を作ってみようと
> チャレンジしています。
> 今まで16F84Aなどで7セグメントLEDをダイナミックドライブして時計を作る程度の
> 技術しかありません・・・
> 今まですべてアセンブラで書いていたのですが、今回からC言語(XC8)を使って
> 勉強しています。
>
> ところで、今、main関数内の配列処理をmain関数から出して別関数化としようと思って
> いるのですが、コンパイルエラーとなり悩んでいます。
> 簡単な1行計算程度の関数であれば外に出せるのですが、「配列」の処理を別関数に
> することが難しく、、イロイロネットや書籍を買ってきて読んで試してるのですが
> うまくいきません。。。。
> 原因がわからずどうしょうもない状態です。
> 大変恐縮ではありますが、どなたかお知恵をお貸ししていただければ助かります。
>
> 簡単に要点を整理すると、
>
> ●配列a[16][4]を定義します。
> ●配列b[8]を配列a[16][4]のうちa[0〜7][0]の場所に別関数を使ってコピーしたい。
>
> 見苦しいソースですが以下に記載します。
>
> 下記ソースをコンパイルすると、エラーとなり下記のコメントが出ます。
>
> 1938-1.c:67: error: (981) pointer required
>
> 必要なポインターがない???
>
> 基本的に私がポインターをよく理解していないのだと思いますが、本を読んでもよくわからないんです(泣)
> 具体的対応がわからず・・・・・
>
> ちなみに適当に変数をイロイロ触ってみると
>
> 配列コピー関数(別関数部分)の
>
> void copy1(char a)
>
> の部分を
>
> void copy1(char *)
>
> とすると、コンパイル成功となりますが、理由もわからないし、main関数内のコピー関数呼び出し部
>
> 「copy1(a);」
>
> の横の行番号に!マークが表示され、コンパイル結果の中に
>
> 1938-1.c:82: warning: (359) illegal conversion between pointer types
>
> と表示されています。
>
> 申し訳ありませんがどうかご教授お願いします。。。。。
>
>
> ***********************************************
> // PIC16F1938 Configuration Bit Settings
>
> // 'C' source line config statements
>
> #include <xc.h>
> #define _XTAL_FREQ 12500000 //?????????12.5MH????? ???????
>
> // #pragma config statements should precede project file includes.
> // Use project enums instead of #define for ON and OFF.
>
> // CONFIG1
> #pragma config FOSC = HS // Oscillator Selection (HS Oscillator, High-speed crystal/resonator connected between OSC1 and OSC2 pins)
> #pragma config WDTE = OFF // Watchdog Timer Enable (WDT disabled)
> #pragma config PWRTE = OFF // Power-up Timer Enable (PWRT disabled)
> #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 = OFF // Brown-out Reset Enable (Brown-out Reset disabled)
> #pragma config CLKOUTEN = OFF // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
> #pragma config IESO = OFF // Internal/External Switchover (Internal/External Switchover mode is disabled)
> #pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)
>
> // CONFIG2
> #pragma config WRT = OFF // Flash Memory Self-Write Protection (Write protection off)
> #pragma config VCAPEN = OFF // Voltage Regulator Capacitor Enable (All VCAP pin functionality is disabled)
> #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)
>
>
> void delay_us(unsigned int time) //1use
> {
> while(time)
> {
> __delay_us(1);
> time--;
> }
> }
>
> char a[16][4]={ //a配列宣言
> {0x01,0xAA,0xAA,0x10},
> {0x02,0x00,0x00,0x10},
> {0x04,0x7F,0xFE,0x10},
> {0x08,0x40,0x02,0x10},
> {0x10,0x40,0x02,0x10},
> {0x20,0x7F,0xFE,0x10},
> {0x40,0x00,0x00,0x10},
> {0x80,0x00,0x00,0x10},
> {0x80,0xFF,0xFF,0x01},
> {0x40,0x81,0x01,0x02},
> {0x20,0x81,0x01,0x04},
> {0x10,0x81,0x01,0x08},
> {0x08,0xFF,0xFF,0x10},
> {0x04,0x00,0x00,0x20},
> {0x02,0x00,0x00,0x40},
> {0x01,0xAA,0xAA,0x80},
> };
>
> const char b[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01} ; //配列b
>
>
> void copy1(char a) //配列コピーの関数
> {
> char ss=0;
> for(ss=0;ss<8;ss++)
> {
> a[ss][0]=b[ss];
> }
> return;
> }
>
>
> void main(void)
> {
> unsigned char e=0;
> unsigned char t=0;
> unsigned char i=0;
>
> unsigned char m1=0;
> unsigned char m2=0;
>
>
> copy1(a); //配列コピー関数の呼び出し
>
> PORTA=0;
> PORTB=0;
> PORTC=0;
> TRISA=0x00; //PORTA?ALL???
> TRISB=0x00; //PORTB?ALL???
> TRISC=0x00; //PORTC?ALL???
> ANSELA=0x00; //PORTA?ALL?I/O?
> ANSELB=0x00; //PORTB?ALL?I/O?
>
> RC2=1; //OE?H???????
>
>
> while(1)
> {
>
>
> RC2=1; //OE?H???????
> for(e=0;e<8;e++) //??8???????????
> {
> for(t=0;t<4;t++) //8bit×4???????
> {
> m1=a[e][t];
> m2=a[e+8][t];
>
> for(i=0;i<8;i++)
> {
> if((m1 & 0x80)!=0)
> {RB0=1;}
> else
> {RB0=0;}
>
>
> if((m2 & 0x80)!=0)
> {
> RB5=1;
> }
> else
> {
> RB5=0;
> }
>
>
> RC0=1; //CLK H
> RC0=0; //CLK L
> m1=m1<<1;
> m2=m2<<1;
> }
> }
> RC1=1; //LAT H??????
> RC1=0; //LAT L
> PORTA=e; //A0,A1,A2????????????
> RC2=0; //OE?L???????
> delay_us(300); //???????300?s
> RC2=1; //OE?H???????
> PORTA=0; //A0,A1,A2????????????
> }
> }
> }

横から別レス失礼します。
PICマイコンやコンパイラXC8の使い方の問題ではなく、
(大変失礼ながら)単純にC言語の文法への理解不足が直接の原因だと思われます。

配列、ポインタ、関数宣言に関する参考書籍として、以下をお勧めします。
アセンブラを理解されている方なら、なお読みやすいと思います。

C言語ポインタ完全制覇 (標準プログラマーズライブラリ) 前橋 和弥 (著)
http://www.amazon.co.jp/C%E8%A8%80%E8%AA%9E%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E5%AE%8C%E5%85%A8%E5%88%B6%E8%A6%87-%E6%A8%99%E6%BA%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%82%BA%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA-%E5%89%8D%E6%A9%8B-%E5%92%8C%E5%BC%A5/dp/4774111422
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^2: 配列処理の別関数化・・
167
: 15/02/27-21:30
いまい

ありがとうございます。
どうも関数と配列、ポインタが理解できていないようです。
先ほど、新宿の紀伊國屋書店で書籍を立ち読みしていたのですがその本を見かけました!
早速買いに行ってきます!
アセンブラは最低限ですが何とかなるのですが、cは全く初めてなんで
初歩的な箇所で躓きます。
ありがとうございます!
▲pagetop

- WebForum -