Ir ao conteúdo
  • Cadastre-se

Outro Linguagem C para uC


Posts recomendados

@aphawk

 

Grande Paulo. Minha resposta já é o fluxo a ser seguido. Só tem que substituir a palavra divisor por prescaler do timer (me deu branco na hora). Vai ter que cair no asm, alto nível não dá conta do desafio.

 

@josias001 , assembler ou C? Quando usar este ou aquele? O C na maioria das vezes é mais fácil mas em etapas em que é necessário ter o hardware na mão vale a pena conhecer um pouco de assembler. Para um projeto único, alto nível sempre, mesmo que para isso tenha que comprar um uC mais rápido e com mais memória. Sai mais barato gastar 2 dólares a mais num uC mais parrudo que ficar mais 2 dias de programação. Se for um produto seriado, vale a pena gastar 2 dias a mais para economizar apenas 20 cents por hardware produzido. Na escala se recupera o investimento humano.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

12 horas atrás, aphawk disse:

Vamos ver se conseguimos temporização EXATA de 1 Hz

 

16 horas atrás, Sérgio Lembo disse:

100 bytes vai render umas 30 instruções, vai ficar apertado mas quem sabe...

 

Cola tá valendo?????????????????

 

Então vejam o programinha que eu  fiz (anexos).

Acho que dá uns 21 words ( me corrijam se eu estiver errado !)

 

OBS: Só não faço uma animação como aquelas que nossa amiga faz, porque eu não sei fazer.

 

josias001 

21 WORDS.jpg

Sucesso.jpg

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

17 minutos atrás, Sérgio Lembo disse:

@josias001 , parabéns. O disassembly sugere a utilização de 48 bytes. Para compreender o código faltou a gentileza do comentário. Ficar estudando o datasheet do uC escolhido para compreender seu exemplo é cruel.

Estou meio enferrujado no ASM, e o meu conhecimento do ASM do PIC é nulo, mas... os ASMs tem muitas semelhanças entre si, e apesar de não conhecer, ele não me é totalmente estranho.

Comentar o código seria interessante, ajudaria tremendamente na compreensão (na minha e na de muita gente aqui).

 

Ser "xingado" em ASM é complicado.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

1 hora atrás, Sérgio Lembo disse:

Ficar estudando o datasheet do uC escolhido para compreender seu exemplo é cruel.

 

44 minutos atrás, Intrudera6 disse:

Comentar o código seria interessante, ajudaria tremendamente na compreensão (na minha e na de muita gente aqui).

 

Os amigos perdoem a minha insensibilidade, não fiz por mal...😔

Presumi erroneamente que todos nós falávamos uma mesma língua, foi mal.

( Isso acontece comigo com uma certa frequência, preciso ficar me policiando...)

Segue anexo versão do programa com comentários.

Qualquer dúvida, estou à disposição.

 

Josias001

Comentado.png

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

3 horas atrás, Sérgio Lembo disse:

O disassembly sugere a utilização de 48 bytes.

 

Amigo:

A análise que eu faço do disassembly é a seguinte (não sei se está correta):

 

 - PIC 16F628 = 2048 X 14 bits de memória de programa flash (2kword).
 -14bits é a largura da memória de programa (desses 14 bits, 8 bits são para        decodificação de instruções e 5 bits para endereçamento direto).

 

A memória de programa desse uC possui 2048 linhas de programação, cada linha representa 1 word (14 bits) e o programa Pisca-Led (1Hz) ocupou 21 linhas de programação (21 words).

 

Josias001

 

 

 

Link para o comentário
Compartilhar em outros sites

@josias001 ,

 

Legal !!!! Parabéns !!

Não entendí como você está usando a divisão por 256 a partir de 1 Mhz e gerando 1 Hertz preciso pois a interrupt fica a 3.906,25 Hertz... como a temporização ficou exata com esses valores ?

Você consegue disponibilizar os arquivos .obj gerados para eu testar no meu Proteus ?

Obrigado !

 

Obs falamos a mesma língua quando se trata de hardware ....  mas de software estamos numa Torre de Babel kkkkk !

 

Paulo

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@aphawk , se bem entendi ele está usando um timer de 8 bits com prescaler em 256 e interrupt no overflow. isso resulta numa frequência de interrupt de 15.26Hz. O interrupt gera uma contagem regressiva e dessa forma faz a frequência. A contagem regressiva é de 20 para fazer o togle do pino de saída. Não enxerguei um valor inicial de reload para ajuste de tempo. Ter uma contagem de 195 com togle em 10 já nos daria uma precisão compatível com a precisão do oscilador interno. Muito pobre os recursos de timer do uC selecionado. Teria que fazer uma cascata de 2 para conseguir um PWM na frequência desejada operando autônomo ao software.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Sérgio Lembo ,

 

Sim, é a mesma conta que eu fiz aqui, 15,25789xxxxxxx  interrupts  por segundo e ele decrementa um contador para fazer o toggle do pino de saída, mas vai ter sempre um erro pequeno na frequência !

Ou seja, não é a resposta ao problema que eu propus fazer.....

Tem de usar outros recursos do hardware ( afinal tem 3 timers, e INT0 também certo ??? )  para chegar a 1 Hz exato, e é aí que entra a imaginação do programador : como usar isso tudo de hardware para ter um código pequeno e deixar o hardware fazer o trabalho pesado ?

 

Paulo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@aphawk

Na verdade o que sugere é fazer um PWM e dar um halt sem parar o oscilador. Depois de ter lido o STM8 e o Arm M0 e M3 esse processador de 20 anos não anima muito. Vai ter que fazer cascata de 2 e aparentemente o link será externo. É o mesmo que estudar uma válvula, só compensa para quem faz rádio FM.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@aphawk @Sérgio Lembo

 

Senhores:

Aqui cabe uma errata, que não altera o tamanho do código:

Onde se lia, tempo = 31, lê-se tempo = 15

Se Hz = vezes por segundo:

Frequência de interrupção = clock/prescaler/(256-TMR0)

Frequência de interrupção = 1MHz/256/256 = 15,25 Hz

Período = 1/F = 1/15,25 = 0,065536 segundo x 15 = 0,98304 segundo


Clock  =  Frequência de oscilação/4 

Clock = 4MHz/ 4 = 1MHz

 

Não dá 1 segundo exato mas é aproximado!

OBS1: Aparentemente não dá para fazer upload de arquivos *.hex

 

OBS2: Para fazer uma forma de onda como essa do anexo (uma piscada por segundo)

recomendo substituir Tempo= 15 por Tempo=7.   :D

 

 

 

 

josias001

 

 

 


 

tempo 7.jpg

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@josias001 , permita-me colocar mais uma errata: prescaler=128. 1Hz significa 1 ciclo completo de liga-desliga isto é, 1 togle a cada 500ms.

Em termos do desafio de fazer 1Hz com poucos bytes funciona, a diferença é próxima a precisão do oscilador interno de forma que tá valendo. A intenção original é ter um PWM que trabalhe sozinho sem dar trabalho ao CPU além do setup inicial. No caso do PIC escolhido a limitação dos recursos é o maior desafio. Na minha primeira resposta fiz o uso do ARR (auto reload register), recurso que inexiste nos timers deste modelo e que é comum até mesmo nos timers ditos básicos dos uC mais recentes de baixo custo. Para mim usar esse modelo de PIC é o mesmo que armazenar dados em disquete. Excelente mídia no seu tempo, mas passou...

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

9 minutos atrás, Sérgio Lembo disse:

permita-me colocar mais uma errata: prescaler=128. 1Hz significa 1 ciclo completo de liga-desliga isto é, 1 togle a cada 500ms.

 

Perfeito, meu amigo!👍

 

Confesso que fiz o programa meio "nas coxas", por preguiça não procurei uma precisão.

 

59 minutos atrás, josias001 disse:

OBS2: Para fazer uma forma de onda como essa do anexo (uma piscada por segundo)

recomendo substituir Tempo= 15 por Tempo=7.   :D

 

Como pode ver no meu post anterior, cheguei à mesma conclusão que você (*.jpg com a forma de onda, mas no começo eu me confundi um pouco ---> 1 segundo aceso, 1 segundo apagado (isso não é 1 Hz)).

 

Concordo que meus 16F628 são antigos (acho que comprei em 2005), mas para quem aproveita TTLs de placas de IBM PCs, para experimentos, estão de bom tamanho. 

Ainda assim, para a confecção de alguns produtos, eu não os trocaria por outros, dada a familiaridade que eu tenho com os mesmos.

 

Com prazer, divido com você então os créditos por ter encontrado uma  solução (parcial, não tão precisa)  para a questão do pisca_led_1 Hz.  :D

 

Então a configuração do Option_Reg para prescaler 1:128  fica assim:

 

movlw  B'10000110'

movwf  Option_Reg

 

Josias001

 

tempo 7.jpg

  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

@josias001 , obrigado pela resposta.

A minha insistência em não recomendar o uso de coisas antigas é que dá o mesmo trabalho estudar o velho e o novo sendo que o novo além de mais recursos costuma ser mais fácil pelos recursos e mais barato. Como a base dessa agradável discussão foi temporização, isso me fez lembrar de um desafio que envolvia timer. Na pesquisa por opções deparei com o ARM_M0 da Novuton. Se normalmente falamos de uC e seus periféricos na Novuton podemos falar de um Timer onde a CPU é um periférico. A descrição do timer e os inúmeros exemplos de utilização ocupam mais da metade do datasheet. Para quem vir a precisar de um timer com 6 compares e uma pancada de opçôes de configuração fica a dica. O ruim é a pancada de registradores a serem configurados mas o osso faz parte da carne.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Vou fazer uma ultima tentativa para fazer alguém forçar a cabeça para dar uma solução para o que propus ....    a maioria dos microcontroladores que usamos no dia a dia tem 3 timers. Se souber como interligar os três, e configurar corretamente, todo o trabalho será feito pelo hardware, e SEM precisar de interrupção, e 1 Hz EXATOS ...., e com menos de 30 bytes tudo inclusive o código de inicialização ...

 

Usando dois timers também consegue, mas nesse caso será necessário o uso de uma interrupção, e aumenta um pouco o código.

 

Aliás, dependendo da família do microcontrolador, também consegue com 1 timer .....

 

Pronto, caminho das pedras ensinado ......

 

Cadê as cabeças pensantes ? kkkkkkk

 

Paulo

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Fiz isso agora há pouco só como terapia. Baseei nos dados do fonte asm do autor e não conferi nada ok?

Também pra se manter nas rédeas do título

 

31 minutos atrás, aphawk disse:

o trabalho será feito pelo hardware, e SEM precisar de interrupção

Paulão nem sei se entendi direito. Pra mim o HW É a interrupção. Sem hw sem interrupção, seria algo como (pic10f200)
 

unsigned int t0=30000,t1; //valor xutado!
for(;;)
{
while(t0--)
	{
	GPIO0^=1;
	while (t1--) {asm ("nop");asm ("nop");} //ajuste fino
	asm ("nop");asm ("nop"); //ajuste ainda mais fino
	}
t0=30000;//reload xutado!
asm ("nop");asm ("nop");//ajuste fino demais da conta sô.
}

Só com hw uma alternativa é usar cristal 32768. Neste caso basta 1 timer sem precisar cascatear.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

2 horas atrás, Isadora Ferraz disse:

Fiz isso agora há pouco como terapia.

 

19 horas atrás, josias001 disse:

Com prazer, divido com você então os créditos por ter encontrado uma  solução (parcial, não tão precisa)  para a questão do pisca_led_1 Hz.  :D

 

Amiga:

Aparentemente você usou como base para sua simulação o meu  programa.

Agradeço a cooperação, ficou muito bom e agregou conteúdo à minha inspiração.

Mas infelizmente não poderei dividir os créditos com você pois já o fiz com nosso amigo.

Mas, num futuro próximo espero contar com sua parceria, para ilustrar meus sensacionais programas (se você me prometer que da próxima vez, vai colocar um resistor em série com o led,  para evitar problemas), mesmo que seja para ajudar na sua terapia.

 

Melhoras.

 

Josias001 😩

  • Haha 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Amigo, não é aparentemente, é literal pois o mencionei lá, lembra?

Sim preferi não pensar no 1Hz e sim na alternativa C pro seu programa sim. Sobre os exatos 1Hz nem dei muita bola também, vou preferir a manifestação do Paulão ok?

 

E pra quem está achando que isso é uma baita perda de tempo estapafúrdia (tem toda razão kk), permita-me registrar um caso real com real conexão ao desafio Paulão:

Certa feita precisei medir um sinal ultrasônico com muita tolerância. A ideia era apenas saber se ele estava lá. Um osciloscópio resolvia mas era muita flatulência pra pouco resultado de digestão. E caro. O insight: dividir o sinal a uma freq audível e 'ouvi-lo'. De cara um cd4040 resolvia. mas onde achar isso pra'aquele mesmo dia?!! Sem chance. Alguns minutos depois e ... sai um pic programado com a entrada do timer num pino e

for (;;) GPIO0=TMR1>>3;

Tá lá um buzzer piezzo no pino. Deu beep... tem sinal. Aperto de mão? Tapinha nas costas? 'Valeu' ?.. nem isso ganhei kk

Ok não é  muita mas tem sim uma conexãozinha entre a realidade e o sonho do Paulão...

 

Dica: peça pra sua esposa não lavar a louça hoje. Ao chegar em casa você vai ter a pia só pra você kk. Talvez você não precise de ter a pia mas ela ... com certeza. Então deixa pra ela mesma.. kk (aff fraquinha...)

 

Ah sim, ia esquecendo.. gosto (quando pertinente e .. possível) de manter nos posts uma conexão técnica mínima com a proposta do forum, por isso a aquela conexãozinha. Um post só de interrelações pessoais vira alvo fácil pro meu perseguidor amigo Brunão me puxar a orelha... de novo kk

Portanto, fica mais esta dica... Tentemos somar algo tecnicamente mínimo em cada post

(olha a terapia aí ... kk)

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

39 minutos atrás, Isadora Ferraz disse:

Ok não é  muita mas tem sim uma conexãozinha entre a realidade e o sonho do Paulão...

 

kkkk verdade, mas não é sonho, é uma realidade, só que estou tentando difundir algo a mais aqui nesse post : usar a criatividade !

Enquanto as pessoas olharem apenas os hardwares separados, tudo fica mais difícil de ser feito. Mas quando você junta esses hardwares, coisas podem ser feitas de maneiras muito mais simples !

 

1 hora atrás, Isadora Ferraz disse:

Paulão nem sei se entendi direito. Pra mim o HW É a interrupção. Sem hw sem interrupção, seria algo como (pic10f200)

Sim, você entendeu direito !

Claro que você sabe como usar um Timer com interrupção.

Mas dá para cascatear os 3 Timers , e assim obter os 1 Hz de forma automática, gastando cerca de 10 bytes para programar os três , e claro, ligando a saída de um na entrada do outro .... e sem interrupção !

Besteira de ideia, mas são essas idéias doidas que salvam a gente em vários casos !

 

Paulo

 

 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, josias001 disse:

(se você me prometer que da próxima vez, vai colocar um resistor em série com o led,  para evitar problemas)

@Isadora Ferraz

 

30 minutos atrás, Isadora Ferraz disse:

Portanto, fica mais esta dica... Tentemos somar algo tecnicamente mínimo em cada post

 

Amiga:

 

No meu post anterior denunciei um erro grave (técnico) na tua simulação, que teoricamente representa um projeto.

 

Tenho certeza que foi por esquecimento e não por falta de conhecimento.

 

Acho que isso soma algo tecnicamente mínimo ao post, pois quem ler vai saber que em série com um led, sempre vai um resistor limitador de corrente.  :D

 

Quase perdi certa vez uma centena de PCBs por ter esquecido de colocar resistores limitadores de corrente no layout da placa, por isso acho que tal observação é relevante.

 

Mas agradeço o conselho, não sou de ficar de papo furado, minhas intervenções (sempre bem-humoradas) sempre tem a ver com algum assunto relacionado ao propósito do Clube do Hardware.

 

Josias001

 

 

 

 

 

 

 

 

 

 

relevante.jpg

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, josias001 disse:

No meu post anterior denunciei um erro grave (técnico) na tua simulação, que teoricamente representa um projeto.

 

Ual, os ânimos estão se acirrando ... quer dizer que não colocar um resistor em série com um LED num simulador virou "erro grave técnico" ???

 

Em nenhuma simulação minha eu uso um resistor no Led, eu apenas quero ver se ele acende ou não acende, e no caso do meu simulador, o Proteus, o resistor é desnecessário.

 

Enquanto simulação, não me preocupo em isolar os terras de meu projeto, muito menos com a suposta "resistência" dos fios por onde passam altas correntes, pois isso tudo é coisa de se fazer quando a simulação do programa está feita e vamos partir ao projeto físico.

 

Detalhes como interferência entre trilhas de alta corrente ou de alta frequência não aparecem nos simuladores de microcontroladores,  então nem perco tempo pensando em incluir "indutâncias mútuas" e "resistências teórica de uma trilha" nas minhas simulações . Ou vou precisar de baita Core i7 top com 20 Gb de ram .....

 

Por ultimo, lembro aqui que este Fórum é para aprendizado e para dirimir dúvidas, não deve ser usado para outro fim que não seja este.

 

Ano novo pessoal, desarmem seus corações e vamos em frente porque temos muito a ensinar aos que precisam de nós !

 

Paulo

 

 

  • Curtir 1
  • Haha 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
1 hora atrás, josias001 disse:

um erro grave (técnico) na tua simulação, que teoricamente representa um projeto.

Bem observado. No entanto o foco era o sw e não necessariamente o hw. Mas foquei que você gostou do sw!

 

1 hora atrás, josias001 disse:

Tenho certeza que foi por esquecimento e não por falta de conhecimento.

De fato muito pelo contrário, nem esqueci e não coloquei de propósito. Pra esta façanha na simulação vá (fui) nas propriedades do led e o configure como digital. Ele vem da lib como analógico e se deixar assim, pode dar problema sim além de deixar a simulação mais lenta (acho que o motivo é óbvio). Então... de uma certa forma foi excesso de conhecimento kk. Mas sim, um iniciante poderia se confundir.... bem.... não a partir de agora kk

 

1 hora atrás, josias001 disse:

em série com um led, sempre vai um resistor limitador de corrente

Bem.... Na teoria você está corretíssimo mas (sempre tem um mas) na prática (onde me localizo) em casos extremos (lanterninha de 1,99) nem resistor tem. E funciona a contento por meses... tenho algumas com anos e sim uso de vez em quando. Você deve perceber que o led meio que tem um resistor (resistência) interno quando percebe que ele começa a acender fraquinho com V bem menor do que a dele. P.ex. 2V acende led de 3V. Também já liguei 4 leds 3V em série direto na bateria 12V com sucesso. Debrucemos só mais um pouco sobre isso...

 

(A inspiração)

1 hora atrás, aphawk disse:

são essas idéias doidas que salvam a gente em vários casos !

você pode com segurança ligar led em saída ttl direto sem resistor 😯. O pulo do gato é pulso bem curto p.ex. numa multiplexada varredura. Mas por hora, caro leitor, nem faça isso. É só conceito. Prefira um maior amadurecimento

 

1 hora atrás, josias001 disse:

Quase perdi certa vez uma centena de PCBs por ter esquecido de colocar resistores limitadores de corrente no layout da placa, por isso acho que tal observação é relevante.

devia ter me procurado. Poderia nem resolver mas a gente ia dar alguma risada  kk.

1 hora atrás, aphawk disse:

ideia, mas são essas idéias doidas que salvam a gente em vários casos !

 

1 hora atrás, aphawk disse:

quando você junta esses hardwares, coisas podem ser feitas de maneiras muito mais simples !

É isso aí Paulão! Pra corroborar-te lembra que fiz um divisor de freq pra ouvir ultrassom? Poizintão... me lembrei agora que usei a entrada do comparador pois o sinal era baixo tipo 0.5Vpp. A saída do comparador liguei por fora na entrada do contador do timer. Ou seja, literalmente 2 hw se dando as mãos...

 

agora, aphawk disse:

Ano novo pessoal, desarmem seus corações e vamos em frente porque temos muito a ensinar aos que precisam de nós !

kk relaxa amigo!! Estamos de boa eu e o novo amigo @josias001 !! Bem. .. pelo menos de minha parte kk .. pra provar.. eu até curti um (01) post dele! kk

  • Obrigado 1
  • Haha 1
Link para o comentário
Compartilhar em outros sites

@Isadora Ferraz  e @josias001 .

O que o Paulo propõe é colocar um timer com 1Hz e sua saída ligada diretamente ao pino de saída. A CPU só entra na configuração, depois disso pode entrar em sleep ou fazer qualquer outra coisa que o led continua piscando.

O uso da interrupção força a CPU trabalhar o vetor, queremos ela coçando o saco.

 

@aphawk

Paulo, estou com um projeto adormecido que necessita de um contador de 32 bits. A família STM8 e STM32 até possui o modelo em algumas versões mas 1 dos captures utiliza o mesmo pino do USB e eu quero os 4 captures. Pensei então em colocar 2 timer de 16 bits com 4 captures em cascata, ligar os captures em paralelo e ter o resultado em 32bits. Surgiu uma dúvida: quando ocorrer o reload do primeiro timer seus captures serão zerados? Se isto ocorrer as temporizações medidas durante a primeira corrida serão perdidas, o fluxo é linear, sem interrupção, enquanto o hw faz a nova leitura a CPU interpreta a anterior e a ideia da cascata será perdida para essa aplicação.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
19 minutos atrás, Sérgio Lembo disse:

colocar um timer com 1Hz e sua saída ligada diretamente ao pino de saída.

Infelizmente não lembro se este mc (ou qualquer outro que seja) libera qualquer saída dum contador num pino. Uma olhadela em datasheets nos (vos) cairia bem.

 

20 minutos atrás, Sérgio Lembo disse:

um contador de 32 bits

Pra questão dos 32 bits num mc de 8 que tenha contador de 16, só com 100% hw não sei se é possível. Uma lôca alternativa é um mínimo de sw. Algo como uma interrupt no transbordo 16 bits só pra incrementar uma variável de 16 bits e montar outra de 32 a partir de 1 de 16 e 2 de 8... ok confusão proposital ... algo como:

Supondo ser o pic16fxxx

unsigned int b16;
long b32;
void interrupt timer1()
{
b16++;
b32=b16*65536 + TMR1H*256  + TMR1L;
}

Lembrando que esta montagem deve ser feita também no momento em que quer capturar b32 pois na interrupt TMR1 H L tendem a ser zero.

Ok acho que nem eu me autoentendi mas fica aí a semente-conceito...

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

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...