Ir ao conteúdo
  • Cadastre-se
valecovo

Função DELAY com o PIC 16F877A

Recommended Posts

Olá a todos

Estou dando os primeiros passos na programação de PICs. Escolhi a linguagem C porque já tinha alguns conhecimentos da mesma.

Estou a usar o MPLAB v8.80 com o compilador CCS.

Dos muitos problemas com que me estou a deparar, este não consigo resolver e por isso venho aqui pedir ajuda.

É o seguinte com este programa: ele compila bem, mas ao simular o programa no MPLAB com a ferramenta MPLAB SIM, quando chega ao primeiro delay, vem para "#use delay" e não sai daí. Já alterei clock=20000000 mas acontece o mesmo. Presumo que falte incluir algum ficheiro no inicio do programa, mas não sei qual.

Por favor, peço ajuda.

// Pisca – Pisca 
#include <16f877A.h>
#fuses xt,wdt,noprotect,put,brownout,nolvp,nocpd,nowrt
#use delay(clock=4000000, RESTART_WDT)

#use fast_io(a)
#use fast_io(
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)

#byte porta = 0x05
#byte portb = 0x06
#byte portc = 0x07
#byte porte = 0x09

void main ()
{
setup_counters(RTCC_INTERNAL, WDT_2304MS);
set_tris_a(0b11111111);
set_tris_b(0b11111000);
set_tris_c(0b11111111);
set_tris_d(0b11111111);
set_tris_e(0b00000111);

porta=0x00; // limpa porta
portb=0x00; // limpa portb
portc=0x00; // limpa portc
portd=0x00; // limpa portd
porte=0x00; // limpa porte

while(TRUE)
{
RESTART_WDT();
output_high(PIN_B0);
delay_ms(1000);
output_low(PIN_B0);
delay_ms(1000);
output_high(PIN_B1);
delay_ms(1000);
output_low(PIN_B1);
delay_ms(1000);
}
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui nem compilou. você esqueceu do #byte portd = 0x07

Você não precisa usar o fast_io nesse código.

Você não precisa usar o comando TRIS.

A vantagem de usar o CCS é que ele faz isso automaticamente.

Testei no proteus e simulou corretamente.

Falou

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

FASTIO é quando for preciso mudar o estados dos Bits de um port rapidamente,pois o CCS inclui uma instrução NOP quando muda o estado do pino e altera o TRIS todas vez que se muda de saida para entrada,deixando o codigo menos eficiente quando se precisa de velocidade nos PORTS.

Faça um teste gerando uma onda quadrada sem FASTIO e com FASTIO.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pela resposta

#byte portd = 0x07 foi ao copiar.

Também já testei no proteus e simulou corretamente.

Não sei porque no MPLAB não sai da linha "#use delay".

Compartilhar este post


Link para o post
Compartilhar em outros sites
FASTIO é quando for preciso mudar o estados dos Bits de um port rapidamente..........deixando o codigo menos eficiente quando se precisa de velocidade nos PORTS.

OK. Concordo. Mas veja o exemplo que o solicitante colocou. Não consigo perceber velocidade nas manipulações dos pinos.

Corrigindo o que eu disse lá em cima:

"Você não precisa usar o comando TRIS."

Fica,

Você não precisa usar o comando TRIS, nesse código de aprendizado. Apenas em aplicações de tempo crítico.

Faça um teste gerando uma onda quadrada sem FASTIO e com FASTIO.

Posso gerar uma onda quadrada de 2Hz e não verei diferença. Mas se eu gerar uma de 5 ou mais Khz, poderei sim ver diferença. Como você mesmo disse, em casos críticos.

Falou

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ja estamos num nivel de 'ousar' mais nos códigos,mesmo os principiantes, e no caso do CCS,o FASTIO pode ser a diferença entre funcionar ou não.

Um exemplo que postei para ajudar um colega do forum com um DIMMER,é um exemplo,o codigo só sincroniza se usar FASTIO no PORT;

Link DIMMER CCS

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que tem outro erro, depois do primeiro RESTART_WDT(); tem 4 segundos de delay, dentro desse tempo a contagem do watch dog vai estourar, resetando o PIC.

dentro do main você configurou para WDT_2304MS. então mais ou menos no meio do While vai resetar.

Já aconteceu comigo isso... Quebrei a cabeça para descobrir o erro. Acho bom você colocar o RESTART_WDT depois ou antes de cada delay.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×