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] PLL SAA1057 i dekoder RDS

SQ9MYX 19 Wrz 2010 20:10 5163 1
REKLAMA
  • #1 8528756
    SQ9MYX
    Poziom 23  
    Witam,
    Przymierzam sie do budowy małego sendera UKF i koderem rds i stereo w celach dydaktycznych.
    Znalazłem program do obsługi syntezera na saa1057 na ATMEGA8 i mam małe pytanie.
    Jak zmienić program żeby na wyświetlaczu wyświetlał mi częstotliwość w podanym formacie XX,XX MHZ w tej chwili wyświetla XX,XXX,X MHZ, jak ograniczyć pasmo działania syntezy od 87,50 MHZ do 108,00 MHZ, Jak zrealizować Wyświetlenie na ekranie napisu (LOCKED) po podaniu logicznego 1 np na port d.1 (sygnał mam już wyprowadzony z syntezy), kolejna sprawa jak polaczyc dwa programy w jeden czyli syntezer i dekoder rds, Chciałbym aby na przemian na wyświetlaczy pojawiał sie tekst zdekodowany z RDS oraz ustawiona czestotliwość.
    Załączam listingi obu programów


    synteza
    
    '*******************************************************************************
    '             STEROWNIK SYNTEZY CZESTOTLIWOSCI Z UKLADEM SAA1057
    '*******************************************************************************
    'Autor :  Michał Wojtków
    'Data  :  16.01.2005
    'e-mail:  michallo4@wp.pl
    'www   :  www.michallo.ll.pl
    'GG#   :  714371
    'uwagi :  program ustepniony dla www.easy-soft.prv.pl
    '*******************************************************************************
    '                       KONFIGURACJA PODSTAWOWA
    '*******************************************************************************
    $crystal = 8000000                                          'deklaracja rezonatora
    $regfile = "m8def.dat"                                      'wybór procesora
    Config Lcd = 20 * 4
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portd.4 , Rs = Portd.2 , E = Portd.3
    Cursor Off                                                  'wyłączenie kursora
    Config Debounce = 30                                        'ustawienie zwłoki dla drgań styków klawiatury
    Config Pinc.3 = Output                                      ' SPI
    Config Pinc.4 = Output                                      ' SPI
    Config Pinc.5 = Output                                      ' SPI
    Config Pinb.2 = Output                                      ' wyjscie podswietlania
    
    Config Pind.1 = Input                                       ' wyjscie bistabilne
    Config Pinb.3 = Input                                       ' key 1
    Config Pinb.4 = Input                                       ' key 2
    Config Pinb.5 = Input                                       ' key 3
    Config Pinc.2 = Input                                       ' key 4
    Dim Czestot1 As Word                                        'zmienna danych dla SAA1057
    Dim Czestot2 As Word                                        'zmienna pomicnicza
    Dim A As Byte
    Dim B As Bit                                                ' zmienna pomocnicza
    Dim Key As Byte                                             '
    Dim _eep(4) As Byte                                         ' dane odczytane z eeprom
    Dim Frequency As Word                                       ' zmienna dla czestotliwosci
    Dim Setup As Word                                           ' zmienna dla ustawien
    Dim Mnoznik As Byte                                         ' zmienna dla mnoznika 100 i 125
    Dim Pokazanaf As Long                                       ' zmienna obliczen czestotliwosci
    Dim Pokazanaff As String * 10                               '
    Dim Pokazanafstr As String * 10
    Config Pind.1 = 1 : Portd.1 = 0
    Config Pinb.3 = 0 : Portb.3 = 1
    Config Pinb.4 = 0 : Portb.4 = 1
    Config Pinb.5 = 0 : Portb.5 = 1
    Config Pinc.2 = 0 : Portc.2 = 1
                                                     '
                                             'włączenie poświetlania
    Dat Alias Portc.4                                           'aliasy dla SPI
    Enalbe_ Alias Portc.3                                       '
    Clok Alias Portc.5                                          '
    '*******************************************************************************
    '                             poczatek programu
    '*******************************************************************************
    Gosub Odczyt_ustawien                                       ' sprawdz ostanie nastawy
    Cls
    Locate 1 , 1
    Lcd "test"                                                  'powitanie
    Locate 2 , 7
    Lcd "test"
    Wait 2
    Cls
    Locate 1 , 4
    Lcd "PLL"
    Locate 2 , 3
    Lcd "loading"
    Wait 2
    '*******************************************************************************
    '                               Petla glowna
    '*******************************************************************************
    Do
    Waitms 250
    Petla_glowna:
    B = 0
    Cls
    Locate 1 , 5
    Pokazanaf = Frequency * Mnoznik
    Pokazanaff = Str(pokazanaf)
    Pokazanafstr = Format(pokazanaff , "00.0000")
    Pokazanaff = Format(pokazanafstr , "000.0")
    Lcd Pokazanaff : Lcd "MHz"
    
    
    
    
    
    Gosub Klawisz
    If Key = 1 Then : Gosub Menu : End If
    
    
    
    Loop
    '*******************************************************************************
    '                         Obsluga syntezy SAA1057
    'podprogram do komunikacji z SAA1057, dane (16 bitow) do wyslania
    'musza byc podstawione pod zmienna czestot1 ktora jest zdeklarowana jako
    'zmienna word, zmienna czestot2 jest zmienna pomocnicza,
    'ktorej nie uzywamy bezposrednio czyli nic pod nie podstawiamy,
    'Ot cala filozofia sterowania układem SAA1057
    'dane jakie maja zostac wysłane mozna sobie odczytac w pdf lub w moich
    'podprogramach.
    '*******************************************************************************
    Saa:                                                        'wyslanie wartości f/u do syntezy
    Dat = 0
    Enalbe_ = 0
    Clok = 0
    Waitms 5
    Enalbe_ = 1
    Waitms 5
    Clok = 1
    Waitms 5
    Clok = 0
    Waitms 5
    For A = 0 To 15                                             'szesnaście danych do wysłania
    Rotate Czestot1 , Left , 1
    Czestot2 = Czestot1 And 1
    If Czestot2 = 0 Then
    Dat = 0
    Else
    Dat = 1
    End If
    Waitms 5
    Clok = 1
    Waitms 5
    Clok = 0
    Waitms 5
    Next A
    Enalbe_ = 0
    Waitms 5
    Clok = 1
    Waitms 5
    Clok = 0
    Waitms 5
    Enalbe_ = 1
    Dat = 1
    Clok = 1
    Waitms 100
    Return
    '*******************************************************************************
    '                        OBSLUGA KLAWIATURY
    '*******************************************************************************
    Klawisz:
    Key = 0
    Debounce Pinb.3 , 0 , Przypisanie , Sub
    Debounce Pinb.4 , 0 , Przypisanie , Sub
    Debounce Pinb.5 , 0 , Przypisanie , Sub
    Debounce Pinc.2 , 0 , Przypisanie , Sub
    Return
    
    Przypisanie:
    If Pinb.3 = 0 Then : Key = 1 : End If
    If Pinb.4 = 0 Then : Key = 2 : End If
    If Pinb.5 = 0 Then : Key = 4 : End If
    If Pinc.2 = 0 Then : Key = 3 : End If
    Return
    '*******************************************************************************
    '                                 menu
    '*******************************************************************************
    Menu:
    Reset Podswietlanie
    Cls
    Locate 1 , 1
    Lcd "1-Setup 2-freq"
    Locate 2 , 1
    Lcd "3-format 4-ESC"
    Waitms 500
    Do
    Gosub Klawisz
    If Key = 1 Then : Goto Setup : End If
    If Key = 2 Then : Goto Frequency : End If
    If Key = 3 Then : Goto Formatt : End If
    If Key = 4 Then : Goto Petla_glowna : End If
    
    Loop
    '*******************************************************************************
    '                                setup
    '*******************************************************************************
    Setup:
    Cls
    Locate 1 , 1
    Lcd "1-det 2-Prad"
    Locate 2 , 1
    Lcd "3-Test 4-ESC"
    Waitms 500
    Do
    Gosub Klawisz
    If Key = 1 Then : Goto Detector : End If
    If Key = 2 Then : Goto Prad : End If
    If Key = 3 Then : Goto Test : End If
    If Key = 4 Then : Goto Menu : End If
    
    
    Loop
    
    '*******************************************************************************
    '                                 PRAD
    '*******************************************************************************
    Prad:
    Cls
    Locate 1 , 1
    Lcd "1-0,023 2-0,07"
    Locate 2 , 1
    Lcd "3-0,23 4-ESC "
    Waitms 500
    Do
    Gosub Klawisz
    If Key = 1 Then : Goto Current1 : End If
    If Key = 2 Then : Goto Current3 : End If
    If Key = 3 Then : Goto Current4 : End If
    If Key = 4 Then : Goto Menu : End If
    
    Loop
    '*******************************************************************************
    '                                  TEST
    '*******************************************************************************
    Test:
    Cls
    Locate 1 , 1
    Lcd "1-log.1 2-F.ref"
    Locate 2 , 1
    Lcd "3-cnt. 4-ESC"
    Waitms 500
    Do
    Gosub Klawisz
    If Key = 1 Then : Goto Log1 : End If
    If Key = 2 Then : Goto F_ref : End If
    If Key = 3 Then : Goto Count : End If
    If Key = 4 Then : Goto Menu : End If
    
    
    Loop
    '*******************************************************************************
    '                                  detector
    '*******************************************************************************
    Detector:
    Cls
    Locate 1 , 1
    Lcd "1-AUTO 2-ON"
    Locate 2 , 1
    Lcd "3-OFF 4-ESC"
    Waitms 500
    Do
    Gosub Klawisz
    If Key = 1 Then : Goto Auto : End If
    If Key = 2 Then : Goto _on : End If
    If Key = 3 Then : Goto _off : End If
    If Key = 4 Then : Goto Setup : End If
    
    Loop
    
    '*******************************************************************************
    '                                 Current1:
    '*******************************************************************************
    Current1:
    Setup.9 = 0
    Setup.10 = 0
    Setup.11 = 0
    Setup.12 = 0
    Gosub Ustaw
    Goto Setup
    '*******************************************************************************
    '                                 Current2:
    '*******************************************************************************
    Current2:
    Setup.9 = 1
    Setup.10 = 0
    Setup.11 = 0
    Setup.12 = 0
    Gosub Ustaw
    Goto Setup
    '*******************************************************************************
    '                                 Current3:
    '*******************************************************************************
    Current3:
    Setup.9 = 0
    Setup.10 = 1
    Setup.11 = 0
    Setup.12 = 0
    Gosub Ustaw
    Goto Setup
    '*******************************************************************************
    '                                 Current4:
    '*******************************************************************************
    Current4:
    Setup.9 = 0
    Setup.10 = 1
    Setup.11 = 1
    Setup.12 = 0
    Gosub Ustaw
    Goto Setup
    '*******************************************************************************
    '                                 Current5:
    '*******************************************************************************
    Current5:
    Setup.9 = 0
    Setup.10 = 1
    Setup.11 = 1
    Setup.12 = 1
    Gosub Ustaw
    Goto Setup
    '*******************************************************************************
    '                                  Log1
    '*******************************************************************************
    Log1:
    Setup.0 = 0
    Setup.1 = 0
    Setup.2 = 0
    Setup.3 = 0
    Gosub Ustaw
    Goto Test
    '*******************************************************************************
    '                                  F_ref
    '*******************************************************************************
    F_ref:
    Setup.0 = 0
    Setup.1 = 0
    Setup.2 = 1
    Setup.3 = 0
    Gosub Ustaw
    Goto Test
    '*******************************************************************************
    '                                  count
    '*******************************************************************************
    Count:
    Setup.0 = 1
    Setup.1 = 0
    Setup.2 = 0
    Setup.3 = 0
    Gosub Ustaw
    Goto Test
    '*******************************************************************************
    '                                  synch
    '*******************************************************************************
    Synch:
    Setup.0 = 1
    Setup.1 = 0
    Setup.2 = 1
    Setup.3 = 0
    Gosub Ustaw
    Goto Test
    '*******************************************************************************
    '                                  auto
    '*******************************************************************************
    Auto:
    Setup.5 = 0
    Setup.6 = 0
    Gosub Ustaw
    Goto Detector
    '*******************************************************************************
    '                                   on
    '*******************************************************************************
    _on:
    Setup.5 = 0
    Setup.6 = 1
    Gosub Ustaw
    Goto Detector
    '*******************************************************************************
    '                                  off
    '*******************************************************************************
    _off:
    Setup.5 = 1
    Setup.6 = 1
    Gosub Ustaw
    Goto Detector
    '*******************************************************************************
    '                                frequency
    '                    podprogram zmiany czestotliwosci
    '*******************************************************************************
    Frequency:
    Reset Podswietlanie
    Cls
    Locate 1 , 5
    Pokazanaf = Frequency * Mnoznik
    Pokazanaff = Str(pokazanaf)                                 'Frequency * Mnoznik
    Pokazanafstr = Format(pokazanaff , "00.0000")
    Pokazanaff = Format(pokazanafstr , "000.0")
    Lcd Pokazanaff : Lcd "MHz"
    Locate 2 , 1
    Lcd "1-UP  DOWN-2"
    Waitms 500
    Do
    Gosub Klawisz
    If Key = 1 Then : Gosub Up : End If
    If Key = 2 Then : Gosub Down : End If
    If Key = 3 Then : Gosub Ustaw1 : End If
    If Key = 4 Then : Gosub Ustaw1 : Goto Menu : End If
    
    Loop
    '*******************************************************************************
    '                                  UP
    '      zmiana o jeden krok czestotliwosci w górę
    '*******************************************************************************
    Up:
    Frequency = Frequency + 1
    Pokazanaf = Frequency * Mnoznik
    Pokazanaff = Str(pokazanaf)                                 'Frequency * Mnoznik
    Pokazanafstr = Format(pokazanaff , "00.0000")
    Pokazanaff = Format(pokazanafstr , "000.0")
    
    Locate 1 , 5
    Lcd Pokazanaff : Lcd "MHz"
    Waitms 100
    If Pinb.3 = 0 Then : Goto Up : End If                       'nowa funkcja
    Return
    
    '*******************************************************************************
    '                                  down
    '     zmiania o jeden krok czestotliwosci w dół
    '*******************************************************************************
    Down:
    Frequency = Frequency - 1
    Pokazanaf = Frequency * Mnoznik
    Pokazanaff = Str(pokazanaf)                                 'Frequency * Mnoznik
    Pokazanafstr = Format(pokazanaff , "00.0000")
    Pokazanaff = Format(pokazanafstr , "000.0")
    
    Locate 1 , 5
    Lcd Pokazanaff : Lcd "MHz"
    Waitms 100
    If Pinb.4 = 0 Then : Goto Down : End If                     'nowa funkcja
    Return
    '*******************************************************************************
    '                                  format
    ' pomocnicza funkcja, pomagajaca opanowac sterownik po zaprogramowaniu lub
    '  checi powrotu do ustawien poczatkowych
    '*******************************************************************************
    Formatt:
    Setup = 49541                                               '&B1100000110000101
    Gosub Ustaw
    Frequency = 9820
    Gosub Ustaw1
    Gosub Odczyt_ustawien
    Goto Menu
    '*******************************************************************************
    '                           odczyt ustawien
    'odczytanie z pamieci EEPROM nastaw parametrow i czestotliwosci,
    '                       oraz ustawinie ich w SAA1057
    '*******************************************************************************
    Odczyt_ustawien:
    For A = 1 To 4
    Readeeprom _eep(a) , A
    Waitms 50
    Next A
    Setup = Makeint(_eep(3) , _eep(4))
    Czestot1 = Setup
    Gosub Saa
    Frequency = Makeint(_eep(1) , _eep(2))
    Czestot1 = Frequency
    Gosub Saa
    If Setup.13 = 0 Then : Mnoznik = 100 : End If
    Return
    '*******************************************************************************
    '                                 Ustaw
    ' ustawienie w SAA1057 parametrow petli PLL oraz zapis do pamieci EEPROM
    '*******************************************************************************
    Ustaw:
    Czestot1 = Setup
    Gosub Saa
    _eep(3) = Low(setup)
    _eep(4) = High(setup)
    Writeeeprom _eep(3) , 3
    Writeeeprom _eep(4) , 4
    Return
    
    '*******************************************************************************
    '                                 Ustaw1
    ' ustawienie w SAA1057 częstotliwosci i zapis w pamieci EEPROM
    '*******************************************************************************
    Ustaw1:
    Czestot1 = Frequency
    Gosub Saa
    _eep(1) = Low(frequency)
    _eep(2) = High(frequency)
    Writeeeprom _eep(1) , 1
    Writeeeprom _eep(2) , 2
    Return
    
    '*******************************************************************************
    '                                 The End ?
    '*******************************************************************************


    dekoder RDS
    
    	 ' **************************************
    ' *    Projekt: RDS-Modul              *
    ' *    Date:    28.02.2010             *
    ' *    Autor:   DL4FBZ & DL1ZAX        *
    ' *    Atmega:  8                      *
    ' *    LCD:     2 * 16                 *
    ' *    Version: 1.1                    *
    ' **************************************
    
    $regfile = "m8def.dat"
    $crystal = 4332000
    $baud = 9600
    $hwstack = 32
    $swstack = 10
    $framesize = 20
    
    Config Lcdbus = 4
    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Config Lcd = 16 * 2
    Initlcd
    
    Cls
    Cursor Off
    
    Dim Checksume(26)as Word
    
    Checksume(26) = &B1000000000
    Checksume(25) = &B0100000000
    Checksume(24) = &B0010000000
    Checksume(23) = &B0001000000
    Checksume(22) = &B0000100000
    Checksume(21) = &B0000010000
    Checksume(20) = &B0000001000
    Checksume(19) = &B0000000100
    Checksume(18) = &B0000000010
    Checksume(17) = &B0000000001
    Checksume(16) = &B1011011100
    Checksume(15) = &B0101101110
    Checksume(14) = &B0010110111
    Checksume(13) = &B1010000111
    Checksume(12) = &B1110011111
    Checksume(11) = &B1100010011
    Checksume(10) = &B1101010101
    Checksume(9) = &B1101110110
    Checksume(8) = &B0110111011
    Checksume(7) = &B1000000001
    Checksume(6) = &B1111011100
    Checksume(5) = &B0111101110
    Checksume(4) = &B0011110111
    Checksume(3) = &B1010100111
    Checksume(2) = &B1110001111
    Checksume(1) = &B1100011011
    
    Const Banka = &B1111011000
    Const Bankb = &B1111010100
    Const Bankc = &B1001011100
    Const Bankc1 = &B1111001100
    Const Bankd = &B1001011000
    
    Dim Empfang As Long
    Dim Empfang_neu As Long
    Dim Ergebnis As Word
    Dim Neue_daten As Bit
    Dim I As Byte
    Dim E As Byte
    Dim T As Byte
    
    Dim Txt2a As String * 17
    
    Dim Txt As String * 2
    Dim Txt0a As String * 8
    Dim N0a As Byte
    Dim N0p As Byte
    
    Dim N2a As Byte
    Dim N2b As Byte
    Dim Blk As Byte
    
    Dim M As Byte
    Dim L As Byte
    Dim Rds As Long
    
    Dim Bit_zaehler As Byte
    Dim Synchron As Bit
    Dim Berechnen As Bit
    
    Config Portd.2 = Input                                      ' Interrupt
    Set Portd.2
    Config Portb.1 = Input                                      ' Daten Input
    Set Portb.1
    Rdsdata Alias Pinb.1
    
    Config Portb.0 = Input                                      'Taster 1
    Config Portd.7 = Input                                      'Taster 2
    Set Portb.0
    Set Portd.7
    
    Locate 1 , 5
    Lcd "RDS-Modul"
    Locate 2 , 4
    Lcd "Version 1.1"
    Wait 1
    Cls
    
    On Int0 Int2_isr
    Enable Int0
    Enable Interrupts
    
    Config Int0 = Falling
    
    N2a = 0
    N2b = 0
    
    Do
       If Synchron = 0 Then
         Empfang = Rds
         Bit_zaehler = 0
         Berechnen = 1
       Else
         Empfang = Empfang_neu
         Neue_daten = 0
       End If
       If Berechnen = 1 Then
         For I = 0 To 25
           If Empfang.i = 1 Then
             E = I + 1
             Ergebnis = Ergebnis Xor Checksume(e)
           End If
         Next I
    
         M.0 = Empfang.10
         M.1 = Empfang.11
         M.2 = Empfang.12
         M.3 = Empfang.13
         M.4 = Empfang.14
         M.5 = Empfang.15
         M.6 = Empfang.16
         M.7 = Empfang.17
         L.0 = Empfang.18
         L.1 = Empfang.19
         L.2 = Empfang.20
         L.3 = Empfang.21
         L.4 = Empfang.22
         L.5 = Empfang.23
         L.6 = Empfang.24
         L.7 = Empfang.25
    
         Select Case Ergebnis
           Case Banka                                           ' Sender Kennung
             Locate 1 , 11
             Lcd Hex(l) ; Hex(m)
             Synchron = 1
           Case Bankb
             Synchron = 1
             Blk = &H00
             Blk.3 = L.3
             Blk.4 = L.4
             Blk.5 = L.5
             Blk.6 = L.6
             Blk.7 = L.7
             Select Case Blk
               Case &B00100000                                  'Type 2A
                 N2a = 1
               Case &B00000000                                  'Type 0A
                 N0a = 1
                 Blk = &H00
                 Blk.0 = M.0
                 Blk.1 = M.1
                 Select Case Blk
                   Case &B00000000
                     N0p = 1
                   Case &B00000001
                     N0p = 3
                   Case &B00000010
                     N0p = 5
                   Case &B00000011
                     N0p = 7
                 End Select
    
               Case &B01000000                                  'Type 4A
             End Select
           Case Bankc
             Synchron = 1
             If N2a = 1 Then
               Txt2a = Txt2a + Chr(l) + Chr(m)
               If Len(txt2a) > 16 Then Txt2a = Right(txt2a , 16)
             End If
           Case Bankc1
             Synchron = 1
             N0a = 0
             N2a = 0
             N2b = 0
           Case Bankd
             Synchron = 1
             If N2a = 1 Then
               Txt2a = Txt2a + Chr(l) + Chr(m)
               If Len(txt2a) > 16 Then Txt2a = Right(txt2a , 16)
               Locate 2 , 1
               Lcd Txt2a
               N2a = 0
             End If
             If N0a = 1 Then
               Txt = Chr(l) + Chr(m)
               Mid(txt0a , N0p , 2) = Txt
               Locate 1 , 1
               Lcd Txt0a
               N0a = 0
             End If
             If N2b = 1 Then N2b = 0
           Case Else
             Synchron = 0
             N0a = 0
             N2a = 0
             N2b = 0
         End Select
         Ergebnis = &B0000000000000000
         If Neue_daten = 0 Then Berechnen = 0
       End If
    
       Locate 1 , 16
       If Synchron = 1 Then Lcd "*" Else Lcd "-"
    Loop
    End
    
    Int2_isr:
       Shift Rds , Left
       If Rdsdata = 1 Then Rds.0 = 1 Else Rds.0 = 0
    
       Incr Bit_zaehler
       If Synchron = 1 Then
         If Bit_zaehler = 26 Then
           Empfang_neu = Rds
           Neue_daten = 1
           Berechnen = 1
           Bit_zaehler = 0
         End If
       End If
       If Bit_zaehler = 27 Then Bit_zaehler = 1
    Return
  • REKLAMA
  • #2 8531786
    rpal
    Poziom 27  
    kolega niech się zdecyduje czy pisze o nadajniku UKF z koderem RDS czy o odbiorniku z dekoderem RDS. Tytuł przeczy treści postu, chciałem pomóc ale w w dekodowaniu RDS a nie w kodowaniu.używasz słowa sender a piszesz o wyświetlaniu tekstu z RDS. Może lepiej bardziej po polsku ale ze zrozumieniem treści?
REKLAMA