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

[ATMEGA 32][C] - Pomiar napięcia zmiennego przez ADC - program

n0rciu 16 Gru 2013 19:32 3381 10
  • #1 13068246
    n0rciu
    Poziom 9  
    Witam. Napisałem program do pomiaru napięcia i pradu zmiennego, sygnaly doprowadzone na nozki ADC6 i ADC7, następnie chcęje spróbkować w przerwaniach z timera w trybie CTC (po64 próbki każdy), zatrzymaćna chwile przerwania, dokonać obliczeń, wyświetlić na lcd i "od nowa". Napisałem program, lecz nic nie oblicza prosiłbym o pomoc.

    Przepraszam z góry za jakość kodu, będę wszystko przebudowywał w funkcjach.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #2 13068363
    Konto nie istnieje
    Poziom 1  
  • #3 13075745
    n0rciu
    Poziom 9  
    To jest akurat dobrze, w rejestrze OCR1A mam wartosc porownywaną tak jest w dokumentacji.

    Uproscilem troszke program, napisalem nowy do pomiaru narazie na jednym kanale, ten sam problem. Wygląda na to jakby przerwanie w ogóle nie było wykonywane. Co ciekawe napisałem sobie z ciekawości program do obsługi identycznie skonfigurowanego przerwania CTC z tego samego licznika który migał diodą led i działa.

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


    W symulatorze licznik dochodzi do zadanej wartosci i zeruje się bez wykonania przerwania...
  • #4 13075956
    BlueDraco
    Specjalista - Mikrokontrolery
    wynik = (srednia*512)/1024;

    To z grubsza to samo to samo, co
    wynik = srednia / 2;

    Tyko w pierwszej postaci łatwiej o błąd w obliczeniach.

    Funkcja pomiar() raczej nie działa, bo przełącza multiplekser i natychmiast odczytuje wynik pomiaru - jakiego pomiaru?

    Nie ma sensu ładować wyników do tablicy, jeśli potrzebujesz tylko ich sumy.
  • #5 13076121
    Konto nie istnieje
    Poziom 1  
  • #6 13077713
    n0rciu
    Poziom 9  
    Z dokumentacji rozumiem ,że.:W rejestrze TIMSK bit OCIE1B odpowiada za zezwolenie na przerwania typu comparematch i porownuje do wartosci TOP ktora znajduje sie w rejestrze OCR1A.


    Ładuje to do tablicy ponieważ używam rozbudowanego programu do napiecia zmiennego.

    Te problemy o których piałem mam juz za sobą.. Natomiast mam pewien problem w kompilacji, kawałek kodu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    w tej chwili program działa dobrze, wynik operacji 4599, ale gdy chcę zwiększyć mnożnik na 97 to:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    wyskakuje warning: ../main.c:111: warning: integer overflow in expression

    a wynik operacji wynosi -15969...

    Szukałem rozwiązań na zagranicznych forach, tyle co znalazłem:
    http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=115785
    Niestety tamte podpowiedzi nie działają.
  • #7 13077779
    2rs232
    Poziom 18  
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Ten artykuł powinien Ci rozjaśnić przyczynę błędnego wyniku.
  • #8 13077818
    n0rciu
    Poziom 9  
    Dziękuję za artykuł. Dodałem w kodzie rzutowanie, a mianowicie:

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


    Niestety wynik tego działania to dalej "-15969"

    Wlasnie zauwazylem, ze liczna -15969 bierze sie stad:

    mam 511*97 = 49567 co w dwojkowym zapisie daje: 1100000110011111

    teraz po zamianie do kodu U2 mamy: 0011111001100001 , co daje dziesiętnie 15969

    tylko dlaczego tak się dzieje ? :)
  • #9 13077906
    piotrva
    VIP Zasłużony dla elektroda
    A jak to wyświetlasz? Czy funkcja wyświetlająca jest przystosowana do pracy ze zmiennymi uint32_t, a nie przypadkiem zwykłymi int?
  • #10 13077961
    n0rciu
    Poziom 9  
    Wyswietlam to w taki sposób:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Korzystam z biblioteki lcd44780, gdzie mam:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #11 13077984
    piotrva
    VIP Zasłużony dla elektroda
    49567%1000000=49567>255
    Tu masz błąd - znowu nie wiesz jakie są zakresy danych zmiennych.
REKLAMA