logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

PWM Atmega16, nie działa jak chcę

honestly 02 Sty 2011 14:12 2202 11
REKLAMA
  • #1 8946929
    honestly
    Poziom 10  
    Cytat:
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>

    int s; //zmienna do zmiany korekcji PWM
    int i;

    void PWM_Init()
    {
    TCCR0|=(1<<WGM00); //tryb PWM
    TCCR0&=~(1<<WGM01);
    TCCR0&=~(1<<COM00); // tryb porównania
    TCCR0|=(1<<COM01);
    TCCR0|=(1<<CS00); // prescaler
    TCCR0|=(1<<CS01);
    TCCR0|=(1<<CS02);
    }

    void zwieksz()
    {
    s=s+10;

    if(s>255)
    s=255;
    else
    {
    for(i=0;i<50;i++)
    _delay_ms(10);
    }
    }

    void zmniejsz()
    {
    s=s-10;

    if(s<0)
    s=0;
    else
    {
    for(i=0;i<50;i++)
    _delay_ms(10);
    }
    }



    int main(void)
    { DDRB=0b00001000;
    DDRA=0x00;

    PORTB=0b00001000;
    PWM_Init();
    sei();
    s=0;

    while(1)
    {
    OCR0=s;
    if(bit_is_clear(PINA,1))
    {
    zwieksz();
    }
    else if(bit_is_clear(PINA,2))
    {
    zmniejsz();
    }
    else if(bit_is_clear(PINA,4))
    {
    s=0;
    }
    }
    }


    Witam,
    mam kolejny problem z cyklu programowania..
    Układ ma za zadanie zgłaśnianie i z ciszanie i wyłączanie buzzera przyciskami.
    Niestety nie mogę sobie poradzić z programem, ten wyżej powoduje dzwięki w losowym czasie i z losową długością, na przyciski nie reaguję, a są one podłączone tak:
    PIN----GND
    |
    10k
    |
    VCC
    Może ustawienia samego PWM są złe, nie ukrywam, że sprawia mi on spory problem, bo nie wiedziałem od czego się zabrać, I też nie wiem gdzie w avr studio ustawić częstotliwość, i czy dodać swó kwarc 16MHz do układu?
  • REKLAMA
  • #2 8946964
    skalsky5000
    Poziom 21  
    Częstotliwość PWM zmieniasz prescalerem bity CSxx, częstotliwość procesora konfigurujesz fusebitami
  • REKLAMA
  • #3 8947113
    honestly
    Poziom 10  
    skalsky5000 napisał:
    Częstotliwość PWM zmieniasz prescalerem bity CSxx


    Niewiele mi to mówi. Nie mam pojęcia jak to odnieść do programu..
  • REKLAMA
  • #4 8947139
    skalsky5000
    Poziom 21  
    Częstotliwość PWM zmieniasz bitami CS00,01,02.Ty masz ustawione na External clock source.(85strona dokumentacji).Zmień to na
    TCCR0|=((1<<CS00)|(1<<CS01));

    Będziesz miał wtedy FCPU/64
  • #6 8947217
    honestly
    Poziom 10  
    skalsky5000 napisał:
    Częstotliwość PWM zmieniasz bitami CS00,01,02.Ty masz ustawione na External clock source.(85strona dokumentacji).Zmień to na
    TCCR0|=((1<<CS00)|(1<<CS01));

    Będziesz miał wtedy FCPU/64


    ok po wrzuceniu tego przypomina działanie PWM, działa głośniej i ciszej, z tym, że dowolnie ;/ a przyciski nie reagują a debouncingiem niedawno próbowałem się bawić i nie dałem rady, jeszcze pokombinuje
  • REKLAMA
  • #8 8949538
    honestly
    Poziom 10  
    nie działa niestety, kurde nie wiem co na to poradzić nie mam zbyt wielkiego doświadczenia ;/
  • #9 8949732
    Fredy
    Poziom 27  
    Piszesz że układ ma regulować głośność buzzera. Tylko że taki zwykły buzzer ma w sobie generator i nie da się go ściszać. On albo działa dobrze albo nie działa wogóle, ewentualnie głupieje.
  • #10 8949879
    sulfur
    Poziom 24  
    Działają dowolnie, ponieważ jeśli zmienna s mieści się w przedziale to czeka kolega 500 ms nie wiadomo po co.
  • #11 8950888
    honestly
    Poziom 10  
    Fredy napisał:
    nie da się go ściszać. On albo działa dobrze albo nie działa wogóle, ewentualnie głupieje.


    Idzie, nie jest to co prawda ten sam dźwięk, ale słychać wyraźną liniową różnicę dźwięku po ustawieniu PWM, ale póki co jeszcze nie doszedłem jak to wysterować przyciskami, może ten deboucing, jakaś podpowiedź w przykładzie jak to zastosować?

    Póki co działa przycisk wyłączający tzn s=0; co prawda z lekkim opóźnieniem muszę go przytrzymać i jak puszczę to gra dalej, ale o regulacji nie ma mowy, sam się zgłaśnia

    Przykładowe programy jakie znalazłem z deboucingiem niestety nie działają albo są zbyt skomplikowane jak dla mnie... ;/

    Dodano po 2 [godziny] 13 [minuty]:

    Cytat:
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>

    int s; //zmienna do zmiany korekcji PWM
    int i;

    void PWM_Init()
    {
    TCCR0|=(1<<WGM00); //tryb PWM
    TCCR0&=~(1<<WGM01);
    TCCR0&=~(1<<COM00); // tryb porównania
    TCCR0|=(1<<COM01);
    // prescaler


    TCCR0|=((1<<CS00)|(1<<CS01));
    }

    void zwieksz()
    {
    s=s+50;

    if(s>255)
    {
    s=255;
    }
    else
    {
    for(i=0;i<10;i++)
    _delay_ms(5);
    }
    }

    void zmniejsz()
    {
    s=s-50;

    if(s<0)
    {
    s=0;
    }
    else
    {
    for(i=0;i<10;i++)
    _delay_ms(5);
    }
    }



    int main(void)
    { DDRB=0b00001000;
    DDRA=0x00;

    PORTB=0b00001000;
    PWM_Init();
    sei();
    s=0;

    while(1)
    {
    OCR0=s;
    if(bit_is_clear(PINA,1))
    {
    zwieksz();
    }
    if(bit_is_clear(PINA,2))
    {
    zmniejsz();
    }
    /*
    if(!(PINB & 0x04)) s |= 0;
    else s &= ~(0);

    */
    if(bit_is_clear(PINA,3))
    {

    s=0;
    }
    }
    }


    Obecnie mój program wygląda tak, i powoli zaczyna robić co chcę, krótki opis:
    Gdy włączam zasilanie, brzęczyk zaczyna się zgłaśniać i az bedzie piszczał normalnie, i teraz przyciski (zachowują się dziwnie) PB2 pownien zciszać, ale robi to PB3 (why?) muszę go cały czas trzymać, aż zamilknie brzęczyk gdy puszczam ten znowu powoli zaczyna hałasować, PB3 powinien go wyłączać, ale robi to PB4 (why?)

    Jak zrobić żeby zmniejszając dźwięk o tyle ile razy nadusze na przycisk?
    Dlaczego przyciski zachowują się tak dziwnie?
    Dlaczego sam się zgłaśnia?

    Proszę o pomoc, bo już naprawdę nie mam pomysłów ;/
REKLAMA