分享

[AVR笔记]ICCAVR与CodeVisionAVR

 笔录收藏 2014-04-04

1. 中断的用法
ICCAVR
#pragma interrupt_handler <function_name>:<interrupt_vetor_number>
       如果想要多个中断入口使用同一个中断服务程序,只要用不同的向量号多次声明就可以了,例如,计划定时器1和0溢出共用time_ovf中断函数,可以定义如下:
#pragma interrupt_handler time_ovf:7 time_ovf:8

CodeVisionAVR
       中断的用法:
       interrupt[interrupt_vetor_number] function_name
       如:
interrupt [TIM1_OVF] void timer1_overflow(void)

2. 头文件
ICCAVR
       在macros.h中,定义了一个“#define BIT(x) (1<<(x))”的宏,用该宏来操作位变量,编译后生成的代码质量更高。如下例:
#define PORTA0 0
#define PORTA1 1
#define PORTA2 2
#define PORTA3 3
#define PORTA4 4
#define PORTA5 5
#define PORTA6 6
#define PORTA7 7
       在使用时,应该在文件头加入“#include <macros.h>”定义,如要将PORTA7清零,可能使用如下语句:
PORTA&=~BIT(PORTA7)
       要装饰PORTA7置位,可以使用如下语句:
PORTA|=BIT(PORTA7)

3. 对寄存器变量的访问
CodeVisionAVR
       定义了新的数据类型“sfrb”和“sfrw”,使C语言可以直接访问MCU的有关寄存器。如:
sfrb DDRD=x011

ICCAVR
       没有定义类似的数据类型,而是采用强制类型转换和指针的概念来实现访问MCU的寄存器,如:
#define DDRD (*(volatile unsigned char *)0x31) //加上了0x20
       则在ICCAVR中访问:
DDRD=0xff;

4. 使用AVR片内不同的存储空间
       由于AVR单片机内部有三种类型的存储空间(ARM、EEPROM和FLASH),CodeVisionAVR和ICCAVR均对语法进行的扩充。
       对字符串的处理两者相同,即对于用户没有指定只能保存在Flash中的字符串,在启动时将字符从程序存储区复制到数据存储区。
ICCAVR
       对const类型进行的扩充,编译器会自将const类型数据分配进FLASH存储中,对片内EEPROM存贮器的访问,ICCAVR只能通过调用头文件eeprom.h中的函数EEPROM进行。ICCAVR不支持将全局变量或局部变量分配至EEPROM,通常只将常量分配至有EEPROM中,一般定义如下:
#program data:eeprom/flash
const unsigned char table[]={0x3f,0x06...,};
#program data:data

CodeVisionAVR
       扩充了flash和eeprom两个关键词,使用flash将const定义的常量分配进Flash存器,以节省RAM的使用。而eeprom关键词限定的变量则被分配进片内EEPROM中,在C语言中访问EEPROM中变量的方法与访问RAM中变量的方法完全相同,包括指针形式的访问。  
       注意:在CVAVR中,有两种存储模式“TINY”和“SMALL”,其中“TINY”模式使用1个字节(8位)的指针,因此只能访问不大于256字节的存储空间;“SMALL”模式使用2个字节的指针,可以访问不大于64K字节的存储空间。当使用外部数据存储器时,必须使用“SMALL”,如果没有使用外部数据存储器,应优先使用“TINY”模式。
       CVAVR指向字符串的指针数组至多只支持8个元素,注意,是指向字符串的指针数组,普通数组则没有这个限制。
       如:
char flash *string[8]={"a","b","c","d","e","f","g","h"};

5. 位变量
CodeVisionAVR
       可以直接定义位变量
bit on_off=1;
ICCAVR
       在ICCAVR 6.26C中,不能直接定义位变量,但是可以使用C语言中的结构体定义位变量,如下例:
struct data //存放于SRAM中
       {
              unsigned bit0:1;
              unsigned bit1:1;
              unsigned bit2:1;
              unsigned bit3:1;
              unsigned bit4:1;
              unsigned bit5:1;
              unsigned bit6:1;
              unsigned bit7:1;
       }
       上例中,成员列表的位域的类型必须用unsigned或signed定义关键字。a、b均占用一个字节的存储空间。定义之后就可以直接使用位变量了,如:
a.bit1=0;
a.bit7=1;
if(a.bit5==1)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多