Elektroda.pl
Elektroda.pl
X
Elektroda.pl
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Multipleksowanie dwóch liczników na ATTINY 2313.

24 Maj 2010 20:04 1368 12
  • Poziom 10  
    Witam.
    Jestem bardzo początkującym "programistą". Na płytce AVT3500 stawiam pierwsze kroki przy programowaniu ATTINY2313. Postanowiłem spróbować zrobić program pracujący w następujący sposób:
    dwa wyświetlacze LED wyświetlają multipleksowo stan dwóch niezależnych liczników dziesiętnych ( 0..9 ) np. L1 i L2. Licznik L1 zlicza przyciśnięcia przycisku S1 , a licznik L2 przyciśnięcia przycisku S2 ( działają na okrągło do góry )
    Nie potrafię niestety zrobić tego na jednym ATTiny 2313 ( na dwóch oddzielnych to nie sztuka ). Bardzo proszę o pomoc , czy jest to w ogóle możliwe ze względu na małą ilość portów we/wy ( 15szt)
  • Poziom 16  
    No kolego najpierw trzeba trochę się rozeznać w temacie bo nawet jak ci powiem to i tak daleko nie za jedziesz.15 portów to nawet za dużo siedmioma portami sterujesz dwa wyświetlacze 7 seg 2 portami multipleksujesz.Zostaje ci jeszcze obsługa przycisków czyli reszta portów w twoim Atinny 2313
  • Poziom 10  
    To że da się zrobić to już dobra wiadomość. Czy mógłbyś kolego Karolu zaproponować jakieś rozwiązanie mojego problemu- chciałbym się uczyć od fachowców , a najlepiej na przykładach.
  • Poziom 10  
    Witam, dziękuję wszystkim za chęć pomocy , ale Koledzy chyba nie do końca zrozumieli mój problem. Chodzi mi o uruchomienie na jednym ATTiny2313 dwóch niezależnych liczników liczących każdy od 0 do 9. Liczniki te mają zliczać impulsu od dwóch przycisków ( do masy ) , każdy na osobny licznik. NIe chodzi mi o licznik liczący do 99 z wyświetlaczmi multipleksowymi.
  • Poziom 32  
    Zrób obsługę przycisków w przerwaniu obsługującym multipleksowanie wyświetlaczy. Powinno się udać.
  • Poziom 10  
    Jak pisałem jestem bardzo początkujący - czy mógłbyś powiedzieć to trochę prostrzym językiem .
  • Poziom 42  
    kkrryyss1 --> już w drugim założonym temacie mówisz, że koledzy cię nie rozumieją bo ci nie chodzi o multipleksowanie tylko o dwa niezależne liczniki na dwóch wyświetlaczach LED.

    To ile razy trzeba koledzie jeszcze powiedzieć, że właśnie na 2 wyświetlaczach multipleksowanych można zrobić 2 niezależne liczniki liczące od 0 do 9 - to nie jest problem

    Dokładnie tak samo możesz na 4 wyświetlaczach zrobić 4 liczniki jak i na 20 wyświetlaczach 20 niezależnych liczników. Powiem więcej, nawet na ATtiny2313 można obsłużyć 20 wyświetlaczy i nie będzie to stanowiło problemu z pinami tylko trzeba by użyć rejestrów przesuwnych - no ale to zostaw sobie na później.

    Teraz zrozum, że podstawa to nauczyć się porządnie robić wyświetlanie multipleksowane, jak to będziesz miał - to deklarujesz dwie zmienne i niezależnie zwiększasz wartość każdej zmiennej od niezależnych przycisków. Następnie zawartość tych zmiennych wyświetlasz na multipleksowanym PODWÓJNYM wyświetlaczu LED - i nie ma to nic wspólnego z jednym licznikiem od 0 do 99.
  • Poziom 32  
    Prostszym językiem to będzie tak. Ponieważ masz 2 wyświetlacze, wyświetlasz cyfrę na pierwszym wyświetlaczu, później go gasisz i wyświetlasz cyfrę na drugim. Żeby nie było widać migania cyfr trzeba to robić 100 razy na sekundę, albo szybciej. Procesor więc musi zatrzymywać się 100 razy w ciągu sekundy i zapalać wyświetlacze na przemian. W tym celu należy użyć jednego licznika który będzie odmierzał te 100Hz i po tym jak odmierzy zgłosi że swoje zrobił, to tzw. przerwanie. Wtedy procesor zabierze się za wyświetlenie cyferki i w tym momencie możesz sobie sprawdzić stan przycisków. Możesz to napisać w assemblerze, C lub basicu, w zależności w czym uczysz się programować. Wszędzie działa to tak samo. Czym więcej wyświetlaczy tym częściej procesor musi przerywać prace żeby wyświetlić cyfry bez migania.
  • Poziom 10  
    Witam po dłuższej przerwie spowodowanej wyjazdem . Wróciłem do mojego problemu i prawie udało mi się napisać program .

    $regfile = "attiny2313.dat"
    $crystal = 4000000

    Config Portb = 255 'wszystkie końcówki jako wyjścia
    Portb = &B11111111 'na początek wygaś
    Config Portd = &B1111100 'dwie najmłodsze jako wejścia
    Portd = &B1111111 'wyłączone wyświetlacze

    Dim Lewy As Byte , Prawy As Byte , Ktory As Byte
    Eedr = 0
    Eear = 0
    Do
    Waitms 1

    Debounce Pind.0 , 0 , Zwieksz1 , Sub 'naciśnięcie S1 --lewy
    Debounce Pind.1 , 0 , Zwieksz2 , Sub ' naciśnięcie S2 --prawy

    Incr Ktory
    If Ktory = 2 Then Ktory = 0
    Portd = &B1111111

    Select Case Ktory

    Case 0:
    Portb = Lookup(prawy , Tabela)
    Portd.3 = 0
    Case 1:
    Portb = Lookup(lewy , Tabela)
    Portd.4 = 0

    End Select

    Prawy = Eedr
    Lewy = Eear

    Loop
    End


    Zwieksz1:
    Incr Eear
    If Eear = 10 Then Eear = 0

    Zwieksz2:
    Incr Eedr
    If Eedr = 10 Then Eedr = 0
    Return


    Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144

    Niestety coś jest nie tak. Po naciśnięciu przycisku S2 prawy wyświetlacz prawidłowo zlicza od 0 do 9 i nie wpływa na stan wyświetlacz lewego. Kiedy naciskam przycisk S1 zwiększa się o1 stan obu wyświetlaczy , a powinien wzrastać od 0 do 9 tylko stan wyświetlacza lewego.
    Nie mogę znaleźć błędu , proszę o pomac.

    Kod proszę umieścić w znaczniku code!
    Robak
  • Poziom 36  
    Witam !
    Po tych liniach:
    Code:

    Zwieksz1:
    Incr Eear
    If Eear = 10 Then Eear = 0

    dopisz:
    Code:

    Return
  • Poziom 10  
    Dziękuję za pomoc sp3ots. Teraz jest wszystkom OK.
  • Poziom 10  
    Mógłbyś mi jeszcze podpowiedzieć jak rozszerzyć program, aby oprócz funkcji wykonywanych jak dotychczas ( dwa niezależne liczniki ) na wyjściu Portd.2 uzyskać impulsator o częstotliwości ok 0,5 Hz.
    Mój obecny program
    Code:
    'Niezależne sterowanie dwoma wyświetlaczami
    
    'przy pomocy dwóch przcisków. Zliczanie w górę.

    $regfile = "attiny2313.dat"
    $crystal = 4000000

    Config Portb = 255       'wszystkie końcówki jako wyjścia
           Portb = &B11111111       'na początek wygaś
    Config Portd = &B1111100 'dwie najmłodsze jako wejścia
           Portd = &B1111111 'wyłączone wyświetlacze

    Dim Lewy As Byte , Prawy As Byte , Ktory As Byte , Licz As Word

    Eedr = 0
    Eear = 0
    Do
    Waitms 1

    Debounce Pind.0 , 0 , Zwieksz1 , Sub       'naciśnięcie S1  --lewy
    Debounce Pind.1 , 0 , Zwieksz2 , Sub       ' naciśnięcie S2 --prawy

    Incr Ktory
    If Ktory = 2 Then Ktory = 0
    Portd = &B1111111


    Select Case Ktory

    Case 0:
    Portb = Lookup(prawy , Tabela)
    Portd.3 = 0

    Case 1:
    Portb = Lookup(lewy , Tabela)
    Portd.4 = 0

    End Select

    Prawy = Eedr
     Lewy = Eear

    Loop
    End

    Zwieksz1:
    Incr Eear
    If Eear = 10 Then Eear = 0
    Return

    Zwieksz2:
    Incr Eedr
    If Eedr = 10 Then Eedr = 0
    Return

    Tabela:
      Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144


    W jaki sposób przedstawić mój kod na białym polu KOD?

    Tym razem, poprawiłem za Ciebie ;)
    Edytuj ten post i popatrz jak to wygląda.
    [zumek]