Elektroda.pl
Elektroda.pl
X

Search our partners

Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

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

trebor_m 29 Jan 2011 17:38 3214 6
  • #1
    trebor_m
    Level 10  
    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 :

    Code:

    $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:
    Code:


    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
    Code:
    Code:
  • #2
    Wojtek75
    Level 24  
    trebor_m wrote:
    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:
    Code:
    and  D = 7

    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
    trebor_m
    Level 10  
    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 ?
    Code:


    $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 ?
  • #4
    trebor_m
    Level 10  
    Problem rozwiązany - przy pomocy dwóch funkcji
    Code:
    if then
    

    ....
    end if
    oraz
    case aaa
    case 0:
    case n:
    end case



    :)
  • #5
    trebor_m
    Level 10  
    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
    trebor_m
    Level 10  
    A poniżej obiecany działający kod:
    Code: basic4gl
    Log in, to see the code

    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
    trebor_m
    Level 10  
    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.