初めての夏休みの電子工作

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
夏休みの電子工作

初めての夏休みの電子工作

#1

投稿記事 by 夏休みの電子工作 » 14年前

はじめまして。
現在、LCDを使って自作のガイガーカウンターを作ろうとしています。
今回の質問はもちろんガイガーカウンターから外れてLCDに文字を表示する関数を自作した上でPICに入ったパルス信号を数えて
そのカウント数をLCDに表示するプログラムを作っています。
環境としては、フリーコンパイラSDCCを使っています。
他のエラーは消してあとは下のエラー文のみなのですが、意味はどうやら100行めの空欄の前にエラーという意味らしいです。
しかし、100行目をいくら探しても見つかりません。
このエラーが起きてしまう原因と対策を知りたいです。
全角スペースなどを探してみましたがなかったです。

エラー文→  yahoo.c:100: syntax error: token -> '' ; column 0

コード:


void main (void)
{
 int i=0;
 int l=0;
 int k;
 int count=0;
 const char st[11]={0x2e,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
 const int s[11][2]={{0x80,0x83},{0xC0,0x00},{0xC0,0x40},{0xC0,0x80},{0xC0,0xC0},{0xC0,0x01},{0xC0,0x41},{0xC0,0x81},{0xC0,0xC1},{0xC0,0x02},{0xC0,0x42}};

 const double c[];
 
 ANSEL=0x00; /*アナログ OFF*/
 TRISA=0x3C;
 TRISB=0x0F; /*RB0~RB3を入力設定*/
 PORTA=0x00; /*ポートAを初期化*/
 PORTB=0x00;

 for(;;)
  {
   for(;;)                                     
    {                                            
     if((PORTA&0x08)==0x08)          
      {count=count+1;}                   
     else if((PORTA&0x04)==0x04)   
       {break;}                               
    }

 c[l]=count;

 delay_ms(36);
 PORTA=0x80;
 PORTB=0x80;
 PORTB=0x00;
 PORTA=0x80;
 PORTB=0x80;
 PORTB=0x00;
 PORTA=0x03;
 PORTB=0x80;
 PORTB=0x00;
 
 delay_ms(1);
 PORTA=0x00;
 PORTB=0x80;
 PORTB=0x00;
 PORTA=0xC3;
 PORTB=0x80;
 PORTB=0x00;
 
 delay_ms(1);
 PORTA=0x00;
 PORTB=0x80;
 PORTB=0x00;
 PORTA=0x40;
 PORTB=0x80;
 PORTB=0x00;
 
 delay_ms(2);
 PORTA=0x00;
 PORTB=0x80;
 PORTB=0x00;
 PORTA=0x81;
 PORTB=0x80;
 PORTB=0x00;

 for(;;)
 {
  for(;;)
  {
   if(st[i][0]!=c[l])
    {i=i+1;}
   else
    {break;}
  }
  if(c[l]!=0x00)
   {
    k=i;
    PORTB=0x40;
    PORTA=s[k][0];
    PORTB=0xC0;
    PORTB=0x40;
    PORTA=s[k][1];
    PORTB=0xC0;

    l=l+1;
   }
  else
   {break;}
   PORTA=0x00;
   PORTB=0x00;
   delay_ms(59000);
   PORTA=0x00;
   PORTB=0x80;
   PORTB=0x00;
   PORTA=0xC3;
   PORTB=0x80;
   PORTB=0x00;
  }
}

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 初めての夏休みの電子工作

#2

投稿記事 by h2so5 » 14年前

main関数が閉じていません。

non
記事: 1097
登録日時: 15年前

Re: 初めての夏休みの電子工作

#3

投稿記事 by non » 14年前

閉じ括弧をつけたとしても、他にもエラーでませんか?
non

夏休みの電子工作

Re: 初めての夏休みの電子工作

#4

投稿記事 by 夏休みの電子工作 » 14年前

閉じ括弧つけてみましたが、コンパイルすると以下のエラーがでました。
yahoo.c:29: error 33: Attempt to assign value to a constant variable (=)
yahoo.c:70: error 22: Array or pointer required for '[]' operation

夏休みの工作

Re: 初めての夏休みの電子工作

#5

投稿記事 by 夏休みの工作 » 14年前

先ほどのエラーですが
29: error 33: Attempt to assign value to a constant variable (=)について、
配列c[]の初期設定の時点で、constをはずすことで消えました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 初めての夏休みの電子工作

#6

投稿記事 by softya(ソフト屋) » 14年前

とりあえず、ヘッダを含めて書いて欲しいのとPICでdouble型って本気で使うのででしょうか?
PICの型番次第ではROMに収まらないし、どのPICでも死ぬほど遅いですよ。

あとSDCCのオプションも。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

夏休みの電子工作

Re: 初めての夏休みの電子工作

#7

投稿記事 by 夏休みの電子工作 » 14年前

↓現在のプログラムです。

コード:

#include "16f88-hs.h"
void main (void)
{
 int i=0;
 int l=0;
 int k;
 int count=0;
 const char st[11]={0x2e,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
 const int s[11][2]={{0x80,0x83},{0xC0,0x00},{0xC0,0x40},{0xC0,0x80},{0xC0,0xC0},{0xC0,0x01},{0xC0,0x41},{0xC0,0x81},{0xC0,0xC1},{0xC0,0x02},{0xC0,0x42}};

 float c[];
 
 ANSEL=0x00; /*アナログ OFF*/
 TRISA=0x3C;
 TRISB=0x0F; /*RB0~RB3を入力設定*/
 PORTA=0x00; /*ポートAを初期化*/
 PORTB=0x00;

 for(;;)
  {
   for(;;)
    {
     if((PORTA&0x08)==0x08)
      {count=count+1;}
     else if((PORTA&0x04)==0x04)
       {break;}
    }

 c[l]=count;

 delay_ms(36);
 PORTA=0x80;
 PORTB=0x80;
 PORTB=0x00;
 PORTA=0x80;
 PORTB=0x80;
 PORTB=0x00;
 PORTA=0x03;
 PORTB=0x80;
 PORTB=0x00;
 
 delay_ms(1);
 PORTA=0x00;
 PORTB=0x80;
 PORTB=0x00;
 PORTA=0xC3;
 PORTB=0x80;
 PORTB=0x00;
 
 delay_ms(1);
 PORTA=0x00;
 PORTB=0x80;
 PORTB=0x00;
 PORTA=0x40;
 PORTB=0x80;
 PORTB=0x00;
 
 delay_ms(2);
 PORTA=0x00;
 PORTB=0x80;
 PORTB=0x00;
 PORTA=0x81;
 PORTB=0x80;
 PORTB=0x00;

 for(;;)
 {
  for(;;)
  {
   if(st[i][0]!=c[l])
    {i=i+1;}
   else
    {break;}
  }
  if(c[l]!=0x00)
   {
    k=i;
    PORTB=0x40;
    PORTA=s[k][0];
    PORTB=0xC0;
    PORTB=0x40;
    PORTA=s[k][1];
    PORTB=0xC0;

    l=l+1;
   }
  else
   {break;}
   PORTA=0x00;
   PORTB=0x00;
   delay_ms(59000);
   PORTA=0x00;
   PORTB=0x80;
   PORTB=0x00;
   PORTA=0xC3;
   PORTB=0x80;
   PORTB=0x00;
  }
 }
}
次にヘッダーです。

コード:

#include "pic16f88.h"

/** PICの設定 **/
//	_INTRC_IO	: 内部クロックを使用
//	_WDT_OFF	: 正常か否かの監視をOFF
//	_PWRTE_ON	: 電源投入タイマをON
//	_CP_OFF		: プログラムメモリのコードプロテクトOFF
//	_MCLR_OFF	: マスタクリアを不使用(RA5として使用)
//	_LVP_OFF	: 低電圧プログラムをOFF
//	_BODEN_OFF	: 電源電圧低下時の処理をOFF
int at 0x2007 __config = _INTRC_IO & _WDT_OFF & _PWRTE_ON & _CP_OFF & _MCLR_OFF & _LVP_OFF & _BODEN_OFF;

// 内部クロックの周波数 8MHz=8000KHz
#define KHZ	8000

// 内部クロック8MHzで動作
#define OSCCON 0x70

// 遅延関数
#define WAIT	__asm nop __endasm

// 約10μs,停止
void delay_10us(void)
{
	WAIT; WAIT; WAIT; WAIT; WAIT;
	WAIT; WAIT; WAIT; WAIT; WAIT;
	WAIT;
}

// 約100μs,停止
void delay_100us(void)
{
	int i1;

	for(i1=0;i1<16;i1++) WAIT;
}

// 指定[ms]の間,停止
void delay_ms(int time)
{
	int i1,i2;

	for(i1=0;i1<time;i1++){
		for(i2=0;i2<162;i2++){
			WAIT;
	}	}
}

// シリアル通信(RS232C)用の定義
#define TX_PORT	2
#define RX_PORT	1
#define TX_BIT	(1<<TX_PORT)
#define RX_BIT	(1<<RX_PORT)

// 通信速度(この講義では,19200bpsで固定)
#define	BAUD	19200

// マイクロチップ社のデータシートより
#define	BAUD_FACTOR	(16L*BAUD)
#define SPBRG_VALUE	(unsigned char)(((KHZ*1000L)-BAUD_FACTOR)/BAUD_FACTOR)

// シリアル通信(RS232C)の初期設定
void RSinit(void)
{
	TRISB=TX_BIT|RX_BIT;// These need to be 1 for USART to work
	SPBRG=SPBRG_VALUE;	// Baud Rate register, calculated by macro
	BRGH=1;
	SYNC=0;			// Disable Synchronous/Enable Asynchronous
	SPEN=1;			// Enable serial port
	TXEN=1;			// Enable transmission mode
	CREN=1;			// Enable reception mode
}

// メッセージの送信
void PrintC(unsigned char msg[])
{
	int i;

	for(i=0;msg[i];i++){
		TXREG=msg[i];	// Transmit letter
		while(!TRMT);	// Wait (not optional)
	}
}

// 10進数の整数を送信
void PrintI(int val)
{
	int i1,i2,flag=0;
	unsigned char msg[12],tmp;

	for(i2=0;i2<12;i2++) msg[i2]='\0';

	i2=0;
	if(val<0){ msg[i2]='-'; i2++; }

	for(i1=100;i1>=10;i1*=0.1){
		tmp=(val/i1)%10;
		if(flag || tmp){
			msg[i2]=tmp+0x30;
			i2++; flag=1;
	}	}
	msg[i2]=val%10+0x30;
	PrintC(msg);
}

// 1文字の受信
void Scan1(unsigned char msg[])
{
	while(!RCIF);	// Wait until data recieved
	msg[0]=RCREG;	// Store for later
	msg[1]='\0';
}

ヘッダーがインクルードしている、ヘッダーファイルもつけますか?
あと、先ほどオプションとありましたが、わからないです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 初めての夏休みの電子工作

#8

投稿記事 by softya(ソフト屋) » 14年前

すくなくともfloat c[];は変ですね。
プログラム全体が分からないので正しいかはわかりませんがcountを代入しているのでint c[];が正しいと思いますし、大きさがないとまずいのでint c[100];など数値を入れてください。100は適当です。
これ以上はプログラムにコメントとか変数名にもっと意味のある名前をつけてもらわないと解読が難しいです。
i,l,kやc,st,sなどの意味のわからない名前が解読を困難にしています。

[追記]
ポートA、Bの各ビットが何かも説明されていないので困ります。
あと割り込みでカウントしなくて周期は大丈夫かとか。気になるところもあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

non
記事: 1097
登録日時: 15年前

Re: 初めての夏休みの電子工作

#9

投稿記事 by non » 14年前

夏休みの電子工作 さんが書きました:閉じ括弧つけてみましたが、コンパイルすると以下のエラーがでました。
yahoo.c:29: error 33: Attempt to assign value to a constant variable (=)
yahoo.c:70: error 22: Array or pointer required for '[]' operation
ハードがわからないので、プログラムの解析はしていませんが、エラーは
最初のは、
ソフト屋さんから指摘あるように、配列の大きさを与えていないからです。
c[1]しか、使用しないのに配列なのは、目的はなんでしょう?

2個目は、
stが一次元配列なのに、
if(st[0]!=c[l])
のように、2次元配列として使っているからです。

プログラムの意味はわかりませんが、
PORTA=0x80;
PORTB=0x80;
PORTB=0x00;
PORTA=0x80;
PORTB=0x80;
PORTB=0x00;
PORTA=0x03;
PORTB=0x80;
PORTB=0x00;
このように、続けて、同じポートに出力して意味があるのでしょうか?
仮に最適化されないとしても、間にdelayもないのなら、意味があるとは思えないのですが?
non

閉鎖

“C言語何でも質問掲示板” へ戻る