Interrupção MC9S12NE64

Software e Hardware para uC da Qualcomm, NXP, FreeScale e Motorola

Moderadores: 51, guest2003

Interrupção MC9S12NE64

Mensagempor BFCardoso » 11 Set 2009 13:08

Olá galera,

é a primeira vez q estou trabalhando com o uC de 16 bits da freescale, o MC9S12NE64, e estou tendo dificuldade em usar interrupções. Estava tentando fazer igual fazia no QY4, ou seja, apenas entrar no arquivo linker.prm e escrever o vetor de interrupção.

O que tenho que fazer de diferente para poder usar interrupções?

Muito obrigado.

BFCardoso.
BFCardoso
Bit
 
Mensagens: 48
Registrado em: 17 Nov 2006 14:25
Localização: Santa Rita do Sapucaí - MG

Mensagempor BFCardoso » 16 Set 2009 14:40

Olá galera...

O problema esta mais desesperador do que eu imaginava.

Recorri até ao help do Codewarrior. Nele é ensinado duas formas de fazer: uma usando "#pragma" e outra usando o que eu fazia, colocando "interrupt" e o número do vetor na assinatura da função.
Só que estou achando que este help do Codewarrior é genérico para qualquer uC.

Li também alguns post aqui no fórum sobre esse assunto, mas não funcionou, ou seja, não consigo compilar de nenhum modo.

Me deem uma idéia, por favor.

Obrigado pela atenção.

BFCardoso
BFCardoso
Bit
 
Mensagens: 48
Registrado em: 17 Nov 2006 14:25
Localização: Santa Rita do Sapucaí - MG

Mensagempor mastk » 17 Set 2009 08:09

Ola cardoso, nao usei ainda nenhum menbro dos HCS12, acho que o mais simples eh vc usar o interrupt para associar a rotina com o verto, se for vetorizada quem no QY esse NE. Mas vc disse que nao esta compilando, deveria compilar e nao ter interrupcoes...
Avatar do usuário
mastk
Dword
 
Mensagens: 4407
Registrado em: 14 Out 2006 20:43

Mensagempor BFCardoso » 17 Set 2009 14:18

Olá mastk...

Eu fiz tudo que li no help, no AN e aqui no fórum...
Segue abaixo as tentativas.....

/*Desse jeito eu nao preciso mudar em nada o .prn*/
interrupt 20 void SCI (void){}

/*Desse jeito tenho que adicionar no .prn o comando VECTOR 20 SCI*/
interrupt void SCI (void){}

Estas duas formas citadas acima, que são iguais as feitas nos HC8, simplesmente nao compilam.

/*Esta maneira esta no help e compilou, só que o problema é:
COMO E ONDE EU COLOCO O VETOR OU O ENDEREÇO DA INTERRUPÇÂO SCI?
*/
#pragma TRAP_PROC
void SCI (void){}


Continuo contando com a ajudo de voces.

Obrigado

BFCardoso
BFCardoso
Bit
 
Mensagens: 48
Registrado em: 17 Nov 2006 14:25
Localização: Santa Rita do Sapucaí - MG

Mensagempor BFCardoso » 17 Set 2009 15:46

Galera....DESCOBRI O PROBLEMA....

Acho que quase a maioria quando cria um projeto no Codewarrior, isso se aplica a mim também, só se preocupa em selecionar o uC correto e depois clicar em NEXT até poder clicar em FINISH.

Quando escolhi o uC MC9S12NE64, por default o Codewarrior selecionava a opção "BANKED" quando aparecia a pergunta: "Wich memory model shall be used?".
Essa opçao faz o uC trabalhar com sua total capacidade de memória, criando um espaço chamado NON BANKED, que é acessada com 16 bits de endereço, e não 24 bits como o resto a memória.
Sendo assim é necessário selecionar a área NON BANKED para funcionar a função de interrupção. Segue um exemplo:

#pragma CODE_SEG NON_BANKED
interrupt 20 void SCI (VOID){}
#pragma CODE_SEG DEFAULT

Podemos ver o NON_BANKED declarado no arquivo .PRM.

Estas informações eu consegui depois que liguei e pedi suporte técnico em uma empresa distribuidora.

O fato de prestar atenção que ficou selecionada "BANKED" e não "SMALL" foi pura sorte.

Depois que descobri a resposta, encontrei no help do Codewarrior, em FAQ's a seguinte definição do meu problema:

QUESTION
I try to implement an interrupt routine and don't know what the following linker error means?
Link Error: L1907: Fixup overflow in _Vector_8, to my_interrupt_func type 1, at offset 0x0

ANSWER
Interrupt routines must be located in a non banked area, by using #pragma CODE_SEG NON_BANKED the interrupt routine will be located in a non banked area. Also make sure that the sectionNON_BANKED does exist in the .prm file. At the end of the interrupt routine you will need to add #pragma CODE_SEG DEFAULT, otherwise all following functions will also land in the non banked area.

RESUMINDO:

Nunca achei que um help de algum programa iria me ajudar, basta procurarmos direito.
Agora, tenho que entender direito o que é memória "bankeada" e "não bankeado".
Quem já souber, já pode postar aqui. Hehehe.

Obrigado pela ajuda de todos e espero que alguem tenha aprendido como eu.

Abraços.

Ps.: Como isso é uma informação nova para mim, posso ter escrito algo errado.
BFCardoso
Bit
 
Mensagens: 48
Registrado em: 17 Nov 2006 14:25
Localização: Santa Rita do Sapucaí - MG


Voltar para NXP (ex-FreeScale (ex-Motorola))

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x