Hola!. Estoy haciendo mi primer programa en MikroC para un PIC 18F2550. El programa es muy sencillo, cambia el estado de los puertos del PIC:
------------------------------------------------------
void main (void)
{
char val;
char contador;
char super;
TRISA = 0x00;
TRISB = 0x00;
TRISC = 0x00;
val = 0x55;
while (1)
{
PORTA = val;
PORTB = val;
PORTC = val;
val = ~val;
for (contador = 128; contador > 0; contador --)
for (super = 254; super > 0; super--)
{
asm nop;
asm nop;
asm nop;
asm nop;
}
}
return;
}
------------------------------------------------------
En "Project Setup" seleccioné el PIC18F2550 y en "Clock" le puse 40MHz. Pulso "Build Project" y lo compila sin errores.
En el listado que genera MikroC aparece esto, solamente pongo la parte "problemática":
------------------------------------------------------
; ASM code generated by mikroVirtualMachine for PIC - V. 8.2.0.0
; Date/Time: 22/02/2009 22:48:09
; Info:
http://www.mikroe.com; ADDRESS OPCODE ASM
; ----------------------------------------------
$0000 $EF04 F000 GOTO _main
$0008 $ _main:
;Prueba.c,4 :: void main (void)
;Prueba.c,11 :: TRISA = 0x00;
$0008 $6A92 CLRF TRISA, 0
;Prueba.c,12 :: TRISB = 0x00;
$000A $6A93 CLRF TRISB, 0
------------------------------------------------------
En la dirección 0x0000 tiene un GOTO 0x008 y ahí empieza con los TRIS.
El problema es que en el archivo HEX que genera el MikroC aparece otra cosa, este es el HEX completo:
------------------------------------------------------
:1000000004EF00F0FFFFFFFF926A936A946A550EB7
:10001000156E15C080FF15C081FF15C082FF151E2B
:10002000800E166E165000080DE2FE0E176E175069
:10003000000806E200000000000000001706F7D7E5
:100040001606F0D7E6D7FFD7FFFFFFFFFFFFFFFF42
:020000040030CA
:0E000000FFF8FFFEFFFFBBFFFFFFFFFFFFFF4C
:00000001FF
------------------------------------------------------
O sea, los TRIS no comienzan en la dirección 0x0008 como dice el listado sino que comienzan en la dirección 0x0002 justo después del GOTO, cuando el PIC se resetea, salta las instrucciones de TRIS (y un par mas) y obviamente no funciona nada. Si le pongo varios NOP de relleno funciona todo bien. ¿Esto es normal?. ¿Me falta algo en el programa .C?.
Gracias.