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

[Atmega32][Bascom] UART sprzętowy a programowy

Elektronik_Kraków 30 Maj 2011 22:34 2721 3
REKLAMA
  • #1 9561126
    Elektronik_Kraków
    Poziom 13  
    Witam
    Nie za bardzo wychodzi mi wykorzystanie z dwóch portów UART.
    UART sprzętowy odbiera ramki z modułu GPS ( Tx modułu do Rx AtMega32 ) i to działa.
    Działa do momentu gdy włączę UART sprzętowy ( tylko Rx na jednym z portów Atmega do Tx portu Com w komputerze - korzystam z przejściówki, ale to chyba nie problem ), wtedy informacje na LCD nie są aktualizowane do momentu naciśnięcia Enter'a ( każdorazowe naciśnięcie Enter, nawet bez żadnych znaków odświeża LCD ). Natomiast nie wykonuje tego co było w założeniu.

    Umieszczam tylko istotną część kodu, pominąłem biblioteki do zapisu SD, to działa poprawnie.
    
    $regfile = "m32def.dat"
    $crystal = 8000000
    $baud = 9600                                                ' predkość transmisji
    $hwstack = 128                                              ' rozmiar stosu sprzętowego
    $swstack = 128                                              ' rozmiar stosu programowego
    $framesize = 128                                            ' rozmiar ramki
    
    Open "comd.7:9600,8,n,1" For Input As #2
    
    Dim Rs1 As String * 54
    Dim Gps1 As Byte
    Dim Usart2 As String * 12
    Dim Usart2_dane As Byte
    
    A1 = "$GPGGA"
    A2 = "$GPGSA"
    A3 = "$GPRMC"
    A4 = "$GPGSV"
    A5 = "data"
    
    Do
        Gps1 = Inkey()
        If Gps1 = 13 Then Exit Do                               ' jeśli koniec linii
        Rs1 = Rs1 + Chr(gps1)                                   ' utwórz ciąg
    Loop
    
    Do
        Usart2_dane = Inkey(#2)
        If Usart2_dane = 13 Then Exit Do                        ' jeśli koniec linii
        Usart2 = Usart2 + Chr(usart2_dane)                      ' utwórz ciąg
    Loop
    
    Ramka = Instr(rs1 , A1)                                     ' szukaj w zmiennej Rs ciągu A1
    Ramka1 = Mid(rs1 , Ramka , 6)                               ' zwraca fragment tekstu ze zmiennej Rs
    
    Ramka8 = Instr(usart2 , A5)                                 ' szukaj w zmiennej Rs ciągu A5
    Ramka9 = Mid(usart2 , Ramka8 , 6)                           ' zwraca fragment tekstu ze zmiennej Rs
    
    If Ramka5 = "$GPRMC" Then                                   ' jesli zmienna Ramka1 =  "$GPRMC" wtedy
    '*****************************  obliczanie długości geograficznej
    La1 = Mid(rs3 , 18 , 2)                                     ' zwróć wartość 2 kolejnych pól licząc od znaku 18-go z ciągu Rs
    La2 = Mid(rs3 , 20 , 2)
    La3 = Mid(rs3 , 23 , 3)
    Lak = Mid(rs3 , 29 , 1)
    '*****************************  obliczanie szerokości geograficznej
    Lo1 = Mid(rs3 , 32 , 2)
    Lo2 = Mid(rs3 , 34 , 2)
    Lo3 = Mid(rs3 , 37 , 3)
    Lok = Mid(rs3 , 43 , 1)
    '*****************************  obliczanie prędkości
    Speed1 = Mid(rs3 , 45 , 3 )                                 'wartość 3 kolejnych pól licząc od znaku 45
    Speed2 = Instr(speed1 , Znaczek )                           'określa numer miejsca położenia ","
    Speed3 = Mid(speed1 , 1 , Speed2)
    Speed4 = Val(speed3)
    
    Speed5 = Speed4 * 1.852                                     ' prędkość jako string do wyświetlania
    
    Speed55 = Str(speed5)                                       ' prędkość jako string dla zapisu na Sd
    
    N_sig1 = Mid(rs3 , 10 , 1)                                  'wykrywa literę V, co oznacza brak ramki
    
    End If
    
    '***************************** ustawianie daty
    If Ramka8 = "data" Then                                     ' jesli zmienna Ramka1 =  "$GPGGA" wtedy
     Day1 = Mid(usart2 , 5 , 2 )
     Day = Val(day1)
     Month1 = Mid(usart2 , 7 , 2 )
     Month = Val(month1)
     Call Settime
    
    End If
    Waitms 199
    Rs1 = ""
    Usart2 = ""
    
    '***********************  Obsługa zapisu na SD
    
    Sub Write_to_sd()
    Local Errorcode As Byte                                     ''()
         Gbdriveerror = Driveinit()
        If Gbdriveerror = 0 Then
          Errorcode = Initfilesystem(1)
          If Errorcode <> 0 Then
             Blad_sd = 1
          Else
    
             Open "gps.txt" For Append As #3                    'otwórz plik pomiar.txt aby dopisać dane
             Write #3 , Data_czas , Gps_data , Speed55 , Sd     'zapisz dane: data, czas , odczyt temperatury
             Flush #3                                           'zapisz bufor pliku na karcie SD
             Close #3                                           'zamknij kanał transmisji sprzętowego urządzenia
             Blad_sd = 0                                        'ustaw zmienna na 0
          End If
        Else
          Blad_sd = 1
       End If
    
    End Sub
    


    Może jakieś sugestie ?
  • REKLAMA
  • #2 9561179
    Konto nie istnieje
    Konto nie istnieje  
  • REKLAMA
  • #3 9561236
    Elektronik_Kraków
    Poziom 13  
    Działa w wersji programu bez:
    
    Open "comd.7:9600,8,n,1" For Input As #2 
    

    czyli co 1 sekundę aktualizuje pozycje na LCD i jest OK

    Dołożenie drugiego ( programowego ) portu USART:
    
    Open "comd.7:9600,8,n,1" For Input As #2 
    

    powoduje, że LCD nic nie wyświetla, naciśnięcie Enter powoduje aktualizację wyświetlania na LCD, jeśli naciskam enter co 1 sekundę, to dane na LCD się zmieniają.
    Celem włączenie UART programowy ma być możliwość konfiguracji np. daty i czasu przez port RS232 z komputera ( przyszłościowo jakiś moduł GSM ).

    Pierwszy raz używam ( raczej próbuję użyć ) UART sprzętowy. Nie wiem, czy nie zrobiłem sobie zamieszania przez te kanały do zapisu na SD.

    -----------------------------------------
    Tzn. już wiem, że "oryginalny" UART programowy , czeka w pętli na kolejne bity transmisji i w tym czasie proc jest uziemiony, stąd te przerwy w odświeżaniu LCD
  • #4 9561968
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA