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) 

Exibições: 1257

Responder esta

Respostas a este tópico

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")

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço