atmega16 如何设置通讯端口初始化失败~比如a口只用了前四个.那DDRA和PORTA怎么写?

AVR&I/O端口位操作
基于ATmega16A和AVR
Studio 6,&需要include
&avr/io.h&
写用PORTx,读取用PINx。AVR的IO是真正双向IO结构。不论如何配置DDxn,都可以通过读取PINxn
寄存器来获得引脚电平。
输出口操作:
PORTA |= (1 &&
PORTAx)&&&&&&&&&&
PORTA &= ~(1 &&
PORTAx)&&&&&&&//&位置低
PORTA ^= (1 &&
PORTAx)&&&&&&&&&&//&位取反
输入口操作:
& (1 && PORTAx)
& // 位读取
由此可以编写IO测试小程序
int main(void)
& uint8_t i = 0;
& DDRA = 0xFF;
& while(1)
if (i == 100)
{&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&
PORTA ^= (1&&PORTA3); //
~PORTA3&&&&&&&&&&
如果PORTA3无误则用万用表测量应输出2.5V,示波器显示50%占空比的方波。
DDRA=OXFF;
PORTA=OXFF;
PORTA=OXFF;
DDRA=OXFF;
是有区别的,这两种顺序对应IO口的电平变化是不一样的。
DDRA、PORTA、在上电时默认都为0x00。
前者:输出口,并全部输出低电平。此时执行PORTA=OXFF,在此
IO口上面就会有一个从低电平到高电平的瞬间变化,因为在变化期间IO口方向已经为输出,所以这个信号是有一定能量的,会产生一定的干扰。
后者:先设电平后设方向,上面说的瞬间变化就不会发生了。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。21ic官方微信-->
求救Atmega16的快速PWM模式
高级技术员, 积分 977, 距离下一级还需 23 积分
高级技术员, 积分 977, 距离下一级还需 23 积分
高级技术员, 积分 977, 距离下一级还需 23 积分
高级技术员, 积分 977, 距离下一级还需 23 积分
芯片资料上的模式14,top值是ICR1,想用OC1B输出,需要设置什么top清零吗?我想用固定top值来控制舵机,50Hz频率,8分频,比较匹配时置位,TCCR1A:0x32
TCCR1B:0x1A
ICR1H=0x4e
ICR1l=0x1F& && &
OCR1B 控制占空比
这么配置怎么总是不行?我用ICCAVR自动向导也控制不了,是不是这个模式不能产生50Hz的频率啊?
先谢谢各位大神了哈
满意回复+5
//ICC-AVR application builder :
// Target : M16
// Crystal: 8.0000Mhz
void port_init(void)
PORTA = 0x00;
高级技术员, 积分 977, 距离下一级还需 23 积分
高级技术员, 积分 977, 距离下一级还需 23 积分
高级技术员, 积分 977, 距离下一级还需 23 积分
高级技术员, 积分 977, 距离下一级还需 23 积分
都已经进来的大神们,赐教一下吧
高级工程师, 积分 6214, 距离下一级还需 1786 积分
高级工程师, 积分 6214, 距离下一级还需 1786 积分
高级工程师, 积分 6214, 距离下一级还需 1786 积分
高级工程师, 积分 6214, 距离下一级还需 1786 积分
//ICC-AVR application builder :
// Target : M16
// Crystal: 8.0000Mhz
#include &iom16v.h&
#include &macros.h&
void port_init(void)
PORTA = 0x00;
DDRA&&= 0x00;
PORTB = 0x00;
DDRB&&= 0x00;
PORTC = 0x00; //m103 output only
DDRC&&= 0x00;
PORTD = 0x00;
DDRD&&= 0x00;
//TIMER1 initialize - prescale:8
// WGM: 14) PWM fast, TOP=ICRn
// desired value: 50Hz
// actual value: 50.000Hz (0.0%)
void timer1_init(void)
TCCR1B = 0x00; //stop
TCNT1H = 0xB1; //setup
TCNT1L = 0xE1;
OCR1AH = 0x4E;
OCR1AL = 0x1F;
OCR1BH = 0x4E;
OCR1BL = 0x1F;
ICR1H&&= 0x4E;
ICR1L&&= 0x1F;
TCCR1A = 0x32;
TCCR1B = 0x1A; //start Timer
//call this routine to initialize all peripherals
void init_devices(void)
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
timer1_init();
MCUCR = 0x00;
GICR&&= 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
中级技术员, 积分 174, 距离下一级还需 126 积分
中级技术员, 积分 174, 距离下一级还需 126 积分
中级技术员, 积分 174, 距离下一级还需 126 积分
中级技术员, 积分 174, 距离下一级还需 126 积分
请问3楼程序 timer1_init(void)函数中为何要加下面两句,好像不加就输出不了PWM
我仔细看了Datasheet也没说要加
TCNT1H = 0xB1; //setup
TCNT1L = 0xE1;
扫描二维码,随时随地手机跟帖
时间类勋章
技术高手奖章
人才类勋章
甘甜之泉水
发帖类勋章
技术奇才奖章
人才类勋章
无冕之王奖章
等级类勋章
沉静之湖泊
发帖类勋章
时间类勋章
技术新星奖章
人才类勋章
时间类勋章
您需要登录后才可以回帖
热门推荐 /3更多相关文档void delayus(uint i)//延时 { for(;i!=0;i--) { for(j=100;j!=0;j--); } }
void Led() //显示函数 { uchar m=2;//消隐延时 PORTC=0 //输出低电平,选通千位数 PORTA=table[cnt/1000]; //取出千位数,查表,输出。 delayus(m); //延时 PORTA=0x00; //数码销隐 PORTC=0 //销隐 PORTC=0 //输出低电平,选通百位数 PORTA=table[cnt00/100]; //取出百位数,查表,输出。 delayus(m); //延时 PORTA=0x00; //数码销隐 PORTC=0 //销隐 PORTC=0 //输出低电平,选通十位数 PORTA=table[cnt0/10]; //取出十位数,查表,输出。 delayus(m); //延时 PORTA=0x00; //数码销隐 PORTC=0 //销隐 PORTC=0xf7; PORTA=table[cnt]; //取出个位数,查表,输出。 delayus(m); PORTA=0x00; //数码销隐 PORTC=0 } void init_io(void)//初始化I/O { //设置A口为输出 DDRA=0X PORTA=0 //设置B口为输入 DDRB=0x00; PORTB=0x00; //设置C口为输出 DDRC=0X PORTC=0 }
void jianyan(void)//检查数码管 { uchar m=20;//设置延时时间 PORTA=0xFC;//0 PORTC=0x00; delayms(m); PORTA=0x60;//1 PORTC=0x00; delayms(m); PORTA=0xDA;//2 PORTC=0x00; delayms(m); PORTA=0xF2;//3 PORTC=0x00; delayms(m); PORTA=0x66;//4 PORTC=0x00; delayms(m); PORTA=0xB6;//5 PORTC=0x00; delayms(m); PORTA=0xBE;//6 PORTC=0x00; delayms(m); PORTA=0xE0;//7 PORTC=0x00; delayms(m); PORTA=0xFE;//8 PORTC=0x00; delayms(m); PORTA=0xF6;//9 PORTC=0x00; delayms(m); PORTA=0xFC;//0 PORTC=0x00; delayms(m); }
void get_key(void)//按键扫描函数
{ while((PINB&0X01)==0)//按键加计数标志 {key_up=1; Led(); } while((PINB&0X02)==0)//按键减计数标志 {key_down=1; Led();} }
void main(void) { init_io();//初始化I/O jianyan();//检查数码管 PORTA=0//点亮所有数码管 PORTC=0x00; delayms(3); //PORTC=0//关闭所有数码管
while(1) { get_key();//按键扫描 if (key_up==1) { if(cnt!=9999)//判断是否计数到9999 {cnt=cnt+1;//加一 key_up=0;} } if (key_down==1) { if(cnt!=0)//判断是否计数到0 {cnt=cnt-1;//减一 key_down=0; } } Led(); } }
////////////////////////////
程序(2)/////////////////////////// #include
#define uchar unsigned char
#define uint unsigned int
//uchar table[10]={0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};//共阴 uchar table[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共阳
uint cnt=0;//计数初值
uchar key_ uchar key_
void delayms(uint i)//延时 { for(;i!=0;i--) { for(j=8000;j!=0;j--); } }
void delayus(uint i)//延时 {
for(;i!=0;i--) { for(j=100;j!=0;j--); } }
void Led(uint i) //显示函数 { uchar m=10;//消隐延时
PORTB=0x80; //输出低电平,选通百位数 PORTC=table[i00/100]; //取出百位数,查表,输出。 delayus(m); //延时 PORTC=0 //数码销隐 PORTB=0x00; //销隐
PORTB=0x40; //输出低电平,选通十位数 PORTC=table[i0/10]; //取出十位数,查表,输出。 delayus(m); //延时 PORTC=0 //数码销隐 PORTB=0x00; //销隐
PORTB=0x20; //输出低电平,选通个位数 PORTC=table[i]; //取出个位数,查表,输出。 delayus(m); //延时 //PORTC=0 //数码销隐 PORTB=0x00; //销隐 } void init_io(void)//初始化I/O { //设置A口为输出 DDRA=0X PORTA=0 //设置B口为输入 DDRB=0xf0; PORTB=0xf0; //设置C口为输出 DDRC=0X PORTC=0 }
void get_key(void)//按键扫描函数
{ while((PINB&0X01)==0)//按键加计数标志 {key_up=1; Led(cnt);//消除按下黑暗 } while((PINB&0X02)==0)//按键减计数标志 {key_down=1; Led(cnt);//消除按下黑暗 } }
void main(void) { init_io();//初始化I/O
delayms(3); //PORTC=0//关闭所有数码管
while(1) { get_key();//按键扫描 if (key_up==1) { if(cnt!=999)//判断是否计数到999 {cnt=cnt+1;//加一 key_up=0;} } if (key_down==1) { if(cnt!=0)//判断是否计数到0 {cnt=cnt-1;//减一 key_down=0; } } Led(cnt); } }}

我要回帖

更多关于 单片机端口初始化 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信