Página 1 de 2
Como usar variável dentro da interrupção

Enviado:
27 Jul 2010 18:09
por valdir.pavan
Olá Galera,
Como faço para acessar variáveis de dentro da interrupção? Quando eu declaro alguma coisa antes da interrupção ela não funciona e o PIC para. Se eu declarar a variável depois e quiser ler da interrupção o compilador da erro pq não encontra a variável, pois ela está sendo declarada depois. Então como eu faço para ler e escrever numa variável de dentro da interrupção?
Queria uma solução que não usasse a EEPROM, pois minhas variáveis são int32.
Eu tentei usar ponteiro mas tb não deu certo pq ele não deixa ser declaro depois e se declarar antes a interrupção não funciona.
Obrigado

Enviado:
27 Jul 2010 18:29
por _blackmore_
vc pode declarar as variáveis dentro da interrupção ou então declarar como uma variável global.

Enviado:
27 Jul 2010 19:38
por Francesco
Não sei se seu compilador suporta, mas uma opção é declarar a variável como "static". Isso faz com que ela nunca seja liberada, ficando sempre alocada com o último valor.
No entanto, só é acessível dentro da interrupção. Se você quer uma variável que seja acessível dentro de uma interrupção e por outras funções, aí é uma variável global.
Francesco

Enviado:
27 Jul 2010 23:08
por xultz
É uma prática de programação horrível, mas como o PIC é horrível, se justifica usar todas as variáveis como globais. Eu pelo menos faço isso. Como a pilha dele é muito pequena, e a RAM também, passar parâmetros para funções é um pesadelo.
Eu geralmente crio um arquivo .h que tem declaração de todas as variáveis globais dentro, e documento todas elas, foi o melhor jeito que encontrei.

Enviado:
28 Jul 2010 00:04
por valdir.pavan
Então...
Minhas variáveis estão como glabais por isso que estou com problema. Eu quero ler e escrever em uma variável global. Mas se eu declaro ela antes da função de interrupção da problema e o PIC não funciona, se eu declaro depois o compilador da erro pq não encontra a variável que eu estou querendo ler ou escrever justamente pq declarei depois.
Me ajudem com um programa simples:
Como eu poderia fazer para incrementar um variável GLOBAL toda vez que a interrupção acontecer, não importa a frequencia, nem nada, soh gostaria de incrementar uma variavel global na interrupção?

Enviado:
28 Jul 2010 07:39
por Sergio38br
vc esta declarando as variaveis antes de declarar os prototipos das funções??? Ex.:
- Código: Selecionar todos
//variaveis
unsigned int a1;
unsigned int a2;
unsigned char a3;
//Prototipos
void i2c_mem_send_c1(unsigned char *ptr_a,unsigned char *ptr_b);
void i2c_mem_rcv_c1(unsigned char *ptr_c);
void config_ports(void);
void i2c_wake_up_c1(void);
void nop2(void);
void i2c_mem_stop_c1(void);
void i2c_noack_c1(void);
void i2c_ack_c1(void);
[ ]'s
Sergio
Como usar variável dentro da interrupção

Enviado:
28 Jul 2010 14:59
por valdir.pavan
Tenho um programa bem simples mas que não está funcionando, não é o meu programa original, mas se eu conseguir fazer funcionar isso já consigo terminar o meu.
Esse programa teria que fazer 3 coisas, piscar um led no pino C2 pela interrupção, piscar o pino C6 a cada 1 segundo pelo while, e piscar o pino C1 toda vez que o resto de i por 10 for zero. E i é incrementado na interrupção toda vez que ela acontece.
O problema é que se eu declaro a variavel antes o programa não funciona e se eu declaro depois da erro pq o compildor não entende o i pois está declarado depois.
Me ajudem.
#int_TIMER2
int i;
void TIMER2_int(void)
{
static boolean LED;
++i;
if(i==201){
i=0;
}
LED = !LED;
output_bit(pin_C2, LED);
}
void main()
{
setup_timer_2(T2_DIV_BY_16,250,15);
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
i=0;
while (true){
output_high(PIN_C6);
delay_ms(1000);
output_low(PIN_c6);
delay_ms(1000);
if(i%10==0){
output_high(PIN_C1);
delay_ms(100);
output_low(PIN_c1);
delay_ms(100);
}
}
}

Enviado:
28 Jul 2010 15:48
por KrafT
- Código: Selecionar todos
#int_TIMER2
void TIMER2_int(void)
{
static boolean LED;
static int i;
++i;
...
Como usar variável dentro da interrupção

Enviado:
28 Jul 2010 15:57
por valdir.pavan
Mesmo assim da erro na hora d ecompilar. Pq essa variavel é local e eu tb estou lendo ela do main(). Eu queria que essa variavel "i" fosse global, ou algum tipo que eu pudesse acessar de qualquer rotina ou função.
E eu queria algum jeito sem que escrevesse na memoria eeprom. apenas usando variaveis.

Enviado:
28 Jul 2010 16:25
por KrafT
Hum...
Quando vc quer acessar a variavel declarada em outro módulo, pode ser necessário declara-la como extern
Caso voce use um arquivo fonte só, basta declarar ela antes do main() e das rotinas que a utilizam.
Mas evite usar nomes tão curtos para variaveis, ainda mais globais. Não custa nada usar um nome que já dê uma noção da sua finalidade.
Como usar variável dentro da interrupção

Enviado:
28 Jul 2010 16:59
por valdir.pavan
Como se usa uma variável como extern ? estou usando assim : extern int i;
está certo? mas mesmo assim está dando erro, pois na interrupção ele não entende o que é "i" , o compilador diz que não foi declarada.

Enviado:
28 Jul 2010 18:12
por KrafT
Qual o compilador que vc está usando?
Desculpe se vc disse isso em algum ponto, mas numa lida rápida não ví não.
Como usar variável dentro da interrupção

Enviado:
28 Jul 2010 18:20
por valdir.pavan
Uso o CCS

Enviado:
28 Jul 2010 18:48
por _blackmore_
valdir.pavan
- Código: Selecionar todos
Uso o CCS
faz assim ...
- Código: Selecionar todos
int variáveis // declare as variaveis antes do main
void main
{
seu codigo
}
faça um local para declarar todas as variáveis ... antes do main, todas que for utilizar.
quando for utilizar alguma função ( arquivo.h) deve declarar a função dentro do arquivo.

Enviado:
28 Jul 2010 19:57
por valdir.pavan
Mas seu eu declarar logo acima do main() a minha função de interrução não consegue ler e escrever nessa variavel. E é justamente isso que eu quero. ler e escrever numa variavel de dentro da interrupção, sendo que essa variavel não é local da interrupção, e eu posso acessar ela de qualquer rotina ou função