Witam
Piszę na atmedze8 w bascomie program do odczytywania danych z odbiornika GPS. GPS jest podłączony RSem do Atmegi, obsługuje go sprzętowy UART. Transmisja jest realizowana z prędkością 4800, megę taktuje zewnętrzny kwarc 7,3728 Mhz (ale na wewnętrzym 4 Mhz też próbowałem).
Oto kod obcięty o parę chwilowo nieistotnych rzeczy (definicje zmiennych, $crystal, $baud):
Sprawa wygląda prosto. GPS nadaje co 1 sekundę taki ciąg danych:
Program odczytuje z bufora kolejne znaki i wysyła je na Tx, celem sprawdzenia co tak naprawdę odczytuje. Tx Atmegi podłączyłem do komputera i widzę dane na terminalu.
Jeśli przerwanie jest wyłączone wszystkie dane ładnie przechodzą. Jeśli tylko włączę przerwanie, a w nim użyję np. funkcji LCD do pisania na wyświetlaczu, cześć danych co jakiś czas się gubi. Im dłuższy tekst wysyłam do wyświetlacza lub im częściej licznik się przepełnia tym więcej danych gubię. Jak rozumiem chodzi o to, że przerwanie timera ma większy priorytet niż te od UARTA, więc co jakiś czas UART gubi napływające dane.
Jak w takim razie zrobić, żebym mógł korzystać z timera, a UART odbierał wszystkie dane?
Pozdrawiam,
m4jkel
Piszę na atmedze8 w bascomie program do odczytywania danych z odbiornika GPS. GPS jest podłączony RSem do Atmegi, obsługuje go sprzętowy UART. Transmisja jest realizowana z prędkością 4800, megę taktuje zewnętrzny kwarc 7,3728 Mhz (ale na wewnętrzym 4 Mhz też próbowałem).
Oto kod obcięty o parę chwilowo nieistotnych rzeczy (definicje zmiennych, $crystal, $baud):
Config Serialin = Buffered , Size = 80
Enable Interrupts
Config Timer1 = Timer , Prescale = 64
Enable Timer1 : On Timer1 Co1s
Cls
Do
If Ischarwaiting() = 1 Then
Znak = Inkey()
Print Chr(znak) ;
End If
Loop
End
Co1s:
Cls
Timer1 = 3036
Locate 1 , 1
Lcd "a"
Return
Sprawa wygląda prosto. GPS nadaje co 1 sekundę taki ciąg danych:
$GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6AProgram odczytuje z bufora kolejne znaki i wysyła je na Tx, celem sprawdzenia co tak naprawdę odczytuje. Tx Atmegi podłączyłem do komputera i widzę dane na terminalu.
Jeśli przerwanie jest wyłączone wszystkie dane ładnie przechodzą. Jeśli tylko włączę przerwanie, a w nim użyję np. funkcji LCD do pisania na wyświetlaczu, cześć danych co jakiś czas się gubi. Im dłuższy tekst wysyłam do wyświetlacza lub im częściej licznik się przepełnia tym więcej danych gubię. Jak rozumiem chodzi o to, że przerwanie timera ma większy priorytet niż te od UARTA, więc co jakiś czas UART gubi napływające dane.
Jak w takim razie zrobić, żebym mógł korzystać z timera, a UART odbierał wszystkie dane?
Pozdrawiam,
m4jkel