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

AVR/ATMEGA8 - Sterowanie multipleksowe LED w przerwaniu

GOTHAM 21 Paź 2013 18:31 3096 9
REKLAMA
  • #1 12866627
    GOTHAM
    Poziom 14  
    Witam,


    chciałbym wyświetlacz w przerwaniu cyfry na seg. led.
    Pomysł mam następujący w przerwaniu będzie wyświetlany każdorazowo 1 segment.
    Skoro są 4 segmenty to przerwać na sekundę będzie 200 więc na każdy segment przypadnie 50 razy.

    Wybieranie segmentu w przerwaniu robić za pomocą switch ? nie spowolni to przerwania?

    I jeszcze prośba o korekcję czasu na wyświetlenie którą robię według wzoru:
    (czas jaki chce uzyskać/częstotliwość zegara - 1)

    (1/200)/(1/80000000)-1 = 39999
  • REKLAMA
  • #2 12866674
    tmf
    VIP Zasłużony dla elektroda
    Na segment? Raczej masz na myśli na cyfrę? Dla 50 Hz odświeżania będzie widać wyraźnie migotanie. Trzeba 200-300 razy na sekundę odświeżać.
    Ściągnij przykładowe kody do książek z linku w mojej stopce, tam masz przykład realizacji multipleksowania LED. switch jest niepotrzebny, a całość nie obciąży MCU w istotnym stopniu.
  • REKLAMA
  • #3 12866726
    GOTHAM
    Poziom 14  
    W moim przypadku segment = cyfra. Czy kolega może skopiować linka.Domyślam się , że w przerwaniu jest np prosty licznika.
  • REKLAMA
  • #6 12867014
    GOTHAM
    Poziom 14  
    dondu napisał:
    GOTHAM napisał:
    W moim przypadku segment = cyfra.

    Uporządkuj nazewnictwo - wyświetlacz 7-segmentowy, to nie 7 cyfr :)


    Miałem na myśli to, że na 1 segmencie jest wyświetlana 1 cyfra.
  • REKLAMA
  • #8 12867514
    GOTHAM
    Poziom 14  
    Przykład ściągnięty, ale czy kolega TMF może mi wyjaśnić jak używać tych przerwań? Niestety nie dysponuje książką, a ślepe kopiowanie bez zrozumienia raczej przynosi kiepskie efekty.

    Lista błędów kiedy próbuje skompilować:
    
    ed7przyklad.c:24: error: 'PORTA' undeclared (first use in this function)
    led7przyklad.c:24: error: (Each undeclared identifier is reported only once
    led7przyklad.c:24: error: for each function it appears in.)
    led7przyklad.c: At top level:
    led7przyklad.c:46: warning: 'TIMER0_COMPA_vect' appears to be a misspelled signal handler
    led7przyklad.c:56: warning: function declaration isn't a prototype
    led7przyklad.c: In function 'Timer0Init':
    led7przyklad.c:57: error: 'TCCR0B' undeclared (first use in this function)
    led7przyklad.c: At top level:
    led7przyklad.c:62: warning: function declaration isn't a prototype
    led7przyklad.c: In function 'Timer0InitWithDimmer':
    led7przyklad.c:63: error: 'OCIE0A' undeclared (first use in this function)
    led7przyklad.c:64: error: 'OCR0A' undeclared (first use in this function)
    led7przyklad.c: At top level:
    led7przyklad.c:69: warning: function declaration isn't a prototype
    led7przyklad.c: In function 'main':
    led7przyklad.c:70: error: 'DDRA' undeclared (first use in this function)
    led7przyklad.c:84: error: 'OCR0A' undeclared (first use in this function)
    led7przyklad.c:88: error: expected declaration or statement at end of input
    



    Problem sam rozwiązałem wzorując się nie na książce której nie mam a na jednym przykładzie zamieszczonym na forum. Niestety ujawnia się tutaj największa bolączka elektrody, bardzo mało osób nie zamieszcza kodów źródłowych. Zrozumiałe to jest w wypadku gdy chcą zarabiać i opatentować kod w innym wypadku nie ma sensu, a wiele osób mogły by się czegoś nowego nauczyć i nie marnować czasu na powtórne wynalezienie przysłowiowego "koła".
  • #9 12880186
    darkonel
    Poziom 19  
    Sprawa jest prosta:
    W przerwaniu (X to numer aktywnego wyświetlacza 0...3):
    1. gasisz wyświetlacze
    2. zwiększasz numer X aktywnej cyfry wyświetlacza (jeśli X>3 to X=0)
    3. wyprowadzasz dane na poszczególne segmenty cyfry X
    4. zapalasz wyświetlacz o numerze X
    5. wychodzisz z obsługi przerwania.

    Pozdrawiam
  • #10 12883018
    GOTHAM
    Poziom 14  
    darkonel napisał:
    Sprawa jest prosta:
    W przerwaniu (X to numer aktywnego wyświetlacza 0...3):
    1. gasisz wyświetlacze
    2. zwiększasz numer X aktywnej cyfry wyświetlacza (jeśli X>3 to X=0)
    3. wyprowadzasz dane na poszczególne segmenty cyfry X
    4. zapalasz wyświetlacz o numerze X
    5. wychodzisz z obsługi przerwania.

    Pozdrawiam



    Witam,

    Tak też zrobiłem ale dzięki przykładom z anglojęzycznych stron. Jak skończę robić swój termometr z zegarem to oczywiście podzielę się wynikami swojej pracy z forumowiczami. ( płytki + kod źródłowy )
REKLAMA