tearsman520 发表于 2010-2-15 10:32:29

AVR中写数据到PINx寄存器是什么作用?

在AVR中要使引脚的电平翻转,应该是往PORTx寄存器写数据。PINx寄存器是用来检测引脚的电平值是高电平还是低电平的。

然而AVR的参数手册中提及PINx寄存器是可读写的,那么如果往PINx寄存器写数据会有什么效果呢?

下面是国外的一个人写的SPI接口初始化代码,使用的是ATtiny85。


;---------------------------------------------------------------------------;
; Receive a byte接收一个字节
;
; BYTE rcv_spi (void);

.global rcv_spi
.func rcv_spi
rcv_spi:
        ldi        r24, 0b000100                        ;PB2(SCK)取得立即数到r24寄存器
        .rept 16                                ;Toggle SCK 16 times 翻转SCK16次
        out        _SFR_IO_ADDR(PINB), r24                ;
        .endr                                        ;/
        nop                        ;读取移位寄存器中的内容到r24寄存器——由于接收的数据只有8位,所以直接通过r24寄存器返回给C程序。
        in        r24, _SFR_IO_ADDR(USIDR)        ;/
        ret
.endfunc



;---------------------------------------------------------------------------;

问题来了,out _SFR_IO_ADDR(PINB),r24 这句话的作用是翻转SCK。往PINx寄存器写数据就是这种效果吗?

ilovezeno 发表于 2010-2-15 11:28:18

我只知道,这个寄存器可以当作额外的通用寄存器用....官方有这个技巧的介绍.....

airzougang 发表于 2010-2-15 15:40:15

写这个寄存器 没有多大用的这个主要是用来读的!

god-father 发表于 2010-2-15 15:53:02

就是弄不懂去写操作PIN有啥现实意义

linyu0395 发表于 2010-2-15 16:37:03

输出有取反的作用

tearsman520 发表于 2010-2-15 17:27:29

回复【4楼】linyu0395 林
-----------------------------------------------------------------------

感谢您的回答,刚刚谷歌了一下,找到一篇文章http://www.avrtool.com/avr/Print.asp?ArticleID=686

确实是这样,写1到PINx寄存器的某位,对该位有取反的作用。

machao 发表于 2010-2-21 09:33:47

注意!这个不是通用的性能,需要查看具体使用芯片的型号。

M16就没有这个功能,在M16的手册中,PIN就是只读寄存器,I/O结构图中没有写PIN的信号。

而TINY85的手册中,PIN是可读写的寄存器,手册中明确说明写PIN将把PIN取反,I/O的结构图也同M16的不同,有写PIN的信号。

还是应该沉下心来,养成先仔细看手册的习惯,然后认真理解,这是最根本的。网上别人的东西,只是参考。

http://cache.amobbs.com/bbs_upload782111/files_26/ourdev_534577.jpg
M16的I/O结构图

http://cache.amobbs.com/bbs_upload782111/files_26/ourdev_534578.jpg
TINY85的I/O结构图

tearsman520 发表于 2010-2-25 01:41:52

回复【6楼】machao
-----------------------------------------------------------------------

感谢马老师细心答复,学生心粗了……
页: [1]
查看完整版本: AVR中写数据到PINx寄存器是什么作用?