打印
[AVR单片机]

汇编查表程序请教

[复制链接]
3380|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
eehomer|  楼主 | 2012-4-11 22:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 eehomer 于 2012-4-11 23:05 编辑

相关的程序如下,我不知道为啥查表不对,例如对一次进入LOOP1的时候,我觉得查表查到的应该是0x80,但结果却是0xFF,而且每个循环都是,不知道怎么回事.我到底错在哪里呀,我就是想查下表呀。软件仿真的时候R31里面也明明是0x01,R30也明明是0x00呀。实际下载程序运行和软件仿真一致,我看别人查表程序也是这样的呀。:'(

.org $0000                        
rjmp RESET                        
;******************************************************************************
; data tables
;******************************************************************************
.org $0100
sine:        ; 256 step sinewave table
    .db    0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae
    .db    0xb0,0xb3,0xb6,0xb9,0xbc,0xbf,0xc1,0xc4,0xc7,0xc9,0xcc,0xce,0xd1,0xd3,0xd5,0xd8
    .db    0xda,0xdc,0xde,0xe0,0xe2,0xe4,0xe6,0xe8,0xea,0xec,0xed,0xef,0xf0,0xf2,0xf3,0xf5
    .db    0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfc,0xfd,0xfe,0xfe,0xff,0xff,0xff,0xff,0xff
    .db    0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfe,0xfd,0xfc,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7
    .db    0xf6,0xf5,0xf3,0xf2,0xf0,0xef,0xed,0xec,0xea,0xe8,0xe6,0xe4,0xe2,0xe0,0xde,0xdc
    .db    0xda,0xd8,0xd5,0xd3,0xd1,0xce,0xcc,0xc9,0xc7,0xc4,0xc1,0xbf,0xbc,0xb9,0xb6,0xb3
    .db    0xb0,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x98,0x95,0x92,0x8f,0x8c,0x89,0x86,0x83
    .db    0x80,0x7c,0x79,0x76,0x73,0x70,0x6d,0x6a,0x67,0x63,0x60,0x5d,0x5a,0x57,0x54,0x51
    .db    0x4f,0x4c,0x49,0x46,0x43,0x40,0x3e,0x3b,0x38,0x36,0x33,0x31,0x2e,0x2c,0x2a,0x27
    .db    0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x17,0x15,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x0a
    .db    0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x03,0x02,0x01,0x01,0x00,0x00,0x00,0x00,0x00
    .db    0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08
    .db    0x09,0x0a,0x0c,0x0d,0x0f,0x10,0x12,0x13,0x15,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x23
    .db    0x25,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3b,0x3e,0x40,0x43,0x46,0x49,0x4c
    .db    0x4f,0x51,0x54,0x57,0x5a,0x5d,0x60,0x63,0x67,0x6a,0x6d,0x70,0x73,0x76,0x79,0x7c

;******************************************************************************
; code
;******************************************************************************

RESET:  ldi    r20, 0
        out    portd, r20
        ldi    r20, 0xff
        out    ddrd, r20
        
        ldi        r31,high(sine)
        ldi        r30,low(sine)

        ldi     r29,0x00        
        ldi     r28,0x00        
        
        ldi     r24,0x55        
        ldi     r25,0x35        
        ldi     r26,0x00   

LOOP1:
        add        r28,r24            
        adc        r29,r25            
        adc        r30,r26            
        lpm                    
        out        PORTD,r0   
        rjmp    LOOP1

相关帖子

沙发
hyhmh| | 2012-4-12 15:30 | 只看该作者
建议看一下 指令系统
当使用 X、Y、Z 时 不要用 R30等
而用  ldi ZH,high(sine*2)
        ldi ZL,low(sine*2)
读FLASH ROM指令
     lpm R16, Z+
或   lpm

使用特权

评论回复
板凳
airwill| | 2012-4-12 16:08 | 只看该作者
这是 AVR 内核的问题, 由于 flash 编址是以 16 bit 位单位的。而 LPM 指令则会将地址*2 处理, 所以楼主没有照顾到这个变化, 当然会错误了。仔细看看 LPM 指令的说明吧

使用特权

评论回复
地板
eehomer|  楼主 | 2012-4-12 16:10 | 只看该作者
本帖最后由 eehomer 于 2012-4-12 16:37 编辑

3# hyhmh
太帅了,可以了,谢谢。
我试了下,主要是要high(sine*2),而我之前是high(sine)。谢谢。

使用特权

评论回复
5
ZALIN| | 2012-4-12 16:15 | 只看该作者
ldi        r31,high(sine*2)
ldi        r30,low(sine*2)

使用特权

评论回复
6
eehomer|  楼主 | 2012-4-12 16:36 | 只看该作者
4# airwill
就是因为这个。
The program memory is organized in 16 bit words while the Z pointer is a byte address.

使用特权

评论回复
7
LEDS| | 2012-5-3 18:56 | 只看该作者
表格地址要乘2。

使用特权

评论回复
8
redstone8415| | 2016-4-20 14:31 | 只看该作者
LEDS 发表于 2012-5-3 18:56
表格地址要乘2。

谁能清楚的解释一下为何要是: sine*2
最好是从内存模型上解释!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

130

帖子

1

粉丝