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

[ATmega8] [C] 11-bitowy PWM - unie

soulreaver1 03 Mar 2009 20:41 1152 10
REKLAMA
  • #1 6232148
    soulreaver1
    Poziom 21  
    Witam.

    Mam problem z wykonaniem inkrementacji/dekrementacji na rejestrach TCNT1H i TCNT1L Atmega8 - słyszałem że do tego celu najlepiej wykorzystać unie, ale nie do końca wiem jak ich używać. Jeśli stworzę unię składającą się z dwóch zmiennych typu char to jak wykonać na nich dekrementację z wartości np.1023 do 1022?


    
    union pwmVal 
    {
    usigned char wartosc_H;
    unsigned char wartosc_L;
    };
    
    
    pwmVal--;     // ??
  • REKLAMA
  • Pomocny post
    #2 6232235
    OldSkull
    Poziom 28  
    nie zadziała. Na stronie http://www.cplusplus.com/doc/tutorial/other_data_types.html masz bardzo czytelny przykłąd (najlepszy jaki znalazłem):
    Cytat:

    One of the uses a union may have is to unite an elementary type with an array or structures of smaller elements. For example:
    union mix_t {
    long l;
    struct {
    short hi;
    short lo;
    } s;
    char c[4];
    } mix;


    defines three names that allow us to access the same group of 4 bytes: mix.l, mix.s and mix.c and which we can use according to how we want to access these bytes, as if they were a single long-type data, as if they were two short elements or as an array of char elements, respectively. I have mixed types, arrays and structures in the union so that you can see the different ways that we can access the data. For a little-endian system (most PC platforms), this union could be represented as:
    [ATmega8] [C] 11-bitowy PWM - unie
  • #3 6232363
    soulreaver1
    Poziom 21  
    Ok. wiem już że unia może zawierać różne typy zmiennych, jej wielkość jest równa wielkości największej zmiennej, jednorazowo możemy korzystać tylko z jednej zmiennej unii, ale dalej nie znam odpowiedzi na moje pytanie. Mógłbym prosic o kawałek kodu, który to wyjaśni?
  • REKLAMA
  • #4 6232380
    Nol
    Poziom 15  
    Mówiąc jednym zdaniem: do składników unii odwołujemy się następująco:
    
    nazwa_unii.składowa 
    lub 
    wskaźnik_do_unii->składowa
    w Twoim wypadku np. pwmVal.wartosc_L 
    


    Należy pamiętać, żeby nie mylić unii ze strukturą - w danym momencie unia może zawierać daną tylko jednego typu. Od Ciebie zależy jak ją zinterpretujesz.
  • REKLAMA
  • #5 6232433
    soulreaver1
    Poziom 21  
    Czyli powinno być tak ?

    
    union pwmVal
    {
    unsigned short int krok;
    unsigned char wartosc_H;
    unsigned char wartosc_L;
    };
    
    
    pwmVal.krok--;     //
  • REKLAMA
  • #7 6232865
    Freddie Chopin
    Specjalista - Mikrokontrolery
    no i po co komu taka bzdurna unia, ktora zawiera dwie zmienne zawierajace DOKLADNIE to samo (wartosc_H i wartosc_L)?

    moze zamiast 'czytac o tym, ze najlepiej do czegostam zastosowac unie' to zastosowac to co sie zna, bo jakos nie widze zadnych zalet stosowania unii dla PWMa...

    4\/3!!
  • #8 6232961
    Nol
    Poziom 15  
    Freddie Chopin napisał:
    no i po co komu taka bzdurna unia, ktora zawiera dwie zmienne zawierajace DOKLADNIE to samo (wartosc_H i wartosc_L)?


    Właśnie dlatego wyżej napisałem, by nie mylić znaczenia unii i struktury. Moim zdaniem autor wątku myli(ł?) te pojęcia, bo odniosłem wrażenie, jakby chciał mieć dostęp do dwóch różnych zmiennych w ramach czegoś, co omylnie nazwał unią. Po prostu w głowie mi się nie mieści, by ktoś chciał świadomie użyć unii, by przechowywać w niej dane tego samego typu :D
  • Pomocny post
    #9 6233268
    OldSkull
    Poziom 28  
    ehh, przecież podałem przykład właśnie do tego przypadku:
    
    union mix_t { 
    long l; 
    struct { 
    short hi; 
    short lo; 
    } s; 
    char c[4]; 
    } mix;"
    


    a tutaj powinno być:
    
    union pwm{ 
    struct { 
    unsigned char hi; 
    unsigned char lo; 
    } s; 
    unsigned int pomiar; 
    } pwmVal;
    
    [...]
    pwmVal.pomiar --;
    

    wpisywanie wartości hi i lo tak jak było na stronce:
    pwmVal.s.lo = ....
    pwmVal.s.hi = ....

    A jak to nie będzie działac to robić sumę części high pomiaru i część low pomnożonej razy 256.
  • Pomocny post
    #10 6233602
    zumek
    Poziom 39  
    soulreaver1 napisał:
    ...Mam problem z wykonaniem inkrementacji/dekrementacji na rejestrach TCNT1H i TCNT1L Atmega8...

    Masz problem , bo używasz dość skomplikowanego narzędzia(AVR-GCC), a nie byłeś łaskaw zajrzeć do instrukcji obsługi(dokumentacja).
    A teraz fragment z pliku iom8.h: #define TCNT1 _SFR_IO16(0x2C)
  • #11 6237147
    soulreaver1
    Poziom 21  
    Dzięki za pomoc. Mam jeszcze jedno pytanie; na którym wyprowadzeniu OC1A czy OC1B otrzymam PWM podczas pracy w trybie 11-bit pwm? W datesheecie jakoś nie mogę się tego doszukać.
REKLAMA