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,072
Dołączył: 02-02-2009
Post: #121
RE: Programowanie ARM, nauka, środowiska programistyczne IDE
Wiem, że w naszym gronie jest wielu kolegów ze sporą wiedzą i doświadczeniem w programowaniu w C, dlatego wszelkie uwagi w trakcie kursu są cenne, oby było ich coraz więcej.
O makrach warto było napisać ponieważ często spotykamy je w wielu kodach i warto znać ten mechanizm aby w pełni zrozumieć przeglądane kody. Zgoda, to samo można zrobić funkcją inline ale początkujący programiści nie bardzo wiedzą jaka jest różnica pomiędzy zwykłą funkcją, funkcją static a funkcją inline.

Ze względu na małe zainteresowanie kursem mam taką propozycję:

1/ Zróbmy jakiś konkretny, prosty przyrząd, sterownik (np. miernik SWR, miernik mocy typu OZ2CPU, prosty sterownik do radia, prosty analizator obwodów z TFT typu NA02, analizator antenowy typu VK5JST, inne propozycje). Może praktyczne zastosowanie modułu i gotowy kod przyciągnie dodatkowych kolegów chętnych do zbudowania i testowania takiego urządzenia.

Do takiego projektu potrzebujemy:
- konfigurację i obsługę GPIO (mamy);
- kanał szeregowy (mamy);
- wyświetlacz (prawie gotowy);
- przetworniki ADC (do zrobienia);
- obsługa DDS lub Si5351 (do zrobienia);
- panel dotykowy (do zrobienia).


Może ktoś z Kolegów ma już opanowane brakujące elementy lub większe fragmenty kodu możliwe do przeniesienia na DiscoF429. Dużą zaletą takiego podejścia jest pokazanie sposobu połączenia obsługi wielu układów peryferyjnych w jednym programie. Fajnie byłoby opracować kilka praktycznych aplikacji na ten moduł i zamieścić na forum.

2/ Warto byłoby do modułu DiscoF429 dorobić płytkę bazową (złącza 2mm -> 2,54mm) + pola do lutowania + dadatki. Przy pojedynczych połączeniach kabelki są OK ale w miarę ich przybywania staje się to bardzo niewygodne. Na takim module możemy umieścić dodatkowe elementy: buzer, złącza enkoderów, złącze klawiatury, rejestry szeregowe, bufory dla ADC, złącze pod DDS, itd. do ustalenia.

Proszę o opinie na ten temat, czy znajdą się chętni do realizacji takiego pomysłu.

73 Adam
30-07-2016 20:46
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SQ8MVY Offline
Paweł
****

Liczba postów: 724
Dołączył: 30-07-2011
Post: #122
RE: Programowanie ARM, nauka, środowiska programistyczne IDE
(30-07-2016 20:46)SP5FCS napisał(a):  ....Warto byłoby do modułu DiscoF429 dorobić płytkę bazową (złącza 2mm -> 2,54mm) + pola do lutowania + dadatki. Przy pojedynczych połączeniach kabelki są OK ale w miarę ich przybywania staje się to bardzo niewygodne....

Ciekawa propozycja. Jednak przy analizie kosztów wykonania takiej "bazy", można przy okazji spojrzeć na takiego gotowca.
Co prawda, nie ma na takiej bazie dodatkowych układów, ale jest dostęp do zwykłych złącz 2.54mm z pogrupowanymi sygnałami interfejsów stm-a.

Złącza szpilkowe na stm429I-Disc1 są w normalnym rozstawie 2.54mm


No cóż, cicho, pusto, jakoś bez ruch w poście..

Więc wkleję takie małe coś. Prostą obsługę zintegrowanego LCD. Na chwilę obecną komunikacja tylko przez SPI, ale pędzonym chyba na max prędkości.

Komentarzy w przykładzie jest chyba dosyć dużo.....
Może będzie jakiś odzew.....



.zip  Obsluga_LCD.zip (Rozmiar: 689.13 KB / Pobrań: 611)

73 Paweł
(Ten post był ostatnio modyfikowany: 01-08-2016 21:59 przez SQ8MVY.)
31-07-2016 12:08
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP5FCS Offline
Adam
*****

Liczba postów: 1,072
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ń: 614)

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

Liczba postów: 253
Dołączył: 01-09-2014
Post: #124
RE: Programowanie ARM, nauka, środowiska programistyczne IDE
Przetwornik AC na Discovery może pracować z prędkością 2400000 pomiarów na sekundę.
Stosując "undersampling" można by pokusić się o prosty odbiornik na 80m (na początek DSB)
Potrzebny byłby filtr pasmowy, wzmacniacz w.cz+zabezpieczenie wejścia przetwornika, antena, słuchawki, Discovery i program.

Andrzej
03-08-2016 16:42
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP6IFN Offline
Ryszard
****

Liczba postów: 456
Dołączył: 23-03-2010
Post: #125
RE: Programowanie ARM, nauka, środowiska programistyczne IDE
Cytat:Na bazie takiego "szkieletu programu" możemy spokojnie zrobić pierwszy prosty przyrząd, tylko zainteresowania ciągle brak.
Adamie!
To okres wakacyjny pewnie ma w tym swój udział. Koledzy z qToxa obiecali mi że zainteresowanie się zwiększy po okresie wakacyjnym. Ja na bazie dotychczasowych wiadomości usilnie ćwiczę, przerabiam i kombinuję jak mogę, bo zależy mi na tym kursie.

(03-08-2016 16:42)SP6LUN napisał(a):  Przetwornik AC na Discovery może pracować z prędkością 2400000 pomiarów na sekundę.
Stosując "undersampling" można by pokusić się o prosty odbiornik na 80m (na początek DSB)
Potrzebny byłby filtr pasmowy, wzmacniacz w.cz+zabezpieczenie wejścia przetwornika, antena, słuchawki, Discovery i program.
Tutaj już jest radio, w zakładce ARM RADIO http://weaksignals.com/ ale górna częstotliwość to 900 kHz
Rysio!
(Ten post był ostatnio modyfikowany: 03-08-2016 17:33 przez SP6IFN.)
03-08-2016 17:26
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP5FCS Offline
Adam
*****

Liczba postów: 1,072
Dołączył: 02-02-2009
Post: #126
RE: Programowanie ARM, nauka, środowiska programistyczne IDE
(03-08-2016 16:42)SP6LUN napisał(a):  Przetwornik AC na Discovery może pracować z prędkością 2400000 pomiarów na sekundę.
Stosując "undersampling" można by pokusić się o prosty odbiornik na 80m (na początek DSB)

Propozycja kusząca ale nie na tym etapie kursu, ponieważ taki projekt jak ARM_SDR wymaga dużo więcej wiedzy niż sam procesor czy język C. Do tego dochodzi kodek, filtry, DSP, demodulacja, automatyka itd. Na bezpośrednie samplowanie pasma 80m to nawet ten STMF429 podkręcony do 200Mhz nie wystarczy. Te próbki trzeba potem obrobić aby było z czego wygenerować sygnał akustyczny. Koledze I2PHD udało się osiągnąć na tym module jedynie 900kHz, dlatego raczej należy pomyśleć o przesunięciu pasma w dół, może tak jak sugerował Piotr SP9FKP w okolice pośredniej 465kHz.
Moim zdaniem na tym etapie nauki to zbyt ambitny projekt, szczególnie że chętnych do tworzenia kodu nie widać. W tej chwili trzeba rozpracować kolejne peryferia modułu i być może na tym co już mamy zrobić coś prostszego.
----------------------------------------------------------------------------------------------------------
Według specyfikacji czasów wyświetlacz ILI9341 powinien poprawnie pracować przy zegarze SPI do 10MHz. Testy na module Pawła i moim wykazały, że chodzi spokojnie przy 21 a nawet 42MHz. Przy obsłudze poprzez SPI zegar ma największy wpływ na czas obsługi elementów graficznych.


Załączone pliki Miniatury
İmage

73 Adam
08-08-2016 14:36
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP6LUN Offline
Andrzej
****

Liczba postów: 253
Dołączył: 01-09-2014
Post: #127
RE: Programowanie ARM, nauka, środowiska programistyczne IDE
Mój moduł chodzi tylko na 21MHz. Przy 42MHz biały ekran.

Andrzej
08-08-2016 18:15
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP5FCS Offline
Adam
*****

Liczba postów: 1,072
Dołączył: 02-02-2009
Post: #128
RE: Programowanie ARM, nauka, środowiska programistyczne IDE
Andrzej napisz coś więcej:
która wersja Disco, jakie demo, czy uruchamiasz pod deggugerem czy już zaprogramowany moduł poprzez włączenie zasilania. Zauważyłem że czasem pod debbugerem są problemy a samodzielnie moduł działa OK.

73 Adam
08-08-2016 18:41
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP6LUN Offline
Andrzej
****

Liczba postów: 253
Dołączył: 01-09-2014
Post: #129
RE: Programowanie ARM, nauka, środowiska programistyczne IDE
Mój moduł to Disc1. Na razie jeszcze nie uźywam debugera. Wgrywam binarkę przez zamapowany dysk.
Program to Demo_IL9341.
Jeżeli mój moduł okaże się jedynym niedziałającym przy spiclk=42MHz, będę szukał przyczyny - może zasilanie?.

Andrzej
08-08-2016 19:17
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP5FCS Offline
Adam
*****

Liczba postów: 1,072
Dołączył: 02-02-2009
Post: #130
RE: Programowanie ARM, nauka, środowiska programistyczne IDE
Z Twoim modułem wszystko jest OK.
Moje demo pracuje tylko do 21MHz, Pawła pracuje również na 42MHz. Masze funkcje trochę się różnią sposobem sterowania wyświetlacza i oczekiwania na wolny bufor SPI, stąd ta różnica. Pierwotnie uruchamiałem SPI z zegarem 10MHz ponieważ na tym samym SPI chciałem robić próby z rejestrami szeregowymi na 74HC595. Drugą przyczyną może być ustawiony poziom optymalizacji kompilatora, dla bardzo szybkich funkcji trzeba wyłączyć optymalizację kodu.

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


Skocz do:


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