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][bascom] multipleksowanie czterech wyświetlaczy

overs 09 Wrz 2011 17:15 3373 14
REKLAMA
  • #1 9910812
    overs
    Poziom 16  
    Posty: 253
    Pomógł: 1
    Ocena: 7
    witam.
    w moim programiku multipleksowanie czterech wyświetlaczy 7-segm. odbywa się inaczej niż zakładałem, i nie mogę ruszyć z miejsca.

    $regfile = "m8def.dat"
    $crystal = 1000000
    '$sim
    
    
    
    
    Config Portd = Output
       Portd = &B11111111
    Config Portc.0 = Output
    Config Portc.1 = Output
    Config Portc.2 = Output
    Config Portc.3 = Output
    On Timer0 Multi
    
    Config Kbd = Portb , Debounce = 40 , Delay = 100
    
    7_segm Alias Portd
    
    W1 Alias Portc.0
    W2 Alias Portc.1
    W3 Alias Portc.2
    W4 Alias Portc.3
    
    
    Set 7_segm
    
    
    Dim A As Byte , B As Byte , C As Byte , D As Byte , Nr_wysw As Byte
    Enable Interrupts
    Enable Timer0
    Load Timer0 , 90
    
    
    Start:
    Do
    A = Getkbd()
    If A < 16 Then
    Gosub Multi
    Waitms 25
    End If
    Loop
    
    Multi:
    
    Load Timer0 , 90
    Reset W1
    Reset W2
    Reset W3
    Reset W4
    
    Select Case Nr_wysw
    
    Case 0:
    7_segm = Lookup(a , Dane)
    Waitms 4
    Set W1
    
    Case 1:
    7_segm = Lookup(a , Dane )
    Waitms 4
    Set W2
    
    Case 2:
    7_segm = Lookup(a , Dane )
    Waitms 4
    Set W3
    
    Case 3:
    7_segm = Lookup(a , Dane )
    Set W4
    Wait 1
    
    
    End Select
    Incr Nr_wysw
    If Nr_wysw = 4 Then Gosub Zerowanie
    Return
    
    Zerowanie:
    Nr_wysw = 0
    
    Reset W1
    Reset W2
    Reset W3
    Reset W4
    
    Return
    
    
    
    
    
    End
    
    Dane:
    Data &B11111001
    Data &B10100100
    Data &B10110000
    Data &B10111111
    
    Data &B10011001
    Data &B10010010
    Data &B10000010
    Data &B10111111
    
    Data &B11111000
    Data &B10000000
    Data &B10010000
    Data &B10111111
    
    Data &B10111111
    Data &B11000000
    Data &B10111111
    Data &B10111111
    
    


    chciałbym aby układ działał na zasadzie wpisywanego pin-u, i porównywał wartość na wyświetlaczach czy jest zgodna z programową wartością.

    obecnie jest tak , że wpisując na drugi wyśw. pierwszy gaśnie , a chciałbym żeby ta liczba była "zatrzaśnieta"

    dziękuje z góry za pomoc.
  • REKLAMA
  • REKLAMA
  • #3 9912210
    overs
    Poziom 16  
    Posty: 253
    Pomógł: 1
    Ocena: 7
    założenie jest takie:
    naciskam klawisz, zostaje on wpisany na wyświetlacz1, potem naciskam nst. klawisz i zostaje ta liczba wpisana na wyświetlacz2,przy czym na wyświetlaczu1 pozostaje ta liczba pierwsza. itp itd

    a obecnie mam tak:
    nacisnę klawisz, liczba zostaje wpisana na wyświetlacz1 , naciskam klawisz drugi , pierwszy wyświetlacz sie gasi a liczba wpisana jest na wyświetlacz2

    fajnie jakby ktoś mnie naprowadził na właściwy trop.

    zakładam że chodzi o cztery zmienne np. A , B , C , D dla każdego wyświetlacza , tylko jak to zrobić i powiązać z multipleksowaniem.
  • REKLAMA
  • #5 9917847
    overs
    Poziom 16  
    Posty: 253
    Pomógł: 1
    Ocena: 7
    #snnaap
    dzięki za zainteresowanie. ogólnie programik który poprawiłeś spełniał założenia ale musiałem poprawić timer0, ustawiłem metodą prób i błędów, bo program działał tylko odświeżanie miał za małe.

    teraz walczę aby zrobić że wbijając odpowiedni PIN , program wystawi mi "1" na odpowiednim porcie do sterowania osobnym urządzeniem.

    wiem że do tego służy funkcja: ( powiedzmy kod 1234)
    if a = 1 and b=2 and c=3 and d=4 then set portc.4 ( dla przykladu portc.4 )

    tylko że nie umie zrobić by spełniło mi warunki wszystkie, a pojedynczy potrafi.
    tego ifa wstawiam jako dodatkowy warunek po wait 1 :

    If Nr_wysw_tmp = 4 Then
              D = Tmp
              Wait 1


    caly program:

    $regfile = "m8def.dat"
    $crystal = 1000000
    '$sim
    
    
    
    
    Config Portd = Output
       Portd = &B11111111
    Config Portc.0 = Output
    Config Portc.1 = Output
    Config Portc.2 = Output
    Config Portc.3 = Output
    Config Portc.4 = Output
    Portc.4 = 0
    
    Config Timer0 = Timer , Prescale = 8
    On Timer0 Multi
    Start Timer0
    
    Config Kbd = Portb , Debounce = 40 , Delay = 100
    
    7_segm Alias Portd
    
    W1 Alias Portc.0
    W2 Alias Portc.1
    W3 Alias Portc.2
    W4 Alias Portc.3
    
    
    Set 7_segm
    
    
    Dim A As Byte , B As Byte , C As Byte , D As Byte , Tmp As Byte , Nr_wysw As Byte , Nr_wysw_tmp As Byte
    Enable Interrupts
    Enable Timer0
    Load Timer0 , 20
    
    A = 15
    B = 15
    C = 15
    D = 15
    Nr_wysw_tmp = 0                                             ' start programu od wyswietlacza 1
    Start:
    Do
    
          Tmp = Getkbd()
          If Tmp < 16 Then
    
              Nr_wysw_tmp = Nr_wysw_tmp + 1
    
              If Nr_wysw_tmp = 1 Then A = Tmp
    
              If Nr_wysw_tmp = 2 Then B = Tmp
    
              If Nr_wysw_tmp = 3 Then C = Tmp
    
              If Nr_wysw_tmp = 4 Then
              D = Tmp
              Wait 1
              A = 15                                            ' wpisanie dla a , b, c, d wartosci 15 co daje " - - - -  "
              B = 15
              C = 15
              D = 15
              Nr_wysw_tmp = 0
              End If
    
              Waitms 50
          End If
    
    Loop
    
    
    
    
    Multi:
    
        Load Timer0 , 20
        Reset W1
        Reset W2
        Reset W3
        Reset W4
    
        Select Case Nr_wysw
    
             Case 0:
             7_segm = Lookup(a , Dane)
             'Waitms 4
             Set W1
    
             Case 1:
             7_segm = Lookup(b , Dane )
             'Waitms 4
             Set W2
    
             Case 2:
             7_segm = Lookup(c , Dane )
             'Waitms 4
             Set W3
    
             Case 3:
             7_segm = Lookup(d , Dane )
             Set W4
             'Wait 1
    
        End Select
    
    
        Incr Nr_wysw
    
        If Nr_wysw = 4 Then Nr_wysw = 0
    
    Return
    
    
    
    Return
    
    
    End
    
    Dane:
    Data &B11111001
    Data &B10100100
    Data &B10110000
    Data &B10111111
    
    Data &B10011001
    Data &B10010010
    Data &B10000010
    Data &B10111111
    
    Data &B11111000
    Data &B10000000
    Data &B10010000
    Data &B10111111
    
    Data &B10111111
    Data &B11000000
    Data &B10111111
    Data &B10111111
  • #6 9918599
    snnaap
    Poziom 25  
    Posty: 677
    Pomógł: 83
    Ocena: 10
    Moim zdaniem najlepszym rozwiązaniem będzie obliczenie z wprowadzonych liczb końcowej liczby czyli koncowa_liczba = D*1000+C*100+B*10+A co dla twojego przykładu dało nam 1234 i teraz sprawdzasz jeden warunek;

    if koncowa_liczba = 1234 then
    set portc.4

    Warunek ten wstaw po wait1

    a następnie wyzeruj zmienną koncowa_liczba i po kłopocie.


    Pamiętaj że końcowa liczba jest duża czyli musi być przynajmniej integer.

    Pozdrawiam
  • REKLAMA
  • #7 9920227
    overs
    Poziom 16  
    Posty: 253
    Pomógł: 1
    Ocena: 7
    dzięki za kolejną podpowiedź.

    ogólnie takiego polecenia nie idzie stworzyć jak :
     koncowa_liczba = D*1000+C*100+B*10+A 
    chyba że chodziło ci o ogólny warunek , żebym sobie uzmysłowił o co chodzi.

    tak więc rozbiłem to jako :
    Cyfra1kodu = A * 1000
    Cyfra2kodu = B * 100
    Cyfra3kodu = C * 10
    Cyfra4kodu = D
    Code = Code + A
    Code = Code + B
    Code = Code + C
    Code = Code + D


    wcześniej definiując cyfrykodu jako integer , choć chyba można by jako word.

    dodałem wcześniej też , linijkę mycode = 1234
    i teraz za pomocą
    If Mycode = Code Then Goto Koniec   

    sprawdzę czy zachodzi warunek , czy dobrze rozumuję ?
  • Pomocny post
    #8 9920315
    snnaap
    Poziom 25  
    Posty: 677
    Pomógł: 83
    Ocena: 10
    Jak już to nie :
    overs napisał:



    Cyfra1kodu = A * 1000
    Cyfra2kodu = B * 100
    Cyfra3kodu = C * 10
    Cyfra4kodu = D
    Code = Code + A
    Code = Code + B
    Code = Code + C
    Code = Code + D



    tylko:

    Cyfra1kodu = A * 1000
    Cyfra2kodu = B * 100
    Cyfra3kodu = C * 10
    Cyfra4kodu = D
    Code = Code + Cyfra1kodu 
    Code = Code + Cyfra2kodu 
    Code = Code + Cyfra3kodu 
    Code = Code + Cyfra4kodu 
  • #9 9921082
    overs
    Poziom 16  
    Posty: 253
    Pomógł: 1
    Ocena: 7
    #snnaap

    mam jeszcze takie pytanie, czy jeszcze muszę coś dopisać do tej regułki co podałeś ? bo jakoś nie chce mi się wykonać ten mój IF

    IF code=mycode then gosub koniec

    wydaje mi się że if powinien być pod wait 1 , a przed nim obliczenie kodu.

    pozdrawiam
  • Pomocny post
    #10 9921360
    snnaap
    Poziom 25  
    Posty: 677
    Pomógł: 83
    Ocena: 10
    Nie wiem czy sam pisałeś program czy może wziąłeś gotowca ale z funkcją getkbd() jest taka sprawa, że:


    "Funkcja GETKBD() zwraca numer naciśniętego klawisza, w klawiaturze matrycowej, podłączonej do portu mikrokontrolera. Gdy nie naciśnięto żadnego z klawiszy funkcja zwraca liczbę 16."

    i

    "Ponieważ funkcja zwraca numer umowny klawisza w matrycy, można dokonać konwersji kodów klawiszy (za pomocą danych w linii DATA w połączeniu z funkcją LOOKUP by były one zgodne z posiadaną klawiaturą"

    czyli to że Ty klikniesz klawisz z numerem "1" nie oznacza, że do zmiennej A, B, C lub D zostanie wpisana liczba 1. Do zmiennej zostanie wpisany numer umowny klawisza.
    Dlatego warunek nie jest spełniany.

    Nie wiem jakim klawiszom odpowiadają jakie liczby. Można do tego dojść patrząc na Dane w linii DATA lecz do tego musisz pokazać schemat jak masz podłączony wyświetlacz do uK (jaki pin do jakiego segmentu).

    Pozdrawiam
  • #11 9922867
    overs
    Poziom 16  
    Posty: 253
    Pomógł: 1
    Ocena: 7
    samemu pisałem program ( z twoją pomocą ) , jest to mój pierwszy :D , kiedyś miałem w szkole dsm-51.

    naciśnięcie klawisza 1 , getkbd zwraca " 0" więc uwzględniłem to sprawdzając czy działa ta funkcja sprawdzania kodu. to dzisiaj powalczę aby mieć 1 na 1 :D
  • Pomocny post
    #12 9922876
    snnaap
    Poziom 25  
    Posty: 677
    Pomógł: 83
    Ocena: 10
    overs napisał:
    samemu pisałem program ( z twoją pomocą ) , jest to mój pierwszy :D , kiedyś miałem w szkole dsm-51.

    naciśnięcie klawisza 1 , getkbd zwraca " 0" więc uwzględniłem to sprawdzając czy działa ta funkcja sprawdzania kodu. to dzisiaj powalczę aby mieć 1 na 1 :D



    Czyli teraz jest 1 to 1, 2 to 2, itp

    Musisz dodać jeszcze jedne dane (dane2) w obrębie Data i używać Lookup.
    Warze jest żebyś poznał jaką liczbę zwraca dany klawisz. Czyli już wiesz, że klawisz 1 daje 0 czyli

    Dane2:
    Data 1
    Data xx 'jeszcze nie wiadomo
    Data xx 'jeszcze nie wiadomo
    ...
  • #13 9924837
    overs
    Poziom 16  
    Posty: 253
    Pomógł: 1
    Ocena: 7
    obecnie jest że klawisz 1 zwraca 0 , 2 zwraca 1 , 3 zwraca 2 , "a" zwraca 3 ,

    [atmega8][bascom] multipleksowanie czterech wyświetlaczy

    schemat wrzuciłem na szybko, a pobieranie danych z tablicy zrobić tak?

    if tmp = 0 then tmp = lookup ( 1 ,dane2 ) ' jesli nacisniesz 1 wtedy do tmp wpisze wartosc 1 z tablicy dane2
    if tmp = 1 then tmp = lookup ( 2 ,dane2 )

    czy

    tmp = lookup ( tmp ,dane2 )

    dane2:
    data 1,2,3,12,4,5,6,13,7,8,9,14,10,0,11,15

    1 to 1
    .
    .
    .
    9 to 9
    0 to 0
    * to 10
    # to 11
    A to 12
    B to 13
    c to 14
    d to 15
  • #15 9929886
    overs
    Poziom 16  
    Posty: 253
    Pomógł: 1
    Ocena: 7
    hej.
    znalazłem błąd dlaczego nie działała mi funkcja sprawdzania kodu:
    miałem

    Code = code + Cyfra1kodu
    Code = Code + Cyfra2kodu
    Code = Code + Cyfra3kodu

    a miało być:

    Code = Cyfra1kodu
    Code = Code + Cyfra2kodu
    Code = Code + Cyfra3kodu

    a błąd wynikał może z tego iż na początku programu miałem zdefiniowane code=0

    #snnaap
    dzięki za pomoc, jak narazie mam to co potrzebowałem.

Podsumowanie tematu

LABEL_AI_GENERATED
W dyskusji poruszono problem multipleksowania czterech wyświetlaczy 7-segmentowych przy użyciu mikrokontrolera ATmega8 i języka Bascom. Użytkownik miał trudności z zachowaniem wartości na wyświetlaczach, gdzie po naciśnięciu klawisza, wartość na pierwszym wyświetlaczu znikała przy wprowadzeniu kolejnej. Uczestnicy zasugerowali modyfikacje kodu, w tym użycie zmiennych do przechowywania wartości dla każdego wyświetlacza oraz poprawne obliczanie końcowej liczby z wprowadzonych cyfr. Wskazano również na konieczność użycia funkcji LOOKUP do konwersji kodów klawiszy oraz poprawne zdefiniowanie zmiennej 'Code' w celu sprawdzenia wprowadzonego PIN-u. Użytkownik ostatecznie zidentyfikował błąd w kodzie, który uniemożliwiał poprawne działanie funkcji sprawdzania kodu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA