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

Attiny2313 BASCOM Matryca led i 74HC595 Problem

kamil007 17 Lis 2010 23:45 4634 7
  • #1 17 Lis 2010 23:45
    kamil007
    Poziom 12  

    Witam!
    Nie mogę pozbyć się problemu żarzenia diodek w matrycy led.
    Przesówam na matrycy jakiś tekst w lewo, na kolumnie poprzedzającą aktywną kloumne, zaczynają się żarzyć te diody które świecą na aktywnej kolumnie.
    Co daje taki bardzo głupi efekt smużenia do przodu:cry:
    Kod programu opieram w większości o kod z książki Pana Marcina Wiązania.
    Zakładma że jest to skutek błednego oprogramowania, gdyż pomijając rejestr 74HC595, podłączjąc kolumny matrycy poprzez ULN2803 do ATTINY taki efekt nie występuje.
    Opisze może schemat:
    Matryca 8x8. Wiersze matrycy mam podłaczone przez oporniki do UDN2981 i do mikrokontrolera, kolumny przez ULN2803, rejestr 74hc595 i do mikrokontrolera.
    oto kod programu:

    Code:


    $regfile = "ATtiny2313.dat"

    $crystal = 8000000

    Config Pind.0 = Output
    Config Pind.1 = Output
    Config Pind.2 = Output
    Config Pind.3 = Output
    Config Pind.4 = Output
    Config Pind.5 = Output
    Config Pind.6 = Output
    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    Config Pinb.5 = Output
    Config Pinb.6 = Output
    Config Pinb.7 = Output
      Declare Sub Tablica_sw
    Declare Sub Pobr_kol_z_tab

    Declare Sub Przepisz I



    Config Timer0 = Timer , Prescale = 256


    Declare Sub Pob_w_zn A


    On Timer0 Mult_wysw_matr


    Dim Znak As String * 1

    Dim Nr_kol As Byte

    Dim Kod_zn As Byte T


    Dim Kol_zn As Byte

    Dim I As Byte
    Dim B As Byte
    Dim J As Byte
    Dim Kol(8) As Byte
     Dim Tekst As String * 40
    Dim D1 As Byte

    Ds Alias Portd.0
    Oe Alias Portd.1
    St_cp Alias Portd.2
    Sh_cp Alias Portd.3
    Mr Alias Portd.4
    Ds = 0
    Oe = 0
    St_cp = 0
    Sh_cp = 0
    Mr = 0
    MR=1



    Enable Interrupts

    Enable Timer0

    Load Timer0 , 47


      Do
     Tekst = "Ble ble ble ble ble "
     D1 = Len(tekst)

     For J = 1 To D1

      Znak = Mid(tekst , J , 1)
      Kod_zn = Asc(znak)

      Tablica_sw
        Next J

     Loop
    End

    Sub Tablica_sw



     For I = 1 To 5

       Call Pobr_kol_z_tab


        Waitms 700

       Call Przepisz

       Next I
       Kol(8) = 255


      Waitms 700
      Call Przepisz

          End Sub

    Sub Pobr_kol_z_tab
    Kod_zn = Asc(znak)

     Select Case I

     Case 1:
      Kol(8) = Lookup(kod_zn , Kol1)





     Case 2:
      Kol(8) = Lookup(kod_zn , Kol2)

     Case 3:
      Kol(8) = Lookup(kod_zn , Kol3)

     Case 4 :
      Kol(8) = Lookup(kod_zn , Kol4)

     Case 5:
      Kol(8) = Lookup(kod_zn , Kol5)



     End Select
    End Sub


    Sub Przepisz



     Kol(1) = Kol(2)

     Kol(2) = Kol(3)

     Kol(3) = Kol(4)

     Kol(4) = Kol(5)
      Kol(5) = Kol(6)
       Kol(6) = Kol(7)
       Kol(7) = Kol(8)

    End Sub

    Sub Pob_w_zn


     Select Case Nr_kol

     Case 0:
      Kol_zn = Kol(nr_kol + 1)

     Case 1:
      Kol_zn = Kol(nr_kol + 1)

     Case 2:
      Kol_zn = Kol(nr_kol + 1)

     Case 3:
      Kol_zn = Kol(nr_kol + 1)

     Case 4:
      Kol_zn = Kol(nr_kol + 1)
      Case 5:
      Kol_zn = Kol(nr_kol + 1)
       Case 6:
      Kol_zn = Kol(nr_kol + 1)
        Case 7:
      Kol_zn = Kol(nr_kol + 1)
     End Select
     Portb = Portb And &B10000000

     Kol_zn = Kol_zn And &B01111111

           Kol_zn = Not Kol_zn
     Portb = Portb Or Kol_zn

    End Sub

    Mult_wysw_matr:

     Load Timer0 , 47



     Call Pob_w_zn


     Select Case Nr_kol

     Case 0:
       Ds = 1
       Gosub Reg_shift

      Case 1:
        Ds = 0
        Gosub Reg_shift
     Case 2:
        Ds = 0
        Gosub Reg_shift
     Case 3:
         Ds = 0
        Gosub Reg_shift
     Case 4:
         Ds = 0
        Gosub Reg_shift
        Case 5:
         Ds = 0
        Gosub Reg_shift
         Case 6:
         Ds = 0
        Gosub Reg_shift
          Case 7:
          Ds = 0
        Gosub Reg_shift

     End Select
     Incr Nr_kol
           '
     If Nr_kol = 8 Then

      Nr_kol = 0

     End If
    Return

    Reg_shift:


          Sh_cp = 1


         Sh_cp = 0

          St_cp = 1
          St_cp = 0

       Return



    Kol1:     
    Dalej są kody kolumn....     

    W przypadku pominięcia rejestru kod w zasadzie jest taki sam, tylko w obsudze przerwania najpierw wygaszam wszystkie kolumny, potem zapalam tą, która ma się świecić. I działa to dobrze.

    Code:

    Mult_wysw_matr:                                             'podprogram przerwania od
                                                                      'przepełnienia Timer0
     Load Timer0 , 94                                           'załadowanie do licznika
                                                                      'wartości początkowej
     Reset C1                                                    'wygaszenie kolumny 1
     Reset C2                                                   'wygaszenie kolumny 2
     Reset C3                                                   'wygaszenie kolumny 3
     Reset C4                                                   'wygaszenie kolumny 4
     Reset C5                                                   'wygaszenie kolumny 5
     Reset C6
     Reset C7
     Reset C8
     
     Call Pob_w_zn                                              'wywołanie procedury
                                                                      'pobierającej kod wyświetlanej
                                                                       'kolumny z tablic
     Select Case Nr_kol                                         'w zależności od wartości Nr_kol
           'wykonaj:
     Case 0:                                                    'gdy Nr_kol = 0
     Set C1                                                     'włączenie kolumny 1
     Case 1:                                                    'gdy Nr_kol = 1
      Set C2                                                    'włączenie kolumny 2
     Case 2:                                                    'gdy Nr_kol = 2
      Set C3                                                    'włączenie kolumny 3
     Case 3:                                                    'gdy Nr_kol = 3
     Set C4                                                     'włączenie kolumny 4
     Case 4:                                                    'gdy Nr_kol = 4
      Set C5                                                    'włączenie kolumny 5
    Case 5:
    Set C6
    Case 6:
    Set C7
    Case 7:
    Set C8

     End Select                                                 'koniec instrukcji wyboru
     Incr Nr_kol                                                'zwiększenie o jeden wartości
           'Nr_kol
     If Nr_kol = 7 Then                                         'jeśli wartość Nr_kol osiągnie
                                                                    7 to
      Nr_kol = 0                                                'zerowanie wartości Nr_kol
     End If
    Return                                                      'powrót z podprogramu przerwania

    Czy jest ktoś w stanie mi pomóc??:cry::cry:

    0 7
  • CControls
  • #2 18 Lis 2010 18:52
    kamil007
    Poziom 12  

    Hm, nikt nie ma żadnego pomysłu :cry:
    Bo ja juz nie mam.

    0
  • #3 11 Gru 2010 21:26
    Neverhood
    Poziom 16  

    Nie znam bascoma, ale sterujesz w programie rejestrem hc595 : dane(bit)-> zegar->wyświetl->dana(bit)->zegar->wyświetl .... u Ciebie ( DS->SH_CP->ST_CP->DS->SH_CP->ST_CP ... ). Czyli podczas ładowania odpowiednich bitów w rejestrze pokazujesz(ST_CP) na wyjściu (led) tymczasowy stan. Czas ładowania docelowej wartości jest krótki ,więc tylko smuży wyświetlacz.
    Spróbuj tak: dana->zegar->dana->zegar-> ..... ->dana->zegar -> (koniec i dopiero)wyświetl

    0
  • CControls
  • #4 12 Gru 2010 10:53
    kamil007
    Poziom 12  

    heh , dzięki za odpowiedź.
    Na razie troszkę zabawkę porzuciłem w kąt.:D

    Cytat:

    Spróbuj tak: dana->zegar->dana->zegar-> ..... ->dana->zegar -> (koniec i dopiero)wyświetl

    Kiedy miał by być ten koniec?:D
    Ja rejestrem ustawiałem tylko kolumny włacz/wyłacz, a dane z tablic bezpośrednio z portu procka.
    Czyli np: PORTx =&01010101 ,zapalam rejetrem odpowiednią kolumnę, itd.
    Póżniej zmieniłem kolejność , czyli zapalałem odpowiednią kolumnę , a potem ładowałem dane na port. Co dało efekt normalanego smużenia, czyli za literkami.
    Teraz matryca leży w kącie, ale próbuję dane właśnie wpychać do rejestru, a prockiem zapalać tylko odpowiednią kolumnę.

    0
  • #5 12 Gru 2010 13:24
    Neverhood
    Poziom 16  

    Ten rejestr przesuwny ma swój bufor do którego wrzuca się dane poprzez DS i SH_CP. Aby nowy, obecny stan w tym buforze pojawił się na zewnątrz trzeba ruszyć ST_CP.

    Ustawia się stan na DS (cyfrowy sygnał). Aby przekazać ten stan do rejestru przesuwnego , daje się zbocze rosnące na linii zegarowej. Wtedy ten bit jest już w rejestrze. Teraz ustawiając nową daną na linii DS i (po ustaleniu na DS) podaniu rosnącego zbocza zegarowe SH_CP, kolejna dana ląduje w rejestrze. Poprzednia jest przesunięta o jedną pozycję..
    Jeśli już załaduje się cały ciąg danych, którym chcemy zapalić te światełka. Prościej docelowy stan (koniec, ładowania potrzebnych danych), który jest nam potrzebny, wtedy dajemy zbocze rosnące na linii ST_CP. Czyli wyświetl. Jeśli ta linia nie jest ruszana to na na wyjściu mamy cały czas dotychczasowy stan pinów, pomimo tego wewnątrz rejestru "są" już inne wartości
    Linia ST_CP(RCK) "mieszana" z DS i CLK będzie nam pokazywać bieżący stan tego rejestru wyjściowego na wyjściu. Czyli na wyjściu będziemy widzieć jak te bity są ładnie przesuwane (smużenie).

    0
  • #6 12 Gru 2010 22:37
    kamil007
    Poziom 12  

    Troszke nie mogę załapać :cry:
    Znaczy teraz już znam zasadę działania tekiego rejestru (albo mi się wydaje :D )
    ale jakoś nie chwytam tego co napisałeś.
    Czyli kiedy mam zrobić wyświetl??
    Zakładając że mam pięć kolumn, zapala się pierwsza (jeżeli jest to pierwsza kolumna Ds=1, jak inna Ds=0) , druga (Ds=0) , .., .. , piąta(Ds=0), i odnowa.
    I tak przepychałem tą jedynkę, a Ty jak proponujesz? :cry:

    0
  • #7 12 Gru 2010 23:35
    Neverhood
    Poziom 16  

    Dokładnie. Dopiero jak "przepchasz tą jedynkę" na właściwą pozycję, wtedy dopiero dajesz wyświetl(ST_CP)
    Popatrz na zdjęcie ze stanami
    https://www.elektroda.pl/rtvforum/topic1693428.html

    Ja bym proponował usunąć co nieco z tej procedury do postaci :

    Code:

    Reg_shift:


          Sh_cp = 1


         Sh_cp = 0

           Return


    I teraz klucz programu-wyświetl
    Code:
     St_cp = 1
    
          St_cp = 0

    Umieścić gdzieś po wykonanym wpisywaniu
    Code:
      Gosub Reg_shift
    

     End Select

    ------------------
        Sh_cp = 1


         Sh_cp = 0
    ----------------
     Incr Nr_kol
           '
     If Nr_kol = 8 Then

    Od razu zaznaczam, iż bascoma nie znam. Tutaj bardziej na czuja rozumiem program. Więc musisz samemu zweryfikować.

    0