Olá!
De novo a placa DEMO9S12NE64. Procurei pelo forum antigo e vi lá um exemplo de como fazer o canal serial deste processador funcionar. Com estas rotinas, o programa envia pela canal serial, mas o danado nao recebe nada e ainda ecoa uns carateres esquisitos no hiperterminal. Estou usando o feijao com arroz. Abaixo as rotinas:
#define RDRF 0x20 // Receive Data Register Full Bit
#define TDRE 0x80 // Transmit Data Register Empty Bit
void SCI0Init(void)
{
SCI0BDH = 0x00;
SCI0SR2 = 0;
SCI0SR1;
SCI0BDL = 0x83; //9600 a 25Mhz
SCI0CR1 = 0;
SCI0CR2 = 0x2c;
}
//***********************************************************
//
//***********************************************************
void Outchar_SCI0(unsigned char sci0)
{
while (!(SCI0SR1 & TDRE));
SCI0DRL = sci0;
}
//***********************************************************
//
//***********************************************************
static void WriteToSCI0(unsigned char *text, char controle)
{
while (*text != '\0')
{
Outchar_SCI0(*text++);
}
if (controle) {
Outchar_SCI0(cCR);
Outchar_SCI0(cLF);
}
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED /* Interrupt section for this module. Placement will be in NON_BANKED area. */
interrupt void SCI0_ISR(void)
{
unsigned char d;
d = SCI0DRL;
SCI0SR1;
while (!(SCI0SR1 & RDRF));
serial_buffer[cont_bytes++] = d;
if (cont_bytes == MAXSERIALLEN) {
cont_bytes = 0;
}
serial_buffer[cont_bytes] = 0;
if (d == cCR){
executa_serial();
}
}
#pragma CODE_SEG DEFAULT
na tabela de vetores de interrupcao , na posicao 20(ou 43), foi posto a descricao da rotina de interrupcao.
O que está errado nisto? As interrupcoes estao ativas, o vetor de interrupcao está mirando pra rotina. O que que falta?
Qualquer ajuda é bem vinda.
Obrigado!
fmaesso@terra.com.br