Ir ao conteúdo
  • Cadastre-se

Delay não funciona direito no pic 16f628A


PAT0LINO

Posts recomendados

olá galerinha...pra começa a aprender microcontroladores, resolvi fazer um programa que faz um led piscar:D legal né...mas nem algo simples assim consegui fazer funcionar...

o codigo é esse:

#include <16F628A.h>

#FUSES NOWDT,INTRC_IO,NOPUT,NOPROTECT,NOBROWNOUT,NOMCLR,NOLVP,NOCPD

#use delay(clock=4000000)

void main()

{ setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

setup_timer_1(T1_DISABLED);

setup_timer_2(T2_DISABLED,0,1);

setup_comparator(NC_NC_NC_NC);

setup_vref(FALSE);

setup_oscillator(False);

while(true){

output_high(pin_b0);

delay_ms(10);

output_low(pin_b0);

delay_ms(10);

}

}

programo no CCS, e uso o gravador PICburner, com IC-prog.

o q acontece é o seguinte:

o led até pisca...só que de 10 em 10 segundos...e não de 10 em 10 milisegundo como programei...

alguem ai tem alguma ideia do q esteja ocorrendo de errado?:confused:

valeu ai moçada!

Link para o comentário
Compartilhar em outros sites

Como você não utilizou as tags de código aqui do forum,

[/code......

Não posso afirmar que seja esse o erro, mas veja como está declarado seus fuses:

[code]#FUSES NOWDT,INTRC_IO,NOPUT,NOPROTECT,NOBROWNOUT,NOMCLR,[B]N OLVP[/B],NOCPD

Não pode ter esse espaço aí não... É junto :NOLVP (no low voltage programming)

Experimente aumentar esse tempo entre as piscadas, 10ms é muito pouco. E coloque também um capacitor de uns 47uF no pino de alimentação do PIC, caso você não tenha um eletrolitico, pode ser um capacitor de cerâmica mesmo.

Isso que está acontecendo com você parace algo q aconteceu comigo a muito tempo atrás. Foi só colocar o capacitor q resolveu.

Ahh e não se esqueça de colocar um resistor em serie com o LED. Um valor de testes pode ser umd e 150 ohm... E você esqueceu de declarar o fuse XT!

Experimente com esse codigo aqui:

#include <16F628A.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES INTRC_IO //Usar clock interno
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#use delay(clock=4000000)
void main()
{
while(true)
{
output_high(pin_b0);
delay_ms(500);
output_low(pin_b0);
delay_ms(500);
}

}

Falou

Link para o comentário
Compartilhar em outros sites

e ai matheus, tudo bem...

então, se eu usar FUSES XT, terei que usar um clock externo certo?

mas eu queria usar o clock interno do pic...pois não preciso de precisão na contagem de tempo...por isso usei intrc como fuses...

e o programa até funciona...só que com a contagem de tempo muito diferente da programada...no meu caso, o delay de 10milisegundos, na verdade funciona como um delay de 10 segundos... o q é bem estranho...

eu tava pensando que poderia ser algo relacionado com o valor de clock interno que porgramei... tipo, as vezes o clock=4Mhz, é muito alto, e esse pic 16f628A não trabalha com esse valor, teria que ser algo bem menor...mas não sei direito tmb...sou muito inexperiente em micocontroloradores ainda...:D

valeu ai!

Link para o comentário
Compartilhar em outros sites

Amigo, o PIC16F628A trabalha com clock interno de 4Mhz sim.

Pelo que falou, creio que seu problema esteja associado ao clock (O compilador usa esta declaração para ajustar as rotinas de delay).

Não trabalho como o CCS, mas pelo que andei vendo tem uma forma correta de declarar o clock. Isso deixo para o pessoal do CCS.

A minha certeza é essa, pois estes dias estava fazendo um contador com displays (4 multiplexados). Declarei 20Mhz de clock e por descuido usei um cristal de 4Mhz. O resultado para tempo de 1 segundo era 4x maior. (uso o mikroC Pro).

Abraço.

Link para o comentário
Compartilhar em outros sites

então galera...agora entendi o q tava errado...:lol:

fui ver no datasheet, e la fala que há duas opções para se trabalhar com o oscilador interno desse pic, uma de 48KHz, e a outra opção de 4MHz...

não sabia disso, e por isso não escolhi nada, o default devia ser o de 48Khz,

portanto bastou eu trocar a linha de codigo: setup_oscillator(False);

por: setup_oscillator(OSC_4MHZ);

q na verdade é setar os bits do registrador responsavel pelo internal osc...:D

valeu ai gente, por me ajudarem a chegar nessa conclusão!

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...