collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: duvida em fast PWM  (Lida 3883 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
duvida em fast PWM
« em: 19 de Maio de 2011, 17:37 »
boas

estou a tentar diminuir a luminosidade de um led com fast PWM num attiny25, o que acontece é que o led nunca chega a apagar completamente quando o a instrução deixa de ser verdadeira, alguém me sabe dizer onde é que está o erro?

Código: [Seleccione]
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
OCR0A = 255;
TCCR0A = (1<<COM0A1) | (1<<WGM01) | (1<<WGM00);
TCCR0B = (1<<CS01);
DDRB |= (1<<PB0);

while(OCR0A > 0)
{
_delay_ms(10);
OCR0A--;
}
}


Offline msr

  • Mini Robot
  • *
  • Mensagens: 798
Re: duvida em fast PWM
« Responder #1 em: 19 de Maio de 2011, 18:24 »
Quando a condição deixa de ser verdadeira (OCR0A > 0) pões logo o PWM ao máximo (OCR0A = 255;), nem sequer existe o delay de 10ms. Isto porque quando ele sai do ciclo while o MCU faz um reset e volta a correr o programa.

Experimenta por um while(1); a seguir ao teu ciclo while para ver se o LED não fica permanentemente apagado.

De qualquer das maneiras valores baixos (proximos de zero) do duty cycle já deveriam dar para ver o LED apagado...


Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: duvida em fast PWM
« Responder #2 em: 19 de Maio de 2011, 18:33 »
não, neste caso quando a condição deixa de ser verdadeira pára, se a condição for while(OCR0A >= 0) é que reinicia...

de qualquer maneira já testei o código seguinte e é igual, não desliga completamente:

Código: [Seleccione]
while(1)
{
OCR0A = 0;
}

tenho que ir ler melhor a datasheet para ver se é algum register mal definido...

Offline msr

  • Mini Robot
  • *
  • Mensagens: 798
Re: duvida em fast PWM
« Responder #3 em: 19 de Maio de 2011, 18:40 »
Nos PICs quando o programa atinge o fim do código é feito reset automaticamente. Nos AVRs não?

Mas realmente se lhe pões OCR0A=0; deveria desligar...
Tens o ânodo do LED ligado directamente à saída do PWM ou estás usar algum transistor como switch?

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: duvida em fast PWM
« Responder #4 em: 19 de Maio de 2011, 18:42 »
apenas uma resistência para limitar a corrente, 1k, era o que tinha à mão...

se o loop for infinito é claro que reinicia, mas neste caso não é...

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: duvida em fast PWM
« Responder #5 em: 19 de Maio de 2011, 18:43 »
Não, o gcc quando detecta o fim do main, entra num loop infinito com as interrupções desligadas, porque um micro-controlador não tem para onde retornar, logo fica num ciclo infinito para não ficar a fazer resets para sempre.
Isso é porque >0 é 1, logo ainda dá impulsos.
Avr fanboy

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: duvida em fast PWM
« Responder #6 em: 19 de Maio de 2011, 18:52 »
então porque é que quando eu substituo o loop por isto:

Código: [Seleccione]
while(1)
{
OCR0A = 0;
}

retirando "OCR0A = 255;" do inicio do programa o resultado é exactamente o mesmo?

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: duvida em fast PWM
« Responder #7 em: 19 de Maio de 2011, 18:56 »
Pode ser por a resistência ser muito elevada, mas já vou ver se o código está certo.
Tens o programador ligado á placa?
O PB0 é o MOSI do ISP.
« Última modificação: 19 de Maio de 2011, 19:02 por senso »
Avr fanboy

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: duvida em fast PWM
« Responder #8 em: 19 de Maio de 2011, 19:38 »
sim é o MOSI, também já tinha pensado nisso, mas mesmo desligando o programador fica igual

alterei a resistência para 470r, é igual...

entretanto vou testar com um mega328...
« Última modificação: 19 de Maio de 2011, 19:42 por CBX »

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: duvida em fast PWM
« Responder #9 em: 19 de Maio de 2011, 19:45 »
Experimenta baixar o clock do pwm, só porque sim.
Avr fanboy

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: duvida em fast PWM
« Responder #10 em: 19 de Maio de 2011, 20:42 »
fica igual  ::)

por ex:
Código: [Seleccione]
TCCR0B |= (1<<CS01); // Fcpu/64
« Última modificação: 19 de Maio de 2011, 21:05 por CBX »

Offline GnGz

  • Mini Robot
  • *
  • Mensagens: 665
Re: duvida em fast PWM
« Responder #11 em: 19 de Maio de 2011, 21:13 »
fica igual  ::)

por ex:
Código: [Seleccione]
TCCR0B |= (1<<CS01); // Fcpu/64

Quando está 1 no CS01 não é fcpu/8 ?

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: duvida em fast PWM
« Responder #12 em: 19 de Maio de 2011, 21:26 »
sim é, copiei o errado, mas também não interessa o problema não é dai  ???

o correcto seria ((1 << CS10) | (1 << CS11));

Offline GnGz

  • Mini Robot
  • *
  • Mensagens: 665
Re: duvida em fast PWM
« Responder #13 em: 19 de Maio de 2011, 21:33 »
Sim

Offline CBX

  • Mini Robot
  • *
  • Mensagens: 1.315
Re: duvida em fast PWM
« Responder #14 em: 25 de Maio de 2011, 18:57 »
boas

lembrei-me de testar o código com umas modificações no timer1 só porque sim e, bem funciona como deve:

Código: [Seleccione]
#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
OCR1A = 255;
DDRB |= (1<<PB1);
TCCR1 |= ((1<<PWM1A) | (1<<COM1A1) | (1<<CS01));

while(OCR1A>0)
{
_delay_ms(10);
OCR1A--;
}
}

só não consigo perceber é porque é que não funciona no, PB0, timer0  ???

obrigado a todos...