txif hay que forzarlo a uno antes del programa principal. Este es el programa completo:
#include <18F458.h>
#device adc=16
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES OSCSEN //Oscillator switching is enabled
#FUSES PUT //Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#use delay(clock=8000000)
#use rs232(baud=9600,XMIT=PIN_C6)
#include <string.h>
int16 ListaNumeros[10]={54,1238,41,2500,640,99,1,999,1001,2666};
int16 Contador=0;
#byte PIR1=0xF9E
#bit txif=PIR1.4
#byte txreg=0xFAD
#define PUTCH(c) { while(txif==0); txreg=c; }
void ConvierteARomano(int16 Numero) {
unsigned char Num;
if (Numero>>8) {
while (Numero >= 1000) {
PUTCH('M');
Numero -= 1000;
};
if (Numero >= 900) {
PUTCH('C');
PUTCH('M');
Numero -= 900;
}
if (Numero >= 500) {
PUTCH('D');
Numero -= 500;
}
if (Numero >= 400) {
PUTCH('C');
PUTCH('D');
Numero -= 400;
}
while(Numero>>8) {
PUTCH('C');
Numero -= 100;
};
}
Num = Numero;
while(Num >= 100) {
PUTCH('C');
Num -= 100;
};
if (Num >= 90) {
PUTCH('X');
PUTCH('C');
Num -= 90;
}
if (Num >= 50) {
PUTCH('L');
Num -= 50;
}
if (Num >= 40) {
PUTCH('X');
PUTCH('L');
Num -= 40;
}
while(Num >= 10) {
PUTCH('X');
Num -= 10;
};
if (Num >= 9) {
PUTCH('I');
PUTCH('X');
Num -= 9;
}
if (Num >= 5) {
PUTCH('V');
Num -= 5;
}
if (Num >= 4) {
PUTCH('I');
PUTCH('V');
Num -= 4;
}
while(Num > 0) {
PUTCH('I');
Num--;
};
}
#INT_TIMER1
void Incrementa_Contador() {
Contador++;
}
void main()
{
int i;
int16 Duracion;
setup_timer_1 ( T1_INTERNAL);
printf ("Primer concurso de programacion. NUMEROS ROMANOS\n\r");
printf ("www.micropic.es\n\r\n\r");
set_timer1(0);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
txif = 1; // Reset de la USART
for (i=0;i<10;i++) {
printf ("%LU = ",ListaNumeros[i]);
ConvierteARomano(ListaNumeros[i]);
printf ("\n\r");
}
Duracion=get_timer1();
printf ("Ha tardado %LU ticks\n\r",make32(Contador,Duracion));
while(TRUE);
}