Ankieta: Jaki system operacyjnym preferujesz
Ankieta jest zamknięta.
Windows 60.78% 31 60.78%
Linux 31.37% 16 31.37%
MAC/OS 7.84% 4 7.84%
Inny 0% 0 0%
Razem 51 głosów 100%
*) odpowiedź wybrana przez Ciebie [Wyniki ankiety]

Odpowiedz 
 
Ocena wątku:
  • 1 Głosów - 5 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Programowanie ARM, nauka, środowiska programistyczne IDE
SP5FCS Offline
Adam
*****

Liczba postów: 1,071
Dołączył: 02-02-2009
Post: #123
RE: Programowanie ARM, nauka, środowiska programistyczne IDE
Demo Pawła to duży krok do przodu pozwalający nam wreszcie wyświetlać efekty pracy programu. W mojej obsłudze wyświetlacza zamiast makra zastosowałem funkcje static inline do sterowania pinami CS, WRX (DCX). Efekt jest identyczny a kod jak dla mnie bardziej czytelny. Warto jawnie opisać stany na pinie WRX-DCX (Data, Command) aby nie trzeba było pamiętać co jest czym ustawiane.

Typ inline oznacza, że ciało funkcji będzie wstawiane do programu w każde miejsce wywołania funkcji. Funkcja nie jest wywoływana tak jak tradycyjne funkcje poprzez skok, nie jest generowany klasyczny prolog i epilog funkcji. Koszt w kodzie i czasie wykonania takiej funkcji jest dokładnie taki sam jak tego co znajduje się w środku funkcji.

Typ static oznacza, że jest to prywatna funkcja tylko dla moduły wyświetlacza, funkcja nie jest dostępna w innych modułach programu.

Kod:
//////////////////////////////////////////////////////////////////////////////////////////
// aktywacja kontrolera LCD
inline static void lcd_cs_on(void)
{
    LCD_CS_GPIO->ODR &= ~ LCD_CS_PIN;
}

//////////////////////////////////////////////////////////////////////////////////////////
// blokowanie kontrolera LCD
inline static void lcd_cs_off(void)
{
    LCD_CS_GPIO->ODR |=   LCD_CS_PIN;
}

//////////////////////////////////////////////////////////////////////////////////////////
// dane dla kontrolera LCD
inline static void lcd_wrx_data(void)
{
    LCD_WRX_GPIO->ODR |=   LCD_WRX_PIN;
}

//////////////////////////////////////////////////////////////////////////////////////////
// rozkaz dla kontrolera LCD
inline static void lcd_wrx_command(void)
{
    LCD_WRX_GPIO->ODR &= ~ LCD_WRX_PIN;
}

Zamiast funkcji sprint warto napisać własną aby działała szybciej, dla częstotliwości można usunąć dodatkowo obsługę liczb ujemnych.
Nie musimy wtedy wczytywać dodatkowego modułu <stdio.h>.

Kod:
//////////////////////////////////////////////////////////////////////////////////////////
// wyswietla liczbe int32 w postaci cyfr
// wspolrzedne X, Y dla cyfry jednosci, kolejne cyfry na LCD w lewo

void lcd_int32( uint16_t x, uint8_t y, int32_t value)
{
    uint8_t    n = 0;
    char    buf[9];
    char    znak = '+';

    if (value < 0)
            {
                znak='-';
                value = 0 - value;
            }
    buf[n++] = '\000';                  //ogranicznik wyswietlania cyfr
    do  {
        buf[n++] = (value % 10) + '0';  //kolejne cyfry od najnizszej pozycji
        value = value / 10;
        } while (value != 0);
    buf[n] = znak;

    while (buf[n] != '\000')
        {
        lcd_char_16x24(x-(n*16), y, buf[n]);    //wg. wymaganego fontu
        --n;
        }
}

Na zdjęciu demo obsługi wbudowanego wyświetlacza ILI9341, symulacja prostego sterownika radia. Górną częstotliwość możemy zmieniać enkoderem, dolna "udaje" skaner. Niebieski klawisz przywraca skaner do nastawy 3700khz. Na dole ekranu przykłady kolorowych ikon. W tym programie jest wszystko z poprzednich zadań. Paczka z projektem w załączniku ( trzy fonty + kilka ikon).
Na bazie takiego "szkieletu programu" możemy spokojnie zrobić pierwszy prosty przyrząd, tylko zainteresowania ciągle brak.


Załączone pliki Miniatury
İmage

.zip  Demo_ILI9341.zip (Rozmiar: 235.38 KB / Pobrań: 491)

73 Adam
03-08-2016 15:19
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Wiadomości w tym wątku
RE: Programowanie ARM, nauka, środowiska programistyczne IDE - SP5FCS - 03-08-2016 15:19

Skocz do:


Użytkownicy przeglądający ten wątek: 1 gości