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

Przekształcenie wyniku na LCD, duży problem, brak pomysłu.

lukashb 01 Paź 2009 18:23 3222 15
REKLAMA
  • #1 7079509
    lukashb
    Poziom 39  
    Witam! Jak w temacie, mam urządzenie, któro daje mi w efekcie końcowym wyświetla mi liczby na LCD przy użyciu komendy LCD Sequence, i nie było by problemu gdbyby nie to, że cyferki są za małe a muszą być widoczne, czyli chciałbym przy użyciu wyświetlacza LCD 4x16 przerzucić te 4 liczby co mi się wyświetlają na ekran 4x16 w opcji fulltext czyli tak: http://www.phanderson.com/lcd106/lcd115_blue.jpg , przeszukałem elektrodę i znalazłem 2 projekty z takim sposobem wyświetlania, jeden to zegarek z grą, drugi to walentynkowe serce, w gruncie rzeczy to są te same projekty i ten sam program do wyświetlania. Wiem, że potrzeba zdefiniować znaki Deflcdchar, dokładnie 7 sztuk i potem odpowiednio je zapalać dla uzyskania konretnych liczb, jednak moja wiedza kończy się na prostych programach, a ten z pozoru może i jest prosty lecz nie dla mnie.
    Deflcdchar 0 , 32 , 32 , 32 , 3 , 15 , 15 , 31 , 31         '> na dole
    Cls
    Deflcdchar 1 , 32 , 32 , 32 , 24 , 30 , 30 , 31 , 31        '< na dole
    Cls
    Deflcdchar 2 , 31 , 31 , 15 , 15 , 3 , 32 , 32 , 32         '> na gorze
    Cls
    Deflcdchar 3 , 31 , 31 , 30 , 30 , 24 , 32 , 32 , 32        '< na gorze
    Cls
    Deflcdchar 4 , 32 , 32 , 32 , 32 , 31 , 31 , 31 , 31        'kreska
    Cls
    Deflcdchar 5 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31        ' set all
    Cls
    Deflcdchar 6 , 31 , 31 , 31 , 31 , 32 , 32 , 32 , 32        ' kreska na gorze
    Cls
    Deflcdchar 7 , 31 , 30 , 28 , 24 , 31 , 31 , 31 , 31        'polaczony
    Cls

    Program wyświetlający liczby (dekoder) moe wstawić potem, lecz jest on trochę przydługi, ale będe wdzięczny za każdą pomoc nawet na prostym przykładzie jak zamienić wartość wyświetlaną przy LCD Sequence na taką jak ja chcę, i o ile to możliwe (a pewnie jest możliwe, z waszą pomocą)
    Język programowania to Bascom, procesor Atmega8 napędzana na 14,318MHz. Pozdrawiam
  • REKLAMA
  • Pomocny post
    #2 7083846
    Krauser
    Poziom 26  
    Link nie działa, ale jeśli dobrze zrozumiałem to potrzeba wyświetlić 4 cyfry w pełnym polu wyświetlacza LCD 4*16 (jedna cyfra zajmuje 16 pozycji znaków). Wypróbuj poniższy kod w symulacji.
    
    $sim
    Config Lcd = 16 * 4
    Deflcdchar 0 , 7 , 7 , 7 , 7 , 7 , 7 , 7 , 7       '   | prawy
    Deflcdchar 1 , 28 , 28 , 28 , 28 , 28 , 28 , 28 , 28       ' |   lewy
    Deflcdchar 2 , 31 , 31 , 31 , 32 , 32 , 32 , 32 , 32       ' -  góra
    Deflcdchar 3 , 32 , 32 , 32 , 32 , 32 , 31 , 31 , 31       '- dół
    Deflcdchar 4 , 3 , 7 , 7 , 14 , 14 , 28 , 28 , 28       ' /góra
    Deflcdchar 5 , 7 , 7 , 7 , 14 , 14 , 28 , 28 , 24       ' /dół
    Deflcdchar 6 , 24 , 28 , 28 , 14 , 14 , 7 , 7 , 7       ' \góra
    Deflcdchar 7 , 28 , 28 , 28 , 14 , 14 , 7 , 7 , 3       '\dół
    
    Declare Sub Drukujcyfre(byval Pozycja As Byte , Byval Cyfra As Byte)
    
    Dim A As Byte
    Dim B As Byte
    Dim C As Word
    Dim D As Byte
    Dim E As Word
    
    Dim I As Byte
    Dim J As Byte
    Dim K As Byte
    Dim L As Byte
    Dim M As Byte
    Dim N As Byte
    
    Cls
    Cursor Off Noblink
    
    Do
       For C = 1987 To 9999
          For B = 1 To 4
             Select Case B
                Case 1 :
                     E = C / 1000
                     D = E
                Case 2 :
                     E = C Mod 1000
                     E = E / 100
                     D = E
                Case 3 :
                     E = C Mod 100
                     D = E / 10
                Case 4 :
                     E = C Mod 10
                     D = E
             End Select
             Call Drukujcyfre(b , D)
          Next B
       Next C
    Loop
    
    End
    
    
    Sub Drukujcyfre(byval Pozycja As Byte , Byval Cyfra As Byte)
        M = Pozycja - 1
        M = M * 4
        M = M + 1
         For I = 1 To 4
             Locate I , M
             For J = 0 To 3
                 N = Cyfra * 16
                  K = I - 1
                  K = K * 4
                  K = K + J
                  K = K + N
                  L = Lookup(k , Cyfry)
                  Lcd Chr(l)
             Next J
         Next I
    End Sub
    
    'kody cyfr
    '0 to znak wczytany wcześniej do wyświetlacza z użyciem deflcdchar
    '32 to znak pusty znajdujący się w ROM wyświetlacza
    Cyfry:
    '0
    Data 32 , 4 , 2 , 6
    Data 32 , 1 , 32 , 0
    Data 32 , 1 , 32 , 0
    Data 32 , 7 , 3 , 5
    '1
    Data 32 , 32 , 4 , 1
    Data 32 , 4 , 32 , 1
    Data 32 , 32 , 32 , 1
    Data 32 , 32 , 32 , 1
    '2
    Data 32 , 4 , 2 , 6
    Data 32 , 32 , 32 , 5
    Data 32 , 32 , 4 , 32
    Data 32 , 4 , 3 , 3
    '3
    Data 32 , 4 , 2 , 6
    Data 32 , 32 , 3 , 5
    Data 32 , 32 , 32 , 6
    Data 32 , 7 , 3 , 5
    '4
    Data 32 , 32 , 4 , 1
    Data 32 , 4 , 32 , 1
    Data 32 , 2 , 2 , 1
    Data 32 , 32 , 32 , 1
    '5
    Data 32 , 0 , 2 , 2
    Data 32 , 0 , 3 , 32
    Data 32 , 32 , 32 , 6
    Data 32 , 7 , 3 , 5
    '6
    Data 32 , 4 , 2 , 6
    Data 32 , 1 , 32 , 32
    Data 32 , 4 , 2 , 6
    Data 32 , 7 , 3 , 5
    '7
    Data 32 , 2 , 2 , 4
    Data 32 , 32 , 4 , 32
    Data 32 , 4 , 32 , 32
    Data 32 , 1 , 32 , 32
    '8
    Data 32 , 4 , 2 , 6
    Data 32 , 7 , 3 , 5
    Data 32 , 4 , 32 , 6
    Data 32 , 7 , 3 , 5
    '9
    Data 32 , 4 , 2 , 6
    Data 32 , 7 , 3 , 5
    Data 32 , 32 , 32 , 0
    Data 32 , 7 , 3 , 5
    
    'wyświetlenie cyfry 3 na pozycji 4
    '(
    A = 13
    Locate 1 , 13
    Lcd Chr(32)
    Lcd Chr(4)
    Lcd Chr(2)
    Lcd Chr(6)
    
    Locate 2 , 13
    Lcd Chr(32)
    Lcd Chr(32)
    Lcd Chr(3)
    Lcd Chr(5)
    
    Locate 3 , 13
    Lcd Chr(32)
    Lcd Chr(32)
    Lcd Chr(32)
    Lcd Chr(6)
    
    Locate 4 , 13
    Lcd Chr(32)
    Lcd Chr(7)
    Lcd Chr(3)
    Lcd Chr(5)
    ')
    'to samo z użyciem podprogramu
    'Call Drukujcyfre(4 , 3)
    
  • REKLAMA
  • #3 7083980
    lukashb
    Poziom 39  
    Witam! Dziękuje za jakąkolwiek odpowiedź, zawsze to w głowie więcej zostanie, dziś spędziłem cały dzień (no prawie ;) ) na tworzeniu liczb przy użyciu Deflcdchar i potem wyświetlałem je pojedynczo na LCD, wrzuciłem potem Twój program w procesor i zlicza na LCD :) i muszę powiedzieć, że właśnie o taki sposób mi chodziło, i teraz pytanie, jak przerobić kod poniższy (dekoder) ze standardowego sposobu wyświetlania na Twój sposób? Czy w ogóle się da?
    
    $regfile = "m8def.dat"
    $crystal = 14318000
    Ddrb = &B110
    Ddrd = &B00000000
    Portd.2 = 1
    ' Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 ,
    Cursor Off
    Config Timer1 = Timer , Prescale = 1 , Capture Edge = Rising , Noise Cancel = 1
    Config Aci = On , Compare = On , Trigger = Rising
    On Icp1 Oncapture
    Enable Icp1
    On Int0 Ontaster
    Config Int0 = Falling
    Enable Int0
    Enable Interrupts
    Dim Count1 As Word
    Dim Icr_new As Word
    Dim Icr_old As Word
    Dim Freqlong As Long
    Dim Freq As Word
    Dim Timesample(10) As Word
    Dim Freqsum As Word
    Dim Samplenr As Integer
    Dim Freqaverage As Word
    Dim Frequpper As Word
    Dim Freqlower As Word
    Dim Tone As String * 1
    Dim Toneeold As String * 1
    Dim Sequence As String * 15
    Dim Message As String * 15
    Dim Timeout As Word
    Locate 4 , 1
    
    Cls
    
    Main:
    Portb.1 = 0
    Portb.2 = 0
    Waitms 0.6
    
    Freqlong = 14318000 / Icr_new
    Icr_new = 0
    Freq = Freqlong
    Incr Timeout
    If Timeout = 50 Then
      Sequence = ""
      Toneeold = ""
      Message = ""
      Timeout = 0
    End If
    Timesample(10) = Timesample(9)
    Timesample(9) = Timesample(8)
    Timesample(8) = Timesample(7)
    Timesample(7) = Timesample(6)
    Timesample(6) = Timesample(5)
    Timesample(5) = Timesample(4)
    Timesample(4) = Timesample(3)
    Timesample(3) = Timesample(2)
    Timesample(2) = Timesample(1)
    Timesample(1) = Freq
    Freqsum = 0
    For Samplenr = 1 To 10
      Freqsum = Freqsum + Timesample(samplenr)
    Next
    Freqaverage = Freqsum / 10
    Frequpper = Timesample(1) + 20
    Freqlower = Timesample(1) - 20
    If Freqaverage > Freqlower And Freqaverage < Frequpper Then
      Select Case Freqaverage
          Case 1109 To 1139 : Tone = "1"
          Case 1182 To 1212 : Tone = "2"
          Case 1260 To 1290 : Tone = "3"
          Case 1343 To 1373 : Tone = "4"
          Case 1431 To 1461 : Tone = "5"
          Case 1525 To 1555 : Tone = "6"
          Case 1625 To 1655 : Tone = "7"
          Case 1732 To 1760 : Tone = "8"
          Case 1845 To 1875 : Tone = "9"
          Case 1961 To 1991 : Tone = "0"
    
    
          Case 2090 To 2130 : Tone = "E"
        Case Else : Goto Main
      End Select
    Else : Goto Main
    End If
    If Tone = Toneeold Then Goto Main
    Timeout = 0
    If Tone = "E" Then
    Sequence = Sequence + Toneeold
    Else
    Sequence = Sequence + Tone
    End If
    Toneeold = Tone
    If Len(sequence) >= 3 Then
    
          Locate 2 , 6
      Lcd Sequence
    
    
    
                      Portd.4 = 1
       Select Case Sequence
          Case "02347" : Message = "0234"
          Case "02847" : Message = "0284"
          Case "02217" : Message = "0221"
    
                Case Else : Goto Main
       End Select
    
    
    
    
    
              Locate 2 , 6
           Lcd Message
    
    
    
    
    
    End If
    Goto Main
    Ontaster:
    Portb.1 = 0
    Portb.2 = 0
    Cls
    Lcd "EEA-czytnik"
    Return
    Oncapture:
      Count1 = Timer1
      Icr_new = Count1 - Icr_old
      Icr_old = Count1
      Portb.1 = 1
      Portb.2 = 1
    Return
    

    Kod trochę długi ale za to działający jeżeli chodzi o dekodowanie liczb. Proszę o podpowiedź jak to przerobić. Pozdrawiam
  • Pomocny post
    #4 7084118
    Krauser
    Poziom 26  
    W twoim kodzie musisz zamienić zmienną tekstową na liczbę używając:
    
    zmienna = VAL( tekst )
    'czyli
    C = VAL( Sequence )
    

    wykorzystaj fragment kodu z moich wypocin wyświetlający liczbę C na lcd i powinno działać. Tylko nie wiem czemu Sequence ma aż 15 znaków długości.
  • REKLAMA
  • #5 7084185
    lukashb
    Poziom 39  
    Już mówię, Sequence ma 15 ponieważ jest możliwe do zdekodowania liczb 15, od 0 do 9 i od A do E, ale i tak nigdy jednorazowo nie przychodzi więcej znaków niż 3, max 4, więc jest ok. Trochę pokombinowałem i zgłupiałem całkowicie, zmienne to nie moja mocna strona, lecz jak sądze, trzeba zrobić tak: skleić nasze kody, z Twojego usunąć zapis
    For C = 1987 To 9999 
    i w zamian dać
    C = VAL( Sequence ) 
    uprzednio usuwając moje LCD sequence, i po tym próba kompilacji i błąd, zostaje Next C, i nie bardzo wiem czy dobrze robię.


    ---


    
    
    $regfile = "m8def.dat"
    $crystal = 14318000
    Ddrb = &B110
    Ddrd = &B00000000
    Portd.2 = 1
    ' Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 ,
    Cursor Off
    Config Timer1 = Timer , Prescale = 1 , Capture Edge = Rising , Noise Cancel = 1
    Config Aci = On , Compare = On , Trigger = Rising
    On Icp1 Oncapture
    Enable Icp1
    On Int0 Ontaster
    Config Int0 = Falling
    Enable Int0
    Enable Interrupts
    Dim Count1 As Word
    Dim Icr_new As Word
    Dim Icr_old As Word
    Dim Freqlong As Long
    Dim Freq As Word
    Dim Timesample(10) As Word
    Dim Freqsum As Word
    Dim Samplenr As Integer
    Dim Freqaverage As Word
    Dim Frequpper As Word
    Dim Freqlower As Word
    Dim Tone As String * 1
    Dim Toneeold As String * 1
    Dim Sequence As String * 15
    Dim Message As String * 15
    Dim Timeout As Word
    Locate 4 , 1
    
    Cls
    
    Main:
    Portb.1 = 0
    Portb.2 = 0
    Waitms 0.6
    
    Freqlong = 14318000 / Icr_new
    Icr_new = 0
    Freq = Freqlong
    Incr Timeout
    If Timeout = 50 Then
      Sequence = ""
      Toneeold = ""
      Message = ""
      Timeout = 0
    End If
    Timesample(10) = Timesample(9)
    Timesample(9) = Timesample(8)
    Timesample(8) = Timesample(7)
    Timesample(7) = Timesample(6)
    Timesample(6) = Timesample(5)
    Timesample(5) = Timesample(4)
    Timesample(4) = Timesample(3)
    Timesample(3) = Timesample(2)
    Timesample(2) = Timesample(1)
    Timesample(1) = Freq
    Freqsum = 0
    For Samplenr = 1 To 10
      Freqsum = Freqsum + Timesample(samplenr)
    Next
    Freqaverage = Freqsum / 10
    Frequpper = Timesample(1) + 20
    Freqlower = Timesample(1) - 20
    If Freqaverage > Freqlower And Freqaverage < Frequpper Then
      Select Case Freqaverage
          Case 1109 To 1139 : Tone = "1"
          Case 1182 To 1212 : Tone = "2"
          Case 1260 To 1290 : Tone = "3"
          Case 1343 To 1373 : Tone = "4"
          Case 1431 To 1461 : Tone = "5"
          Case 1525 To 1555 : Tone = "6"
          Case 1625 To 1655 : Tone = "7"
          Case 1732 To 1760 : Tone = "8"
          Case 1845 To 1875 : Tone = "9"
          Case 1961 To 1991 : Tone = "0"
    
    
          Case 2090 To 2130 : Tone = "E"
        Case Else : Goto Main
      End Select
    Else : Goto Main
    End If
    If Tone = Toneeold Then Goto Main
    Timeout = 0
    If Tone = "E" Then
    Sequence = Sequence + Toneeold
    Else
    Sequence = Sequence + Tone
    End If
    Toneeold = Tone
    If Len(sequence) >= 3 Then
    
    
          'Locate 2 , 6
     ' Zmienna = Val(sequence)
    
    '    Lcd Sequenc
    
    
           '           Portd.4 = 1
    '   Select Case Sequence
     '     Case "02347" : Message = "0234"
     '     Case "02847" : Message = "0284"
     '     Case "02217" : Message = "0221"
    
     '           Case Else : Goto Main
      ' End Select
     '         Locate 2 , 6
      '     Lcd Message
    
    
    
    
    Deflcdchar 0 , 7 , 7 , 7 , 7 , 7 , 7 , 7 , 7       '   | prawy
    Deflcdchar 1 , 28 , 28 , 28 , 28 , 28 , 28 , 28 , 28       ' |   lewy
    Deflcdchar 2 , 31 , 31 , 31 , 32 , 32 , 32 , 32 , 32       ' -  góra
    Deflcdchar 3 , 32 , 32 , 32 , 32 , 32 , 31 , 31 , 31       '- dół
    Deflcdchar 4 , 3 , 7 , 7 , 14 , 14 , 28 , 28 , 28       ' /góra
    Deflcdchar 5 , 7 , 7 , 7 , 14 , 14 , 28 , 28 , 24       ' /dół
    Deflcdchar 6 , 24 , 28 , 28 , 14 , 14 , 7 , 7 , 7       ' \góra
    Deflcdchar 7 , 28 , 28 , 28 , 14 , 14 , 7 , 7 , 3           '\dół
    
    
    
    Declare Sub Drukujcyfre(byval Pozycja As Byte , Byval Cyfra As Byte)
    
    Dim A As Byte
    Dim B As Byte
    Dim C As Word
    Dim D As Byte
    Dim E As Word
    
    Dim I As Byte
    Dim J As Byte
    Dim K As Byte
    Dim L As Byte
    Dim M As Byte
    Dim N As Byte
    
    Cls
    Cursor Off Noblink
    
    Do
       C = Val(sequence)
          For B = 1 To 4
             Select Case B
                Case 1 :
                     E = C / 1000
                     D = E
                Case 2 :
                     E = C Mod 1000
                     E = E / 100
                     D = E
                Case 3 :
                     E = C Mod 100
                     D = E / 10
                Case 4 :
                     E = C Mod 10
                     D = E
             End Select
             Call Drukujcyfre(b , D)
          Next B
       'Next C
    Loop
    
    End
    
    
    Sub Drukujcyfre(byval Pozycja As Byte , Byval Cyfra As Byte)
        M = Pozycja - 1
        M = M * 4
        M = M + 1
         For I = 1 To 4
             Locate I , M
             For J = 0 To 3
                 N = Cyfra * 16
                  K = I - 1
                  K = K * 4
                  K = K + J
                  K = K + N
                  L = Lookup(k , Cyfry)
                  Lcd Chr(l)
             Next J
         Next I
    End Sub
    
    'kody cyfr
    '0 to znak wczytany wcześniej do wyświetlacza z użyciem deflcdchar
    '32 to znak pusty znajdujący się w ROM wyświetlacza
    Cyfry:
    '0
    Data 32 , 4 , 2 , 6
    Data 32 , 1 , 32 , 0
    Data 32 , 1 , 32 , 0
    Data 32 , 7 , 3 , 5
    '1
    Data 32 , 32 , 4 , 1
    Data 32 , 4 , 32 , 1
    Data 32 , 32 , 32 , 1
    Data 32 , 32 , 32 , 1
    '2
    Data 32 , 4 , 2 , 6
    Data 32 , 32 , 32 , 5
    Data 32 , 32 , 4 , 32
    Data 32 , 4 , 3 , 3
    '3
    Data 32 , 4 , 2 , 6
    Data 32 , 32 , 3 , 5
    Data 32 , 32 , 32 , 6
    Data 32 , 7 , 3 , 5
    '4
    Data 32 , 32 , 4 , 1
    Data 32 , 4 , 32 , 1
    Data 32 , 2 , 2 , 1
    Data 32 , 32 , 32 , 1
    '5
    Data 32 , 0 , 2 , 2
    Data 32 , 0 , 3 , 32
    Data 32 , 32 , 32 , 6
    Data 32 , 7 , 3 , 5
    '6
    Data 32 , 4 , 2 , 6
    Data 32 , 1 , 32 , 32
    Data 32 , 4 , 2 , 6
    Data 32 , 7 , 3 , 5
    '7
    Data 32 , 2 , 2 , 4
    Data 32 , 32 , 4 , 32
    Data 32 , 4 , 32 , 32
    Data 32 , 1 , 32 , 32
    '8
    Data 32 , 4 , 2 , 6
    Data 32 , 7 , 3 , 5
    Data 32 , 4 , 32 , 6
    Data 32 , 7 , 3 , 5
    '9
    Data 32 , 4 , 2 , 6
    Data 32 , 7 , 3 , 5
    Data 32 , 32 , 32 , 0
    Data 32 , 7 , 3 , 5
    
    'wyświetlenie cyfry 3 na pozycji 4 
    '( 
    A = 13 
    Locate 1 , 13 
    Lcd Chr(32) 
    Lcd Chr(4) 
    Lcd Chr(2) 
    Lcd Chr(6) 
    
    Locate 2 , 13 
    Lcd Chr(32) 
    Lcd Chr(32) 
    Lcd Chr(3) 
    Lcd Chr(5) 
    
    Locate 3 , 13 
    Lcd Chr(32) 
    Lcd Chr(32) 
    Lcd Chr(32) 
    Lcd Chr(6) 
    
    Locate 4 , 13 
    Lcd Chr(32) 
    Lcd Chr(7) 
    Lcd Chr(3) 
    Lcd Chr(5) 
    ') 
    'to samo z użyciem podprogramu 
    'Call Drukujcyfre(4 , 3) 
    
    
    End If
    Goto Main
    Ontaster:
    Portb.1 = 0
    Portb.2 = 0
    Cls
    Lcd "EEA-czytnik"
    Return
    Oncapture:
      Count1 = Timer1
      Icr_new = Count1 - Icr_old
      Icr_old = Count1
      Portb.1 = 1
      Portb.2 = 1
    Return
    
    
    
    
    
    
  • Pomocny post
    #6 7085408
    Krauser
    Poziom 26  
    1. Pętla for C=1111 to 9999 zawsze kończy się next C, bo pomiędzy for i next jest to co ma się wykonać. Dlatego dobrze, że to wyrzuciłeś.
    2. Zmienne sugeruję przenieś na początek tam gdzie inne.
    3. Cały kod
    
       C = Val(sequence)
          For B = 1 To 4
             Select Case B
                Case 1 :
                     E = C / 1000
                     D = E
                Case 2 :
                     E = C Mod 1000
                     E = E / 100
                     D = E
                Case 3 :
                     E = C Mod 100
                     D = E / 10
                Case 4 :
                     E = C Mod 10
                     D = E
             End Select
             Call Drukujcyfre(b , D)
          Next B 
    

    to procedura zamieniająca string na word i wyświetlajaca na lcd. Możesz nawet zrobić z tego podprogram[ Sub Lcdsequence(sequence as string*15) ] podobnie jak Drukujcyfre i nie może ona być w pętli do loop. End też trzeba usunąć.
    4. Czyli zamiast Lcd Sequence należy umieścić fragment kodu z punktu 3 lub wywołanie tej procedury. Błędem jest zamykanie pętli main za end i za definicjami cyfr. Takie rzeczy są zawsze na końcu.
    5. Jeśli Dim Sequence as String*15 to Sequence="123456789012345" jak widać pomieści bardzo dużą liczbę - oczywiście po przekształceniu.
  • #7 7085733
    lukashb
    Poziom 39  
    Witam! Dziękuje za odpowiedź, posprawdzałem co i jak, i nie jest dobrze, a chyba wszystko zrobiłem co zasugerowałeś. Objeż sam
    $regfile = "m8def.dat"
    $crystal = 14318000
    Ddrb = &B110
    Ddrd = &B00000000
    Portd.2 = 1
    ' Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 ,
    
    Cursor Off Noblink
    Config Timer1 = Timer , Prescale = 1 , Capture Edge = Rising , Noise Cancel = 1
    Config Aci = On , Compare = On , Trigger = Rising
    On Icp1 Oncapture
    Enable Icp1
    On Int0 Ontaster
    Config Int0 = Falling
    Enable Int0
    Enable Interrupts
    
    
    
    Dim Count1 As Word
    Dim Icr_new As Word
    Dim Icr_old As Word
    Dim Freqlong As Long
    Dim Freq As Word
    Dim Timesample(10) As Word
    Dim Freqsum As Word
    Dim Samplenr As Integer
    Dim Freqaverage As Word
    Dim Frequpper As Word
    Dim Freqlower As Word
    Dim Tone As String * 1
    Dim Toneeold As String * 1
    Dim Sequence As String * 15
    Dim Message As String * 15
    Dim Timeout As Word
    
    
    
    Deflcdchar 0 , 7 , 7 , 7 , 7 , 7 , 7 , 7 , 7       '   | prawy
    Deflcdchar 1 , 28 , 28 , 28 , 28 , 28 , 28 , 28 , 28       ' |   lewy
    Deflcdchar 2 , 31 , 31 , 31 , 32 , 32 , 32 , 32 , 32       ' -  góra
    Deflcdchar 3 , 32 , 32 , 32 , 32 , 32 , 31 , 31 , 31       '- dół
    Deflcdchar 4 , 3 , 7 , 7 , 14 , 14 , 28 , 28 , 28       ' /góra
    Deflcdchar 5 , 7 , 7 , 7 , 14 , 14 , 28 , 28 , 24       ' /dół
    Deflcdchar 6 , 24 , 28 , 28 , 14 , 14 , 7 , 7 , 7       ' \góra
    Deflcdchar 7 , 28 , 28 , 28 , 14 , 14 , 7 , 7 , 3           '\dół
    
    
    
    Declare Sub Drukujcyfre(byval Pozycja As Byte , Byval Cyfra As Byte)
    
    
    
    Dim A As Byte
    Dim B As Byte
    Dim C As Word
    Dim D As Byte
    Dim E As Word
    
    Dim I As Byte
    Dim J As Byte
    Dim K As Byte
    Dim L As Byte
    Dim M As Byte
    Dim N As Byte
    
    
    Cls
    
    Main:
    Portb.1 = 0
    Portb.2 = 0
    Waitms 0.6
    
    Freqlong = 14318000 / Icr_new
    Icr_new = 0
    Freq = Freqlong
    Incr Timeout
    If Timeout = 50 Then
      Sequence = ""
      Toneeold = ""
      Message = ""
      Timeout = 0
    End If
    Timesample(10) = Timesample(9)
    Timesample(9) = Timesample(8)
    Timesample(8) = Timesample(7)
    Timesample(7) = Timesample(6)
    Timesample(6) = Timesample(5)
    Timesample(5) = Timesample(4)
    Timesample(4) = Timesample(3)
    Timesample(3) = Timesample(2)
    Timesample(2) = Timesample(1)
    Timesample(1) = Freq
    Freqsum = 0
    For Samplenr = 1 To 10
      Freqsum = Freqsum + Timesample(samplenr)
    Next
    Freqaverage = Freqsum / 10
    Frequpper = Timesample(1) + 20
    Freqlower = Timesample(1) - 20
    If Freqaverage > Freqlower And Freqaverage < Frequpper Then
      Select Case Freqaverage
          Case 1109 To 1139 : Tone = "1"
          Case 1182 To 1212 : Tone = "2"
          Case 1260 To 1290 : Tone = "3"
          Case 1343 To 1373 : Tone = "4"
          Case 1431 To 1461 : Tone = "5"
          Case 1525 To 1555 : Tone = "6"
          Case 1625 To 1655 : Tone = "7"
          Case 1732 To 1760 : Tone = "8"
          Case 1845 To 1875 : Tone = "9"
          Case 1961 To 1991 : Tone = "0"
    
    
          Case 2090 To 2130 : Tone = "E"
        Case Else : Goto Main
      End Select
    Else : Goto Main
    End If
    If Tone = Toneeold Then Goto Main
    Timeout = 0
    If Tone = "E" Then
    Sequence = Sequence + Toneeold
    Else
    Sequence = Sequence + Tone
    End If
    Toneeold = Tone
    If Len(sequence) >= 3 Then
    
       C = Val(Sequence)
          For B = 1 To 4
             Select Case B
                Case 1 :
                     E = C / 1000
                     D = E
                Case 2 :
                     E = C Mod 1000
                     E = E / 100
                     D = E
                Case 3 :
                     E = C Mod 100
                     D = E / 10
                Case 4 :
                     E = C Mod 10
                     D = E
             End Select
             Call Drukujcyfre(b , D)
          Next B
    
    
    
    Cursor Off Noblink
    
    
    
    Sub Drukujcyfre(byval Pozycja As Byte , Byval Cyfra As Byte)
        M = Pozycja - 1
        M = M * 4
        M = M + 1
         For I = 1 To 4
             Locate I , M
             For J = 0 To 3
                 N = Cyfra * 16
                  K = I - 1
                  K = K * 4
                  K = K + J
                  K = K + N
                  L = Lookup(k , Cyfry)
                  Lcd Chr(l)
             Next J
         Next I
    End Sub
    
    
    'kody cyfr
    '0 to znak wczytany wcześniej do wyświetlacza z użyciem deflcdchar
    '32 to znak pusty znajdujący się w ROM wyświetlacza
    Cyfry:
    '0
    Data 32 , 4 , 2 , 6
    Data 32 , 1 , 32 , 0
    Data 32 , 1 , 32 , 0
    Data 32 , 7 , 3 , 5
    '1
    Data 32 , 32 , 4 , 1
    Data 32 , 4 , 32 , 1
    Data 32 , 32 , 32 , 1
    Data 32 , 32 , 32 , 1
    '2
    Data 32 , 4 , 2 , 6
    Data 32 , 32 , 32 , 5
    Data 32 , 32 , 4 , 32
    Data 32 , 4 , 3 , 3
    '3
    Data 32 , 4 , 2 , 6
    Data 32 , 32 , 3 , 5
    Data 32 , 32 , 32 , 6
    Data 32 , 7 , 3 , 5
    '4
    Data 32 , 32 , 4 , 1
    Data 32 , 4 , 32 , 1
    Data 32 , 2 , 2 , 1
    Data 32 , 32 , 32 , 1
    '5
    Data 32 , 0 , 2 , 2
    Data 32 , 0 , 3 , 32
    Data 32 , 32 , 32 , 6
    Data 32 , 7 , 3 , 5
    '6
    Data 32 , 4 , 2 , 6
    Data 32 , 1 , 32 , 32
    Data 32 , 4 , 2 , 6
    Data 32 , 7 , 3 , 5
    '7
    Data 32 , 2 , 2 , 4
    Data 32 , 32 , 4 , 32
    Data 32 , 4 , 32 , 32
    Data 32 , 1 , 32 , 32
    '8
    Data 32 , 4 , 2 , 6
    Data 32 , 7 , 3 , 5
    Data 32 , 4 , 32 , 6
    Data 32 , 7 , 3 , 5
    '9
    Data 32 , 4 , 2 , 6
    Data 32 , 7 , 3 , 5
    Data 32 , 32 , 32 , 0
    Data 32 , 7 , 3 , 5
    
    End If
    
    
    
    
    Goto Main
    Ontaster:
    Portb.1 = 0
    Portb.2 = 0
    Cls
    Lcd "EEA-czytnik"
    Return
    Oncapture:
      Count1 = Timer1
      Icr_new = Count1 - Icr_old
      Icr_old = Count1
      Portb.1 = 1
      Portb.2 = 1
    
    
    
    
      Return
    
    
    
    
    

    Teraz po włączeniu, i stwierdzeniu sekwencji układ wyświetla coś co jest podobne do 0008, ponieważ latają śmieci na LCD i zaraz wynik ten gaśnie wieszając całość, co może być nie tak? a może te programy nie będą współpracowały? Pozdrawiam Łukasz.
  • Pomocny post
    #8 7086197
    Krauser
    Poziom 26  
    Dwie linijki przed Ontaster: czyli End If i Goto Main mają być zaraz za linią Next B. (Dziwne, że tego nie zauważyłeś) Cursor Off Noblink wystarczy wykonać tylko raz więc należy to umieścić za Cls
  • REKLAMA
  • #9 7086319
    lukashb
    Poziom 39  
    Wcześniej też tak próbowałem, i nic, aktualnie jest tak, i jak cokolwiek zdekoduje to są same zera, ew. czasem nie pełne zera (brakuje spodu itp)
    
    $regfile = "m8def.dat"
    $crystal = 14318000
    Ddrd = &B00000000
    Portd.2 = 1
    ' Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 ,
    Cursor Off
    Config Timer1 = Timer , Prescale = 1 , Capture Edge = Rising , Noise Cancel = 1
    Config Aci = On , Compare = On , Trigger = Rising
    On Icp1 Oncapture
    Enable Icp1
    On Int0 Ontaster
    Config Int0 = Falling
    Enable Int0
    Enable Interrupts
    Deflcdchar 0 , 7 , 7 , 7 , 7 , 7 , 7 , 7 , 7       '   | prawy
    Deflcdchar 1 , 28 , 28 , 28 , 28 , 28 , 28 , 28 , 28       ' |   lewy
    Deflcdchar 2 , 31 , 31 , 31 , 32 , 32 , 32 , 32 , 32       ' -  góra
    Deflcdchar 3 , 32 , 32 , 32 , 32 , 32 , 31 , 31 , 31       '- dół
    Deflcdchar 4 , 3 , 7 , 7 , 14 , 14 , 28 , 28 , 28       ' /góra
    Deflcdchar 5 , 7 , 7 , 7 , 14 , 14 , 28 , 28 , 24       ' /dół
    Deflcdchar 6 , 24 , 28 , 28 , 14 , 14 , 7 , 7 , 7       ' \góra
    Deflcdchar 7 , 28 , 28 , 28 , 14 , 14 , 7 , 7 , 3           '\dół
    
    
    
    Declare Sub Drukujcyfre(byval Pozycja As Byte , Byval Cyfra As Byte)
    
    Dim A As Byte
    Dim B As Byte
    Dim C As Word
    Dim D As Byte
    Dim E As Word
    
    Dim I As Byte
    Dim J As Byte
    Dim K As Byte
    Dim L As Byte
    Dim M As Byte
    Dim N As Byte
    Dim Count1 As Word
    Dim Icr_new As Word
    Dim Icr_old As Word
    Dim Freqlong As Long
    Dim Freq As Word
    Dim Timesample(10) As Word
    Dim Freqsum As Word
    Dim Samplenr As Integer
    Dim Freqaverage As Word
    Dim Frequpper As Word
    Dim Freqlower As Word
    Dim Tone As String * 1
    Dim Toneeold As String * 1
    Dim Sequence As String * 15
    Dim Message As String * 15
    Dim Timeout As Word
    Locate 4 , 1
    
    Cls
    
    Main:
    Portb.1 = 0
    Portb.2 = 0
    Waitms 0.6
    
    Freqlong = 14318000 / Icr_new
    Icr_new = 0
    Freq = Freqlong
    Incr Timeout
    If Timeout = 60 Then
      Sequence = ""
      Toneeold = ""
      Message = ""
      Timeout = 0
    End If
    Timesample(10) = Timesample(9)
    Timesample(9) = Timesample(8)
    Timesample(8) = Timesample(7)
    Timesample(7) = Timesample(6)
    Timesample(6) = Timesample(5)
    Timesample(5) = Timesample(4)
    Timesample(4) = Timesample(3)
    Timesample(3) = Timesample(2)
    Timesample(2) = Timesample(1)
    Timesample(1) = Freq
    Freqsum = 0
    For Samplenr = 1 To 10
      Freqsum = Freqsum + Timesample(samplenr)
    Next
    Freqaverage = Freqsum / 10
    Frequpper = Timesample(1) + 20
    Freqlower = Timesample(1) - 20
    If Freqaverage > Freqlower And Freqaverage < Frequpper Then
      Select Case Freqaverage
          Case 1109 To 1139 : Tone = "1"
          Case 1182 To 1212 : Tone = "2"
          Case 1260 To 1290 : Tone = "3"
          Case 1343 To 1373 : Tone = "4"
          Case 1431 To 1461 : Tone = "5"
          Case 1525 To 1555 : Tone = "6"
          Case 1625 To 1655 : Tone = "7"
          Case 1732 To 1760 : Tone = "8"
          Case 1845 To 1875 : Tone = "9"
          Case 1961 To 1991 : Tone = "0"
    
    
          Case 2090 To 2130 : Tone = "E"
        Case Else : Goto Main
      End Select
    Else : Goto Main
    End If
    If Tone = Toneeold Then Goto Main
    Timeout = 0
    If Tone = "E" Then
    Sequence = Sequence + Toneeold
    Else
    Sequence = Sequence + Tone
    End If
    Toneeold = Tone
    If Len(sequence) >= 5 Then
    
      
          C = Val(sequence )
          For B = 1 To 4
             Select Case B
                Case 1 :
                     E = C / 1000
                     D = E
                Case 2 :
                     E = C Mod 1000
                     E = E / 100
                     D = E
                Case 3 :
                     E = C Mod 100
                     D = E / 10
                Case 4 :
                     E = C Mod 10
                     D = E
             End Select
             Call Drukujcyfre(b , D)
          Next B
    
          Portd.4 = 1
      
    
    
    
     End If
    Goto Main
    
    Ontaster:
    Portb.1 = 0
    Portb.2 = 0
    Cls
    Lcd "CCIR-dekoder"
    
    
    
    Sub Drukujcyfre(byval Pozycja As Byte , Byval Cyfra As Byte)
        M = Pozycja - 1
        M = M * 4
        M = M + 1
         For I = 1 To 4
             Locate I , M
             For J = 0 To 3
                 N = Cyfra * 16
                  K = I - 1
                  K = K * 4
                  K = K + J
                  K = K + N
                  L = Lookup(k , Cyfry)
                  Lcd Chr(l)
             Next J
         Next I
    End Sub
    
    'kody cyfr
    '0 to znak wczytany wcześniej do wyświetlacza z użyciem deflcdchar
    '32 to znak pusty znajdujący się w ROM wyświetlacza
    Cyfry:
    '0
    Data 32 , 4 , 2 , 6
    Data 32 , 1 , 32 , 0
    Data 32 , 1 , 32 , 0
    Data 32 , 7 , 3 , 5
    '1
    Data 32 , 32 , 4 , 1
    Data 32 , 4 , 32 , 1
    Data 32 , 32 , 32 , 1
    Data 32 , 32 , 32 , 1
    '2
    Data 32 , 4 , 2 , 6
    Data 32 , 32 , 32 , 5
    Data 32 , 32 , 4 , 32
    Data 32 , 4 , 3 , 3
    '3
    Data 32 , 4 , 2 , 6
    Data 32 , 32 , 3 , 5
    Data 32 , 32 , 32 , 6
    Data 32 , 7 , 3 , 5
    '4
    Data 32 , 32 , 4 , 1
    Data 32 , 4 , 32 , 1
    Data 32 , 2 , 2 , 1
    Data 32 , 32 , 32 , 1
    '5
    Data 32 , 0 , 2 , 2
    Data 32 , 0 , 3 , 32
    Data 32 , 32 , 32 , 6
    Data 32 , 7 , 3 , 5
    '6
    Data 32 , 4 , 2 , 6
    Data 32 , 1 , 32 , 32
    Data 32 , 4 , 2 , 6
    Data 32 , 7 , 3 , 5
    '7
    Data 32 , 2 , 2 , 4
    Data 32 , 32 , 4 , 32
    Data 32 , 4 , 32 , 32
    Data 32 , 1 , 32 , 32
    '8
    Data 32 , 4 , 2 , 6
    Data 32 , 7 , 3 , 5
    Data 32 , 4 , 32 , 6
    Data 32 , 7 , 3 , 5
    '9
    Data 32 , 4 , 2 , 6
    Data 32 , 7 , 3 , 5
    Data 32 , 32 , 32 , 0
    Data 32 , 7 , 3 , 5
    Return
    
    
    Oncapture:
      Count1 = Timer1
      Icr_new = Count1 - Icr_old
      Icr_old = Count1
      Portb.1 = 1
      Portb.2 = 1
    
    Return
    

    Dane cyfr dawałem i przed samym Returnem, i tak jak teraz, zawsze z różnym skutkiem, nigdy dobrym, nie wiem dlaczego, coś mi się wydaje, że nie zadziała to w ten sposób jaki chcę. Pozdrawiam i dziękuje.

    Dodano po 3 [godziny] 15 [minuty]:

    Bardzo bym prosił o jakie kolwiek wsparcie w tej sprawie, ponieważ skończyły mi się pomysły, a wydaje mi się, że ostatni program jest prawidłowo zrobiony. :cry: a ciągle są same 0000 w których czasem coś brakuje itp.
  • Pomocny post
    #10 7088839
    Krauser
    Poziom 26  
    Trzeba Return ten za Data 32 , 7 , 3 , 5 przenieść za Lcd "CCIR-dekoder".
    Dodatkowo załączam plik, który sprawdziłem w symulacji (pewne rzeczy musiałem skomentować tymczasowo żeby cokolwiek się zmieniło i po pewnej liczbie obiegów pętli C jest większe niż 9999, ale przynajmniej coś wyświetla) W docelowym układzie niestety nie mogę tego sprawdzić.
  • #11 7088906
    lukashb
    Poziom 39  
    Witam! Po przeniesieniu Returna tam gdzie sugerowałeś, brak poprawy, a raczej 0 zmian, tak samo, same 0000 ew. nie kompletne kiedy coś odbierze, a po wgraniu Twojego programu to już całkowicie masakra :D bo bez dekodowania już same 0000 po ucinane, a kiedy coś przyjdzie do krzaki na LCD, coś mi się wydaje, że te 2 programy nie będą chciały współpracować, może od Atmegi za dużo wymagam, sam nie wiem, fakt jest faktem, że nie wyświetla nic. Pozdrawiam
    PS, tak sądzę, że skądś się muszą brać te dominujące zera, no bo ode mnie nieprzychodzą, a odrazu zapełnia nimi LCD, JAKO CIEKAWOSTKĘ, dodam, że raz mi się wyświetliło poprawnie, ale jedną cyfre tylko, z sewkencji 234 była tylko 3, reszta 0, czyli 0300 :)
  • Pomocny post
    #12 7088994
    Krauser
    Poziom 26  
    Witam,
    zamiennie za kod
    C = Val(sequence )
    ...
    Next B 

    wstaw z powrotem Lcd Sequence i zobacz co jest grane, bo tylko tym w praktyce będzie się różnił program. Nieużywane funkcje w niczym nie przeszkadzają. Jedyny problem jaki może być to za długa zmienna sequence. Poza tym wcześniej w warunku sprawdzana długość była krótsza a teraz jest dłuższa(choć właściwie to powinno być <=4). Mojego programu absolutnie nie wrzucaj do procka bez zmian. Trzeba usunąć $sim i zmienić rzeczy które tymczasowo dodałem/usunąłem (oznaczyłem te miejsca '--------)
  • #13 7089153
    lukashb
    Poziom 39  
    Własnie przed chwilą to sprawdziłem, wyświetla bezbłędnie po zmianie na LCD Sequence. Już ciężko coś dodać w tym temacie, bo wszystko wydaje się poprawne, a tak nie jest. Pozdrawiam i dzięki z a pomoc!

    Dodano po 15 [minuty]:

    Co ciekawe, po wyłączeniu linijki C=Val(sequence) teoretycznie nic na LCD nie powinno wyświetlać po odebraniu, a tu niestety efekt jak przy aktywnej linijce, 0000 i jakieś śmieci czasem, czyli tak jakby ta linijka C=Val(sequence) nic nie wprowadzała, może to coś pomoże, choć wątpie.
  • Pomocny post
    #14 7090979
    Krauser
    Poziom 26  
    1. Za-komentowanie samej linijki C=Val(sequence) nic nie zmieni bo w C jest 0. Dopiero usunięcie całej procedury spowoduje brak wyświetlania.
    2. Co jeszcze można poprawić...Umieszczanie funkcji obsługi lcd w funkcji obsługi przerwania Ontaster: nie jest dobre, bo może mieszać podczas trwającego wpisywania do wyświetlacza. Proponuje zrobić następująco. Do zmiennych dodać:
     Dim Ontasterflag As Bit

    w Main: na początku zaraz za Waitms 0.6 umieścić następujący kod:
    If Ontasterflag=1 Then
    Ontasterflag=0
    Cls
    Lcd "CCIR-dekoder"
    End If
    

    natomiast w procedurze Ontaster: usunąć Cls i Lcd "CCIR-dekoder" a w to miejsce wstawić:
    Ontasterflag=1
    

    3. Spróbować można jeszcze następującej rzeczy. W bezbłędnym kodzie tym gdzie jest LCD Sequence spróbować zamiast tej linii dać tylko:
    C=Val(sequence)
    Lcd C
    
    teoretycznie to nic nie powinno zmienić pod warunkiem, że konwersja funkcją Val() daje dobry wynik.
  • #15 7091365
    lukashb
    Poziom 39  
    Spróbowałem i jednego i drugiego, i nic, za każdym razem bez zmian, czyli można stwierdzić, że te kody 2 się nie lubią po połączeniu i nie chce się przekonwertować Sequence, bo mówię, albo same 0000, albo jakieś nie pełne liczby ale nigdy poprawne. Mam jeszcze kod do wyświetlania zegarka na takim LCD, i on działał dobrze, może zechciałbyś w takim razie rzucić okiem na tamten kod, bo jest trochę inaczej zbudowany, lecz widzę podobieństwo to może uda się przerobić go, bardzo mi by zależało na wyświetlaniu dużych liczb, bo małe są poprostu nie widoczne. Kod w załączniku. Dzięki, że poświęcasz mi czas :) Pozdrawiam
REKLAMA