Programowanie w języku C w środowisku AVR Studio4 - Wersja do druku +- HomeMade (http://sp-hm.pl) +-- Dział: Oprogramowanie (/forum-84.html) +--- Dział: Technika programowania mikroprocesorów (/forum-85.html) +--- Wątek: Programowanie w języku C w środowisku AVR Studio4 (/thread-1161.html) |
RE: Programowanie w języku C w środowisku AVR Studio4 - SP5IWI - 23-03-2012 23:35 Cytat:Ale i tak zignorujemy caly port C... DZIAŁA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Przerobiłem tak "jak Pan Nauczyciel" kazał i jest OK,dzięki Marcin.Ja to próbowałem robić sam wcześniej ale powielałem ciągle ten sam błąd.Źle liczyłem piny wyj portu DDSa.LCD i KEYB liczyłem od "0" i te działały dobrze a DDSa liczyłem od "1" zamiast od "0" i ciągle było źle. Janek sp5iwi RE: Programowanie w języku C w środowisku AVR Studio4 - SP5IWI - 26-03-2012 20:45 Cytat:DZIAŁA!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Wyłączyłem JTAGa i na PORTC też śmiga jak "Pan Profesor" pokazywał Janek sp5iwi RE: Programowanie w języku C w środowisku AVR Studio4 - SP4EJT - 05-04-2012 12:57 Kilka osób na mnie krzyczało że język C jest skomplikowany i że lepiej bascoma trenować, a tu niespodzianka - mimo że narobiłem błedów program działa !!! Janek to potwierdził, więc oprogramowanie duuużo wybacza użytkownikowi i wcale nie jest tak strasznie jak niektórzy twierdzili. Wiem że dawno powinienem poprawić błędy o których była mowa wcześniej - zrobię to ... jakoś nie mogę się przybrać. Mam natomiast pytanie co do dalszej części drążenia języka C w Atmegach: Czy pracujemy nad "upiększeniem i upraktycznieniem" sterownika syntezy DDS, aby była syntezą z prawdziwego zdarzenia czy robimy np. obsługę konwertera Analogowo-Cyfrowego lub Timera, a może coś z Przerwaniami, a może ktoś ma inny pomysł ???? A może już nie trzeba ciągnąć dalej bo to wystarczyło Wam do wystartowania i pociągnięcia nauki we własnym zakresie ??? .. to byłoby najlepsze Proszę każdego zainteresowanego o wypowiedź. RE: Programowanie w języku C w środowisku AVR Studio4 - SP5FCS - 06-04-2012 11:43 Tak właściwie to po co nam ta UNIA ? Korzyści z UE dla mnie też są dyskusyjne ale unia jako typ danych w języku C jest bardzo silnym i przydatnym narzędziem. Dobrym przykładem zastosowania może być funkcja wysyłania obliczonej nastawy FTW [int32] do układu DDS. W tym wątku zastosowano metodę maskowania pojedynczego bitu danych na 4 bajtowej zmiennej FTW, metoda mocno obciążająca procesor. Kod: void ftw_DDS(unsigned long int FTW) Inna metodą jest użycie funkcji wysyłającej pojedyncze bajty do DDSa. Najczęściej dostęp do kolejnych bajtów jest realizowany poprzez przesuwanie zmiennej FTW o 24,16,8 bitów, metoda zdecydowanie lepsza ale również kosztowna dla procesora. Kod: SPI_MasterTransmit(0x04); Najszybszą metodą dostępu do wybranych bajtów zmiennej FTW jest zdefiniowanie unii. Kod: union // unia dla FTW Najogólniej powyższa unia FTW to taka zmienna, która ma dwa różne formaty danych w tym samym miejscu pamięci, raz jest to integer na 32bitach oraz ta sama zmienna ale jako 4 oddzielne bajty danych. Po obliczeniach wartość FTW[32] przypisujemy do FTW.reg32 a w funkcji wysyłania pobieramy bajty z 4 bajtowej tablicy FTW.reg8[x] podając numer interesującego nas bajtu. Jeśli już uczymy się języka C to warto wykorzystywać "jego dobrodziejstwa" bo np. Bascom tego nie potrafi. RE: Programowanie w języku C w środowisku AVR Studio4 - SP3SWJ - 06-04-2012 14:12 (06-04-2012 11:43)SP5FCS napisał(a): ... Bascom jest wręcz prostackim językiem... i w nim wysłanie danych do DDSa to sprawa tez prostacka.. Kod: Config Portb.0 = Output no ale to nie temat o bascomie... ale może znajdziecie w C równie prosta metodę co w Bascomie... RE: Programowanie w języku C w środowisku AVR Studio4 - SP5FCS - 21-04-2012 9:31 Jarek, prostota kodu oraz gotowe funkcje to największe zalety Bascoma, szczególnie na początku nauki programowania. Jeśli do języka C dostarczymy odpowiedni zestaw funkcji w postaci dodatkowej biblioteki to program może być równie prosty. Wadą funkcji Shiftout Bascoma jest programowa obsługa interfejsu SPI. Sprzętowa obsługa jest prostsza, szybsza i zajmuje mniej kodu. zaletą jest to, że możemy obsługiwać SPI na dowolnych pinach albo mieć kilka niezależnych interfejsów SPI. Struktury Bardzo silnym narzędziem dla programistów w języku C są struktury danych. Często w złożonych aplikacjach musimy operować na blokach danych składających się z wielu parametrów. Jako przykład weźmy nastawy radia na paśmie. Kiedy zmieniamy pasmo musimy zmienić również: antenę, modulację, tłumik wejściowy, wstęgę a może i nastawę automatyki, dsp, itd. Wielokrotne przepisywanie kilkunastu parametrów jest kłopotliwe, kod jest rozbudowany i nieczytelny. Tu z pomocą przychodzi możliwość zdefiniowania struktury w postaci wieloparametrowej zmiennej. Kod: typedef struct { Dalsze operacje odbywają się już na całej strukturze (zapis, odczyt, przepisywanie) lub na jej wybranych elementach gdy pobieramy lub modyfikujemy jedno ustawienie na paśmie. RE: Programowanie w języku C w środowisku AVR Studio4 - SP5FCS - 05-05-2012 16:46 Wygląda na to, że albo zainteresowanie programowaniem w C mocno zmalało albo nadszedł czas na inne rodzaje zainteresowań (działki, łódki, rowery z silnikami i bez). Podczas pisania oprogramowania w C bardzo często popełniamy te same proste błędy. Może warto przy okazji tego kursu napisać kilka postów na ten temat aby inni ich nie popełniali. Czasem są to tak proste i oczywiste błędy a mimo to trudno jest je zlokalizować w programie. # prostym i częstym błędem jest zły sposób indeksowania tablicy. Jeśli tablica ma np. rozmiar 10 tablica[10], to tablica[0] jest pierwszym elementem tablicy a tablica[9] ostatnim. Próba zapisu/odczytu elementu tablica[10] spowoduje poranie/zapis danych poza tablicą. # częstym błędem w wyrażeniach warunkowych jest umieszczanie jednego znaku '=' zamiast dwóch '=='. Wygląda bardzo podobnie i naturalnie z lekcji matematyki, kompilator nie zaprotestuje ale wynik będzie zupełnie inny od zamiaru programisty. if (x=1) oblicz(); ...........................zamiast................if(x==1) oblicz(); W pierwszym przypadku zamiast sprawdzenia warunku zmienna X przyjmie wartość równą 1. RE: Programowanie w języku C w środowisku AVR Studio4 - SP4EJT - 08-05-2012 14:42 Witam po dłuuuugiej przerwie ... pozwolę sobie zacytować wiadomość prywatną od Andrzeja SP3GTG (za jego wcześniejszym pozwoleniem) Cytat:Cześć Marcin Mam nadzieję, iż będziesz kontynuował temat syntezy na AD9951.Dobrze, że ktoś w końcu napisał .... Jeśli ktoś był trochę na mnie zły że zniknąłem z tego tematu to tylko jego wina. Dwukrotnie zadawałem pytania co dalej mam wałkować czy syntezę czy coś innego - ale pozostało to bez echa, więc czułem się tu niepotrzebny. Teraz wiem, że dalsza część kursu będzie dla Andrzeja i pewnie Janka, który pokazał swoja aktywność To tyle w kwestii wytłumaczenia się ... Znany wszystkim nam Adam ileś postów wcześniej podpowiedział mi fajne rozwiązanie wysyłania 32bitowego FTW do DDSa przez port SPI - zyskamy na prędkości naszej syntezy. Na razie nie będę zajmował was portem SPI - zrobię to za jakiś czas. Teraz powiem/pokażę Wam jak działa unia. Nasza unia będzie łączyła w sobie dwie zmienne: zmienną 32-bitową oraz tablicę 8-bitowych wartości o wielkości 4 elementów. Kod: union Kod: union { unsigned long int u32; unsigned char u8[4]; } FTW; utwórzcie sobie nowy projekt ( przymusowa powtórka materiału ) oczywiście w języku C. W utworzony projekt wklejcie sobie kod: Kod: int main(void) [attachment=5280] teraz skompilujcie i uruchomcie debugowanie [attachment=5281] Jeśli nie widzicie okna MEMORY to włączie je [attachment=5282] Okno memory ustawcie na DATA i przewińcie paskiem do samego dołu, Wciskajcie pojedynczo klawisz F11 i obserwujcie co sie dzieje w miejscu gdzie na rysunku jest AF AF AF AF czerwoną czcionką. [attachment=5283] Widać że Zmienna FTW.u32 zmienia 4 bajty pamięci, a zmienna FTW.u8[x] po jednym bajcie wybranym przez index tablicy "x". W programie naszej syntezy wykorzystamy to tak: 1. Obliczymy FTW tak jak do tej pory lecz zmienna FTW zostanie zastąpiona zmienną FTW.u32 2. Nie będziemy wysyłać, jak do tej pory, całego FTW lecz bajt po bajcie wykorzystując 4 bajty tablicy FTW.u8[x] (gdzie x to index elementu tablicy) narazie poprzez funkcję bajt_DDS(unsigned char bobo), którą mamy w pliku obsługi AD9951. Funkcję ftw_DDS(unsigned long int FTW) usuniemy bo przy zastosowaniu unii nie będzie potrzebna. Zmieniony w ten sposób program dam wam później bo właśnie kończy się mój czas. Wezmę ostatni umieszczony przeze mnie gotowiec (ten z postu #118, plik nowy.zip) i go zmienię, zmiany będą "okomentowane" aby było wyraźnie je widać. Jeśli ktoś nie rozumie co się dzieje z tą unią to śmiało piszcie - zrobie jeszcze bardziej obrazowe wyjaśnienie. Do potem Acha... te okno MEMORY to podgląd wewnętrznej pamięci RAM Atmegi (symulacja oczywiście), dzięki temu szczegółowo możemy znać poczynania naszej Atmegi. Zainteresujcie się debugowaniem bo warto - sam poznałem to około miesiąc temu. RE: Programowanie w języku C w środowisku AVR Studio4 - SP4EJT - 11-05-2012 12:58 poniżej program-gotowiec, który zawiera zmiany o których napisałem w powyższym poście. Jeszcze nie przetestowałem, postaram się zrobić to wieczorem, ale może np. Janek SP5IWI wypróbuje Następnym krokiem będzie przygotowanie portu SPI Atmegi do pracy z naszym programem: funkcję wysyłającą bajt do DDSa zamienimy na kod który wyśle bajt przez SPI... RE: Programowanie w języku C w środowisku AVR Studio4 - SP5FCS - 12-05-2012 9:54 Marcin, nie znam dalszego programu tego kursu i nie chciałbym wpływać na jego zmianę ale od początku warto aby był porządek w przekazywanej wiedzy. Jeśli budujemy program oparty na wielu plikach źródłowych to od początku trzeba to robić tak, jak jest przyjęte w języku C. Czym innym jest plik źródłowy a czym innym plik nagłówkowy. Samo dodanie rozszerzenia ***.h nie czyni z niego pliku nagłówkowego, pisałem o tym wcześniej. Plik źródłowy zawiera definicje zmiennych oraz funkcji, wszystko co jest potrzebne do poprawnego skompilowania wydzielonego modułu oprogramowania. Plik źródłowy często wczytuje na początku własny plik nagłówkowy. Plik nagłówkowy zawiera tylko to co programista chce udostępnić na zewnątrz modułu, definicje pinów, stałych, deklaracje zmiennych, prototypy funkcji które mają być widoczne w innych modułach po wczytaniu pliku nagłówkowy. Zasięg zmiennych Kolejnym bardzo ważnym zagadnieniem jest zasięg zmiennych (zmienne globalne, lokalne). Już podczas powstawanie pierwszej funkcji musimy mieć świadomość jakie zmienne będą dostępne w całym programie a jakie tylko w "ciele" funkcji. Zasięg zmiennych jest również mocno powiązany w plikami nagłówkowymi. Bez zrozumienia tych dwóch zagadnień nie da się poprawnie budować programów w języku C. Może warto to wszystko uporządkować zgodnie z przyjętymi zasadami. |