2010-10-18 1 views
1

Я пытаюсь запрограммировать программу Blinky от Keil complier до микроконтроллера P89LPC936 через универсальный программист (SuperPro). Но микроконтроллер не работает. Но когда я пишу простую программу в 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); 
    } 
    } 
} 

Вот Hex файл >>>

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

А вот код сборки и его шестнадцатеричный файл, который работает абсолютно правильно.

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

Как это не вопрос?ОП продемонстрировал некоторые усилия, при условии, что он/она попытался, и просит о помощи. Sheesh. –

+1

, вы должны вернуться к предыдущим запрошенным вопросам и нажать на галочку рядом с ответом, который помог вам больше всего. Вы можете увидеть свои предыдущие вопросы здесь: http://stackoverflow.com/users/357296/adnan#tabs-question-user –

+0

@Colin Спасибо за редактирование – jassuncao

ответ

0

Разберите или скомпилировать C в ассемблере, чтобы увидеть, что делает компилятор. Что работает или нет в вашей программе на C? ли светодиод просто светится? Ваш ассемблер выглядит сжигающим около 140 000 инструкций, но C может быть 40 000? что могло бы сделать разницу между ведомым, который вы можете видеть своими глазами, и тем, который выглядит, но не мигает.

Программа C, как представляется, настраивает регистры, которые нет у ассемблера. есть ли там ошибка? они отключают что-то, что нельзя трогать?

В нижней строке вам нужно переместить обе программы друг к другу, усложнить сборщик, пока он не приблизится к тому, что делает C, и настройте C в сторону ассемблера (хотя нужно посмотреть на выход компилятора).

+0

Хорошо .. это хорошая идея ... я буду работать над этим. Но Y код C работает на симуляторе справа. – Adnan

+0

что он делает или не делает? Если светодиоды светятся, это может мигать очень хорошо, ваш глаз не может его увидеть. но симулятор. Или светодиоды остаются выключенными? Симуляторы редко отражают реальность. часто позволяя записывать только память для чтения, обеспечивая память по адресам за пределами чипа и т. д. –

+0

Нет, это не матер, если я не моргаю их и не позволяю им продолжать работать, даже тогда я не получаю их свечение и контакты также не показывайте выходное напряжение. – Adnan

1

Я не работаю с Keil инструментов в течение длительного времени, и я никогда не использовал этот микро, так что, вероятно, я не буду в состоянии помочь вам много.

  • Вы пытались запустить его на эмуляторе?
  • Попробуйте установить контрольную точку в главном окне и проверьте, не остановлено ли оно. Там может быть проблема с c_start, и ваш основной вызов не вызван.
  • Посмотрите на сборку кода инициализации и проверьте что-то нечетное. Я думаю, вы можете проверить код сборки, сгенерированный компилятором. Возможно, вам придется включить некоторый вариант для создания промежуточных файлов.

Вы также можете проверить "Electronics and Robotics" на stackexchange. Там вы можете найти людей, работающих с электроникой, которые могут обеспечить лучшую помощь.

1

Вы говорите, что вы пишете программу в сборке, и она работает нормально, но не на C. Вы проверили, что ваша среда C настроена на размещение вашего кода и данных в правильных местах в памяти?

Кроме того, некоторые чипы имеют «сброс вектора», который вызывается при первом включении чипа, а также когда чип сбрасывается. Правильно ли среда C задает этот вектор? Включает ли он код, который будет запускаться в вашу программу, когда он начнет работать?

+0

Возможно, это проблема. Но я использовал начальный файл starta.a51 defaul, который включает в себя настройки по умолчанию для вектора прерываний. У вас есть пример того, как сделать его правильным. – Adnan

+0

Простите, не знаю. Это были просто общие вещи, которые мне приходилось делать в прошлом с другими чипами (HC12, i8051 и т. Д.). Правильные расположения памяти для ваших подпрограмм и данных, а также ваш стек и код прерывания будут зависеть от карты памяти для вашего конкретного чипа. Кроме того, настройка этих объектов в среде C, вероятно, специфична для каждого инструмента. –

0

Try:

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