|
运用:avr初始化代码生成
T0:
CTC:
一般用来生成占空比百分之五十的方波,如果是从OC0输出,则选择“匹配时OC0取反”,下面勾选FOC0,同时可选OCIE0(比较匹配中断使能),如果不从OC0输出,选择“不与OC0连接”,后面只选择OCIE0,通过中断来控制。TOIE0在这个模式下没有用,因为这个模式计数器从0开始计数一直到OCNT0然后重新计数,不会到达0XFF,所以没有溢出中断。
相位修正PWM:
由于是双向满程计数,所以晶振和分频都确定了,总的周期也就确定了,通过选择“匹配时引脚OC0电平”来选择是通过是否通过OC0来输出方波。通过滑块调整占空比,TOIE0和OCIE0都能选择,但由于双向计数,定时中断如果有赋初值的话要注意。其实定时中断里可以不赋初值。
快速PWM::
设置与上面类似,就是0到0XFF单向计数,匹配值和0xFF时电平变化。
T2:
与T0相同,只是可以外接其他晶振。
T1:
CTC:
CTC(TOP=ICR1):
不能溢出,而且ICR1没有双缓冲,所以适合频率不变的情况,此时OCR1A和OCR1B都可以调相位
CTC(TOP=OCR1A):
不能溢出,OCR1A做TOP用,剩下OCR1B可以调相位
PWM:
8、9、10位的各种PWM特点就是总计数周期一样,就是根据分频数和位数决定的,和T0差不多。
相位修正PWM(TOP=ICR1)和相位与频率修正PWM(TOP=ICR)基本一样:
可以通过ICR1的设定来确定计数的周期,此时A,B都可以调整占空比。
相位与频率修正PWM(TOP=OCR1A):
OCR1A有双缓冲,所以可以方便修改频率,此时B可调占空比。
相位修正PWM(TOP=OCR1A):
设定OCR1A来确定计数周期,但是运行中修改频率有专有模式,最好不用此模式,这样就浪费了OCR1A,所以这个模式貌似没什么用。
输入捕获:设置PD6/ICP为带上拉输入,ICES1设置上升沿还是下降沿触发捕获(1上升,0下降),ICN1设置是否噪声抑制。选中TICIE1,这样有捕获后产生中断,可以记录下当时的时间,软件会自动生成相应代码,只需要声明一个全局uint变量来接受就可以了
adc:
参考电压默认,dip封装的adc通道选择只能选择单通道,确定好分频因子后,勾选ADCEN,ADATE,然后在需要开启ADC的时候加入代码ADCSRA|=BIT(ADSC);这样系统就自己按照制定频率进行采样,我们要做的就是随时去读取寄存器的采样值就行了。很简单。AREF和AVCC连接到节点,这个节点通过一个50欧姆电阻连接到电源,通过一个104电容接地。
模拟比较器:
比较简单,就是两个输入如果不一样大小,或者违反之前确定的大小规则,就会触发中断或输入捕获,PA端口如果不进行adc转换,也可以作为负极输入端。
SPI:
模式一般采取第一种,也就是datasheet里出现的mode(0,0),勾选SPE,先发高位,主机模式,确定好分频就行了。读spi-E2PROM的时候总提示读操作与写操作冲突,连续读到第三次的时候就没问题了,不知道为什么。
找到原因了,不是spi的问题,是要读“系统状态”RDSR",先写instruction=0x05,然后读出来的数末位如果是1代表忙,用while等待。等待之后重新拉高在拉低一次片选线,就可以读了,哈哈哈
TWI:
如果不采用外部上拉电阻,则PC的两个TWI端口应设置为输入,有上拉。模式选择TWEN,TWEA,从机地址选择要控制的原件相应地址(参考datasheet),分频因子按推荐来设置。最重要的是在生成的twi_stop()函数后设置延时,这个东西困扰了我一天,早就测试了一个keil形式的延时,只是循环,没有NOP()语句,估计被优化掉了,干扰了思考。用AT24C02测试,写入的时候简单,读的时候粗心,没有仔细看顺序,应该是START->TO WRITE->SEND(ADDRESS)->START->TO READ->RECEIVE->STOP,不是想当然的开始-地址-数据-结束!
UART:
其实avr是usart,增强型uart,但是电脑是uart,如果需要同步串行的话应该用spi就可以了,所以只学习了下异步串行,本来很简单的事情仿真却出现了大问题,逻辑冲突,后来才知道proteus的compim也就是串口模型本身是带232芯片的,只需要把rxd和txd分别按相同名称相连就行了。
注意一点:
while (!(UCSRA&0x80));//准备好了可以接收,不是接收后延时
a=UDR;
while(!(UCSRA&0x40));//同理,准备好了可以发送
UDR=a;
不要搞错顺序。
|
|