2010-10-18 123 views
1

我想通过通用编程器(SuperPro)将Keil编译器中的Blinky程序编程为P89LPC936微控制器。但微控制器没有运行。但是当我在assambly编写一个简单的程序并编写相同的硬件时,它工作正常。请问我在哪里做错了我需要帮助。p89lpc936需要keil编程帮助

这里是代码>>> 代码:

/* Blinky.C - LED Flasher for the Keil LPC900 EPM Emulator/Programmer Module */ 

#include <REG936.H> // register definition 

void delay (unsigned long cnt) 
{ 
    while (--cnt); 
} 

void main() 
{ 
    unsigned char i; 

    P1M1 |= 0x20; 
    P1M2 &= 0xDF; 

    P2M1 &= 0xE7; 
    P2M2 |= 0x18; 

delay (20000); 
    for(;;) 
    { for (i = 0x01; i; i <<= 1) 
    { P2 = i; // simulate running lights 
     delay (20000); 
    } 
    for (i = 0x80; i; i >>= 1) 
    { P2 = i; 
     delay (20000); 
    } 
    } 
} 

这里是十六进制文件>>>

:10006B008F0B8E0A8D098C08780874FF12004DECEB 
:06007B004D4E4F70F32210 
:100003004391205392DF53A4E743A5187F207E4EEC 
:100013007D007C0012006B7B01EB6013F5A07F2059 
:100023007E4E7D007C0012006BEB25E0FB80EA7BBB 
:1000330080EB60E3F5A07F207E4E7D007C00120004 
:070043006BEBC313FB80EA25 
:01004A002293 
:04FFF00023001E00CC 
:08FFF800000000000000000001 
:030000000200817A 
:0C00810078FFE4F6D8FD75810B02000347 
:10004B007401FF3395E0FEFDFC080808E62FFFF670 
:10005B0018E63EFEF618E63DFDF618E63CFCF622E9 
:00000001FF 

这里是汇编代码和它的hex文件这是工作绝对正确的。

Code: 
; LPC936A1.A51 
; Oct 7, 2010     PCB: ? 

; Features:  ? 
;    ? 


$mod51 


RL1  bit  P2.3 
RL2  bit  P2.4 

       DSEG AT 20H 
FLAG1: ds  1 
STACK: ds  1 


FRL1 bit  FLAG1.0     ; Relay 1 


       CSEG 
       org  0H 
       ajmp Reset 

       org  30H 
Reset:   mov  0A5H,#0FFH 

Start:   mov  c,FRL1     ; 
       mov  RL1,c 
       cpl  c 
       mov  FRL1,c 
       mov  RL2,c 

       acall Delay0 

       ajmp Start 

Delay0:   mov  R7,#250 
Delay:   mov  R6,#61 
Delay1:   nop 
       nop 
       nop 
       nop 
       nop 

       nop 
       nop 
       nop 
       djnz R6,Delay1 
       djnz R7,Delay 
       ret 

Text:   DB  '(C) DIGIPOWER 2010' 
Text0:   DB  ' LPC936A1 ' 

       END 


And its hex is 
:020000000130CD 
:1000300075A5FFA20092A3B3920092A411400133D0 
:100040007FFA7E3D0000000000000000DEF6DFF2D7 
:10005000222843292044494749504F5745522032CE 
:0D006000303130204C5043393336413120CF 
:00000001FF 

请帮读音字卡住。

问候 达尼

+4

这不是一个真正的问题吗?OP已经表现出了一些努力,提供了他/她的尝试,并且正在寻求帮助。啧。 – 2010-10-18 11:36:01

+1

你应该重新回顾以前提出的问题,然后点击最有帮助的答案旁边的勾号。你可以在这里看到你以前的问题:http://stackoverflow.com/users/357296/adnan#tabs-question-user – 2010-10-18 11:42:18

+0

@Colin感谢编辑 – jassuncao 2010-10-18 11:44:59

回答

0

拆卸或编译C汇编器,看看有什么编译器在做什么。什么在你的C程序中工作或没有? LED是否发光?你的汇编器看起来正在烧14万条指令,但C也许是40,000条?这可能会导致你可以看到你的眼睛和看起来在开但不闪烁的光。

C程序看起来是在设置汇编器没有的寄存器。那里有bug吗?他们禁用了哪些不应该被触及的东西?

底线是你需要将两个程序相互移动,使汇编程序复杂化,直到它接近C正在做的事情,并调整汇编程序的C(不得不查看编译器的输出)。

+0

好吧..这是个好主意......我会努力的。但是,C代码正在模拟器上运行。 – Adnan 2010-10-20 11:35:51

+0

它在做什么或者不在做什么?如果LED发光,它可能会眨眼睛,你的眼睛看不到它。但模拟器会。还是LED灯仍然熄灭?模拟器很少反映现实。通常只允许只读存储器写入,在芯片之外的地址提供存储器等。 – 2010-10-20 13:50:01

+0

不,它不是主体,如果我不眨眼,让它们连续不断,即使那样我也不会让它们发光和引脚也不要显示输出电压。 – Adnan 2010-10-20 14:33:53

1

我不具有Keil工具的工作很长一段时间,我从未使用过微,所以也许我不能帮你了。

  • 您是否试过在模拟器上运行它?
  • 尝试在main中放置一个断点并检查它是否停在那里。我可能会遇到一些c_start的问题,而你的main没有被调用。
  • 看看初始化代码的程序集并检查奇怪的东西。我想你可以检查编译器生成的汇编代码。您可能需要启用某些选项来生成中间文件

您也可以在stackexchange上检查"Electronics and Robotics"。在那里你可能会发现使用电子产品的人可能会提供更好的帮助。

1

你说你在汇编中编写了一个程序,它工作正常,但没有在C中。你是否验证过你的C环境配置为将你的代码和数据放在内存中的正确位置?另外,一些芯片有一个“复位向量”,在芯片首次上电时以及芯片复位时被调用。你的C环境是否正确设置了这个向量?它会在开始运行时将代码跳转到您的程序吗?

+0

这可能是问题所在。但是我使用了包含中断向量的默认设置的默认start900.a51启动文件。你有任何例子如何使其正确。 – Adnan 2010-10-20 17:14:37

+0

对不起,我不知道。这些只是我过去用其他芯片(HC12,i8051等)必须做的一般事情。您的例程和数据以及堆栈和中断代码的正确内存位置取决于特定芯片的内存映射。另外,在C环境中设置这些东西可能是针对每个工具的。 – 2010-10-20 17:39:55

0

尝试:

void delay (unsigned long cnt) 
{ 
    while (--cnt) { 
#pragma asm 
     NOP 
#pragma endasm 
} 
}