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

Atmega128 - ustawienie PWM dla Timer3 w C

Albi1983 27 Mar 2015 11:04 1431 25
  • #1 14565383
    Albi1983
    Poziom 10  
    Witam

    Jestem tu pierwszy raz, więc się przedstawię

    Mam na imię Michał jestem z Gdańska dopiero zaczynam właściwie przygodę z programowaniem uC aktualnie mam ATmega128
    Programuje w języku C

    Mam taki problem z ustawieniem PWM dla Timera 3 według Datasheet ze stron 132-136 powinienem ustawić WGM32 oraz WGM30
    COMnA1/COMnB1/COMnC1 oraz CS31 znajduja sie one w rejestrach TCCR3A oraz TCCR3B

    Jednakże te ustawienia dla Timera3 nie ustawiają mi PWMa. Wyczerpały mi się pomysły już

    Dodam jeszcze, że mam programator JTAGICE3

    mirrek36 tylko proszę Ciebie nie zrąb mnie za to F_CPU - wiem że to zła praktyka ;)

    Prosiłbym o pomoc
    Z góry dziękuje za pomoc


    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 14565750
    szelus
    Poziom 34  
    A czym objawia się to "niedziałanie"?
    W programie, który zamieściłeś, inicjalizację timera 3 masz zakomentowaną, jak również nie ustawiasz nigdzie OCR3, więc? Zamieść aktualny program.

    I dwie uwagi ogólne:
    1. Timer 3 jest identyczny z timerem 1, zamierzałeś je skonfigurować tak samo, czy inaczej?
    2. Unikaj ustawiania trybów "bit po bicie". To zła praktyka, pogarsza czytelność programu, jak również może się "odbić czkawką" wprowadzając sprzęt w stan, o którym nie pomyślałeś. Np. włączanie preskalera powinno wyglądać tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #3 14565776
    Albi1983
    Poziom 10  
    Sorki to miało wyglądać w ten sposób:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Generalnie chodzi mi o to że mam podpięte 3 diody na porcie E gdzie chce uruchomić ten Timer i one nie działają tzn przy uruchomieniu programowania się nie świecą te OCRnA/B/C specjalnie dałem na 0 żeby zobaczyć czy poprawnie mi zainicjuje Timer3 ale niestety diody się nie świecą, a wiem że działają bo testowałem wszystkie diody na zapalaniu/gaszeniu bez PWMa
  • #4 14565821
    szelus
    Poziom 34  
    A jak masz te LEDy podłączone? Dla Twoich ustawień dostajesz przebieg o wypełnieniu 1/256 tzn. przez 255 z 256 okresów wyjście jest w stanie niskim.
  • #5 14565847
    Albi1983
    Poziom 10  
    Tak dokładnie co oznacza, że diody powinny się świecić stale tak mi się wydaje, ale mogę się mylić. Jak daje PORTE = 0b00000000; to diody się świecą a jak ustawie tak jak na programie co wysłałem to nawet nie zamrygają przy tych ustawieniach :(

    Generalnie jak ustawie

    PORTE = 0b11111111;


    oraz

    OCR3A/B/C = 255;


    to także nie działa
  • #6 14565860
    szelus
    Poziom 34  
    To wyłącz timer 3, zrób
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    i napisz jaki wynik.
  • #7 14565869
    Albi1983
    Poziom 10  
    Zrobiłem jak mi powiedziałeś

    Efekt jest taki że świecą się 3 diody na Porcie E
  • #8 14565913
    szelus
    Poziom 34  
    No to połaczone masz dobrze. :)
    Upewnij się wobec tego, że masz wybrany właściwy typ mikrokontrolera w projekcie. Są jakieś ostrzeżenia kompilatora? Ewentualnie wrzuć log z kompilacji.
  • #9 14565922
    Albi1983
    Poziom 10  
    Wszystko jest ok. Jedyny warnning jaki mam to ten:

    Warning 1 return type of 'main' is not 'int' [-Wmain]

    ale to jest

    void main(void)


    ta linijka kodu więc nie ma specjalnego znaczenia

    Pytanie czemu ten PWM na tym Timerze mi nie chce chodzić :)
  • #10 14565969
    dondu
    Moderator na urlopie...
    Przede wszystkim nie dawaj nam do sprawdzania całego kodu. Utwórz sobie osobny projekt i tam przetestuj swój program dot. ustawienia tylko i wyłącznie Timer3. Jeżeli nadal nie dasz rady to wtedy pokaż cały program, który tym razem będzie krótki :)
  • #11 14565992
    szelus
    Poziom 34  
    Osobiście nie programowałem 128-ki; ustawienia wydają się ok. Spróbuj inicjalizacji w ten sposób:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #12 14566001
    Albi1983
    Poziom 10  
    Po tych ustawieniach także nie trybi
  • #14 14566068
    Albi1983
    Poziom 10  
    Próbowałem tak jak mówiłeś z tym kodem:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    i... też nie działa :( Nic się nie dzieje
  • #15 14566087
    dondu
    Moderator na urlopie...
    Założyłeś temat: Atmega128 - ustawienie PWM dla Timer3 w C
    ale nie zrobiłeś tego co napisałem:

    dondu napisał:
    Utwórz sobie osobny projekt i tam przetestuj swój program dot. ustawienia tylko i wyłącznie Timer3.


    Problemy należy rozczłonkowywać na czynniki pierwsze i od tego zacznij, bo błądzisz pomiędzy ustawieniami timera i resztą programu. Usuń wszystko co nie tyczy się tego problemu i zrób ten kod krótkim i czytelnym.

    BTW: Skoro wiesz dobrze, że F_CPU należy definiować w opcjach a nie w kodzie to tak rób.
    Wprawdzie nie wpłynie to na ten program, ale podstawowe nawyki są bardzo istotne.
  • #16 14566108
    szelus
    Poziom 34  
    Na początek zainicjalizuj OCR zerami i wywal cały kod z pętli głównej.
    Pokaż kompletny log z kompilacji i uploadu programu do mikrokontrolera.
    Układ masz na płytce stykowej, dedykowanej PCB, czy jak?
  • #17 14566432
    landy13
    Poziom 31  
    A czy nie jest to ATmega103? Przestawiłeś odpowiedni fusebit?
  • #18 14573589
    Albi1983
    Poziom 10  
    Witam po weekendzie

    Zrobiłem jak mi powiedzieliście tzn zakomentowałem zbędne linijki kodu i skompilowałem i nadal nic. Co do pytania o

    Cytat:
    A czy nie jest to ATmega103? Przestawiłeś odpowiedni fusebit?


    To jest to ATmega128 na pewno co do fusebitów nic nie ruszałem zostawiłem tak jak są fabrycznie ustawione

    Mój kod wygląda teraz w ten sposób:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Przesyłam także log z kompilacji:

    
    Build started.
    Project "HW2.cproj" (Compile target(s)):
    Target "Compile" in file "C:\Program Files (x86)\Atmel\Atmel Studio 6.2\Vs\Compiler.targets" from project "C:\Users\user\Documents\Atmel Studio\6.2\HW2\HW2\HW2.cproj" (entry point):
    	Task "RunCompilerTask"
    		Shell Utils Path C:\Program Files (x86)\Atmel\Atmel Studio 6.2\shellUtils
    		C:\Program Files (x86)\Atmel\Atmel Studio 6.2\shellUtils\make.exe "src/main.o" 
    		make: `src/main.o' is up to date.
    	Done executing task "RunCompilerTask".
    Done building target "Compile" in project "HW2.cproj".
    Done building project "HW2.cproj".
    
    Build succeeded.
    


    Bardzo bym prosił o pomoc w tej sprawie
    Pozdrawiam
  • #19 14573636
    dondu
    Moderator na urlopie...
    Albi1983 napisał:
    Zrobiłem jak mi powiedzieliście tzn zakomentowałem zbędne linijki kodu i skompilowałem i nadal nic.

    Nie zrobiłeś tego co sugerowałem, a co zrobię po raz trzeci:

    dondu napisał:
    Utwórz sobie osobny projekt i tam przetestuj swój program dot. ustawienia tylko i wyłącznie Timer3.

    Innymi słowy najpierw sprawdź, czy PWM w ogóle jest generowany.

    Poza tym, dokładnie określaj co stwierdzasz, bo stwierdzenie:

    Albi1983 napisał:
    ... i nadal nic.

    nic nam nie mówi. Nie wiemy nawet, czy weryfikacja programowania przebiegła prawidłowo.

    Po raz kolejny napiszę także:

    dondu napisał:
    BTW: Skoro wiesz dobrze, że F_CPU należy definiować w opcjach a nie w kodzie to tak rób.
    Wprawdzie nie wpłynie to na ten program, ale podstawowe nawyki są bardzo istotne.


    Elektronika, to dziedzina ścisła i jeśli nie będziesz wykonywał dokładnie tego co sugerujemy, to będziesz z tym tematem przez kolejne dni męczył.
  • #20 14573657
    szelus
    Poziom 34  
    Moim zdaniem landy13 trafił w sedno. Zdaje się, że 128-ka fabrycznie przychodzi skonfigurowana w trybie kompatybilności z ATmega103, a ta nie ma timera 3.
    Musisz przestawić fusy.
  • #21 14573688
    Albi1983
    Poziom 10  
    Jeżeli chodzi

    Cytat:
    Poza tym, dokładnie określaj co stwierdzasz, bo stwierdzenie:

    Cytat:
    Albi1983 napisał:
    ... i nadal nic.


    nic nam nie mówi. Nie wiemy nawet, czy weryfikacja programowania przebiegła prawidłowo.


    To programuje się poprawnie bo lampka programatora się zaświeca przy wgrywaniu

    Natomiast jeżeli chodzi

    Cytat:
    Moim zdaniem landy13 trafił w sedno. Zdaje się, że 128-ka fabrycznie przychodzi skonfigurowana w trybie kompatybilności z ATmega103, a ta nie ma timera 3.
    Musisz przestawić fusy.


    To muszę o tym poczytać bo nie chce sobie procka zablokować i obczaić jak to się robi w AtmelStudio
  • #22 14573729
    dondu
    Moderator na urlopie...
    szelus napisał:
    Moim zdaniem landy13 trafił w sedno. Zdaje się, że 128-ka fabrycznie przychodzi skonfigurowana w trybie kompatybilności z ATmega103, a ta nie ma timera 3.
    Musisz przestawić fusy.

    Tak, bit M103C jest zaprogramowany domyślnie, czyli w trybie kompatybilności z ATmega103.

    Problem polega jednak na tym, że autor tematu nieprawidłowo podchodzi do rozwiązania problemu nie rozczłonkowując go na czynniki pierwsze.
    Co więcej wie, że coś robi źle, ale tego nie poprawia - nie tędy droga.

    Tutaj znajdziesz kalkulator fusebitów: http://www.engbedded.com/fusecalc
    a w nim po wybraniu ATmega128 znajdziesz bit M103C szukaj checkbox: ATmega103 Compatibility Mode [M103C=0]
    W ten sposób ustalisz jakie fusebity (extended) należy ustawić.

    To samo możesz ustalić z dokumentacji w tabeli: Table 117. Extended Fuse Byte
  • #23 14575263
    landy13
    Poziom 31  
    Albi1983 napisał:
    To jest to ATmega128 na pewno co do fusebitów nic nie ruszałem zostawiłem tak jak są fabrycznie ustawione
    Tak podejrzewałem. Jeśli nie ruszałeś to nie masz ATmegi128, a tylko ATmegę103. Jak to zmienić już Ci napisano.
  • #24 14576158
    Albi1983
    Poziom 10  
    Witam ponownie

    Mam takie pytanie:

    Jak za pomocą tego: http://www.engbedded.com/fusecalc i środowiska Atmel Studio 6 ustawić ten przeklęty fusebit M103C?

    Chodzi mi w sensie o to czy ten fusebit mam odptaszkować??
    Mam go zaptaszkowany
    Bo jestem nieco zielony w tej kwestii

    Prosiłbym o pomoc
    Pozdrawiam
  • #25 14576199
    tmf
    VIP Zasłużony dla elektroda
    A masz programator kompatybilny z Atmel Studio? Jeśli tak, to w zakładce programowanie masz fusebity, w tym m103 - odznaczasz go i tyle. Jeśli masz programator, który bezpośrednio nie współpracuje z AS, to robisz to samo, notujesz pokazane wartości fusebitów i zmieniasz je przy pomocy AVR Dude.
  • #26 14576210
    Albi1983
    Poziom 10  
    Ok

    dzięki Wam bardzo odznaczenie M103C rozwiązało mój problem wszystko śmiga fantastycznie

    Jeszcze raz dziękuje :)
REKLAMA