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

multipleksowanie wyświetlacz ze strony -->

*zaba* 07 Sty 2009 17:50 2536 19
  • #1 5964681
    *zaba*
    Poziom 13  
    Witam mam trochę problemów z multipleksowaniem wyświetlacza a mianowicie znalazłem ten kod na stronie Link

    i stawiłem to do bascoma i tyle błędów mi wykryło że głowa boli

         $crystal = 1000000                                     'definiujemy z jakim taktowaniem będzie pracował
    
    Config Portb = Output                                       'port b  jako wejścia
           Portb = &B11111111                                   'wszędzie stan spoczynkowy-0
    Config Portd = Output                                       'pprt d jako wyjścia
           Portd = &B11111111
    
           Do
    
    
           Wyswietlanie:
      Mux = Not Mux
      If Mux = 1 Then
        Set P1.6
        Wysw10 = Wysw / 10
        Wysw10 = Lookup(wysw10 , Tabela)
        P3 = Wysw10
        Reset P1.7
      Else
        Set P1.7
        Wysw1 = Wysw Mod 10
        Wysw1 = Lookup(wysw1 , Tabela)
        P3 = Wysw1
        Reset P1.6
      End If
    Return
    
    
    
     Tabela:
        Data 65 , 207 , 82 , 70 , 204 , 100 , 96 , 79 , 64 , 68
      'znak:  0     1        2      3       4       5       6     7      8     9
    
    
           Loop
           End



    Co tu jest źle?
  • #2 5964756
    janek1815
    Poziom 38  
    Kod jest za krótki brakuje wywołania timera co 4 ms na tym polega cala idea multipleksowania. Przerwanie musi wywoływać procedurę wyświetlanie.
    Brakuje deklaracji zmiennych.
  • #3 5964964
    mirekk36
    Poziom 42  
    Piszesz w dziale AVR więc domniemuję że (może błędnie), że robisz coś na procku typu ATmega lub ATtiny.

    jeśli tak - to nie dziw się że kompilator wywala ci setki błędów bo to normalne w tym przypadku. Nawet nie raczyłeś sobie zadać trudu żeby sprawdzić na tej stronie gdzie podałeś link, że to jest kod dla innej rodziny procków.

    tymczasem na tej stronce jak BYK jest napisane, że to dla procków:

    Cytat:
    Język BASCOM 8051:


    .... weź lepiej i postaraj się poczytać więcej na temat multipleksowania (tylko nie mów, że nie ma gdzie). Są książki do Bascoma ale też jest w necie wiele choć nie zawsze kompletnych przykładów. Tak więc jeśli będziesz chciał to zrobić w oparciu o zerżnięcie na żywca jakiegoś kodu - to zwykle będziesz miał takie efekty.

    nie ma jak zacząć dalszą część nauki o prockach - robiąc (choć mozolnie) ale własną obsługę tego typu. To da ci więcej niż myślisz
  • #4 5965344
    *zaba*
    Poziom 13  
    Aha czyli ten kod jest do innych procków Ja mam Attiny 2313
    Mam jeszcze jedno pytanko jak w tym kodzie zrobić aby wyświetlacz pokazywał konkretna liczbę próbowałem i mi nie wychodzi
    np. liczbę 12

    segment \ pin
    a \ 1
    b \ 5
    c \ 4
    d \ 3
    e \ 0
    f \ 2
    g \ 6

    $regfile = "attiny2313.dat"                                 'najpierw określamy typ proca
    $crystal = 1000000
    
    
    Declare Sub Wyswietlanie
    
    Dim Cyfra As Integer
    Dim C1 As Byte
    Dim C2 As Byte
    
    
    Config Portd = Output
    Portb = &B11111111
    Config Portb = Output
    
    
    C1 = 1
    C2 = 2
    
    Do
    
    '*************Wyswietlanie****************
    
    
    Cyfra = C1
    Gosub Wyswietlanie
    Set Portb.2
    Waitus 300
    Reset Portb.0
    
    Cyfra = C2
    Gosub Wyswietlanie
    Set Portb.1
    Waitus 300
    Reset Portb.1
    
    
    
    
    Loop
    
    
    
    
    '*************************** Wyświetlanie *********************************
    
    Sub Wyswietlanie:
    Portd = Lookup(cyfra , Segmenty )
    End Sub
    
     Segmenty:
    Data 207 , 148
    
  • #5 5969785
    Konto nie istnieje
    Poziom 1  
  • #6 5970114
    *zaba*
    Poziom 13  
    Ja wiem ze segmenty są połączone z uC czyli u mnie portd a anota przez tranzystor a baza tranzystor u mnie portb.1 i portd.2 i ze to chodzi żeby to tak mrygało że oko tego niezawarzy czyli 4ms
    Ale chodzi mi o cała strukturę programu z racji tego że jestem początkującym no nie umiem jeszcze dużo komend niedawno opanowałem funkcje case Wszystko czerpie z kursów zawartych na necie no i właśnie z tego forum

    Widziałem wiele przykładów tego jak to rozwiązać ale żaden mi nie wychodził niestety np. Link albo Link
    lup to Link w tym ostatnim niebardo wiem co oznacz
    C1=1,C2=2,C3=4


    Za wszelką odpowiedź bardzo dziękuję a najbardziej za jakiś przykład

    Dodano po 28 [minuty]:

    multipleksowanie wyświetlacz ze strony -->

    Zrobiłem to wyświetliłem "12" ale na zasadzie prawie jak mruganie diody
    a tu chodzi o zastosowanie tabeli zmienny itp ale jak ??? ito jest moje pytanie

    $regfile = "attiny2313.dat"
    $crystal = 1000000
    
    Config Portb = Output
    
    Config Portd = Output
       Portd = &B11111111
    Do
    Portb.2 = 1
    Portd.4 = 0
    Portd.5 = 0
    Waitms 4
    Portb.2 = 0
    Portd.4 = 1
    Portd.5 = 1
    
    Portb.1 = 1
    Portd.1 = 0
    Portd.5 = 0
    Portd.6 = 0
    Portd.0 = 0
    Portd.3 = 0
    Waitms 4
    Portb.1 = 0
    Portd.1 = 1
    Portd.5 = 1
    Portd.6 = 1
    Portd.0 = 1
    Portd.3 = 1
    
    Loop
    End
  • #8 5971579
    Konto nie istnieje
    Poziom 1  
  • #9 6000856
    *zaba*
    Poziom 13  
    Zrobiłem to po swojemu
                                         $regfile = "attiny2313.dat"       'najpierw określamy typ proca
    $crystal = 1000000                                          'definiujemy z jakim taktowaniem będzie pracował
    
    Config Portb = Output                                       'port b  jako wejścia
           Portb = &B00000000                                   'wszędzie stan spoczynkowy-0
    Config Portd = Output                                       'pprt d jako wyjścia
           Portd = &B11111111
    
     Declare Sub 0
     Declare Sub 1
     Declare Sub 2
     Declare Sub 3
     Declare Sub 4
     Declare Sub 5
     Declare Sub 6
     Declare Sub 7
     Declare Sub 8
     Declare Sub 9
     Declare Sub 10
     Dim A As Byte
    
     Dim Zaba As Integer
    Zaba = 416
    
    
    
       Do
    
        Gosub 0
    
    
        Gosub 1
    
    
        Gosub 2
    
    
        Gosub 3
    
    
        Gosub 4
    
    
        Gosub 5
    
    
        Gosub 6
    
    
        Gosub 7
    
    
        Gosub 8
    
    
        Gosub 9
    
    
        Gosub 10
    
      Loop
    
    
        Sub 0:
        Portb.1 = 1
        Portb.2 = 0
        Portd = 192
        End Sub 0
    
    
    
    
        Sub 1:
       For A = 1 To Zaba
    
       Portb.2 = 1
       Portd = 192
       Waitms 4
       Reset Portb.2
       Set Portd
       Portb.1 = 1
       Portd = 207
       Waitms 4
       Reset Portb.1
       Set Portd
      Next A
        End Sub 1
    
    
    
    
            Sub 2:
       For A = 1 To Zaba
    
       Portb.2 = 1
       Portd = 192
       Waitms 4
       Reset Portb.2
       Set Portd
       Portb.1 = 1
       Portd = 148
       Waitms 4
       Reset Portb.1
       Set Portd
      Next B
        End Sub 2
    
    
        Sub 3:
       For A = 1 To Zaba
    
       Portb.2 = 1
       Portd = 192
       Waitms 4
       Reset Portb.2
       Set Portd
       Portb.1 = 1
       Portd = 133
       Waitms 4
       Reset Portb.1
       Set Portd
      Next B
        End Sub 3
    
         Sub 4:
       For A = 1 To Zaba
    
       Portb.2 = 1
       Portd = 192
       Waitms 4
       Reset Portb.2
       Set Portd
       Portb.1 = 1
       Portd = 139
       Waitms 4
       Reset Portb.1
       Set Portd
      Next B
        End Sub 4
    
    
         Sub 5:
       For A = 1 To Zaba
    
       Portb.2 = 1
       Portd = 192
       Waitms 4
       Reset Portb.2
       Set Portd
       Portb.1 = 1
       Portd = 161
       Waitms 4
       Reset Portb.1
       Set Portd
      Next B
        End Sub 5
    
         Sub 6:
       For A = 1 To Zaba
    
       Portb.2 = 1
       Portd = 192
       Waitms 4
       Reset Portb.2
       Set Portd
       Portb.1 = 1
       Portd = 160
       Waitms 4
       Reset Portb.1
       Set Portd
      Next B
        End Sub 6
    
           Sub 7:
       For A = 1 To Zaba
    
       Portb.2 = 1
       Portd = 192
       Waitms 4
       Reset Portb.2
       Set Portd
       Portb.1 = 1
       Portd = 205
       Waitms 4
       Reset Portb.1
       Set Portd
      Next B
        End Sub 7
    
           Sub 8:
       For A = 1 To Zaba
    
       Portb.2 = 1
       Portd = 192
       Waitms 4
       Reset Portb.2
       Set Portd
       Portb.1 = 1
       Portd = 128
       Waitms 4
       Reset Portb.1
       Set Portd
      Next B
        End Sub 8
    
           Sub 9:
       For A = 1 To Zaba
    
       Portb.2 = 1
       Portd = 192
       Waitms 4
       Reset Portb.2
       Set Portd
       Portb.1 = 1
       Portd = 129
       Waitms 4
       Reset Portb.1
       Set Portd
      Next B
        End Sub 9
    
            Sub 10:
       For A = 1 To Zaba
    
       Portb.2 = 1
       Portd = 207
       Waitms 4
       Reset Portb.2
       Set Portd
       Portb.1 = 1
       Portd = 192
       Waitms 4
       Reset Portb.1
       Set Portd
      Next B
        End Sub 10
           End
  • #10 6000926
    Utul
    Poziom 13  
    Witam

    Tu masz przykład z Mikroprocesorowej Oślej Łączki.
    Może kapniesz o so chodzi :D
    
    
    Rem * * * * * * * * * * * C008c Licznik Dziesiętny 0...99 * * * * * * * * *
    
    
    Config Portb = 255            'wszystkie końcówki jako wyjścia
            Portb = &B11111111    'na początek wygaś
    Config Portd = &B1111100      'dwa najmłodsze jako wejścia
            Portd = &B1111111     'wyświetlacze wyłączone
    
     'deklarujemy zmienne
     Dim Jednostki As Byte , Dziesiatki As Byte , Ktorywysw As Byte , Pomoc1 As Byte
    
     Dziesiatki = 8               'na początek dla kaprysu w liczniku będzie liczba 87
     Jednostki = 7
     Pomoc1 = 0                   'na wszelki wypadek zerujemy zmienną pomocnoiczą
    
     Do
     Waitms 10                    'czekaj 10ms.
     Toggle Ktorywysw             'w każdym obiegu pętli zaświecamy inny wyświetlacz
     Incr Pomoc1                  'co ok. 10ms.
       If Pomoc1 = 10 Then        'co ok. 100ms.
       Pomoc1 = 0                 'skróć cykl
       Incr Jednostki             'co 100ms. zwiększ stan licznika
       End If
    
      If Jednostki = 10 Then      'jeśli przekroczy 9
      Jednostki = 0               'wyzeruj licznik jednostek
      Incr Dziesiatki             'zwiększ licznik dziesiątek
      If Dziesiatki = 10 Then Dziesiatki = 0       'też skracaj cykl
     End If
    
     'a dopiero tu wyświetlamy wynik
     Portd = &B1111111            'najpierw gasimy wszystkie wyświetlacze
     If Ktorywysw = 0 Then        'wyświetl zawartość licznika jednostek
        Portd.3 = 0               'włącz T3 - wyświetlacz jednostek
        Portb = Lookup(jednostki , Tabela)       'przepisz do portB kody
      Else                        'wyświetl zawartość licznika dziesiątek
        Portd.4 = 0               'włącz T4 - wyświetlacz dziesiątek
        Portb = Lookup(dziesiatki , Tabela)       'przepisz do PortB kody
      End If
      Loop
      End                         'end program
    
    
      Tabela:
      Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
    


    Pozdro
  • #11 6011691
    *zaba*
    Poziom 13  
    zrobiłem to ale wyświetlały się liczby od 0do 9 a później już 11, 22 ,33 ,44
    tak jak by nie było multipleksowania zadnego
    :(
  • #12 6013428
    Utul
    Poziom 13  
    Witam
    Mógłbyś wkleić kod ten co napisałeś, bo zgadywać nie będziemy.

    Pozdro
  • #13 6015943
    *zaba*
    Poziom 13  
    "Utul" to jest ten co ty dałeś tylko pozmieniałem porty bo ja na portb.1 i portb.2 mam wyświetlacze a na portd segmenty i oczywiście liczby w tabeli na odlicza mi od 0 do 9 później wyskakuje 11 zamiast 10 i odlicza tak
    22,33,44,55,66,77,88,99 i od początku od zera
  • #14 6016355
    przemorl
    Poziom 11  
    Ten licznik na pewno działa.
    Bazuje na tym z oślej łączki, nie pamiętam już co w nim poprzerabiałem, ale jest na bank OK.
    Poczytaj przeanalizuj (dla dwóch wyświetlaczy wystarczy 8ms)
    Wyświetlacze są podłączone bezpośrednio do portu B atmegi8.
    '    C008a    Licznik dziesiętny 0...99
    '############################################################'ustawienia początkowe
    $regfile = "m8def.dat"                                      'najpierw określamy typ proca
    $crystal = 1000000                                          'definiujemy z jakim taktowaniem będzie pracował
    Dim Jedn As Byte , Dzies As Byte
    Dim Ktorywys As Bit
    Config Portb = Output                                       'wszystkie końcówki jako wyjścia
       Portb = &B11111111
    Config Portd = &B11111110
       Portd = &B11111111                                       'wyświetlacze wyłączone
    Enable Timer0
    Enable Interrupts
    Config Timer0 = Timer , Prescale = 64                       '1mhz/64/125=1/0.008s
    On Timer0 Wysw
    Do
    If Pind.0 = 0 Then
       Waitms 200
       Incr Jedn
    End If
    If Jedn = 10 Then
       Jedn = 0
       Incr Dzies
       If Dzies = 10 Then
          Dzies = 0
       End If
    End If
    Loop
    End
    Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144
    Wysw:
    Timer0 = 131
          Portd = &B11111111
          Toggle Ktorywys
             If Ktorywys = 0 Then
                Portb = Lookup(jedn , Tabela)
                Portd.4 = 0
             Else
                Portb = Lookup(dzies , Tabela)
                Portd.3 = 0
             End If
    Return
      
  • #15 6017250
    Utul
    Poziom 13  
    Witam

    przemorl napisał:
    Ten licznik na pewno działa.



    No właśnie u mnie też to działało, bo teraz już nie programuje na AVT 3500.
    Czyli *zaba* coś poknociłeś, bez urazy. :D

    Pozdro
  • #16 6017487
    *zaba*
    Poziom 13  
    spoko jeszcze raz to przeanalizuje może coś źle zrobiłem

    Dodano po 2 [godziny] 44 [minuty]:

    Dzięki wielkie działa :D
    a czy da sie to jeszcze zrobić ten program na (setki) trzeci wyświetlacz
  • #17 6020191
    Utul
    Poziom 13  
    Witam

    *zaba* napisał:
    spoko jeszcze raz to przeanalizuje może coś źle

    zrobiłem

    Dodano po 2 [godziny] 44 [minuty]:

    Dzięki wielkie działa :D
    a czy da sie to jeszcze zrobić ten program na (setki) trzeci wyświetlacz


    No na pewno się da. Tylko trochę pomyśl to się tylko trochę różni.
    Algorytm jest ten sam tylko trzeba dodać pare linijek. Miłej pracy.

    Pozdro
  • #18 6029796
    *zaba*
    Poziom 13  
    Zrobiłem na trzy liczby ale niestety ta trzecia liczba mryga timer ustawiłem na prescale 1 ale to i tak za mało nie mam zielonego pojęcia jak to zrobić
    pomóżcie

    oto kod
    
      $regfile = "attiny2313.dat"                               'najpierw określamy typ proca
    $crystal = 1000000                                          'definiujemy z jakim taktowaniem będzie pracował
                                           'definiujemy z jakim taktowaniem będzie pracował
    Dim Jedn As Byte , Dzies As Byte , Setki As Byte
    Dim Ktorywys As Bit
    Dim Ktorywys1 As Bit
    Declare Sub 2
    Config Portb = Output                                       'wszystkie końcówki jako wyjścia
       Portb = &B00000000
    Config Portd = &B11111111
       Portd = &B11111111                                       'wyświetlacze wyłączone
    Enable Timer0
    Enable Interrupts
    Config Timer0 = Timer , Prescale = 64                       '1mhz/64/125=1/0.008s
    On Timer0 Wysw
    Enable Timer1
    Enable Interrupts
    Config Timer1 = Timer , Prescale = 1                        '
     On Timer1 Wysw1
    Do
    If Pinb.1 = 1 Then
       Waitms 200
       Incr Jedn
    End If
    If Jedn = 10 Then
       Jedn = 0
       Incr Dzies
       If Dzies = 10 Then
          Dzies = 0
       Incr Setki
       If Setki = 10 Then
       Setki = 0
       End If
    End If
    End If
    Loop
    End
    Tabela:
    Data 192 , 207 , 148 , 133 , 139 , 161 , 160 , 205 , 128 , 129
     Wysw:
    Timer0 = 131
          Portb = &B00000000
          Toggle Ktorywys
    
             If Ktorywys = 0 Then
                Portd = Lookup(jedn , Tabela)
                Portb.1 = 1
             Else
                Portd = Lookup(dzies , Tabela)
                Portb.2 = 1
             End If
    
    Return
    
    
      Wysw1:
     Timer1 = 131
     Portb = &B00000000
             Toggle Ktorywys1
             If Ktorywys1 = 0 Then
                Portd = Lookup(setki , Tabela)
                Portb.3 = 1
                End If
    
    
        Return

    a tu efekt
    Link
    Załączniki:
  • #19 6029996
    Dr.Vee
    VIP Zasłużony dla elektroda
    Miałeś 2 wyświetlacze na 1 przerwaniu, dodałeś wyświetlacz i nagle potrzeba drugiego przerwania? Jakaś nowa reguła - 2 wyświetlacze na 1 przerwanie? ;)

    Wystarczy przecież zadeklarować Ktorywys jako bajt, a nie bit, i po prostu liczyć 0, 1, 2, 0, 1, 2...

    Pozdrawiam,
    Dr.Vee
  • #20 6032401
    *zaba*
    Poziom 13  
    aha czyli ktorywys jako byte i liczyć a mógłbym się dowiedzieć jak liczyć
    przez funkcje incr albo zrobić nowa tabele
    sorry że takie pytania zadaje ale dopiero się uczę i dzieki

    Dodano po 57 [minuty]:

    Zrobiłem !!:D jeszcze musiałem zmienić pozycje if ktorywys ale pokombinowałem i działa Wielkie dzięki za pomoc
    a program gotowy wygląda tak
      $regfile = "attiny2313.dat"                               'najpierw określamy typ proca
    $crystal = 1000000                                          'definiujemy z jakim taktowaniem będzie pracował
    
    Dim Jedn As Byte , Dzies As Byte , Setki As Byte
    Dim Ktorywys As Byte
    Ktorywys = 0
    
    Config Portb = Output                                       '
       Portb = &B00000000
    Config Portd = &B11111111
       Portd = &B11111111
    Enable Timer0
    Enable Interrupts
    Config Timer0 = Timer , Prescale = 64
    On Timer0 Wysw
    
    Do
    If Pinb.1 = 1 Then
       Waitms 200
       Incr Jedn
    End If
    If Jedn = 10 Then
       Jedn = 0
       Incr Dzies
       If Dzies = 10 Then
          Dzies = 0
       Incr Setki
       If Setki = 10 Then
       Setki = 0
    
       End If
    End If
    End If
    Loop
    End
    Tabela:
    Data 192 , 207 , 148 , 133 , 139 , 161 , 160 , 205 , 128 , 129
     Wysw:
    Timer0 = 131
          Portb = &B00000000
    
          Incr Ktorywys
            If Ktorywys = 3 Then
             Ktorywys = 0
             End If
    
          Select Case Ktorywys
            Case 0:
                Portd = Lookup(jedn , Tabela)
                Portb.1 = 1
             Case 1:
                Portd = Lookup(dzies , Tabela)
                Portb.2 = 1
              Case 2:
                Portd = Lookup(setki , Tabela)
                Portb.3 = 1
    
            End Select
    
    
         Return
    
REKLAMA