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 - Ustawienie przerwania INT0 i problem z PWM dla RGB

qubak 15 Sie 2012 13:41 1884 5
REKLAMA
  • #1 11211278
    qubak
    Poziom 9  
    Proszę używać tagu [syntax=C]do wklejania kodu...[/syntax].
    Poniższy wpis proszę poprawić.
    LordBlick

    Mam 2 pytania odnośnie mojego sterownika RGB z wykorzystaniem PWM - ATmega8 - program w c:

    - jak ustawić przerwanie INT0 (PD2), ponieważ ten przycisk przełącza program pracy i trwa to za szybko, nie mogę przeskoczyć o 1 wartość. tylko przy wciśnięciu przycisku przeskakuje mi o kilka wartości np z programu 0 do programu 4?

    //przerwania PD2 - INT0
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


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




    - przy wartości 0 dla wyjść OCR1A, OCR1B i OCR2 diody mimo wszystko świecą (bardzo słabo ale jednak) F=1MHZ, bez preskalera, fast PWM 8 bit


    ustawienia timerów 1 i 2:

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


    Będę wdzięczny za pomoc.

    Dodano po 20 [minuty]:

    zapomniałem dodać, ze jak jest wartość 0 to napięcie jakie się pojawia na wyjściu wynosi ~5V, ale nie jest to spowodowane PWM, bo wypełnienie na pewno nie wynosi ok 40%...

    wydaje mi się, że na wyjściu nie ma zerowego prądu i MOSFET otwiera przeływ prądu do masy...

    byłbym również wdzięczny za udzielenie informacji, czy przyciskiem PD2 można włączać i wyłączać układ np poprzez dłuższe przytrzymanie przycisku, a przy krótkim wciśnięciu przełączać między programami??
  • REKLAMA
  • #2 11211651
    dondu
    Moderator na urlopie...
    Co to ma być? Ogarnij to porządnie, wklej schemat + cały program i dopiero będzie podstawa do analizy.
    Używaj znaczników SYNTAX do wklejania kodu.

    qubak napisał:
    - jak ustawić przerwanie INT0 (PD2), ponieważ ten przycisk przełącza program pracy i trwa to za szybko, nie mogę przeskoczyć o 1 wartość. tylko przy wciśnięciu przycisku przeskakuje mi o kilka wartości np z programu 0 do programu 4?

    Zapewne nie uwzględniasz zjawiska drgań styków: http://mikrokontrolery.blogspot.com/2011/04/przycisk-drgania-stykow-debouncing.html
  • REKLAMA
  • #3 11212139
    qubak
    Poziom 9  
    Uczę się, przepraszam za wcześniejszą formę...

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #4 11212214
    stanleysts
    Poziom 27  
    Teraz da się odczytać.
    Tak jak kolega mówił drgania styków są tu problemem. Wiele razy zmienia ci się stan na pinie PD2 i dlatego ten licznik program pokazuje różne wartości.

    Poza tym po co long int program? Wystarczy int a nawet teraz to unsigned char. Szkoda miejsca.
  • REKLAMA
  • #5 11212904
    qubak
    Poziom 9  
    OK, zrobiłem to w taki sposób:

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

    Działa, więc póki co jest OK...

    Dalej nie wiem jak rozwiązać problem, żeby na wyjściu PWM np OCR1A przy wartości 0 było rzeczywiście 0 i żeby nie świeciła dioda.
  • #6 11213291
    dondu
    Moderator na urlopie...
    Znowu zapomniałeś o SYNTAX - uważaj bo temat poleci do kosza za recydywę :D

    A propos _delay() w przerwaniu zapoznaj się z tym: http://mikrokontrolery.blogspot.com/2011/04/problemy-c-przerwania.html

    qubak napisał:
    Dalej nie wiem jak rozwiązać problem, żeby na wyjściu PWM np OCR1A przy wartości 0 było rzeczywiście 0 i żeby nie świeciła dioda.

    Jeżeli chcesz by było zero to wyłącz PWM i ustaw na pinie 0.
    Albo dokładniej wytłumacz co masz na myśli. Bo jeżeli masz PWM włączone a częstotliwość jest większa niż powiedzmy 30Hz, to nie zobaczysz ludzkim okiem nieświecącej diody pomimo, że ona faktycznie gaśnie.
REKLAMA