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

[Tiny2313][Bascom] UART - komunikacja z PC

LED5W 10 Paź 2009 23:00 2489 11
REKLAMA
  • #1 7113491
    LED5W
    Poziom 34  
    Witam

    Przesyłam z PC do µC napis do wyświetlenia po RS. Jednak w programie wysyłającym muszę dać opóźnienie ok. 50ms pomiędzy wysyłanymi liniami (LCD 2x16), aby napis został poprawnie wyświetlony.
    Czy można ten program jakoś poprawić?
    $regfile = "attiny2313.dat"
    $baud = 4800
    Cls : Cursor Off
    On Urxc Odbierz
    Dim Rs As String * 16 , Rs_zn As Byte , Y As Byte , Cd As Bit , Commode As Bit , Przerysuj_lcd As Byte
    Y = 1                                                       'pierwsza linia LCD
    Portd.2 = 1                                                 'pin podświetlenia w stanie wysokim
    Ddrd.2 = 1                                                  'jako wyjście
    Enable Interrupts : Enable Urxc
    Print "Gotowy..."
    
    Do
    If Commode = 1 Then                                         'tryb poleceń
          Set Cd                                                'zmienna pomocnicza - sprawdza, czy któreś z poleceń zostało wykonane
          Select Case Rs
             Case "cls"
                Cls
             Case "disp on"
                Display On
             Case "disp off"
                Display Off
             Case "bl on"                                       'podświetlenie
                Portd.2 = 0
             Case "bl off"
                Portd.2 = 1
             Case "1"                                           'pierwsza linia wyśw.
                Y = 1
             Case "2"                                           'druga linia
                Y = 2
             Case Else                                          'żadne polecenie nie pasuje
                Reset Cd
             End Select
          If Cd = 1 Then Rs = ""                                'jeżeli wykonano polecenie wyczyść bufor
       Else
       If Przerysuj_lcd = 1 Then
          Locate Y , 1
          Lcd Rs
          Rs = ""
          Reset Przerysuj_lcd
          End If
       End If
    Loop
    End
    
    Odbierz:
    Rs_zn = Udr                                                 'odczytaj znak
    If Rs_zn > 31 Then
          Rs = Rs + Chr(rs_zn)                                  'dodaj do bufora, jeżeli to litera
       Else
          If Rs_zn = 0 Then
             Rs = ""                                            'wyczyść bufor
             Set Commode                                        'wejdź w tryb poleceń
             End If
          If Rs_zn = 10 Then                                    'znak końca lini - koniec lini do wyśw. lub koniec polecenia
                If Commode = 0 Then Set Przerysuj_lcd
                Reset Commode
             End If
       End If
    Return

    µC chodzi na 4MHz.

    Wysyłam to tak (C#):
    private void przerysuj_LCD()
    {
        System.Threading.Thread.Sleep(50);
        serialPort1.WriteLine("\0" + (y+1));
        serialPort1.WriteLine(disp[y]);
    }
  • REKLAMA
  • #2 7113748
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • REKLAMA
  • #4 7119058
    LED5W
    Poziom 34  
    Dziękuję za odpowiedzi.

    atom1477 dodałem drugi bufor, którego zawartość wyświetlam.
    Przepisuję do niego zawartość Rs tak:
    If Rs_zn = 10 Then                                    'znak końca lini - koniec lini do wyśw. lub koniec polecenia
                If Commode = 0 Then
                   Set Przerysuj_lcd
                   Rs_lcd = Rs
                   End If
                Reset Commode
             End If

    Ale to nie działa.
    Co do pierwszej flagi to w sumie już była (Przerysuj_lcd).
    Jeszcze spróbuję dać drugą, ale wtedy przepisanie będę musiał umieścić w pętli głównej.



    ZbeeGin Co do pierwszego rozwiązania to jest takie częściowe. Nie wiem, czy tu by pomogło, ale przy dłuższych wyświetlaczach to raczej nie ma szans.
    Drugie rozwiązanie jest ciekawsze. Nie wiedziałem, że jest takie coś jak Serial0ByteReceived i Serial0CharMatch. :)
    Czy dobrze kombinuję:
    Ustawię sobie bufor na 40 znaków i w przerwaniu Serial0CharMatch (ustawionego na znak końca linii) wpisuję zawartość bufora do zmiennej (czy można przepisać na raz cały string, czy muszę po literce?). Proszę o przykład jak powinno wyglądać to przerwanie.
    Trzeba pamiętać, że musi być odróżniany tekst do wyświetlenia od poleceń (zaczynających się od znaku o numerze 0).
  • #5 7119584
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #7 7121455
    Konto nie istnieje
    Poziom 1  
  • #8 7121512
    LED5W
    Poziom 34  
    Co do symulatora to nie wiem jak tam wpisać w terminal inny znak niż litera - w "normalnym" jest opcja Send ASCII character...
    Koniec ciągu oznaczany jest tylko znakiem o kodzie 10.
  • #9 7121563
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #10 7122680
    marco47
    Poziom 41  
    Jakie stosujesz biblioteki wyświetlacza LCD ?
    Bo w przeglądanym programie nie widzę.
    Pozdrawiam
  • #11 7135795
    LED5W
    Poziom 34  
    atom1477 Właśnie tak robiłem. Tylko jest taki szczegół, że trzeba wcisnąć Enter. :)
    atom1477 napisał:
    W symulacji pomogło to:

    $hwstack = 64
    $swstack = 64
    $framesize = 64

    Mi się wydaje, że w symulacji działa bez tego (w ustawieniach mam hwstack = 32 swstack = 8 framesize = 24). Ale jak to sprawdzasz, jak nie wiesz kiedy nastąpi przerwanie? W praktyce to nic nie daje...


    marco47 Jest to co widać. LCD jest podłączony w 4-bitowym trybie pin.


    Zauważyłem jeszcze jedną rzecz - jeżeli pętla główna nie wyrobi się z przetwarzaniem polecenia to zostanie ono wyświetlone (efekt zauważyłem już wcześniej), gdyż Commode jest zerowana po otrzymaniu znaku końca linii...

    Dodano po 8 [minuty]:

    I tu chyba tkwi problem. Zrobię osobną zmienną na polecenia i zobaczę, czy działa.

    Dodano po 1 [godziny] 23 [minuty]:

    Prawie działa.
    Dolna linia nie zawsze jest wyświetlana (ale gdy się pokaże to poprawnie :)). Zależy to od ilości znaków w każdej linii... np. jeżeli w górnej jest 7 dolna jest wyświetlana normalnie, jeżeli jest ich 16, to dolna wyświetli się, gdy będzie miała co najmniej 7 znaków. O co tu chodzi?

    Kod:
  • #12 7141172
    LED5W
    Poziom 34  
    Pobawiłem się tym trochę. Wymagane opóźnienie na PC zmniejszyło się do ok. 30ms.

    Ale wracając do problemu występującego, gdy opóźnienia nie ma. Objawy wskazywały, że w jakiś sposób zależy to od czasu wykonywania polecenia lcd, więc dodałem po nim waitms 10, co zwiększyło wymaganą ilość znaków w drugiej linii do 12 (przy 16 w górnej).

    Dlaczego układ tak się zachowuje?
REKLAMA