Página 1 de 1

Interrupções no C18

MensagemEnviado: 25 Abr 2011 15:56
por ÁgioFelipe
Olá pessoal. Gostaria de saber se existe alguma biblioteca para configuração das interrupções no C18, algo como a biblioteca timers.h, para que não seja preciso trabalhar diretamente com bits.

MensagemEnviado: 25 Abr 2011 18:17
por Andre_Cruz
ÁgioFelipe,

No compilador C18 existe sim uma biblioteca para os timers !
Uso a versão 3.37.01, tenho instalado junto com o MPLAB, a pasta das bibliotecas esta "C:\Program Files\Microchip\mplabc18\v3.37.01" dentro da pasta h estão as bibliotecas !

Esta fugindo dos bits porque rsrsrsrs

Abraço

André Cruz

MensagemEnviado: 25 Abr 2011 18:56
por ÁgioFelipe
Olá André.
Eu estou querendo uma biblioteca para as interrupções. Algo similar a timers.h só que para as interrupções.

MensagemEnviado: 26 Abr 2011 21:55
por ÁgioFelipe
É parece que não existe mesmo. Então lá vai outra dúvida:
Qual a diferença em se fazer as rotinas de interrupção assim:

Modo 1:
Código: Selecionar todos
#pragma code int=0x08
void int(void)
{
   _asm GOTO ISR_alta _endasm
}
#pragma code

#pragma interrupt ISR_alta
void ISR_alta(void)
{

   //corpo da função

}


Modo 2:
Código: Selecionar todos
#pragma code inter = 0x08
#pragma interruptlow inter
void inter()
{
   //corpo da função
}

MensagemEnviado: 28 Abr 2011 13:06
por ÁgioFelipe
Ninguém sabe?

MensagemEnviado: 28 Abr 2011 13:40
por ze
provavel mente não. mas K entre nós, isso é vital? estaria impedindo alguma evolução sua? Particularmente gostei da 2ª opção pois não tem a odiosa palavra. Leia a teoria sobre #pragma em C. Esta diretiva te "amarra" ao teu compilador hein! Enfim...
Aguarde algum especialista em C18
sucessos!

MensagemEnviado: 28 Abr 2011 16:52
por Rubens_Caetano
Então a diferença "acho" :lol: que está ligada a esse trecho do MPLAB® C18 C COMPILER USER’S GUIDE que diz :
Código: Selecionar todos
2.9.2.3 INTERRUPT VECTORS
MPLAB C18 does not automatically place an ISR at the interrupt vector. Commonly, a
GOTO instruction is placed at the interrupt vector for transferring control to the ISR
proper. For example:
#include <p18cxxx.h>
void low_isr(void);
void high_isr(void);
/*
* For PIC18 devices the low interrupt vector is found at
* 00000018h. The following code will branch to the
* low_interrupt_service_routine function to handle
* interrupts that occur at the low vector.
*/
#pragma code low_vector=0x18
void interrupt_at_low_vector(void)
{
_asm GOTO low_isr _endasm
}
#pragma code /* return to the default code section */
#pragma interruptlow low_isr
void low_isr (void)
{
/* ... */
}
/*
* For PIC18 devices the high interrupt vector is found at
* 00000008h. The following code will branch to the
* high_interrupt_service_routine function to handle
* interrupts that occur at the high vector.
*/
#pragma code high_vector=0x08
void interrupt_at_high_vector(void)
{
_asm GOTO high_isr _endasm
}
#pragma code /* return to the default code section */
#pragma interrupt high_isr
void high_isr (void)
{
/* ... */
}
For a complete example, see Chapter 5. “Examples”

MensagemEnviado: 29 Abr 2011 09:27
por ÁgioFelipe
Rubens_Caetano
Mas ai está apenas explicando como fazer no "Modo 1", não está falando a diferença dos dois, ou está?

MensagemEnviado: 29 Abr 2011 11:51
por Rubens_Caetano
Ao meu olhar a diferença é o uso do GOTO(asm) para agilizar a entrada no vetor de alta prioridade, de uma olhada do disassemby, apesar de que do segundo modo não consegui compilar aqui , da o seguinte erro:

Error - section 'inter' can not fit the absolute section. Section 'inter' start=0x00000008, length=0x0000040c
Errors : 1

MensagemEnviado: 01 Mai 2011 10:32
por ÁgioFelipe
É, já notei que dá esse erro em algumas versões do MPLAB.

MensagemEnviado: 02 Mai 2011 21:16
por ÁgioFelipe
Onde está o Fábio para nos auxiliar, pois o modo 2 está no livro dele.