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

atmega328p - różnice w zliczaniu impulsów na int0

blackrage 05 Maj 2015 13:26 1125 7
REKLAMA
  • #1 14670100
    blackrage
    Poziom 15  
    Witam

    Do atmegi 328p, do int0 mam podpięty jedną nogą pc814, drugą do masy, czyli ten pc814 zwiera do masy int0.
    LCD podłączony do portu D.

    Wejscie int0 podciagnięte wewnętrznym pullupem.
    W przewaniu próbuję zliczać te impulsy, ale otrzymuję dziwne rzeczy.

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

    jeśli wynik wysyłam do lcd w przerwaniu ( jak wyżej ) - to jest on w miarę poprawny - rowne 100, ale jeśli zrobię to tak:

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

    to wyswietla ok 130 i wynik "pływa"...
    Ktos ma jakiś pomysł dlaczego tak się dzieje ?

    ciekawostki :
    - po podciągnięciu int0 rezystorem 4k7 do plusa wynik oscyluje 100 : 103
    - po przepięciu lcd na inny port coś takiego nie występuje
  • REKLAMA
  • #2 14670302
    dondu
    Moderator na urlopie...
    1. Co generuje zliczane impulsy?

    2. Nie linkuj plików .c biblioteki:

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


    3. Funkcje przerwań powinny działać możliwie szybko, a u Ciebie mamy sporo czekania: http://mikrokontrolery.blogspot.com/2011/04/problemy-c-przerwania.html
    Przenieś wyświetlanie do pętli głównej, tym bardziej, że masz ją pustą - czyli tak jak zrobiłeś w drugim kodzie.

    4. Wyświetlanie w pętli głównej powinieneś realizować dopiero po przerwaniu timera i nie częściej niż ma to sens dla oka ludzkiego.
  • REKLAMA
  • #3 14670386
    blackrage
    Poziom 15  
    1.
    Optotranzystor podłączony przez opornik po stronie wtórnej transformatora sieciowego
    atmega328p - różnice w zliczaniu impulsów na int0

    2. OK, dzięki

    3. Doskonale zdaję sobie sprawę, że w przerwaniu ma być "szybko i krótko" i właśnie dlatego chciałbym aby przerwanie wyglądało tak jak w tym drugim kodzie
    ( paradoksalnie - przy kodzie gdzie jest sporo czekania i wysyłania - zlicza dobrze )

    4. Wyświetlanie w pętli głównej, w tej postaci kodu, jest nieco zbyt częste, ale to chyba nie powinno mieć wpływu na zliczanie int0.
    Nie za bardzo rozumiem fragment :
    "Wyświetlanie w pętli głównej powinieneś realizować dopiero po przerwaniu timera"
  • REKLAMA
  • #4 14670399
    dondu
    Moderator na urlopie...
    4. Jak rozumiem, Timer1 odlicza odcinki czasu, po których chcesz zobaczyć wynik pomiaru więc:

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


    Inny pomysł to zliczanie za pomocą timera - doprowadzenie impulsów do wejścia timera.

    Jeszcze inna sprawa, to stabilność częstotliwości sieci.
  • #5 14670422
    blackrage
    Poziom 15  
    poza tym, że flaga musi być volatile - to rzeczywiście działa, choć przyznam szczerze nie wiem dlaczego

    i jak to ma się do tego , że gdy lcd był podłączony do innego portu - to układ zliczał dobrze
  • REKLAMA
  • #6 14670446
    dondu
    Moderator na urlopie...
    blackrage napisał:
    poza tym, że flaga musi być volatile - to rzeczywiście działa, choć przyznam szczerze nie wiem dlaczego
    volatile - oczywiście.
    Działa, bo teraz jest w miarę dobrze zachowana atomowość dostępu do wyświetlanej zmiennej.

    blackrage napisał:
    i jak to ma się do tego , że gdy lcd był podłączony do innego portu - to układ zliczał dobrze

    Trzeba by przeanalizować całość, ale teraz to już szkoda czasu.
  • #7 14670527
    blackrage
    Poziom 15  
    Wyświetlana zmienna impulse_count_frozen modyfikowana jest w przerwaniu TIMER1_COMPA_vect czyli co sekundę ( raczej niezbyt często ), wyświetlana jest za to bardzo cżęsto i to częste wyświetlanie stwarza jakiś problem, bo dodanie zwykłego _delay_ms(100) w pętli głównej też naprawia sprawę.
    Na porcie D jednocześnie z bardzo dużą częstotliwością są wystawiane dane do lcd i odczytywany jest stan int0 - może to tu jest jakiś problem ...

    linię lcd podpiętą do PD1 przepiąłem do innego portu i wyświetla poprawnie
    ( wyswietlanie non-stop w pętli głownej )
  • #8 14670753
    trol.six
    Poziom 31  
    Możliwe że problemem też jest powolne przełączanie transoptora.
    W takim stanie, zarówno transoptor jak i wejście jest bardzo podatne na wszelkie zakłócenia.
    Czas przejścia pomiędzy stanem np 1 a 0 na wejściu układu cyfrowego powinien być w miare krótki.
    Wtedy istnieje możliwość wystąpienia kilku szybkich przerwań.

    Jeśli chodzi o samo wejście to można po prostu "skwantyzować" ;) sobie czas naliczania. Np poprzez blokade naliczania przez czas przejścia potrzebny do ustalenia stanu.
REKLAMA