Ir ao conteúdo

Posts recomendados

Postado

Olá. Estou começando agora a programar PIC e montei um circuito básico de teste para piscar um LED. Uso um PIC18F2550 e um cristal de 8MHz como oscilador.

 

O PROBLEMA:

O teste funcionou, mas não está temporizando corretamente. Coloquei o intervalo de 250mseg entre as piscadas, mas o tempo real está muito maior. O código é este abaixo. Alguém sabe o que errei?

Obrigado.

#include <18f2550.h>
#fuses HS
#use standard_io(a)
#use delay(clock = 8000000)

main()
{
    while (1)
    {
        output_high(pin_a0);
        delay_ms(250);
        output_low(pin_a0);
        delay_ms(250);
    }
}

 

  • Membro VIP
Postado

sou phd em pisca led mas não em ccs. Este com suas libs prontas inibem a compreensão do hw interno do pic que é relativamente simples. Tente debugar ou rodar passo a passo pra ver alguma temporização da rotina delay (vulgo perda de tempo). Sugiro no entanto procurar entender/usar os timers do mc que tendem a dar precisão nas temporizações. Relativamente simples de entender, de quebra vai adquirir algum conhecimento.

Ou se preferir o caminho + fácil, aguarde algum phd no seu compilador. Pode ser alguma cagadinha bem básica.

  • Curtir 1
Postado

Quanto tempo esta demorando?coloca 10s,e veja quanto demora.As vez pode ser problema no seu circuito do crystal.

Quando há problema no crystal,por default troca o crystal pelo oscilador interno,ai basta desativar com este fuse:

#FUSES NOFCMEN                   //Fail-safe clock monitor disabled

Adiciona esta linha no seu código,e verifica se fica piscando,provavelmente não vai piscar mais.Caso aconteça isto,problema e na parte do circuito do crystal.

Sugestão:#use delay(clock=8MHz,crystal=8MHz)//fica mais explicito que o crystal é de 8mhz e clock também,além de ele adiciona pll e hs automatico

 

  • Curtir 1
Postado

Olá "Não Sei".

Fiz as modificações que você sugeriu, primeiro uma linha e depois a outra, compilando e gravando individualmente cada modificação, mas não houve alteração no comportamento da temporização (retirei o cristal do circuito). Coloque também o tempo de 1000ms e cronometrei o tempo real. O que encontrei foi que, para 1000ms no programa, o resultado é de 8segundos (8000ms) no tempo real.

 

Isadora, como comentei, estou começando agora e não tenho conhecimento para argumentar a respeito.

 

#include <18f2550.h>
//#fuses HS
#fuses NOFCMEN  //Fail-safe clock monitor disabled
#use standard_io(a)
//#use delay(clock = 8000000)
#use delay(clock=8MHz,crystal=8MHz)

 

Postado

Então ele está executando a 1Mhz,este valor é do clock interno default.

A definição para "Fail-Safe Clock Monito"(datasheet,pg.9)

"Fail-Safe Clock Monitor: This option constantly monitors the main clock source against a reference signal provided by the internal oscillator. If a clock failure occurs, the controller is switched to the internal oscillator block, allowing for continued low-speed operation or a safe application shutdown."

Ou seja,caso há problema no oscilador externo,ele troca para interno quando está habilitado.Quando você desabilitar ele,seu programa não deveria funcionar.Qual gravador você esta usando?Será que seu gravador está gravando os fuses?

3c77bcf03458437393afeb7913f13bb1.png

 

off topico

@aphawk Não sei se foi no mesmo segundo,mais no mesmo minuto foi.kkkkk

  • Curtir 1
Postado

@wBB ,

 

Não é a minha área, mas tenho um palpite :

 

Verifique se seu PIC não foi gravado para usar oscilador interno, e se tem algum tipo de fuse que especifique dividir clock por 8, pois está claro que seu PIC está rodando na realidade a 1 Mhz.

 

Paulo

adicionado 0 minutos depois

@Nao Sei ,

 

Caramba postamos nos mesmos segundos !!! kkk

 

Paulo

  • Curtir 1
Postado

Quanto à pergunta do gravador estar gravando os "fuses", não sei responder. Uso um PICkit3 novo, MPLab, CCS.
Baseado nessas últimas informações dei uma verificada em "Configuration Bits" e acho que encontrei algo que tenha relação com o que está ocorrendo. Nas três primeiras linhas deste arquivo texto em anexo tem todas as informações de "Configuration Bits", mas ainda não consegui resolver a questão  (seguem abaixo as três primeiras linhas do arquivo anexo).

 

Address    Value Field   Category                                     Setting
300000      01   PLLDIV  PLL Prescaler Selection bits                 Divide by 2 (8 MHz oscillator input)
                 CPUDIV  System Clock Postscaler Selection bits       [Primary Oscillator Src: /1][96 MHz PLL Src: /2]
                 USBDIV  USB Clock Selection bit (used in Full-Speed  USB clock source comes directly from the primary
                         USB mode only; UCFG:FSEN = 1)                oscillator block with no postscale

 

fields.TXT

adicionado 11 minutos depois

Apenas complementando, dei uma verificada no datasheet, na tabela TABLE 22-2, pág. 25, que indica os capacitores para cada tipo de cristal, estou usando 22pF para um cristal de 8MHz conforme indicado, sendo OSC TYPE "HS" conforme configurei mesmo. Pelo menos está conforme recomendação do fabricante...

adicionado 38 minutos depois

Pessoal, grato pela atenção, mas já resolvi. Conforme o @Nao Sei indicou, havia mesmo um dos Fuses com problema, mas não no programador e sim o meu programa, que faltava setar logo no início, indicando para o PIC que iria operar com oscilador externo. Portanto ficou como indicado abaixo. Por favor me corrijam se falei besteira. Estou supondo que está correto, pois o tempo real agora está batendo com o esperado.

Obrigado!

#include <18f2550.h>
#fuses xt //////////////////////////// FALTA ISSO
#use standard_io(a)
#use delay(clock=8MHz,crystal=8MHz)

main()
{
    while (1)
    {
        output_high(pin_a0);
        delay_ms(3000);
        output_low(pin_a0);
        delay_ms(3000);
    }
}

 

  • Curtir 1
Postado

Realmente você tem razão... Só que observei uma coisa agora: tanto com fuse HS, quanto fuse XT, está funcionando correto, mas sem o uso dos capacitores de 22pF que o fabricante indica. Quando coloco os dois capacitores ligados ao cristal e ligo o circuito novamente, o tempo é dividido por 8 automaticamente, sem mudar nada no programa. Apenas com o cristal, tudo OK; Cristal + capacitores, divide por 8 o tempo. Já troquei os capacitores por outros novos, mas continua dividindo o tempo.

O causador do problema está descoberto então, mas o por quê tá complicado!

 

Postado

Hum,os valores dos capacitores é 22pf mesmo?esta marcado 22 ou 220?

caso seja mesmo 22pf,testa com 15pf,este tempos tive problema com pic16f1824,só funcionava com 15pf,porém o datasheet dele não especificava o valor do capacitor.

Postado

Putz!!! Acho que você matou o problema. Não tinha reparado no valor do capacitor... É a velha história de apenas comprar e assumir que a anotação na embalagem está correta. O valor do capacitor que eu estava usando é 223, ou seja 22nF em lugar de 22pF. Só não tenho como confirmar agora se vai resolver com o valor correto de 22pF, pois não tenho um par de capacitores este valor. Mas vou informando conforme houver alteração.

Obrigado!

Postado

Não precisa ser o de 22pf,se tiver de 33pf ou valor abaixo dele,possivelmente funciona,claro o de 22pf é melhor pois está no datasheet,dá mais segurança.

Postado

Pessoal,

Realmente era a porcaria do valor do capacitor que estava gerando o problema de atraso no tempo de clock, tal como o @Nao Sei tinha indicado. Coloquei o capacitor correto (de 22pF) e funcionou perfeitamente. Testei outros valores e também funcionou legal.

Portanto, fechando o assunto, resolvido!

 

Obrigado!

  • Curtir 1
Visitante
Este tópico está impedido de receber 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...