Boa tarde,
Estou fazendo uma aplicação para controlar fita de LED endereçavel com o WS2812.
Minha duvida é como gerar um pulso de 350ns em um pino do microcontrolador, pode ser no Arduino, mas sem usar nenhuma biblioteca.
(Não me adianta usar bibliotecas, pois estarei passando o código para outro microcontrolador)
Tags:
Para ilustrar melhor o problema, vou postar o meu código para vocês:
While(1)
{
GPIOD->ODR=0b11111111; //liga saida
GPIOD->ODR=0b00000000; // desliga saida
}
Com o micro executando apenas esse código a frequencia de saída é de 2Mhz, o que é muito alta, já que o que preciso é de aproximadamente 800khz
while (1)
{
GPIOD->ODR=0b11111111; //liga saida
for(delay=1;delay <= 0X1;delay++); //menor delay possivel
GPIOD->ODR=0b00000000; //desliga saida
for(delay=1;delay <= 0X1;delay++); //menor delay possivel
}
Agora com esse código, com o FOR para fazer um delay, a frequencia cai para 100Khz, o que é muito devagar.
Simplesmente eu não estou conseguindo fazer um delay pequeno o suficiente para gerar a frequencia que eu quero, alguem tem uma ideia?
Bom dia,
Qual Microcontrolador ? Qual Módulo ? Qual a frequência do clock ?
O microcontrolador é um STM8S003F3 e a IDE é o ST Visual Develop, estou trabalhando com oscilador interno de 16Mhz.
Eu estive olhando a biblioteca do Arduino para as fitas WS2812 (Adafruit_NeoPixel-master) para tentar entender como foi implementado o código, mas não consegui nenhuma informação util.
Pelo que está comentado dentro dessa biblioteca, alguns trechos do programa foram escritos em assembler, estou desconfiado que terei que fazer algo assim também.
Bom dia VS,
o menor valor que conseguimos fazer um delay usando o C da IDE do arduino é de
1 uSeg. (função delayMicroseconds(1); ).
1 uSeg. é igual a 1000 nanosegundos.
O clock do arduino é de 16MHz. 16.000.000 de pulso em um segundo, 16.000 pulsos em um milissegundo,
16 pulso em um microssegundo, portanto o melhor dos mundos, um pulso a cada 62,5 nSeg.
O seu processador tem também um clock de 16 MHz, e se executar cada instrução em um ciclo
de clock, então usando assembly, use 5 ou 6 instruções de NOP e terá este tempo de delay.
RV
Obrigado pela resposta, realmente ela faz sentido.
O problema agora é eu descobrir como fazer a IDE aceitar partes do código em assembler
Os cristais dos clocks dos Arduinos não são tão precisos, já que devem ser bem baratos.
Por isso, os valores de delay podem variar um pouquito.
Já constatei essas variações com osciloscópio.
Uma possibilidade seria usar alguns NOP, por ex:
GPIOD->ODR=0b11111111; //liga saida
asm ( "nop \n")
GPIOD->ODR=0b00000000; //desliga saida
asm ( "nop \n")
Nunca uso isso, pode ter uma sintaxe diferente, vide:
https://pt.wikipedia.org/wiki/NOP
https://ucexperiment.wordpress.com/2016/03/04/arduino-inline-assemb...
https://playground.arduino.cc/Main/AVR
Para embelezar:
#define NOP() asm ( "nop \n")
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por