Ir ao conteúdo

Posts recomendados

Postado

Boa Noite:

 

Usei o timer0 do 8051 para conseguir contar o tempo em espaços de 1 segundo.
A cada 65.535 incrementos de 1uS (12MHz /12) é gerada uma interrupção.
Fiz com que a contagem de incrementos sempre começasse em 15.535 para que
o resultado fosse 1 segundo (65.535 - 15.535 = 50.000 x 20)

No tratamento da interrupção :
50.000uS x 20 = 1 segundo.

Só que em comparação com meu relógio Casio e com o relógio do computador, estava
atrasando.

Aí mudei o começo das contagens para 15.558 (65.535-15.558 = 49.977 x 20 = 0,99954 segundos)
e consegui fazer o relógio 8051 funcionar sem atrasar e nem adiantar. 

 

Alguém teria uma explicação para isso? Teoricamente não haveria necessidade desses ajustes
para o relógio funcionar corretamente.

 

OBS: (Por favor, sem aquela piada do tempo das válvulas:-" Relógio que atrasa, não adianta" )

 

Josias001

Postado

Tecnicamente eu não sei explicar... mas você tem contar os ciclos de maquinas de cada instrução executada dentro da rotina de interrupção e subtrair da sua contagem, ex: (Ninst = número de instruções)

 

(65535 - 15535 = 50000)

 

(50000 - Ninst) x 20 = 1s

 

o seu relogio ficou atrasando porque ele contava mais de 1s.

ele contava 50000 + (as instruções da rotina de interrupção) x 20.

 

agora contar o numero de instruções em linguagem C é um pouco difícil.. alguns compiladores descontam o tempo das instruções dentro da rotina de interrupção, outros não...

Em Assembly já é mais fácil pois tem o tempo de cada instrução no datasheet, livros...

  • Curtir 1
  • Membro VIP
Postado
11 horas atrás, josias001 disse:

Por favor, sem aquela piada do tempo das válvulas

E esta, nova, que inventei agora? Não adianta, o mal humor vai atrasar seu progresso

Sem piada você me expulsou e sem publicar a parte do programa tocante à interrupt complica ainda mais. Mesmo assim te perdoo e vejamos um pouco de insight...

 

A rotina de interrupt não deve interferir na contagem do tempo do timer. Pra isso a primeira coisa a se fazer é realimentar os contadores (e zerar o flag). Se você rodar a rotina - mesmo que seja um simples incremento - e realimentar no final, de fato há um atraso no processo. (pensando nisso, alguns mc já possuem um tal de autoreload). Se achar que deve, confirme e publique seu fonte

Dica: alguns mc tem oscilador de timer com pinos de entrada à parte. O ideal pra colocar um cristal 32768 pra usá-lo como base de tempo. Fica oscilante até com o mc dormindo. Uma alternativa pra baixo consumo - bateria.

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

sem publicar a parte do programa tocante à interrupt complica ainda mais.

@Isadora Ferraz

 

Bom Dia:

Não vamos perder tempo (entendeu? perder tempo, relógio....)

 

 void timer() interrupt 1{
      TR0=0; // aqui pausa a contagem
      TH0=0x3C; // ACHO QUE É AQUI QUE EU
      TL0=0xC6; // ESTAVA ME ATRASANDO 😬    --> exatos 23uS
      TR0=1; // aqui reinicia a contagem*
      voltas++;                            //
      if(voltas==20){                    // Tenho na pior das

                                                  // hipóteses, 49.977uS

                                                  // para rodar esse

                                                   //    
          voltas=0;                         //  resto de programa e                                                        // sair da interrupção sem
          contagemS++;}               // comprometer a                                                                // nova contagem*, acho                                                     // que é tempo de
                                                  //  sobra!
      if(contagemS >= 60){          //   
          contagemS=0;                 //
          contagemM++; }               //
                                           
      if(contagemM >= 60){           //
          contagemM=0;                  //
          contagemH++;    }             //
   
       }        

 

OBS: Lembrando que o problema já foi resolvido, o relógio não está mais atrasando e nem adiantando, eu só não estava conseguindo entender o que estava acontecendo.               

Postado

Sei não... acho que vocês dois deveriam arrumar um tempo pra se acertarem ....

 

@josias001 ,

 

O conceito de interrupção como base de tempo é ela ser o mais curta possivel.

 

Use ela apenas para setar um flag indicando que existe um novo segundo a ser tratado, e saia !

 

No programa principal você fica esperando esse flag, e aí incrementa os segundos, os minutos, etc, e zera o flag, aí você fica esperando o flag ser setado e faz tudo de novo.

 

Assim, se o cálculo do Timer estiver perfeito, todo o resto vai estar preciso.

 

Mas existe algo que vai te complicar : a recarga do Timer ....  como você vai saber quantos ciclos de máquina se passaram entre a interrupção e a recarga do Timer ?

Pode apostar que isso é o que está fazendo os tempos serem errados.

A grande vantagem do Assembly é essa ... o controle é total.

 

Mas existem maneira de se resolver isso :  use um Cristal oscilador que seja múltiplo de 2, ou use o hardware do 8051 e um pouquinho de engenhosidade ( e um cristal mais “adequado” ajuda muito ) !

 

Por exemplo, você pode sempre ligar a saída de um Timer na entrada de um outro Timer configurado como Counter, isso ajuda muito a se obter frequências que aparentemente são muito difíceis sem um cristal adequado.

 

Veja aqui a ideia :

https://www.clubedohardware.com.br/forums/topic/937085-projetos-com-avr-design-programação-em-basic-e-assembly/?do=findComment&comment=6253471


Aqui tem o pulo do gato explicado:

https://www.clubedohardware.com.br/forums/topic/937085-projetos-com-avr-design-programação-em-basic-e-assembly/?do=findComment&comment=6542608


A teoria está aí ... como tudo é feito pelos hardwares dos timers, a precisão é total, basta ligar a saída do último Timer a uma entrada qualquer e configurar uma interrupção, e eis a sua base de tempo 100% precisa.


Por exemplo, usando esse cristal de 12.288 você pode usar os divisores 128 e 96, e vai obter uma base de tempo super precisa de 1 milisegundo.

 

Boa diversão !

 

Paulo

  • Curtir 1
  • Membro VIP
Postado

Paulão ... dá um tempo pow...

De fato de vez em quando é melhor dar uma pausa. É o que faço agora e ... por falar nisso...

9 horas atrás, josias001 disse:

TR0=0; // aqui pausa a contagem
      TH0=0x3C; // ACHO QUE É AQUI QUE EU
      TL0=0xC6; // ESTAVA ME ATRASANDO 😬    --> exatos 23uS
      TR0=1; // aqui reinicia a contagem*

Você está semitotalmente correto. A pausa não era necessária. No caso ela está contaminando o tempo (algo como faço aqui). Comente isso...

9 horas atrás, josias001 disse:

//TR0=0; // aqui pausa a contagem

... reteste, e se achar que deve, comente isso.

 

9 horas atrás, josias001 disse:

não estava conseguindo entender o que estava acontecendo

Alguns compiladores têm como contar os ciclos de máquina. Um break point na interrupt te mostraria quantos ciclos até aquele momento. De uma certa forma isso te dá um certo domínio total da máquina sem apelar pro asm. Se bem que um asm (nop) de vez em quando não faz mal.

Falando nisso, que tal um coffee break agora?

  • Curtir 1
Postado

@Isadora FerrazCIRCUITO.thumb.jpg.a9a45a87bbe0f32fe2bf2113fc472a05.jpg

 

Boa tarde ,sou novo aqui e novo em eletrônica,e procuro ajuda.Estou fazendo um circuito na protoboard com um sensor de corrente SCT 013 de 50A/1V,ou seja a referência é a tensão de 0 a 1V

em alguns tutorias da net diz que devemos colocar um divisor de tensão com 2 resistores de 10k e um capacitor de 100uF,conectando o cabo vermelho do sensor no  divisor de tensão ,para gerar 2,5 volts ou terra virtual,mas o divisor de tensão envia 2,5 volts para a porta do microcontrolador,minha dúvida é  se o sensor envia 0 =0A e 1V= 50A  para o porta do microcontrolador,como ignorar os 2,5 volts enviados pelo divisor de tensão,pois mesmo sem colocar o sensor o display de LCD 16X2 Já interpreta essa tensão de 2,5 volts como corrente.Estou programando no Mikroc ,se alguêm pode me ajudar enviando um linha de código para corrigir esse problema.Desde já grato.

  • Membro VIP
Postado

O google me retornou isso

sensor-de-corrente-no-invasivo-sct013-10

Pra ...

2 horas atrás, MaverykY disse:

ignorar os 2,5 volts

... tem algumas emoções e opções:

Leia o valor ad sem corrente e o use como referência. Algo como uma rotina de calibração

iref=adcread();//meça e
eeprowrite(0,iref);//lembre-se

Na leitura do valor propriamente dito, leia o maior valor durante uns 20mS e o subtraia de iref

iref=eepromread(0);//na inicialização do sistema
...
i=adread()-iref;

To com preguiça de bolar uma rotina pra registrar o valor de pico... Outra hora eu tento...

 

 

 

  • Obrigado 1
Postado

@Phenom_X4 @Isadora Ferraz @aphawk

 

Em 28/12/2019 às 19:46, Isadora Ferraz disse:

Você está semitotalmente correto. A pausa não era necessária.

 

Realmente a pausa, aparentemente não é necessária, mas a recarga acrescenta tempo extra ao contador.

Mas como já disse, todas as alterações necessárias para o perfeito funcionamento do relógio foram feitas e ele está funcionando perfeitamente.

Agradeço as explicações, eu queria entender o que estava acontecendo e entendi perfeitamente.

 

Boas Festas à todos 😁

Agora tenho que cuidar do velho* que está passando muito mal, está para morrer.

 

*2019

 

Josias001

 

 

 

 

 

 

  • Curtir 1
  • Membro VIP
Postado
3 horas atrás, josias001 disse:

é antiga

Deve ser muuuito antiga meeesmo de bem antes de eu ou meu avô nascer pois nunca vi e de gosto digamos ... duvidoso...😬

.
 

Pra concluir...

21 horas atrás, josias001 disse:

recarga acrescenta tempo extra ao contador

 

Em 28/12/2019 às 09:02, Isadora Ferraz disse:

de fato há um atraso no processo. (pensando nisso, alguns mc já possuem um tal de autoreload)

P.ex. os da família ST32

 

f.a.n. pro 6 tudo... (esta é original)

:-BEER

  • Curtir 1
Postado

Lembrando que o 8051 também tem auto-reload!!!

 

Auto-reload de 8-bits nos timers 0 e 1 do 8051.

Auto-reload de 16-bits no timer 2 do 8052, que tem também Capture Mode nesse mesmo timer.

 

Feliz Ano Novo à Todos!!!

  • Curtir 2
Postado
Em 01/01/2020 às 19:41, Phenom_X4 disse:

Lembrando que o 8051 também tem auto-reload!!!

 

Auto-reload de 8-bits nos timers 0 e 1 do 8051.

Auto-reload de 16-bits no timer 2 do 8052, que tem também Capture Mode nesse mesmo timer.

 

@Phenom_X4

 

Boa dica!

 

Inspirado por essa informação, fiz uma nova versão do programa, que utiliza o auto-reload do TMR2, no uC  at89s52 (é da família do 8051).

 

De primeira não funcionou (coloquei interrupt 1 no lugar de interrupt 5) mas depois que eu corrigi, funcionou normal. Tudo muito fácil. 👍

 

Josias 001

  • Curtir 1

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!