2010-10-18 5 views
1

J'essaie de programmer le programme Blinky de Keil complier au microcontrôleur P89LPC936 via un programmateur universel (SuperPro). Mais le microcontrôleur ne fonctionne pas. Mais quand j'écris un programme simple en assambly et programme le même matériel cela fonctionne bien. S'il vous plaît j'ai besoin d'aide à ce sujet là où je me trompe.p89lpc936 keil aide à la programmation requise

Code est ici >>> code:

/* 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); 
    } 
    } 
} 

Voici fichier Hex >>>

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

Et voici le code assembleur et son fichier hexagonale qui fonctionne tout à fait raison.

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 

Veuillez m'aider à rester bloqué.

Cordialement Dani

+4

Comment n'est-ce pas une vraie question?OP a fait des efforts, a fourni ce qu'il a essayé et demande de l'aide. Sheesh. –

+1

vous devriez revoir les questions précédentes que vous avez posées et cliquez sur la coche à côté de la réponse qui vous a le plus aidé. Vous pouvez voir vos questions précédentes ici: http://stackoverflow.com/users/357296/adnan#tabs-question-user –

+0

@Colin Merci pour l'édition – jassuncao

Répondre

0

ou Démontez compiler le C assembleur pour voir ce que le compilateur fait. Qu'est-ce qui fonctionne ou non dans votre programme C? est-ce que la led s'allume? Votre assembleur semble brûler environ 140 000 instructions, mais le C peut-être 40 000? cela pourrait faire la différence entre une led que vous pouvez voir avec vos yeux et une autre qui semble allumée sans cligner des yeux.

Le programme C semble configurer des registres que l'assembleur ne configure pas. Y a-t-il un bug ici? sont-ils en train de désactiver quelque chose qui ne devrait pas être touché? En bas, vous devez déplacer les deux programmes l'un vers l'autre, compliquer l'assembleur jusqu'à ce qu'il se rapproche de ce que fait le C et ajuster le C vers l'assembleur (mais attention à la sortie du compilateur).

+0

Ok .. c'est une bonne idée ... je vais travailler dessus. Mais Y le code C est en cours d'exécution sur le simulateur droit. – Adnan

+0

que fait-il ou ne fait-il pas? Si les leds brillent, cela pourrait bien clignoter, votre œil ne peut pas le voir. mais un simulateur le ferait. Ou est-ce que les leds restent éteintes? Les simulateurs reflètent rarement la réalité. permettant souvent d'écrire de la mémoire en lecture seule, fournissant de la mémoire aux adresses au-delà de la puce, etc. –

+0

Non ce n'est pas la mater, Si je ne les cligne pas et les laisse en continu même alors je ne les obtiens pas briller et épingles ne montre pas la tension de sortie non plus. – Adnan

1

Je ne travaille pas avec des outils Keil depuis longtemps et je jamais utilisé ce micro, donc probablement je ne vais pas être en mesure de vous aider beaucoup.

  • Avez-vous essayé de l'exécuter sur l'émulateur?
  • Essayez de placer un point d'arrêt dans main et vérifiez s'il s'arrête là. Il y a peut-être un problème avec c_start et votre main n'est pas appelée.
  • Regardez l'assemblage du code d'initialisation et vérifiez quelque chose d'étrange. Je pense que vous pouvez vérifier le code d'assemblage généré par le compilateur. Vous devrez peut-être activer une option pour générer des fichiers intermédiaires

Vous pouvez également vérifier "Electronics and Robotics" à stackexchange. Là, vous pouvez trouver des personnes travaillant avec l'électronique qui pourraient fournir une meilleure aide.

1

Vous dites que vous écrivez un programme en assembleur et que cela fonctionne bien, mais pas en C. Avez-vous vérifié que votre environnement C est configuré pour placer votre code et vos données dans les bons emplacements en mémoire?

En outre, certaines puces ont un "vecteur de réinitialisation" qui est appelé lorsque la puce est d'abord alimentée et également lorsque la puce se réinitialise. Est-ce que votre environnement C définit ce vecteur correctement? Est-ce qu'il met du code qui va sauter à votre programme quand il commence à courir?

+0

C'est peut-être le problème. Mais j'ai utilisé le fichier de démarrage defaul start900.a51 qui inclut les paramètres par défaut pour le vecteur d'interruption. Avez-vous un exemple de comment le corriger? – Adnan

+0

Je suis désolé, je ne sais pas. Ce n'étaient que des choses générales que j'ai dû faire dans le passé avec d'autres puces (HC12, i8051, etc.). Les emplacements de mémoire appropriés pour vos routines et vos données, ainsi que votre code de pile et d'interruption, dépendront de la carte mémoire de votre puce spécifique. En outre, la définition de ces éléments dans votre environnement C est probablement spécifique à chaque outil. –

0

Essayez:

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