Koleżankom i Kolegom Radioamatorom, Krótkofalowcom,
Konstruktorom i Waszym Rodzinom – w tych trudnych czasach –
Zdrowych, Spokojnych i Pogodnych Świąt Bożego Narodzenia oraz
Szczęśliwego Nowego Roku

Życzy Zespół Home Made


Odpowiedz 
 
Ocena wątku:
  • 3 Głosów - 3.33 Średnio
  • 1
  • 2
  • 3
  • 4
  • 5
Programowanie w języku C w środowisku AVR Studio4
SP5IWI Offline
Janek
*

Liczba postów: 32
Dołączył: 01-02-2009
Post: #141
RE: Programowanie w języku C w środowisku AVR Studio4
Cytat:Ale i tak zignorujemy caly port C...
Sprobuj zrobic tak... Skonfiguruj:
- wyswietlacz na porcie D
- przyciski na porcie B
- DDS na port A ,

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
(Ten post był ostatnio modyfikowany: 23-03-2012 23:36 przez SP5IWI.)
23-03-2012 23:35
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP5IWI Offline
Janek
*

Liczba postów: 32
Dołączył: 01-02-2009
Post: #142
RE: Programowanie w języku C w środowisku AVR Studio4
Cytat: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.


Wyłączyłem JTAGa i na PORTC też śmiga jak "Pan Profesor" pokazywał
Janek sp5iwi
26-03-2012 20:45
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP4EJT Offline
Marcin
****

Liczba postów: 340
Dołączył: 06-05-2011
Post: #143
RE: Programowanie w języku C w środowisku AVR Studio4
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 Wink
Proszę każdego zainteresowanego o wypowiedź.
05-04-2012 12:57
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: #144
RE: Programowanie w języku C w środowisku AVR Studio4
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)
{
    bajt_DDS(0x04);
    unsigned char i;
    for(i=0; i<32; i+=1)     // pętla wykonująca polecenia 32 razy - czyli tyle ile bitów ma "słowo częstotliwości"
    {
       if(FTW&0x80000000)    
       { DDS_PORT = DDS_PORT|(1<<DDS_SDIO); }  
       else        
       { DDS_PORT = DDS_PORT&~(1<<DDS_SDIO); }  
       DDS_PORT = DDS_PORT|(1<<DDS_SCLK);  
       DDS_PORT = DDS_PORT&~(1<<DDS_SCLK);  
       if(i==15)   { DDS_PORT = DDS_PORT&~(1<<DDS_UPDATE); }    // I/O UPDATE w stan niski
       if(i==31)   { DDS_PORT = DDS_PORT|(1<<DDS_UPDATE); }   // I/O UPDATE w stan wysoki
       FTW = FTW << 1;    
    }
}

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);
    SPI_MasterTransmit(FTW>>24);
    SPI_MasterTransmit(tFTW>>16);
    SPI_MasterTransmit(FTW>>8);
    SPI_MasterTransmit(FTW);

Najszybszą metodą dostępu do wybranych bajtów zmiennej FTW jest zdefiniowanie unii.

Kod:
union                    // unia dla FTW
    {
    unsigned long int reg32;
    unsigned char reg8[4];
    } 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.

73 Adam
06-04-2012 11:43
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP3SWJ Offline
Jarek
****

Liczba postów: 653
Dołączył: 20-03-2010
Post: #145
RE: Programowanie w języku C w środowisku AVR Studio4
(06-04-2012 11:43)SP5FCS napisał(a):  ...
... Jeśli już uczymy się języka C to warto wykorzystywać "jego dobrodziejstwa" bo np. Bascom tego nie potrafi.


Bascom jest wręcz prostackim językiem... i w nim wysłanie danych do DDSa to sprawa tez prostacka..

Kod:
Config Portb.0 = Output
Dds_fqud Alias Portb.0

Config Portd.4 = Output
Dds_data Alias Portd.4

Config Portd.5 = Output
Dds_clock Alias Portd.5


Dim Ddstuningword As Long
Dim Ddsregaddress As Byte

Sub Sendddstuningword(ddstuningword As Long)
  Ddsregaddress = &B0000100
  Shiftout Dds_data , Dds_clock , Ddsregaddress , 1 , 8

  Shiftout Dds_data , Dds_clock , Ddstuningword , 1 , 32

  Set Dds_fqud
  nop
  Reset Dds_fqud

End Sub
[/quote]


no ale to nie temat o bascomie... ale może znajdziecie w C równie prosta metodę co w Bascomie...
06-04-2012 14:12
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: #146
RE: Programowanie w języku C w środowisku AVR Studio4
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  {      
                s32 freq_tx;
                s32 freq_rx;
                 u8 step;                                                  
                 u8 antena;
                 u8 att;
                 u8 filtr;                
                 u8 modulacja;  
                 u8 agc;                                  
                } band_struc;

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.

73 Adam
21-04-2012 9:31
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP5FCS Offline
Adam
*****

Liczba postów: 1,072
Dołączył: 02-02-2009
Post: #147
RE: Programowanie w języku C w środowisku AVR Studio4
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.

73 Adam
05-05-2012 16:46
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP4EJT Offline
Marcin
****

Liczba postów: 340
Dołączył: 06-05-2011
Post: #148
RE: Programowanie w języku C w środowisku AVR Studio4
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.
Zaliczyłem dotychczasowe lekcje i wszystko do ostatniej zawsze działało mi bez problemu. Nie chwaliłem się tym na forum bo brak mi czasu na zbędną pisaninę.
Twój sposób nauki "C" jest w/g mnie bardzo dobry i zrozumiały, a każdy kto CHCE
dużo się nauczy. Pozdrawiam Andrzej sp3gtg
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ść Smile To tyle w kwestii wytłumaczenia się ...

Znany wszystkim nam Adam Wink 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
{
   unsigned long int u32;
   unsigned char u8[4];
}
FTW;
przypominam, że ENTERY możemy zastąpić spacją jeśli ktoś chce oszczędzać miejsce na ekranie
Kod:
union {  unsigned long int u32;  unsigned char u8[4]; } FTW;
taka deklaracja powoduje że możemy używać zmiennej FTW.u32 która jest równoznaczna z tablicą która składa się z 4 elementów: FTW.u8[0], FTW.u8[1], FTW.u8[2], FTW.u8[3].
utwórzcie sobie nowy projekt ( przymusowa powtórka materiału Wink) oczywiście w języku C. W utworzony projekt wklejcie sobie kod:
Kod:
int main(void)
{
    union { unsigned long int u32; unsigned char u8[4]; } FTW;
    FTW.u32=0xafafafaf;
    FTW.u8[0]= 0xaa;
    FTW.u8[1]= 0xbb;
    FTW.u8[2]= 0xcc;
    FTW.u8[3]= 0xdd;
}
W opcjach kompilatora ustawcie zerowy stopień optymalizacji - tylko dla naszych eksperymetów, na razie w to nie wnikamy.
İmage
teraz skompilujcie i uruchomcie debugowanie
İmage
Jeśli nie widzicie okna MEMORY to włączie je
İmage
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ą.
İmage
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.
(Ten post był ostatnio modyfikowany: 08-05-2012 14:42 przez SP4EJT.)
08-05-2012 14:42
Odwiedź stronę użytkownika Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
SP4EJT Offline
Marcin
****

Liczba postów: 340
Dołączył: 06-05-2011
Post: #149
RE: Programowanie w języku C w środowisku AVR Studio4
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 Wink

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...


Załączone pliki
.zip  nowy.zip (Rozmiar: 52.65 KB / Pobrań: 767)
(Ten post był ostatnio modyfikowany: 11-05-2012 12:58 przez SP4EJT.)
11-05-2012 12:58
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: #150
RE: Programowanie w języku C w środowisku AVR Studio4
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.

73 Adam
12-05-2012 9:54
Znajdź wszystkie posty użytkownika Odpowiedz cytując ten post
Odpowiedz 


Skocz do:


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