logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Jeżeli znasz c lub jesteś początkujący kliknij tutaj.

daniel93 07 Lip 2005 01:33 4598 21
REKLAMA
  • #1 1635136
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    W edw jest kurs c. W związku z tym że ten kurs jest prowadzony skrytowo .Czuli jest napisane jak to robi śię w c a nie do czego to służy mam kilka pytań :

    1.Wktórym miejscu kodu umieszczać definicje wyprowadzeń ?
    2.Do czego służą zmienne ?
    3.Jak ustawić pin jako wujście/wejście ?
    4.Do czego służą przerwania ?

    To narazie tyle.Proszę odpowiedzi jak najbardziej opisujące budowe avr !
  • REKLAMA
  • #2 1635166
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    1. Najlepiej na poczatku, o ile już nie są zadeklarowane standardowo w którymś z plików w katalogu "C:\WinAVR\avr\include\avr\".
    2. Do przekazywania parametrów pomiędzy procedurami oraz przechowywania wartości do przetworzenia i wysłania. Procedury to są elementy programu mające jakieś konkretne zadanie (albo nawet kilka zadań... ;)). Parametry to są dane, które przetwarzają procedury lub w zależności od których wartości zależy działanie procedur.
    3. Ustawiająć odpowiednie bity w rejestrze DDRx dla portu POTRx. Czytamy nie z PORTx, tylko z PINx.
    4. Do ułatwienia obsługi wydarzeń - nie musimy sprawdzać, czy się coś wydarzyło w programie głównym. Wystarczy obsługę danego wydarzenia obsłużyć właśnie w procedurze przerwania (oczywiście najpierw ją włączając), wywoływanego przez dane zdarzenie. Przykładowe przerwania (nazwy z pliku "C:\WinAVR\avr\include\avr\iom8.h") :
    - SIG_INTERRUPT0 - przepełnienie stanu licznika/czasomierza nr 0 - Wydarzenie następuje, gdy ten licznik zmiena stan z 0xFF (255) na 0x00 (0). Oczywiście najpierw trzeba ten licznik uaktywnić wraz z wywoływaniem przerwania przez mikrokontroler.
    - SIG_UART_RECV - Otrzymano bajt za pomocą odbiornika USART - Wydarzenie następuje, gdy układ wykryje transmisję bajtu danych na wyprowadzeniu RxD - oczywiście odbiornik wcześniej trzeba włączyć i wywoływanie przerwania także oraz ustawić parametry transmisji - tzw. baudrate, ilośc bitów, kontrolę parzystości i ilość bitów stopu.
    Mógłbym tak pisać i miesiąc cały, a i tak bym nie napisał wszystkiego... ;)
    Mogę polecić tylko stronę producenta (po angielsku) z dokumentacją, z której ja osobiście nauczyłem się wszystkiego, bo nie korzystałem z żadnych kursów - nie miałem dostepu do net-a ;). Tam zawsze są wszystkie informacje, co tylko sobie panowie z Atmela wymyślili na temat AVR :
    http://www.atmel.com/dyn/products/datasheets.asp?family_id=607
    http://www.atmel.com/dyn/products/app_notes.asp?family_id=607
    Z początku może się wydawać trudne, ale jak się uprzesz, to się sam zdziwisz, że już coś wiesz... ;)
    A tutaj cosik po polsku :
    http://www.easy-soft.tsnet.pl/modules.php?name=Topics
    http://mikrokontrolery.net/main.php?&txt=avr_kursy
    --
    Pozdrawiam, Daniel
  • #3 1635385
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 41
    Wydaje mi sie ze akurat na te pytania znalazlbys odpowiedz bez problemu w tym kursie (byc moze skrotowo czytales).
    Light'I napisał:
    Do przekazywania parametrów pomiędzy procedurami oraz przechowywania wartości do przetworzenia i wysłania. Procedury to są elementy programu mające jakieś konkretne zadanie (albo nawet kilka zadań... ;)). Parametry to są dane, które przetwarzają procedury lub w zależności od których wartości zależy działanie procedur.

    W C nie ma procedur tylko funkcje.
  • REKLAMA
  • #4 1636185
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    fantom napisał:
    W C nie ma procedur tylko funkcje.
    Procedura może jak najbardziej być funkcją, ale naprawdę, nie czepiajmy się pierdół, bo to są wiadomości dla początkującego, więc najważnejsze są podstawowe dane, a nie doszlifowana terminologia od profesorów...
  • #5 1636223
    GienekS
    Poziom 32  
    Posty: 1971
    Pomógł: 139
    Ocena: 15
    Mnie uczono że procedura nie zwraca parametru a funkcja tak.
  • #6 1636278
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Jakbym się uparł to : http://sjp.pwn.pl/haslo.php?id=49094 ;) (Siłą logiki - programowanie proceduralne zawiera procedury)
    Ale dobra, czy w takim razie :
    void main(void)
    	{
    	}
    jest procedurą czy funkcją ? ;)
    No i jeszcze to do przeczytania :
    http://pl.wikipedia.org/wiki/Podprogram
    ---------------------------------------------------
    Tak w ogóle to ktoś ma coś do dodania w temacie, czy podywagujemy tak przez 2 strony :?: ;)
    --
    Pozdrawiam, Daniel
  • #7 1637088
    marcinkwa
    Poziom 14  
    Posty: 164
    Pomógł: 5
    Funkcja zwraca wartość i używa się jej tak:
    zmienna=funkcja(). np. x=cos(200), x=int(zmienna)
    do funkcji można przekazywać parametry, ale nie trzeba,
    Procedura nie zwraca wartości i używa się jej tak:
    procedura-np cls, lcd "COŚ:
    do procedury można przekazywać parametry, ale nie trzeba
  • #8 1637918
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    Jak ustawić te bity ?
    Acha o co chodzi z tymi plikami źrudłowymi ?
  • REKLAMA
  • #9 1663145
    rzuber
    Poziom 20  
    Posty: 545
    Pomógł: 3
    Ocena: 19
    Z innej beczki. Poszukuje tego kursu bardzo pilnie. Czy byłby ktoś miły i mógł umiescić skany na elektrodzie albo ew. przesłać mi. Dozgonna wdzieczność [ew. punkty]
    Dzięki
  • #10 1709253
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    Chce się upewnić !
    Komenda DDRD = 0X7C;
    w windowsowym kalkulatorze to : 1111100 .
    pytanie: czy te 00 to wejści a najmłodszych bitów ?
  • REKLAMA
  • #11 1709288
    fantom
    Poziom 31  
    Posty: 1649
    Pomógł: 108
    Ocena: 41
    0x7C to 01111100 od prawej bit najmlodszy.
  • #12 1709487
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    Dobra dzienki .
  • #13 1709614
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    rzuber napisał:
    Z innej beczki. Poszukuje tego kursu bardzo pilnie. Czy byłby ktoś miły i mógł umiescić skany na elektrodzie albo ew. przesłać mi.
    http://www.edw.com.pl/index.php?module=Conten...ile=index&func=display&ceid=68&meid=20#K1kurs
    -----------------------------
    Następne odcinki pewnie w najbliższym miesiącu... ;)
  • #14 1710290
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    A ma ktoś ostatni program jaki trzeba wykonać (listing 14) w wersi elektronicznej ?
  • #15 1710540
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    Noto co jest tu źle ? :
    //LEDMulti drugi projekt
    #include <avr\io.h>
    #include <inttypes.h>
    #include <avr\signal.h>
    #include <avr\interrupt.h>
    #include <avr\pgmspace.h>
    #include <avr\delay.h>

    #define LED_A 0
    #define LED_B 1
    #define LED_C 2
    #define LED_D 3
    #define LED_E 4
    #define LED_F 5
    #define LED_G 6
    #define LED_DP 7
    #define LEDPORT PORTB
    #define LEDDDR DDRB
    #define COM1 6
    #define COM2 5
    #define COM3 4
    #define COM4 3
    #define COMPORT PORTD
    #define COMDDR DDRD

    uint16_t g_Licznik = 0;
    uint8_t g_AktWyswietlacz = 0;
    uint8_t g_DaneWyswietlacza [4];
    uint8_t g_DaneCom[4] PROGMEM =
    {~(1<<COM1) , ~(1<<COM2) , ~(1<<COM3) , ~(1<<COM4) };



    void WyswietlHex(uint16_t var);
    {
    g_DaneWyswietlacza[0] = pgm_read_byte(&g_WzorCyfr[var>>(3*4)]);
    g_DaneWyswietlacza[1] = pgm_read_byte(&g_WzorCyfr[(var>>(2*4))&0xf]);
    g_DaneWyswietlacza[2] = pgm_read_byte(&g_WzorCyfr[(var>>(1*4))&0xf]);
    g_DaneWyswietlacza[3] = pgm_read_byte(&g_WzorCyfr[var>>&0xf]);
    }
    int main(void)
    {
    //INICJACJA
    LEDDDR = 0XFF;
    COMDDR = 1<<COM1 | 1<<COM2 | 1<<COM3 | 1<<COM4;
    //Timer0
    TCCR0 = 1<<CS01;
    TIMSK = 1<<TOIE0;
    //Globalne zezwolenie na przewania
    sei();
    //koniec inicjaci
    ////////////////

    //WPISANIE DO TABLICY PRUBNYCH WARTOŚCI
    g_DaneWyswietlacza[0] = ~(1<<LED_B | 1<<LED_C);
    g_DaneWyswietlacza[1] = ~(1<<LED_A | 1<<LED_B | 1<<LED_D | 1<<LED_E | 1<<LED_G );
    g_DaneWyswietlacza[2] = ~(1<<LED_A | 1<<LED_B | 1<<LED_C | 1<<LED_D | 1<<LED_G );
    g_DaneWyswietlacza[3] = ~(1<<LED_B | 1<<LED_C | 1<<LED_F | 1<<LED_G );

    for(;;)
    {
    WyswietlHex(g_Licznik);
    _delay_loop_2(0xffff);
    g_Licznik++;

    }
    return 0;
    }
    //_________________________________________________________
    //obsługa przerwań
    SIGNAL(SIG_OVERFLOW0)
    {
    //Wygaszenie wyswietlaczy
    COMPORT |= 1<<COM1 | 1<<COM2 | 1<<COM3 | 1<<COM4;
    //WYSŁANIE ODPOWIEDNEJ DANEJ
    LEDPORT = g_DaneWyswietlacza[g_AktWyswietlacz];
    //wlonczenie odpowiedniego wyswietlacza
    COMPORT &= pgm_read_byte (&g_DaneCom[g_AktWyswietlacz]);

    //zwienkszenie stanu zmiennej wskazujoncvej na obsługiwany wyswietlacz
    ++g_AktWyswietlacz;
    if(g_AktWyswietlacz > 3)
    g_AktWyswietlacz = 0;
    prog_uint8_t g_WzorCyfr[16] =
    }
    {
    ~(1<<LED_A | 1<<LED_B | 1<<LED_C | 1<<LED_D | 1<<LED_E | 1<<LED_F), //0
    ~(1<<LED_B | 1<<LED_C), //1
    ~(1<<LED_A | 1<<LED_B | 1<<LED_D | 1<<LED_E | 1<<LED_G), //2
    ~(1<<LED_A | 1<<LED_B | 1<<LED_C | 1<<LED_D | 1<<LED_G), //3
    ~(1<<LED_B | 1<<LED_C | 1<<LED_F | 1<<LED_G), //4
    ~(1<<LED_A | 1<<LED_C | 1<<LED_D | 1<<LED_F | 1<<LED_G), //5
    ~(1<<LED_A | 1<<LED_C | 1<<LED_D | 1<<LED_E | 1<<LED_F | 1<<LED_G), //6
    ~(1<<LED_A | 1<<LED_B | 1<<LED_C), //7
    ~(1<<LED_A | 1<<LED_B | 1<<LED_C | 1<<LED_D | 1<<LED_E | 1<<LED_F | 1<<LED_G), //8
    ~(1<<LED_A | 1<<LED_B | 1<<LED_C | 1<<LED_f | 1<<LED_G), //9
    ~(1<<LED_A | 1<<LED_B | 1<<LED_c | 1<<LED_E | 1<<LED_F | 1<<LED_G), //A
    ~(1<<LED_C | 1<<LED_D | 1<<LED_F | 1<<LED_G), //B
    ~(1<<LED_A | 1<<LED_D | 1<<LED_E | 1<<LED_F), //C
    ~(1<<LED_B | 1<<LED_C | 1<<LED_D | 1<<LED_E | 1<<LED_G), //D
    ~(1<<LED_A | 1<<LED_E | 1<<LED_F | 1<<LED_G), //F
    }
  • #17 1710755
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Light'I napisał:
    A komunikaty z błędami bardzo są tajne ? ;)

    Raczej nie , bo widać je na listingu :wink:
    
    #define LED_C 2
    ...// a następnie
    

    ~(1<<LED_A | 1<<LED_B | 1<<LED_c | 1<<LED_E | 1<<LED_F | 1<<LED_G), //A

    Podstawowe błędy składni , początkującego C-ownika (skąd ja to znam ;) )
    Proponuję "przeliterować" kod,"poustawiać" deklaracje zmiennych i stałych we właściwej kolejności(zadeklarować - wykonać operację) ,nie zapominać o średnikach ... itd.

    Pozdrawiam
    Piotrek
  • #18 1710895
    LordBlick
    VIP Zasłużony dla elektroda
    Posty: 5438
    Pomógł: 549
    Ocena: 69
    Owszem, wszystko się zgadza, ale podstawowa umiejętność to również umiejętność czytania komunikatów od kompilatora, przynajmniej tych o błędach i to z numerami linii w tekście pliku ze źródłem.
    --
    Pozdrawiam, Daniel
  • #19 1710929
    frohme
    Poziom 21  
    Posty: 421
    Pomógł: 25
    Ocena: 15
    To co pisał zumek. Przejrzyj załączony plik, porównaj różnice, wyciągnij wnioski. Kompilator avr-gcc jest bezwzględnym i czasami przesadnym perfekcjonistą. Nie sprawdzałem pod względem jakości jedynie formalnie. Kompiluje się.
    Załączniki:
    • led.zip (1.04 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #20 1712349
    daniel93
    Poziom 29  
    Posty: 1673
    Pomógł: 30
    Ocena: 94
    Skompilowałem ten program i działa jak będę miał czas to porównam różnice .
  • #21 4164717
    pouk
    Poziom 11  
    Posty: 33
    [quote=g_DaneWyswietlacza[0] = pgm_read_byte(&g_WzorCyfr[var>>(3*4)]);
    g_DaneWyswietlacza[1] = pgm_read_byte(&g_WzorCyfr[(var>>(2*4))&0xf]);
    g_DaneWyswietlacza[2] = pgm_read_byte(&g_WzorCyfr[(var>>(1*4))&0xf]);
    g_DaneWyswietlacza[3] = pgm_read_byte(&g_WzorCyfr[var>>&0xf]);.[/quote]



    a co to -> var>>(3*4) <- jest??
  • #22 4164915
    pubus
    Poziom 30  
    Posty: 1289
    Pomógł: 138
    Ocena: 31
    Przesuń w prawo o 12...
    Ale pewnie chodzi ci o sam zapis...
    Tak wydaje się, że to mnożenie jest na kija potrzebne...

Podsumowanie tematu

✨ Dyskusja dotyczy podstaw programowania w języku C dla mikrokontrolerów AVR, ze szczególnym uwzględnieniem kursu dostępnego w serwisie EDW. Omówiono miejsce umieszczania definicji wyprowadzeń – najlepiej na początku kodu lub w standardowych plikach nagłówkowych WinAVR. Wyjaśniono rolę zmiennych jako nośników parametrów i wartości przetwarzanych przez funkcje (procedury). Ustawianie pinów jako wejścia lub wyjścia realizuje się przez odpowiednią konfigurację bitów w rejestrze DDRx, a odczyt sygnałów następuje z rejestru PINx. Przerwania służą do obsługi zdarzeń sprzętowych bez konieczności ciągłego sprawdzania ich w pętli głównej programu, co ułatwia zarządzanie zdarzeniami i poprawia efektywność działania. W dyskusji poruszono także różnicę między funkcją a procedurą w C – funkcja zwraca wartość, procedura nie, choć w praktyce terminologia jest stosowana zamiennie. Podano przykłady kodu z wykorzystaniem bibliotek AVR, wskazano typowe błędy początkujących programistów, takie jak błędy składniowe i nieprawidłowe deklaracje. Omówiono także interpretację wartości hexadecymalnych i binarnych dla rejestrów DDRD, co jest kluczowe przy konfiguracji portów. Wskazano na konieczność czytania komunikatów kompilatora avr-gcc dla skutecznego debugowania. Dyskusja zawierała również fragmenty kodu do sterowania wyświetlaczami LED oraz odwołania do plików nagłówkowych i funkcji specyficznych dla AVR, takich jak pgm_read_byte.
Wygenerowane przez model językowy.
REKLAMA