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

Bascom AVR wyświelanie kodów RC5 na LED 7 segmentowym

trebor_m 29 Sty 2011 17:38 3319 6
  • #1 9074557
    trebor_m
    Poziom 11  
    potrzebuję wyświetlić na na wyświetlaczu LED kolejno cyfry podane przez pilota RC5
    mam program w Bascomie który wyświetla mi zadane przeze mnie zmienne :

    
    $regfile = "m32def.dat"
    
    'Częstotliwość kwarcu domyślnie 16MHz
    $crystal = 16000000
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    
    'Podłaczenie wyświetlacza 7 segmentowego
    ' Digit1 PORTB.0
    ' Digit2 PORTB.1
    ' Digit3 PORTB.2
    ' Digit4 PORTB.3
    
    'Segment A PORTA.1
    'Segment B PORTA.2
    'Segment C PORTA.3
    'Segment D PORTA.4
    'Segment E PORTA.5
    'Segment F PORTA.6
    'Segment G PORTA.7
    
    Config Porta = Output
    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    
    'Pin odbiornika TSOP4836
    Config Rc5 = Pind.2
    
    'the interrupt routine is inserted automatic but we need to make it occur
    'so enable the interrupts
    Enable Interrupts
    
    'reserve space for variables
    Dim Address As Byte , Command As Byte
    
    
    
    Config Timer0 = Timer , Prescale = 256
    
    Declare Sub Pobr_znaku(cyfra As Byte)
    
    On Timer0 Mult_wysw
    
    Dim A As Byte
    Dim B As Byte
    Dim C As Byte
    Dim D As Byte
    Dim Nr_wysw As Byte
    
    W1 Alias Portb.0
    W2 Alias Portb.1
    W3 Alias Portb.2
    W4 Alias Portb.3
    
    
    Enable Timer0
    Load Timer0 , 125
    Enable Interrupts
    
    
    
    Do
    A = 1
    B = 2
    C = 3
    D = 4
    
    Loop
     End
    
    
    
    
    
    Sub Pobr_znaku(cyfra As Byte)
    Porta = Lookup(cyfra , Kody7seg)
    End Sub
    
    
    Mult_wysw:
    
    Load Timer0 , 150
    Set W1
    Set W2
    Set W3
    Set W4
    
    
    Select Case Nr_wysw
    
    Case 0:
    Call Pobr_znaku(a)
    Reset W1
    
    
    Case 1:
    Call Pobr_znaku(b)
    Reset W2
    
    Case 2:
    Call Pobr_znaku(c)
    Reset W3
    
    
    Case 3:
    Call Pobr_znaku(d)
    Reset W4
    
    End Select
    
    Incr Nr_wysw
    If Nr_wysw = 4 Then
    Nr_wysw = 0
    End If
    Return
    
    
    Kody7seg:
    
    Data &B10000001 , &B11110011 , &B01001001 , &B01100001 , &B00110011 ,
    Data &B00100101 , &B00000101 , &B11110001 , &B00000001 , &B00100001
    
    


    wszystko jest OK wyświetla się to co powinno ale jak gdziekolwiek włożę takie linijki:
    
    
    Do
    
      Getrc5(address , Command)
      
         Command = Command And &B01111111
        and  D =7
    
      End If
    Loop
    End
    


    zmienna D nie podmienia się tak jak powinno na 7 a na wszystkich segmentach wyświetla się 8 co jest nie tak - jak zmienić wartości zmiennych A,B,C,D za pomocą pilota RC5? Acha powyższy kod nie jest mojego autorstwa są to wycinki pobrane ze strony firmy AND-tech to ich płytek uruchomieniowych

    Poprawiłem trochę tekst i rzeczywiście linia and D=7 nie ma sensu :(
    Proszę pamiętać o używaniu znaczników code. - arnoldziq
  • #2 9077231
    Wojtek75
    Poziom 24  
    trebor_m napisał:
    wszystko jest OK wyświetla się to co powinno ale jak gdziekolwiek włożę takie linijki:

    Multipleksujesz wyświetlacze przy użyciu timer0 a funkcja GetRc5 również korzysta z tego Timera co powoduje, że może się to ze sobą trochę gryźć. Poczytaj w helpie o Config RC5.
    Tego to wogóle nie rozumiem:

    Jeżeli to miało spowodować przypisanie zmiennej D wartości 7 to poczytaj o operatorach logicznych, bo jak na razie to wygląda na to, że nie wiesz, do czego one służą. Jeżeli chcesz przypisać zmiennej jakąś wartość po odebraniu sygnału z pilota to należy skorzystać z instrukcji warunkowych lub wyboru. Raczej nie sklejaj ze sobą fragmentów kodu, których nie rozumiesz, tylko postaraj się je zrozumieć.
  • #3 9077949
    trebor_m
    Poziom 11  
    Dzięki zmian timera pomogła teraz zmienne B,C i D się normalnie wyświetlają ale jak teraz przejść do tego aby kolejne naciśnięcia klawiszy na pilocie ( chodzi mi o cyfry) zmieniły wartość tych zmiennych ?
    
    
    $regfile = "m32def.dat"
    
    'Częstotliwość kwarcu domyślnie 16MHz
    $crystal = 16000000
    $hwstack = 32
    $swstack = 10
    $framesize = 40
    $lib "mcsbyte.lbx"
    
    'Podłaczenie wyświetlacza 7 segmentowego
    ' Digit1 PORTB.0
    ' Digit2 PORTB.1
    ' Digit3 PORTB.2
    ' Digit4 PORTB.3
    
    'Segment A PORTA.1
    'Segment B PORTA.2
    'Segment C PORTA.3
    'Segment D PORTA.4
    'Segment E PORTA.5
    'Segment F PORTA.6
    'Segment G PORTA.7
    
    Config Porta = Output
    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    
    'Pin odbiornika TSOP4836
    Config Rc5 = Pind.2 ,
    
    'the interrupt routine is inserted automatic but we need to make it occur
    'so enable the interrupts
    Enable Interrupts
    
    'reserve space for variables
    Dim Address As Byte , Command As Byte
    
    
    
    
    Config Timer1 = Timer , Prescale = 256
    
    
    Declare Sub Pobr_znaku(cyfra As Byte)
    Declare Sub Rc(z As Byte)
    
    On Timer1 Mult_wysw
    
    Dim A As Byte
    Dim B As Byte
    Dim C As Byte
    Dim D As Byte
    Dim Z As Byte
    Dim Nr_wysw As Byte
    
    W1 Alias Portb.0
    W2 Alias Portb.1
    W3 Alias Portb.2
    
    
    
    Enable Timer1
    Load Timer1 , 125
    Enable Interrupts
    
    Do
    B = 6
    C = 3
    D = 7
    
    Loop
    End
    
    
    
    Sub Pobr_znaku(cyfra As Byte)
    Porta = Lookup(cyfra , Kody7seg)
    End Sub
    
    Sub Rc(z As Byte)
    Do
    Getrc5(address , Command)
    If Address = 0 Then Command = Command And $b11111110
    
    End
    Loop
    End Sub
    
    Mult_wysw:
    
    Load Timer1 , 150
    Set W1
    Set W2
    Set W3
    
    
    'Call Rc(d)
    
    Select Case Nr_wysw
    
    Case 0:
    Call Pobr_znaku(b)
    Reset W1
    
    
    Case 1:
    Call Pobr_znaku(c)
    Reset W2
    
    Case 2:
    Call Pobr_znaku(d)
    Reset W3
    
    End Select
    
    Incr Nr_wysw
    If Nr_wysw = 3 Then
    Nr_wysw = 0
    End If
    Return
    
    
    Kody7seg:
    
    Data &B10000001 , &B11110011 , &B01001001 , &B01100001 , &B00110011 ,
    Data &B00100101 , &B00000101 , &B11110001 , &B00000001 , &B00100001

    co zmiennych logicznych to doczytałem :) - zapis Command = Command And $b11111110 wyłacza kropkę wyświetlacza - ustawia najmłodszy bit na 0. Tylko co dalej ?
  • #5 9219866
    trebor_m
    Poziom 11  
    Programowo problem jest rozwiązany - nie mam akurat pliku z programem ( wkleję w terminie poźniejszym) zamierzenia były takie - odbieram kody z pilota RC5 i wyświetlam cyfry znaczące ( tzn. nie zapala się np 001 tylko 1) Po wciśnięciu na pilocie kolejnej cyfry ta z pierwszego wyświetlacza przchodzi na drugi a na pierwszym wyświetla się ostatnio wciśnięta. Analogicznie po wciśnięciu pilota kolejny raz. Czwarte naciśnięcie dowolnej cyfry powoduje wyzerowanie wyświetlacza i zmiennych i wygaszenie wyświetlacza. Cyfry można też wygasić określonym klawiszem pilota. Program zachowuje się bardzo ładnie na płytce testowej. Wyświetlacze ze wspólną anodą - do wysterowania wystarczy to co poda mikrokontroler. Teraz przyszedł czas na wykonanie płytki docelowej i zastosowanie dużych wyświetlaczy. Mam wyświetlacze KINGBRIGHT SA40-18SRWA są tam 4 diody na segment czyli napięcie na anodę chcę podać około 10-12V prąd z mikroprocesora jest za mały - dlatego na wyjściu dałem ULN2003 - on odwraca sygnał ale to nie problem zmienić programowo na wyjściu mikrokontrolera ( próbowałem na płytce testowej i działa)
    Poniżej schemat projektowanego urządzenia - prosiłbym o spojrzenie okiem na niego przez fachowców - ja to robiłem na zasadzie analogi i podobieństw :) - głównie chodzi mi o sprawdzenie czy dobrze dobrałem tranzystory kluczujące anody poszczególne cyfr i czy takie podłączenie ULN2003 będzie prawidłowe. Bascom AVR wyświelanie kodów RC5 na LED 7 segmentowym
    Schemat nie jest może przejrzysty ale słyży mi głównie do zaprojektowania płytki drukowanej.
    I jeszcze jedno w nocie katalogowej jest tak:
    Bascom AVR wyświelanie kodów RC5 na LED 7 segmentowym
    skoro są 4 diody to napięcie podawane na segment ma być równe 1.85 do 2.5 V x 4 czyli nie więcej niż 10V . Jednak występuje spadek napięcia na każdej diodzie tak więc jakie napięcie ustawić na pierwszym stablizatorze? Byłbym wdzięczny za uwagi
  • #6 9221639
    trebor_m
    Poziom 11  
    A poniżej obiecany działający kod:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Po poprawkach na atmegę 8. Nie wyświetlają się nie znaczące zera - klawisz standbay (kod RC5 -12 i OK kod RC5-59 powodują wygaszenie wskazań wyświetlacza). Na chwilę obecną układ steruje wyświetlaczami o wysokości 4" [/code]
  • #7 9343896
    trebor_m
    Poziom 11  
    Schemat podany powyżej to wersja wstępna i niepoprawna - nie da się wysterować anod wyświetlaczy które wymagają napięcia zasilania ~11 V pojedynczym tranzystorem na bazę którego możemy podać maksymalnie 5V. Tak więc dołączam poprawny schemat urządzenia - złożone i działa. R5-R7 - 5k1 rezystory R8 i R11 po 1k (dla pozostałych cyfr oczywiście to samo). Zamiast BC817 dałem BC849C, BC807 został tak jak na schemacie.
REKLAMA