877/innterrupção externa

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

877/innterrupção externa

Mensagempor alex1000 » 09 Dez 2008 09:40

Amigos, este programa, que seria para testar uma interrupção externa ainda não funciona poderiam dar uma olhada e fazer um comentario?

Código: Selecionar todos
#include<16f877a.h>
#device ADC=10
#fuses NOWDT,NOPROTECT,PUT,NOLVP,HS
#use delay(clock=4000000)

#include<flex_lcd.c>

#int_ext
void interrup()
{
lcd_init();
printf(lcd_putc, " \f ACIONADA INTERRUP");
output_high(pin_b7);
delay_ms(1000);
}
void main()
{
signed int32  analog;
float result;
set_tris_a(0b11111111);
set_tris_b(0b00000001);
set_tris_d(0b00000000);

output_a(0x00);
output_b(0x00);
output_d(0x00);
port_b_pullups(true);
lcd_init();

EXT_INT_EDGE(H_TO_L);
enable_interrupts( int_ext);
enable_interrupts(Global);

setup_comparator(NC_NC_NC_NC);
setup_ADC_ports(RA0_Analog); //configurA pino_a0 para conversão AD
setup_adc(adc_clock_internal); //configurar o clock interno para o AD
set_adc_CHANNEL(0);


while(true)
{
delay_us(100);
analog=READ_ADC();

result=(float)(analog*0.488);
printf(lcd_putc, " \f TEMP %0.2f C ",result,); // \f apaga display - %lu - equivalente long int (ou int 16)
output_low(pin_d3);
delay_ms(100);
}
}
alex1000
Byte
 
Mensagens: 104
Registrado em: 02 Out 2007 23:39

Mensagempor tcpipchip » 11 Dez 2008 09:37

Faz o seguinte (apele)

-Desabilite PULL UP e ponha um RESISTOR EM RB0 para VDD
-Nao lembro se o CCS apaga o bit da INTERRUPT dentro da rotina
#int_ext, o tal do INTF

T+

TCPIPCHIP
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor tcpipchip » 11 Dez 2008 12:12

Meu,

Fiquei agora encucado com o exemplo acima...joguei no compilador e nao roda mesmo....(testei no PROTEUS) :(

E aparentemente tudo esta certo...

E eu ja usei no passado e funciona! :(

TCPIPCHIP
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: 877/innterrupção externa

Mensagempor ffcprog » 11 Dez 2008 12:17

LOOK.

alex1000 escreveu:Amigos, este programa, que seria para testar uma interrupção externa ainda não funciona poderiam dar uma olhada e fazer um comentario?

Código: Selecionar todos
#include<16f877a.h>
#device ADC=10
#fuses NOWDT,NOPROTECT,PUT,NOLVP,HS
#use delay(clock=4000000)

#include<flex_lcd.c>

#int_ext
void interrupt()
{
lcd_init();
printf(lcd_putc, " \f ACIONADA INTERRUP");
output_high(pin_b7);
delay_ms(1000);


INTCON."FLAG DA SUA INT" = 0; // se não zerar quando ligar o gie, no \exato momento a int acontece novamente, criando um ciclo infinito

enable_interrupts(Global); // quando entra na int, o gie desabilita desliga tumaticamente, tem que abilitalo na unha de novo.

}
void main()
{
signed int32  analog;
float result;
set_tris_a(0b11111111);
set_tris_b(0b00000001);
set_tris_d(0b00000000);

output_a(0x00);
output_b(0x00);
output_d(0x00);
port_b_pullups(true);
lcd_init();

EXT_INT_EDGE(H_TO_L);
enable_interrupts( int_ext);
enable_interrupts(Global);

setup_comparator(NC_NC_NC_NC);
setup_ADC_ports(RA0_Analog); //configurA pino_a0 para conversão AD
setup_adc(adc_clock_internal); //configurar o clock interno para o AD
set_adc_CHANNEL(0);


while(true)
{
delay_us(100);
analog=READ_ADC();

result=(float)(analog*0.488);
printf(lcd_putc, " \f TEMP %0.2f C ",result,); // \f apaga display - %lu - equivalente long int (ou int 16)
output_low(pin_d3);
delay_ms(100);
}
}
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Mensagempor alex1000 » 11 Dez 2008 14:29

Esta linha não compila:

INTCON."FLAG DA SUA INT" = 0;
alex1000
Byte
 
Mensagens: 104
Registrado em: 02 Out 2007 23:39

Mensagempor Sergio38br » 11 Dez 2008 14:32

:shock: :shock: :shock: :shock: não acredito
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor ffcprog » 11 Dez 2008 14:45

:shock:
:roll:

vou aí te dar um tapa na orelha!!!
ffcprog
Byte
 
Mensagens: 145
Registrado em: 14 Fev 2007 23:16

Mensagempor tcpipchip » 12 Dez 2008 11:44

Mas o que esta reclamando eh que nao esta entrando na Interrupcao nenhuma vez, pelo que entendi...
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor RobL » 12 Dez 2008 16:26

alex1000 não esquente com esses caras não, são seus amigos, só são impacientes :wink:
Pô, assim o cara nem volta para dizer que resolveu.
Não esquenta não, a gente fica embotado, é normal quando estamos cansado. Sou capaz de cometer esses pequenos deslizes também.
Acho que ele já botou o flag dele no lugar "FLAG DA SUA INT".
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor alex1000 » 13 Dez 2008 23:08

Olá Robl.
Agradeço pelas palavras e não se preocupe, não vou sumir do forum.
Aqui é um excelente lugar para tirar as duvidas.
Quanto ao meu bisonho erro: VERGONHA :oops: :oops:
Vim para casa, tinha alguns minutos antes de sair para o trampo, fui no fórum fiz um copy/paste , ao compilou, vi que a linha começava com INTalguma coisa, fiz outro copy/paste e pumba. Horas depois vejo a mensagem mortal do ffcprog e ai vi meu erro.
ffcprog, naquele momento eu levaria minha orelha até voce e pediria para voce dar um tapa com força :D :D

Voltando ao problema passei a tarde pesquisando(para não passar mais vergonha :oops: :oops: ) e vi que ficou dificil a solução. Vários sites informam a mesma coisa : tres comandos
EXT_INT_EDGE(H_TO_L);
enable_interrupts(GLOBAL);
enable_interrupts(INT_EXT)
E depois #int_ext + uma função
Mais nada.

O que eu estou notando aqui é que o compilaor compila o programa mas faz uma observação: Interrupts disabled during call to preventy re-entracy.
Pelo meu ingles macarronico parece que a interrupção está desabilitada.
alex1000
Byte
 
Mensagens: 104
Registrado em: 02 Out 2007 23:39

Mensagempor RobL » 14 Dez 2008 08:08

A informação do compilador está dizendo que durante uma chamada a interrupção geral estará desabilitada para evitar reentrancia do código, ou seja, atender outra chamada, dentro de uma interrupção (ou no seu serviço).
Sempre que há uma interrupção, a interrupção geral, no pic (GIE), é desabilitada e após limparmos o flag que gerou a interrupção, GIE deve ser habilitada ("re-habilitada") novamente.
Não quer dizer aí que as interrupções estejam desabilitadas.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor alex1000 » 14 Dez 2008 08:35

Valeu. vamos a luta novamente,
alex1000
Byte
 
Mensagens: 104
Registrado em: 02 Out 2007 23:39

Mensagempor Sergio38br » 14 Dez 2008 10:43

Bom dia, Alex tente apenas setar um flag ou variavel dentro da interrupção, resete o flag que causou a interrupção e dentro do corpo principal verifique o valor do flag ou variavel que tinha de ser monitorado.


[ ]`s
Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP

Mensagempor alex1000 » 15 Dez 2008 12:03

Amigos , finalmente funcionou.

Olha o código para quem precisar ou etsa começando como eu.
Quem sabe pode ajudar:

Código: Selecionar todos
#include<16f877a.h>
#device ADC=10
#fuses NOWDT,NOPROTECT,PUT,NOLVP,HS
#use delay(clock=4000000)
#include<flex_lcd.c>

#BYTE INTCON = 0X8B // CONECTA A VARIAVEL INTCON COM NDEREÇO
#BIT GIE= INTCON.7
#BIT INTE = INTCON.4

#int_ext
void interrupt()
{
lcd_init();
printf(lcd_putc, " \f ACIONADA INTERRUP");
output_high(pin_b7); //acende indicando a interrupcao
delay_ms(1000);


inte = 0; // se não zerar quando ligar o gie, no \exato momento a int acontece novamente, criando um ciclo infinito

gie=1;// // quando entra na int, o gie desabilita desliga tumaticamente, tem que abilitalo na unha de novo.

}
void main()
{
signed int32  analog;
float result;
set_tris_a(0b11111111);
set_tris_b(0b00000001);
set_tris_d(0b00000000);

output_a(0x00);
output_b(0x00);
output_d(0x00);
port_b_pullups(FALSE);
lcd_init();

EXT_INT_EDGE(L_TO_H);
INTE=1;
GIE=1;

setup_comparator(NC_NC_NC_NC);
setup_ADC_ports(RA0_Analog); //configurA pino_a0 para conversão AD
setup_adc(adc_clock_internal); //configurar o clock interno para o AD
set_adc_CHANNEL(0);


while(true)
{
delay_us(100);
analog=READ_ADC();

result=(float)(analog*0.488);
printf(lcd_putc, " \f TEMP %0.2f C ",result,); // \f apaga display - %lu - equivalente long int (ou int 16)
output_low(pin_b7);
delay_ms(100);
}
}


Obrigado pela ajuda.
alex1000
Byte
 
Mensagens: 104
Registrado em: 02 Out 2007 23:39


Voltar para PIC

Quem está online

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

x