-
初次接触
GCC
因此花费了我不少时间,搞了半
天加一个晚上终于能编译成功了
!^_^
< br>先是安装《
PN
的配置与
GCC
入门
》操作了一遍,没有成功,之后在论坛了找啊找啊,找了<
/p>
hotpower
的一篇文档,两者一结合,
ok
了
,呵呵。
为了更好的方便象我一样的
初学者,
现在把我操作的一系列步骤写下来,
给初学者一个参考
。
1
、
安装
WinA
VR,
我按照其默认的状态安装的。
(省力省心,
^_^
p>
)
2
、
打开
Programmers Notepad,
先不要着急新建什么工程,
编写什么程序。
按照
p>
《
PN
的配置与
G
CC
入门
》配置一下字体显示和一些工具。
我配置的工具如下:
小弟用的是双龙的下载软件。
当然在配置
Makefile Wizard
时,要把
C:WinAVRbin
目录下的
,,
三
个文件复制到
C:
WinAVRmfile
目录下,然后用
PN
< br>打开该目录下的
文件,并按照下
图修改。
如果
WinAVR
不是按默认目录安装的,假如安装到了
D:/
program/
下,则上图中圈中的地方
要改为
set
prefix
“
D:/program/WinAVR/mf
ile/
”
.
同样工具配置的第一幅图
中
command
和
paramete
rs
栏都要改到相应的目录下面。
以上配置基本完成,下面进入实战阶段。
3
、
在
Programmers Notepad
< br>中,
点击
File->new->project
新建一工程项目,
可取名为
如图
4
、
新建文件,点击
File->New->Default,
5
、
在编辑
区内编写自己的程序代码,并保存到刚才新建
Project
的
目录下面,取名为
test.c
记住
一定要保“
.c
”的格式,否则没有语法显示。之后整个界面如
下所示:
我所加的代码是我随便找的,代码是马老师的
SPI
主机的发
送和接收一个字节的程序。
(做了一点修改)
代码如下:
#include
#include
#include
#include
//#define
unsigned
char
uchar
#define
SIZE 100
unsigned char
SPI_rx_buff[SIZE];
unsigned char
SPI_tx_buff[SIZE];
unsigned char
r
x_wr_index,rx_rd_index,rx_counter,rx_buffer_overfl
ow;
unsigned char
tx_wr_index,tx_rd_index,tx_counter,SPI_ok;
unsigned
char
t10mscnt;
unsigned
char
t500mscnt;
unsigned
char
senddata;
void
mcu_ini(void)
{
unsigned char temp;
cli();
MCUCR
= 0x00;
//disable all interrupts
DDRA=0xff;
PORTA=0x00;
DDRC=0xff;
PORTC=0x00;
DDRD=0xff;
PORTD=0x00;
TCCR0 = 0x00; //stop
TCNT0 = 0x06;
//set count
250us
OCR0
= 0x64;
//set
compare
TCCR0 =
0x02; //start timer
DDRB |= 0xBF;
//MISO=input and
MOSI,SCK,SS = output
PORTB |= 0x40;
//MISO
上拉电阻有效
SPCR = 0xD5;
//SPI
允许,
< br>主机模式,
MSB
,
允许
SPI
中断,
极性方式
01
,
1/16
系统时钟速率
SPSR = 0x00;
temp = SPSR;
temp = SPDR;
//
清空
S
PI
,和中断标志,使
SPI
空闲
p>
SPI_ok = 1;
MCUCR = 0x00;
GICR
= 0x00;
TIMSK = 0x01;
//timer interrupt sources
sei(); //re-enable interrupts
}
//#pragma
interrupt_handler timer0_ovf_isr:10
SIGNAL(SIG_OVERFLOW0)
{
//250us
TCNT0 = 0x06; //reload counter value
if(++t10mscnt>=40)
{
t10mscnt=0;
if(++t500mscnt>=50)
{
senddata++;
if(senddata>=16)
senddata=0;
t500mscnt=0;
}
}
}
//===========================
//#pragma interrupt_handler
master_spi_isr:11
SIGNAL(SIG_SPI)
{
SPI_rx_buff[rx_wr_index] =
SPDR;
< br>//
从
ISP
口读出收到的字节
SPI_ok = 1;
//
SPI
空闲
if
(++rx_wr_index == SIZE) rx_wr_index = 0;
//<
/p>
放入接收缓冲区,并调整队列指
针
if
(++rx_counter == SIZE)
{
rx_counter = 0;
rx_buffer_overflow = 1;
//
接收缓冲区溢出
}
if (tx_counter)
//
如果发送缓冲区中有待发的数据
tx_
counter==0
表示没
有数据要发送
{
--tx_counter;
SPDR = SPI_tx_buff[tx_rd_index];
//
发送一个字节数据,并调整指针
if (++tx_rd_index == SIZE)
tx_rd_index = 0;
SPI_ok = 0;
}
}
<
/p>
//--------------------------------------
--
unsigned char getSPIchar(void)
{
unsigned char
data;
while (rx_counter == 0);
//
无接收数据,等待
data =
SPI_rx_buff[rx_rd_index];
//
从接收缓冲区取出一个
SPI
收到的数据
if (++rx_rd_index == SIZE)
rx_rd_index = 0;
//
调整指针
cli();
--rx_counter;
sei();
return data;
}
//-
-----------------------------------------
void putSPIchar(char c)
{
while (tx_counter ==
SIZE);//
发送缓冲区满,等待
cli();
if (tx_counter
|| SPI_ok==0 )
//
发送缓冲区已中有待发数据
{
//
或<
/p>
SPI
正在发送数据时
SPI_tx_buff[tx_wr_index] = c;
//
将数据放入发送缓冲区排队
-
-
-
-
-
-
-
-
-
上一篇:VS2010中使用XlistCtrl
下一篇:中英饮食文化差异(中英双语)