2012-02-12 6 views
-1

私はAVRマイクロコントローラをプログラミングしていますが、WINAVR Suiteのプログラマーのメモ帳にも書き込んでいます。Cコードを別のファイルに入れる

私は自分のコードを分離しようとしていますが、sepeaet .cファイルではAVR定義済み変数を使用できません。 (AVRが特定のBITを指すように提供する変数)

たとえば、 このコードはmain.cファイルで機能します。ではなく、別のrandom.cのファイルに:

UBRR0H = (unsigned char)(ubrr>>8); 

それがエラーを与える:私のmain.cファイル内

random.c:6: error: 'UBRR0H' undeclared (first use in this function) 

それだけで以下が含まれています:

あなたが持っている
#include <stdio.h> 
#include <stdlib.h> 
#include <util/delay.h> 
#include <string.h> 
#include <avr/interrupt.h> 
#include "lcd.h" 
#include "random.h" 
+3

あなたは 'random.c'ファイルに同じインクルードを持っていますか? –

+0

あなたはUBRR0Hをどこで宣言しましたか? main.cとrandom.c?どこにもない? – fazo

+0

それは事です、私はどこでもUBRR0Hを宣言していません。それはちょうどMCUのsasの一部に来て..そして、宣言されたところではわからないIm。 – michael

答えて

1

yours.hのようなファイルを作成するには、関数定義とマクロ定義を入れます。

#define UBRR0H (unsigned char)(ubrr>>8); 

int mine_function(char, char, int); 

... 

extern int global_variable; 

ないUBRR0Hが変数マクロまたはextranalであるかどうかを確認してください

またについてextern variables何か、どのようにuse themは約いくつかの記事を使用します。

#include "yours.h" 

あなたは多くの.hファイルになってしまいますし、あなたが同じことを複数回含むだろうので、あなたがトラブルに取得する場合(原因になります:

そして、あなたがすべきすべてのあなたの.cファイルよりも

yours.hに誤り、あらかじめ定義されたが)、そこに簡単なハック、:

#ifndef _H_YOURS_INCLUDED_ 
#define _H_YOURS_INCLUDED_ 1 

// Your real content 

#endif /* _H_YOURS_INCLUDED_ */ 
2

あなたの挙でavr/io.hを含めるともgccコンピにMCUを指定する必要がありますコマンドラインに-mmcu=オプションを指定してください。

+2

他の回答は技術的には真ですが、これはavr-gccの文脈で正しい答えです。最後に、これらの定数を自分で定義します。 – freespace

1

コンパイル単位(.cファイル)で「ライブラリ」定義を使用している場合は、そのユニット(ファイル)に適切なヘッダを含める必要があります。 random.cファイルに#includeなどがないと思っています。 main.cにあるだけでコンパイルには役立たず、コンパイル時にはrandom.cがコンパイルされます。 :)

は、(リンカは別の問題である。)の定義は、単にコンパイラとlibcのソース(インクルード)ディレクトリをgrepし、名前を探すことである場所を見つけるために

一つの方法は。それは必ずしもあなたがそれを得るために何を意味するのかをあなたに伝えるわけではありません。その1つは、チップ固有のレジスタ名で、特定のチップのインクルードファイルに表示され、コンパイラスイッチによってはio.hを経由してロードされることが考えられます。

異なるチップを使用しているときに欠落している場合は、データシートを参照して特定のチップにレジスタ/ペリフェラルが存在することを確認し、スペルを含むインクルードファイルを確認します。違いがあるかもしれません。

関連する問題