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

Bascom, program do obsługi SAA1057, jak wstawić przecinek?

mkpl 15 Lis 2007 19:49 2712 11
REKLAMA
  • #1 4485033
    mkpl
    Poziom 37  
    Posty: 5678
    Pomógł: 306
    Ocena: 863
    Witam
    Napisalem ostatnio program do obsługi SAA1057 ;)
    Wszystko chodzi ok ale nie mam pojecia jak do wyświetlanej wartości wstawic przecinek. Wyświelta mi 10700 a chciałbym to zmienić na 107,00 MHz oraz w drugiej lini po podaniu stanu wysokiego na portb.0 aby w 2 linijce wyświetlacza pojawił się napis LOCK ;)

               $regfile = "M8def.dat"
    $crystal = 1000000
    Dim X As Byte
    Dim Wpis As Word
    
    Config Portd.13 = 1
    Config Portd.12 = 1
    Config Portd.11 = 1
    Config Pinb.2 = 0 : Portb.2 = 1
    Config Pinb.1 = 0 : Portb.1 = 1
    
    Dat Alias Portd.13
    Ena Alias Portd.12
    Clk Alias Portd.11
    Config Lcd = 24 * 2
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.5 , Db7 = Portd.6 , E = Portd.0 , Rs = Portd.1
    Cursor On
    
    Cls : Lcd Wpis : Wait 1
    Gosub Saa
    Wpis = 10700                                                'To jest początkowa watrość częstotliwości 107,00MHz
    Cls : Lcd Wpis
    Gosub Saa
    
    Do
    
    Debounce Pinb.2 , 0 , Zwieksz , Sub
    Debounce Pinb.1 , 0 , Zmniejsz , Sub
    Loop
    
    End
    
    Zwieksz:
    Wpis = Wpis + 10
    Cls : Lcd Wpis
    Gosub Saa
    Return
    
    Zmniejsz:
    Wpis = Wpis - 10
    Cls : Lcd Wpis
    Gosub Saa
    Return
    
    Saa:
    Dat = 0
    Ena = 0
    Clk = 0
    Waitms 5
    Ena = 1
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    For X = 15 To 0 Step -1
    
       Dat = Wpis.x                                             'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    
       Waitms 5
       Clk = 1
       Waitms 5
       Clk = 0
       Waitms 5
    Next X
    
    Ena = 0
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    Ena = 1
    Waitms 5
    Dat = 1
    Clk = 1
    Waitms 100
    
    Return
  • REKLAMA
  • #2 4485125
    Prodig
    Poziom 20  
    Posty: 487
    Pomógł: 4
    Ocena: 14
    Co do przecinka jest kilka sposobów w zależności od potrzeb, najprościej chyba tak:
    
    $regfile = "M8def.dat"
    $crystal = 1000000
    Dim X As Byte
    Dim Wpis As Word
    Dim Wpis2 As String * 5
    Dim Przed As String * 2
    Dim Po As String * 3
    
    Config Portd.13 = 1
    Config Portd.12 = 1
    Config Portd.11 = 1
    Config Pinb.2 = 0 : Portb.2 = 1
    Config Pinb.1 = 0 : Portb.1 = 1
    
    Dat Alias Portd.13
    Ena Alias Portd.12
    Clk Alias Portd.11
    Config Lcd = 24 * 2
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.5 , Db7 = Portd.6 , E = Portd.0 , Rs = Portd.1
    Cursor On
    
    Cls : Lcd Wpis : Wait 1
    Gosub Saa
    Wpis = 10700                                                'To jest początkowa watrość częstotliwości 107,00MHz
    Wpis2 = Str(wpis)
    Przed = Left(wpis2 , 3)
    Po = Right(wpis2 , 2)
    
    Cls : Lcd Przed ; "," ; Po ; " MHz"
    Gosub Saa
    
    Do
    
    Debounce Pinb.2 , 0 , Zwieksz , Sub
    Debounce Pinb.1 , 0 , Zmniejsz , Sub
    Loop
    
    End
    
    Zwieksz:
    Wpis = Wpis + 10
    Wpis2 = Str(wpis)
    Przed = Left(wpis2 , 3)
    Po = Right(wpis2 , 2)
    
    Cls : Lcd Przed ; "," ; Po ; " MHz"
    Gosub Saa
    Return
    
    Zmniejsz:
    Wpis = Wpis - 10
    Wpis2 = Str(wpis)
    Przed = Left(wpis2 , 3)
    Po = Right(wpis2 , 2)
    
    Cls : Lcd Przed ; "," ; Po ; " MHz"
    Gosub Saa
    Return
    
    Saa:
    Dat = 0
    Ena = 0
    Clk = 0
    Waitms 5
    Ena = 1
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    For X = 15 To 0 Step -1
    
       Dat = Wpis.x                                             'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    
       Waitms 5
       Clk = 1
       Waitms 5
       Clk = 0
       Waitms 5
    Next X
    
    Ena = 0
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    Ena = 1
    Waitms 5
    Dat = 1
    Clk = 1
    Waitms 100
    
    Return
    


    Ten kod będzie dobry przy liczbach z zakresu od 100,00 do 999,99. Jeżeli zakres ma być inny, daj znać, rozbuduje się program albo inny algorytm zastosuje ;)
  • #3 4485297
    mkpl
    Poziom 37  
    Posty: 5678
    Pomógł: 306
    Ocena: 863
    Program ma pracowac na wartościach od 87,50 do 108,5 :) a masz moze jakis pomys na wyświetlanie stanu synchronicacji? Generalnie chodzi o to ze scalak którym steruje ten program jak sie zsynchronizuje z reszta ukladu wystawia na jednym z wyjść stan logiczny 1 a ja chcialbym zeby atmega go wykryla i wyświetliła w 2 lini lcd PLL Lock :)
  • REKLAMA
  • #4 4485652
    Prodig
    Poziom 20  
    Posty: 487
    Pomógł: 4
    Ocena: 14
    Można wykorzystać przerwanie zewnętrzne. Jutro przerobię program dla zakresu 87,50-108,5 oraz dorobię obsługę przerwania. Teraz jestem już trochę śpiący ;)
  • REKLAMA
  • #5 4486136
    mkpl
    Poziom 37  
    Posty: 5678
    Pomógł: 306
    Ocena: 863
    Ok :) wogóle to dzieki za pomoc :) mało jest takich jak ty:D Ale cos jest nie tak skopiowałem twój kod i bacom wywala mi błędy. Niewiem co jest grane :| ale mam nadzieje ze sie przyda
    Załączniki:
    • Bascom, program do obsługi SAA1057, jak wstawić przecinek? Error.JPG (13.31 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #7 4486295
    mkpl
    Poziom 37  
    Posty: 5678
    Pomógł: 306
    Ocena: 863
    Dosyc stara 1.11.8.3
  • #8 4486740
    Prodig
    Poziom 20  
    Posty: 487
    Pomógł: 4
    Ocena: 14
    To jest wersja najnowsza chyba :)
    Możesz udostępnić swój plik z źródłem programu? Ten z rozszerzeniem .bas
    U mnie kompiluje się bez problemu a mam tą samą wersję BascomAVR.
  • #9 4487641
    mkpl
    Poziom 37  
    Posty: 5678
    Pomógł: 306
    Ocena: 863
    Ok prgram jest tu
    Załączniki:
    • Soft.rar (607 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • #10 4487705
    M. S.
    Poziom 34  
    Posty: 2107
    Pomógł: 259
    Ocena: 680
    A może taki knif :D

    Wartość o nazwie Czestotliwosc = 10700 (kHz) wyświetli jako 10.700 MHz

    Locate 1 , 3
    Lcd " " ; Czestotliwosc ; "       "
    Czestotliwosc = Czestotliwosc \ 1000
    Locate 1 , 2
    Lcd " " ; Czestotliwosc ; "."
    Locate 1 , 11 : Lcd " MHz   "


    I jak to działa?
  • Pomocny post
    #11 4488330
    Prodig
    Poziom 20  
    Posty: 487
    Pomógł: 4
    Ocena: 14
    Sprawdź ten kod. Powinno być wszystko OK. Początkowo chciałem tego "PLL Lock" zrobić na przerwaniu ale widzę, że podłączyłeś tam LCD.
    
    $regfile = "M8def.dat"
    $crystal = 1000000
    Dim X As Byte
    Dim Wpis As Word
    
    Dim Wpis2 As String * 5
    Dim Przed As String * 3
    Dim Po As String * 3
    Dim Dlugosc As Byte
    
    Config Portd.13 = 1
    Config Portd.12 = 1
    Config Portd.11 = 1
    Config Pinb.2 = 0 : Portb.2 = 1
    Config Pinb.1 = 0 : Portb.1 = 1
    
    Dat Alias Portd.13
    Ena Alias Portd.12
    Clk Alias Portd.11
    Config Lcd = 24 * 2
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.5 , Db7 = Portd.6 , E = Portd.0 , Rs = Portd.1
    Cursor On
    
    Cls : Lcd Wpis : Wait 1
    Gosub Saa
    Wpis = 10700                                                'To jest początkowa watrość częstotliwości 107,00MHz
    Gosub Przecinek
    
    Cls : Lcd Przed ; "," ; Po ; " MHz"
    Gosub Saa
    
    Do
    
    Debounce Pinb.2 , 0 , Zwieksz , Sub
    Debounce Pinb.1 , 0 , Zmniejsz , Sub
    
    If Pinb.0 = 1 Then
                   Locate 2 , 1
                   Lcd "PLL Lock"
                  Else
                   Locate 2 , 1
                   Lcd "        "
                  End If
    
    Loop
    
    End
    
    Zwieksz:
    Wpis = Wpis + 10
    Gosub Przecinek
    
    Cls : Lcd Przed ; "," ; Po ; " MHz"
    Gosub Saa
    Return
    
    Zmniejsz:
    Wpis = Wpis - 10
    Gosub Przecinek
    
    Cls : Lcd Przed ; "," ; Po ; " MHz"
    Gosub Saa
    Return
    
    Saa:
    Dat = 0
    Ena = 0
    Clk = 0
    Waitms 5
    Ena = 1
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    For X = 15 To 0 Step -1
    
       Dat = Wpis.x                                             'Tu wartość Wpis wysyłamy do syntezy bit po bicie.
    
       Waitms 5
       Clk = 1
       Waitms 5
       Clk = 0
       Waitms 5
    Next X
    
    Ena = 0
    Waitms 5
    Clk = 1
    Waitms 5
    Clk = 0
    Waitms 5
    Ena = 1
    Waitms 5
    Dat = 1
    Clk = 1
    Waitms 100
    
    Return
    
    Przecinek:
    Wpis2 = Str(wpis)
    Dlugosc = Len(wpis2)
    If Dlugosc = 5 Then
                      Przed = Left(wpis2 , 3)
                      Po = Right(wpis2 , 2)
                   End If
    If Dlugosc = 4 Then
                      Przed = Left(wpis2 , 2)
                      Po = Right(wpis2 , 2)
                   End If
    Return
    
    End
    
  • #12 4489338
    mkpl
    Poziom 37  
    Posty: 5678
    Pomógł: 306
    Ocena: 863
    Dzieki :) Sofcik śmiga aż miło :)

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy programowania w BascomAVR do obsługi układu SAA1057, ze szczególnym uwzględnieniem formatowania wyświetlanej częstotliwości na LCD z przecinkiem dziesiętnym (np. 107,00 MHz zamiast 10700) oraz wyświetlania komunikatu "LOCK" na drugiej linii po wykryciu stanu wysokiego na porcie B.0. Zaproponowano rozwiązanie polegające na konwersji wartości liczbowej na łańcuch znaków, podziale na część całkowitą i ułamkową oraz wyświetleniu ich z przecinkiem i jednostką MHz. Wskazano także możliwość wykorzystania przerwania zewnętrznego do detekcji stanu synchronizacji PLL i wyświetlenia odpowiedniego komunikatu. Omówiono problemy z kompatybilnością kodu z wersją BascomAVR 1.11.8.3 oraz poprawiono kod, który działa poprawnie na tej wersji. Przykładowy kod zawiera definicje portów, konfigurację LCD, funkcję formatowania częstotliwości oraz obsługę przycisków z eliminacją drgań styków (debounce).
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA