Como usar variável dentro da interrupção

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Como usar variável dentro da interrupção

Mensagempor valdir.pavan » 27 Jul 2010 18:09

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
Valdir Pavan Júnior
Graduando em Engenharia Elétrica - EESC USP
MSN: valdir.pavan@hotmail.com
Skype: valdir.pavan
valdir.pavan
Bit
 
Mensagens: 26
Registrado em: 21 Jun 2010 15:04

Mensagempor _blackmore_ » 27 Jul 2010 18:29

vc pode declarar as variáveis dentro da interrupção ou então declarar como uma variável global.
Ouça mais classic rock
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor Francesco » 27 Jul 2010 19:38

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
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor xultz » 27 Jul 2010 23:08

É 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.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Mensagempor valdir.pavan » 28 Jul 2010 00:04

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?
Valdir Pavan Júnior
Graduando em Engenharia Elétrica - EESC USP
MSN: valdir.pavan@hotmail.com
Skype: valdir.pavan
valdir.pavan
Bit
 
Mensagens: 26
Registrado em: 21 Jun 2010 15:04

Mensagempor Sergio38br » 28 Jul 2010 07:39

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
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Como usar variável dentro da interrupção

Mensagempor valdir.pavan » 28 Jul 2010 14:59

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);
}
}
}
Valdir Pavan Júnior
Graduando em Engenharia Elétrica - EESC USP
MSN: valdir.pavan@hotmail.com
Skype: valdir.pavan
valdir.pavan
Bit
 
Mensagens: 26
Registrado em: 21 Jun 2010 15:04

Mensagempor KrafT » 28 Jul 2010 15:48

Código: Selecionar todos
#int_TIMER2

void TIMER2_int(void)
{
static boolean LED;
static int i;
++i;
...
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Como usar variável dentro da interrupção

Mensagempor valdir.pavan » 28 Jul 2010 15:57

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.
Valdir Pavan Júnior
Graduando em Engenharia Elétrica - EESC USP
MSN: valdir.pavan@hotmail.com
Skype: valdir.pavan
valdir.pavan
Bit
 
Mensagens: 26
Registrado em: 21 Jun 2010 15:04

Mensagempor KrafT » 28 Jul 2010 16:25

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.
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Como usar variável dentro da interrupção

Mensagempor valdir.pavan » 28 Jul 2010 16:59

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.
Valdir Pavan Júnior
Graduando em Engenharia Elétrica - EESC USP
MSN: valdir.pavan@hotmail.com
Skype: valdir.pavan
valdir.pavan
Bit
 
Mensagens: 26
Registrado em: 21 Jun 2010 15:04

Mensagempor KrafT » 28 Jul 2010 18:12

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.
Avatar do usuário
KrafT
Dword
 
Mensagens: 2228
Registrado em: 11 Out 2006 14:15
Localização: Blumenau -SC

Como usar variável dentro da interrupção

Mensagempor valdir.pavan » 28 Jul 2010 18:20

Uso o CCS
Valdir Pavan Júnior
Graduando em Engenharia Elétrica - EESC USP
MSN: valdir.pavan@hotmail.com
Skype: valdir.pavan
valdir.pavan
Bit
 
Mensagens: 26
Registrado em: 21 Jun 2010 15:04

Mensagempor _blackmore_ » 28 Jul 2010 18:48

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.
Ouça mais classic rock
_blackmore_
Dword
 
Mensagens: 1397
Registrado em: 28 Set 2008 13:26

Mensagempor valdir.pavan » 28 Jul 2010 19:57

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
Valdir Pavan Júnior
Graduando em Engenharia Elétrica - EESC USP
MSN: valdir.pavan@hotmail.com
Skype: valdir.pavan
valdir.pavan
Bit
 
Mensagens: 26
Registrado em: 21 Jun 2010 15:04

Próximo

Voltar para PIC

Quem está online

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

cron

x