Ir ao conteúdo

Posts recomendados

Postado

Olá!

Gravei o segundo pic 18F4550 e todos os dois apresentam o mesmo "problema".

Para contar 1 segundo é preciso se passarem 2 ou 3 segundos em um relógio digamos normal.

Esta programação é do meu costume usar, ela sempre funciona, porém agora esta dando este problema, o que pode ser, o pic?
Uso MPLAB para fazer estaprogramação.

Códigos do relógio (Timer)

//HORAS ---------------------------------------------------------------------------------------------------------------

//*********************************  Variáveis da HORA  ***********************************
int16 q=0; //Variável que incrementa a cada 0.5s dentro da interupção do timer1.
int   s=0; //Variável dos segundos, incrementa na metade de q.
int   m=0; //Variável dos minutos. 0 a 59
int   h=0; //Variável das horas. 0 a 23.


//*******************************  Interrupção do timer  **********************************
#int_TIMER1 //Interrupção do Timer1
void temp1s(void) //Funcão. O que deverá ser feiro a cada interrupão.
{
   q++; //Variável q incrementada a cada estouro do Timer1
   set_timer1 (3036); //Preload do Timer1
}

//HORAS ---------------------------------------------------------------------------------------------------------------
Após o void main()


//TRATAMENTO DE INTRERRUPÇÃO, AQUI EU INICIALIZO O TIMER*******************************************************************************
   setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
   set_timer1 (3036);                         //Preload do Timer1
   enable_interrupts(INT_TIMER1);             //Habilita interrupção timer1
   enable_interrupts(global);                 //habilita interrupcão global

Muito obrigado!

Postado

O código é enorme, postei parte relacionado ao Timer.

Os fuses.

#FUSES NOWDT                    //Sem Watch dog, evitando reset
#FUSES BROWNOUT                 //Resetar quando detectar brownout (Quando a tensão cair abaixo do previsto no datasheet)
#FUSES HS                       //Crystal de oscilação de 4mhz alta velocidade
//#FUSES XT                     //Crystal de oscilação de 4mhz
#FUSES PUT                      //Power Up Time  Aguarda 72ms para iniciar o pic evitando surto de tensão
#FUSES NOPROTECT                //Codigo sem proteção de leitura, software livre!
#FUSES NODEBUG                  //Verifica se tem erros no código (desabilitado)
#FUSES NOLVP                    //No low voltage prgming (prog. baixa tensão desabilitado), B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection (Sem travar o chip)

#use delay(clock=4000000) // Definição do clock utilizado. Obrigatório!

Obrigado!

  • Membro VIP
Postado

Pode ser um tandcoiz

-bug no compilador

-bug no ci

-outra função zoando o timer

-prescaler errado

-cristal errado

-etc

Dica: coloque um break point dentro da interrupt ou onde você acha que conhece o valor do tempo que passou. Compare,analise os registros, variáveis e etc

Postado

Isadora, então vou eliminar um tandcoiz rs.

Acho que sei o que pode estar acontecendo.

Olhando a programação, reparei que estava 18f4520, era o que eu usava mesmo, agora comprei pics 18F4550, então, pode ser o Prescaler mesmo, porém, qual seria para o 18F4550?
Mais uma coisa, devo usar o XT ou HS para o cristal de 4Mhz?
No Datasheet existem as duas opções.
Obrigado mais uma vez pela ajuda.

  • Curtir 1
  • Membro VIP
Postado

Poizé rapá. ... De novo a questão das mastigadas do compilador.... Dá uma olhadinha no d.s. do 50. É coisa simples. Mas se preferes ainda + simples, mude a configuração no compilador para 18F4550. Talvez ele faça o ajuste do prescaler pra você. Infelizmente não tenho contato direto com este compilador, ok?

De fato 4MHz está no meio do caminho. Me lembro de ter usado XT. Mas nada te impede de testar ambos.

 

Off topic semi on...

As funções mastigadas são interessantes sim pra mc mais complexos. Recentemente me rendi à elas pra piscar um led via bluetooth num esp32 e no appinventor android com sucesso.

Poizé Paulão. Quem me viu,quem me ve.. Arduíno,, aí vou eu kk... (só pra família ESP32).

  • Curtir 1
Postado
6 horas atrás, Marcio Pizano disse:

O código é enorme, postei parte relacionado ao Timer.

Os fuses.


#FUSES NOWDT                    //Sem Watch dog, evitando reset
#FUSES BROWNOUT                 //Resetar quando detectar brownout (Quando a tensão cair abaixo do previsto no datasheet)
#FUSES HS                       //Crystal de oscilação de 4mhz alta velocidade
//#FUSES XT                     //Crystal de oscilação de 4mhz
#FUSES PUT                      //Power Up Time  Aguarda 72ms para iniciar o pic evitando surto de tensão
#FUSES NOPROTECT                //Codigo sem proteção de leitura, software livre!
#FUSES NODEBUG                  //Verifica se tem erros no código (desabilitado)
#FUSES NOLVP                    //No low voltage prgming (prog. baixa tensão desabilitado), B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection (Sem travar o chip)

#use delay(clock=4000000) // Definição do clock utilizado. Obrigatório!

Obrigado!

Esta faltando definir o PLL e CPUDIV.

  • Curtir 1
Postado
23 horas atrás, Isadora Ferraz disse:

Poizé Paulão. Quem me viu,quem me ve.. Arduíno,, aí vou eu kk... (só pra família ESP32)

 

Kkkkk pois é .... nada como a necessidade para fazer a gente sair de nossa zona de conforto ....

 

Esp32 .... vai fazer algo sério com ele ?

 

Paulo

Postado

Obrigado por responder!

Agora fiquei mais inquieto ainda kkk

Segundo explicação do aphawk em outro tópico (https://www.clubedohardware.com.br/forums/topic/662735-dúvida-fórmula-timer0/) diz que para um cristal de 4mhz usa a mesma configuração que está no meu programa, e mesmo adicionando o PLL e o CPUDIV ainda não funcionou.

Segue o código e obrigado mais uma vez!

 

#include <18F4550.h>
#include <stdlib.h> //Para strings


/*
OBS.: Este código não usa saída (Definições) nas portas D porque este tipo de PIC com mais de 40 pinos, faz buscas diretas no pino D
Este código é típico para estes pics.
*/

//http://www.clubedohardware.com.br/forums/topic/764932-rel%C3%B3gio-e-calend%C3%A1rio-com-pic-16f628-super-simples/


#FUSES NOWDT                    //Sem Watch dog, evitando reset
#FUSES BROWNOUT                 //Resetar quando detectar brownout (Quando a tensão cair abaixo do previsto no datasheet)
//#FUSES HS                       //Crystal de oscilação de 4mhz alta velocidade
//#FUSES XT                       //Crystal de oscilação de 4mhz
#FUSES PUT                      //Power Up Time  Aguarda 72ms para iniciar o pic evitando surto de tensão
#FUSES NOPROTECT                //Codigo sem proteção de leitura, software livre!
#FUSES NODEBUG                  //Verifica se tem erros no código (desabilitado)
#FUSES NOLVP                    //No low voltage prgming (prog. baixa tensão desabilitado), B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection (Sem travar o chip)
#pragma config PLL DIV = 1  
#pragma config CPUDIV  = OSC1_PLL2 
#pragma config CPUDIV  = OSC2_PLL2 
#pragma config FOSC    = HSPLL_HS  

#use delay(clock=4000000) // Definição do clock utilizado. Obrigatório!



 
//*****************************************  LCD  *****************************************
//Definição de entradas e saídas
//Cada bit representa um pino físico de I/O
// 0 significa que o pino será uma saída
// 1 significa que o pino será uma entrada
#define trisa 0b11111111
#define trisb 0b00000000
#define trisc 0b00000000
#define trisd 0b00000000

 
// Estas são as definições dos pinos que o LCD utiliza.
// Definem quais pinos do PIC controlarão os pinos do LCD
 
#define lcd_enable pin_a1       // pino enable do LCD (E)
#define lcd_rs     pin_a0       // pino rs (register select)do LCD (RS)
                                // (0) para comandos    (1) para dados
                                //O pino RW vai no negativo.
#define lcd_db4    pin_b4       // pino de dados d4 do LCD
#define lcd_db5    pin_b5       // pino de dados d5 do LCD
#define lcd_db6    pin_b6       // pino de dados d6 do LCD
#define lcd_db7    pin_b7       // pino de dados d7 do LCD

#include <lcd.h>                //declaração da biblioteca do LCD
//*****************************************  LCD  *****************************************
 






/*======================================================================================================================================
                                                               PINOS I/O
======================================================================================================================================*/
#define BOTAO_MENU   PIN_B0 //BOTÃO de escolha de ajuste das funções.
#define AJUSTE_1     PIN_B1 //BOTÃO incremento de variáveis. (AJUSTE 1)
#define AJUSTE_2     PIN_B2 //BOTÃO de escolha de ajuste das funções. (AJUSTE 2)

#define POTENCIOMETRO       PIN_D1  //POTENCIOMETRO            PINO 20 Trata-se de ligar o led do potenciometro apenas quando for ionizar
#define SAIDA_HIONIZADOR_C4 PIN_C4  //SAÍDA DO IONIZADOR       PINO 23
#define SAIDA_HIONIZADOR_C5 PIN_C5  //SAÍDA DO IONIZADOR       PINO 24
#define SAIDA_BOMBA         PIN_C7  //SAÍDA DA BOMBA           PINO 26
#define BOMBA_DIRETO        PIN_D3  //SAÍDA DA BOMBA DIRETO    PINO 22 (Trata-se do botão, quem liga a bomba)

//pull-down em todos os botões para evitar ruídos.

/*======================================================================================================================================
                                                               PINOS I/O
======================================================================================================================================*/






/*======================================================================================================================================
                                                              Minhas variáveis:
======================================================================================================================================*/
int MENU             = 0;           //0 = MOSTRA RELÓGIO /// 1 = NÃO MOSTRA RELÓGIO (TEMPO REAL)
int FOCO             = 1;           //FOCO - 0=HORA REAL - 1=HORA (AJUSTES) - 2=DATA (AJUSTES) - 3=DIA DA SEMANA (AJUSTE) - 4=Bomba ligada inicio - 5=Bomba ligada FIM - 6=Agendando dias
int dia_semana       = 0;           //1 = SEGUNDA...
int dia_semana_bomba = 0;           //Para o ajuste da bomba ligada ou não BOTÃO 2
int final_mes        = 31;          //para saber quantos dias  tem um determinado mes.
char SEMANA[]        = "SEGUNDA";   //Inicio na SEGUNDA
int LIGADO           = 0;           //Para informar se a bomba ou o Hionizador sera ligado ou não
int contador         = 1;           //Para fazer a alteração no pino do hionizador (A1)
int troca            = 0;           //Para fazer a alteração nos RELÉS
int DIRETO           = 0;           //INFORMA SE A BOMBA FOI LIGADA DIRETO OU NÃO
int CONDICAO         = 0;           //Para determinar a hora e minutos que vai ligar a bomba e ou o tratamento.
int EXIBE            = 0;           //Somente para exiber dados no LCD, ficar trocando
      
//char DT[] = "02/07/2017"; //Esse é o tipo de var texto aceito pelo LCD, mantive aqui só para lembrar, acho que não estou usando-o ai para baixo

//int    ndia_semana=1;     //Variável dos dias da semana, é associada a uma string.
int    dia       = 0;       //Variável dos dias do mês. 0 a 31.
int    mes       = 0;       //Variável dos meses. 0 a 12.
int    ano       = 17;      //Variável dos anos. 2017 a 2099.
int    bomba_h_i = 0;       //Variável da programação da bomba (horas ligada INICIO)
int    bomba_m_i = 0;       //Variável da programação da bomba (minutos ligado INICIO)
int    bomba_h_f = 0;       //Variável da programação da bomba (horas ligada FIM)
int    bomba_m_f = 0;       //Variável da programação da bomba (minutos ligado FIM)

//Variáveis que informa se a bomba e o hionizador estarão igados nos determinados dias da semana
int seg_b       = 0;
int seg_h       = 0;
int ter_b       = 0;
int ter_h       = 0;
int qua_b       = 0;
int qua_h       = 0;
int qui_b       = 0;
int qui_h       = 0;
int sex_b       = 0;
int sex_h       = 0;
int sab_b       = 0;
int sab_h       = 0;
int dom_b       = 0;
int dom_h       = 0;
/*======================================================================================================================================
                                                              Minhas variáveis:
======================================================================================================================================*/





/*======================================================================================================================================
                                                              Minha Interrupção:
======================================================================================================================================*/

//HORAS ---------------------------------------------------------------------------------------------------------------

//*********************************  Variáveis da HORA  ***********************************
int16 q=0; //Variável que incrementa a cada 0.5s dentro da interupção do timer1.
int   s=0; //Variável dos segundos, incrementa na metade de q.
int   m=0; //Variável dos minutos. 0 a 59
int   h=0; //Variável das horas. 0 a 23.


//*******************************  Interrupção do timer  **********************************

#int_TIMER1 //Interrupção do Timer1
void temp1s(void) //Funcão. O que deverá ser feito a cada interrupão.
{
   q++; //Variável q incrementada a cada estouro do Timer1
   set_timer1 (3036); //Preload do Timer1
}


//HORAS ---------------------------------------------------------------------------------------------------------------

/*======================================================================================================================================
                                                              Minha Interrupção:
======================================================================================================================================*/



//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
/*======================================================================================================================================
                                                           Programa Principal:
======================================================================================================================================*/
void main()
{

   inicializa_lcd();               //Inicializa o LCD



//TRATAMENTO DE INTRERRUPÇÃO, AQUI EU INICIALIZO O TIMER*******************************************************************************
   setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
   set_timer1 (3036);                         //Preload do Timer1
   enable_interrupts(INT_TIMER1);             //Habilita interrupção timer1
   enable_interrupts(global);                 //habilita interrupcão global


  
  
  ::: CONTINUA :::

 

Postado

@Marcio Pizano ,

 

Fazem 10 anos daquele post ... talvez o Pic18F45xx tenha alguma coisa a ser configurada no compilador.

 

Não posso te ajudar mais pois faz bastante tempo que só uso as famílias Atmega e Attiny. Os Pics simplesmente ficaram no passado ...

 

Paulo

  • Curtir 1
Postado
1 hora atrás, Marcio Pizano disse:

Obrigado por responder!

Agora fiquei mais inquieto ainda kkk

Segundo explicação do aphawk em outro tópico (https://www.clubedohardware.com.br/forums/topic/662735-dúvida-fórmula-timer0/) diz que para um cristal de 4mhz usa a mesma configuração que está no meu programa, e mesmo adicionando o PLL e o CPUDIV ainda não funcionou.

Segue o código e obrigado mais uma vez!

 


#include <18F4550.h>
#include <stdlib.h> //Para strings


/*
OBS.: Este código não usa saída (Definições) nas portas D porque este tipo de PIC com mais de 40 pinos, faz buscas diretas no pino D
Este código é típico para estes pics.
*/

//http://www.clubedohardware.com.br/forums/topic/764932-rel%C3%B3gio-e-calend%C3%A1rio-com-pic-16f628-super-simples/


#FUSES NOWDT                    //Sem Watch dog, evitando reset
#FUSES BROWNOUT                 //Resetar quando detectar brownout (Quando a tensão cair abaixo do previsto no datasheet)
//#FUSES HS                       //Crystal de oscilação de 4mhz alta velocidade
//#FUSES XT                       //Crystal de oscilação de 4mhz
#FUSES PUT                      //Power Up Time  Aguarda 72ms para iniciar o pic evitando surto de tensão
#FUSES NOPROTECT                //Codigo sem proteção de leitura, software livre!
#FUSES NODEBUG                  //Verifica se tem erros no código (desabilitado)
#FUSES NOLVP                    //No low voltage prgming (prog. baixa tensão desabilitado), B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection (Sem travar o chip)
#pragma config PLL DIV = 1  
#pragma config CPUDIV  = OSC1_PLL2 
#pragma config CPUDIV  = OSC2_PLL2 
#pragma config FOSC    = HSPLL_HS  

#use delay(clock=4000000) // Definição do clock utilizado. Obrigatório!



 
//*****************************************  LCD  *****************************************
//Definição de entradas e saídas
//Cada bit representa um pino físico de I/O
// 0 significa que o pino será uma saída
// 1 significa que o pino será uma entrada
#define trisa 0b11111111
#define trisb 0b00000000
#define trisc 0b00000000
#define trisd 0b00000000

 
// Estas são as definições dos pinos que o LCD utiliza.
// Definem quais pinos do PIC controlarão os pinos do LCD
 
#define lcd_enable pin_a1       // pino enable do LCD (E)
#define lcd_rs     pin_a0       // pino rs (register select)do LCD (RS)
                                // (0) para comandos    (1) para dados
                                //O pino RW vai no negativo.
#define lcd_db4    pin_b4       // pino de dados d4 do LCD
#define lcd_db5    pin_b5       // pino de dados d5 do LCD
#define lcd_db6    pin_b6       // pino de dados d6 do LCD
#define lcd_db7    pin_b7       // pino de dados d7 do LCD

#include <lcd.h>                //declaração da biblioteca do LCD
//*****************************************  LCD  *****************************************
 






/*======================================================================================================================================
                                                               PINOS I/O
======================================================================================================================================*/
#define BOTAO_MENU   PIN_B0 //BOTÃO de escolha de ajuste das funções.
#define AJUSTE_1     PIN_B1 //BOTÃO incremento de variáveis. (AJUSTE 1)
#define AJUSTE_2     PIN_B2 //BOTÃO de escolha de ajuste das funções. (AJUSTE 2)

#define POTENCIOMETRO       PIN_D1  //POTENCIOMETRO            PINO 20 Trata-se de ligar o led do potenciometro apenas quando for ionizar
#define SAIDA_HIONIZADOR_C4 PIN_C4  //SAÍDA DO IONIZADOR       PINO 23
#define SAIDA_HIONIZADOR_C5 PIN_C5  //SAÍDA DO IONIZADOR       PINO 24
#define SAIDA_BOMBA         PIN_C7  //SAÍDA DA BOMBA           PINO 26
#define BOMBA_DIRETO        PIN_D3  //SAÍDA DA BOMBA DIRETO    PINO 22 (Trata-se do botão, quem liga a bomba)

//pull-down em todos os botões para evitar ruídos.

/*======================================================================================================================================
                                                               PINOS I/O
======================================================================================================================================*/






/*======================================================================================================================================
                                                              Minhas variáveis:
======================================================================================================================================*/
int MENU             = 0;           //0 = MOSTRA RELÓGIO /// 1 = NÃO MOSTRA RELÓGIO (TEMPO REAL)
int FOCO             = 1;           //FOCO - 0=HORA REAL - 1=HORA (AJUSTES) - 2=DATA (AJUSTES) - 3=DIA DA SEMANA (AJUSTE) - 4=Bomba ligada inicio - 5=Bomba ligada FIM - 6=Agendando dias
int dia_semana       = 0;           //1 = SEGUNDA...
int dia_semana_bomba = 0;           //Para o ajuste da bomba ligada ou não BOTÃO 2
int final_mes        = 31;          //para saber quantos dias  tem um determinado mes.
char SEMANA[]        = "SEGUNDA";   //Inicio na SEGUNDA
int LIGADO           = 0;           //Para informar se a bomba ou o Hionizador sera ligado ou não
int contador         = 1;           //Para fazer a alteração no pino do hionizador (A1)
int troca            = 0;           //Para fazer a alteração nos RELÉS
int DIRETO           = 0;           //INFORMA SE A BOMBA FOI LIGADA DIRETO OU NÃO
int CONDICAO         = 0;           //Para determinar a hora e minutos que vai ligar a bomba e ou o tratamento.
int EXIBE            = 0;           //Somente para exiber dados no LCD, ficar trocando
      
//char DT[] = "02/07/2017"; //Esse é o tipo de var texto aceito pelo LCD, mantive aqui só para lembrar, acho que não estou usando-o ai para baixo

//int    ndia_semana=1;     //Variável dos dias da semana, é associada a uma string.
int    dia       = 0;       //Variável dos dias do mês. 0 a 31.
int    mes       = 0;       //Variável dos meses. 0 a 12.
int    ano       = 17;      //Variável dos anos. 2017 a 2099.
int    bomba_h_i = 0;       //Variável da programação da bomba (horas ligada INICIO)
int    bomba_m_i = 0;       //Variável da programação da bomba (minutos ligado INICIO)
int    bomba_h_f = 0;       //Variável da programação da bomba (horas ligada FIM)
int    bomba_m_f = 0;       //Variável da programação da bomba (minutos ligado FIM)

//Variáveis que informa se a bomba e o hionizador estarão igados nos determinados dias da semana
int seg_b       = 0;
int seg_h       = 0;
int ter_b       = 0;
int ter_h       = 0;
int qua_b       = 0;
int qua_h       = 0;
int qui_b       = 0;
int qui_h       = 0;
int sex_b       = 0;
int sex_h       = 0;
int sab_b       = 0;
int sab_h       = 0;
int dom_b       = 0;
int dom_h       = 0;
/*======================================================================================================================================
                                                              Minhas variáveis:
======================================================================================================================================*/





/*======================================================================================================================================
                                                              Minha Interrupção:
======================================================================================================================================*/

//HORAS ---------------------------------------------------------------------------------------------------------------

//*********************************  Variáveis da HORA  ***********************************
int16 q=0; //Variável que incrementa a cada 0.5s dentro da interupção do timer1.
int   s=0; //Variável dos segundos, incrementa na metade de q.
int   m=0; //Variável dos minutos. 0 a 59
int   h=0; //Variável das horas. 0 a 23.


//*******************************  Interrupção do timer  **********************************

#int_TIMER1 //Interrupção do Timer1
void temp1s(void) //Funcão. O que deverá ser feito a cada interrupão.
{
   q++; //Variável q incrementada a cada estouro do Timer1
   set_timer1 (3036); //Preload do Timer1
}


//HORAS ---------------------------------------------------------------------------------------------------------------

/*======================================================================================================================================
                                                              Minha Interrupção:
======================================================================================================================================*/



//??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
/*======================================================================================================================================
                                                           Programa Principal:
======================================================================================================================================*/
void main()
{

   inicializa_lcd();               //Inicializa o LCD



//TRATAMENTO DE INTRERRUPÇÃO, AQUI EU INICIALIZO O TIMER*******************************************************************************
   setup_timer_1 (T1_INTERNAL | T1_DIV_BY_8); //Configuração do Timer1 para clock interno = 1E6 dividido por 8
   set_timer1 (3036);                         //Preload do Timer1
   enable_interrupts(INT_TIMER1);             //Habilita interrupção timer1
   enable_interrupts(global);                 //habilita interrupcão global


  
  
  ::: CONTINUA :::

 

Não é só acrescentar estes Fuses,voce tem que calcular.

Leia este link:

Configurando a velocidade do 18F4550

  • Curtir 1
  • Obrigado 1
  • Membro VIP
Postado
5 horas atrás, aphawk disse:

Esp32 .... vai fazer algo sério com ele ?

De imediato não e depois... talvez.

IOT... ou você se envolve com ela ou ela te envolve... literalmente

  • Curtir 1
Postado

Aos amigos meu feedback.
Após estudar e seguir as recomendações referentes ao DataSheet do Pic 18F4550, informo que no Proteus funciona perfeitamente, mas quando soldo o PIC na placa, ele simplesmente não funciona como o esperado, usei Timer0 e Timer1 para fazer o processo e nada, porém, quando volto com os valores dos capacitores referente ao PIC 18fr4520 e soldo o pic na placa, tudo funciona perfeitamente.
Lembrando que usei 2 PICs 18F4550 comprados na MultoComercial, não sei exatamente se o problema esta no PIC, mas é estranho porque o outro PIC funciona.

Em fim. Minha placa segue então com o PIC 18F4520, vou continuar estudadndo o 4550 e ver se descubro algo que talvez eu esteja fazendo de errado.
Muito obrigado pelas respostas.
Abraço!

Postado

Voltando aqui para fechar este tópico rs.
Não satisfeito com o resultado apresentado pelo pic 18F4550, fiz um melhor estudo sobre o ciclo de máquina. Cheguei a conclusão de que o pic realmente esta com problemas, pôs os calculos estão corretos como pode ser visto no código acima.
 

Estudo do CICLO DE MÁQUINA (Microcontroladores)
Visão geral.
1º - Defina o tipo de cristal que vai trabalhar.
2º - Defina qual timer ira usar, Timer0, Timer1. 
Dependendo do timer ele pode ser de 8 ou 16bits
8 bits = 255 (Máximo de contagem)
16 bits = 65536 (Máximo de contagem)
3º - Escolha o Prescale que deseja trabalhar.
1:8
1:4
1:2
1:1 etc.

 


Iniciando os cálculos
OBS.: Cálculo para achar 1 segundo no ciclo de máquina.

Calculando Timer1 de 16bits para um cristal de 4Mhz com prescale de 1:8

1º - Sempre dividimos o cristal por 4 (Constante)
4000000 / 4 = 1Mhz (Frequência útil)

2º - Eleve a 1
1 / 1000000 = 0,000001us (1 micro segundos para cada ciclo de máquina)

3º - Utilizando o prescale selecionado 1:8
1/(1Mhz/8) = 0,000008us (8 micro segundos para cada ciclo de máquina)

4º - Multiplica o resultado pelos bits do timer, neste caso 16bits = 65536
65536 * 0,000008 = 0,524288 (Segundos por ciclo de máquina)

5º - Regra de três
X = 0,50 * 65536 / 0,524288 = 62500  (0,50 arredondando o valor para maior precisão)

6º - Subtrai o resultado pelo máximo do ciclo referente aos bits selecionado (16bits = 65536)
65536 – 62500 = 3036 (Valor inicial da contagem)

setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);  (T0_DIV_BY_Prescale selecionado)
set_timer1(3036); (Valor inicial da contagem)
enabled_interrupts(INT_TIMER1);
enabled_interrupts(GLOBAL);

valeu!

  • Curtir 1
  • Membro VIP
Postado

O persistente problema dos mastigados do compilador...

 

Antes de concluir que o problema é o mc, sugiro que avalie o resultado do compilador e não descarte algum bug. Um debug simples avaliando os registros do controle e a comparação com o conhecimento recém adquirido + o entendimento minucioso dos pertinentes circuitos do mc, devem somar algo ao seu conhecimento.

 

Sua análise está boa. Compare com uma 'minha' minimalista mas um pouco mais 'hard' quando queria p.ex. interrupt 50Hz

Timer_block_diag.png

4Mhz---> 1Mhz no timer

1000000/50=20000 =>20000 contagens pra 'rolar' ffff 0000 

=>

65536-20000=45436=0xB1E0=>

...

TMR1H=0xb1; TMR1L=0xe0;

//ex.

if (tmp++>49){tmp=0;segundo++;}

minuto=segundo%60;

hora=minuto%60;

...

Ainda há a [desconhecida por mim] questão do pll deste mc ...

Postado

Experimenta iniciar assim:

#pragma config PLLDIV=1, CPUDIV=OSC1_PLL2, USBDIV=2, FOSC=HS

Esse micro pode trabalhar a 48 Mhz,aleatoriamente não da para saber como foi setado.

  • Curtir 1
  • Membro VIP
Postado
1 hora atrás, vtrx disse:

Experimenta iniciar assim:

...

...e grave sem proteção. Depois leia o conteúdo e compare se os fuses foram gravados corretamente...(caso a configuração acima esteja setada pra 4Mhz)

Crie uma conta ou entre para comentar

Você precisa ser um usuário 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 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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!