Witam!
Buduję urządzenie komunikujące się z PC poprzez port RS232. Zależy mi na jak najszybszej transmisji.
Aplikacja PC wysyła rozkaz TX do urządzenia, urządzenie odsyła zmierzone wartości w postaci ciągu:
dana1:dana2:dana3:dana4:dana5:dana6:dana7:dana8
za pomocą Bascomowej instrukcji Print.
Maksymalna szybkość jaką udaje mi się osiągnąć przy Atega16 i kwarcu 16MHz to około 5Hz. Aplikacja posiada suwak, którą mogę ustawić szybkość pobierania danych z urządzenia. Urządzenie wysyła komendę TX w interwale jaki ustawiam za pomocą suwaka, a następnie szybko odczytuje bufor RS232 i przekazuje dane do zmiennych.
W aplikacji zrobiłem okienko logowania dzięki któremu mogę obserwować cały odbierany string (dana1:dana2:dana3:dana4:dana5:dana6:dana7:dana8)
I widzę, że przy zwiększaniu szybkości powyżej 5Hz string urywa się po 4 czy piątej danej.
Widać - urządzenie nie zdążyło jeszcze wysłać wszystkich danych.
Kompiluję sobie program w Bascom AVR dla różnych wartości rezonatora kwarcowego, i obserwuję wartość BAUD error w raporcie pokompilacyjnym.
Kwarc 16MHz:
$baud = 38400 -> BAUD error: 0,16%
$baud = 57600 -> BAUD error: 2,08%
$baud = 115200 -> BAUD error: 3,55%
$baud = 128000 -> BAUD error: 2,34%
$baud = 256000 -> BAUD error: 2,34%
Widzę, że przy Atmega 16 taktowanego 16MHz nie wycisnę więcej niż 5Hz dla stringu zawierającego 8 danych.
Z ciekawości, wybrałem
$baud = 128000 i zacząłem zwiększać wartość rezonatora:
32MHz -> BAUD error: 2,34%
64MHz -> BAUD error: 0,8% (to już chyba nie najgorszy wynik?)
96MHz -> BAUD error: 0,27%
Niestety Atmega16 można taktować do 16MHz (trochę mało)
Czy ktoś ma pomysł na to, jak wydusić z Atmega16 większą transmisję, niż 38400 baud ?
Buduję urządzenie komunikujące się z PC poprzez port RS232. Zależy mi na jak najszybszej transmisji.
Aplikacja PC wysyła rozkaz TX do urządzenia, urządzenie odsyła zmierzone wartości w postaci ciągu:
dana1:dana2:dana3:dana4:dana5:dana6:dana7:dana8
za pomocą Bascomowej instrukcji Print.
Maksymalna szybkość jaką udaje mi się osiągnąć przy Atega16 i kwarcu 16MHz to około 5Hz. Aplikacja posiada suwak, którą mogę ustawić szybkość pobierania danych z urządzenia. Urządzenie wysyła komendę TX w interwale jaki ustawiam za pomocą suwaka, a następnie szybko odczytuje bufor RS232 i przekazuje dane do zmiennych.
W aplikacji zrobiłem okienko logowania dzięki któremu mogę obserwować cały odbierany string (dana1:dana2:dana3:dana4:dana5:dana6:dana7:dana8)
I widzę, że przy zwiększaniu szybkości powyżej 5Hz string urywa się po 4 czy piątej danej.
Widać - urządzenie nie zdążyło jeszcze wysłać wszystkich danych.
Kompiluję sobie program w Bascom AVR dla różnych wartości rezonatora kwarcowego, i obserwuję wartość BAUD error w raporcie pokompilacyjnym.
Kwarc 16MHz:
$baud = 38400 -> BAUD error: 0,16%
$baud = 57600 -> BAUD error: 2,08%
$baud = 115200 -> BAUD error: 3,55%
$baud = 128000 -> BAUD error: 2,34%
$baud = 256000 -> BAUD error: 2,34%
Widzę, że przy Atmega 16 taktowanego 16MHz nie wycisnę więcej niż 5Hz dla stringu zawierającego 8 danych.
Z ciekawości, wybrałem
$baud = 128000 i zacząłem zwiększać wartość rezonatora:
32MHz -> BAUD error: 2,34%
64MHz -> BAUD error: 0,8% (to już chyba nie najgorszy wynik?)
96MHz -> BAUD error: 0,27%
Niestety Atmega16 można taktować do 16MHz (trochę mało)
Czy ktoś ma pomysł na to, jak wydusić z Atmega16 większą transmisję, niż 38400 baud ?