p89lpc936 keil требуется помощь в программировании - PullRequest
1 голос
/ 18 октября 2010

Я пытаюсь запрограммировать программу Blinky с компилятора Keil на микроконтроллер P89LPC936 через универсальный программатор (SuperPro).Но микроконтроллер не работает.Но когда я пишу простую программу на ассамбли и программирую то же оборудование, она работает нормально.Пожалуйста, мне нужна помощь относительно того, где я делаю что-то не так.

Вот код >>> Код:

/* 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 ]

1 голос
/ 18 октября 2010

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

1 голос
/ 18 октября 2010

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

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

Вы также можете проверить "Электроника и робототехника" на бирже стека. Там вы можете найти людей, работающих с электроникой, которая может оказать более эффективную помощь.

0 голосов
/ 19 октября 2010

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

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

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

0 голосов
/ 18 октября 2010

Попробуйте:

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