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

[C]Modyfikacja programu, obsługa przycisków, miganie LED-ów.

macur 21 Lis 2008 11:50 2352 6
REKLAMA
  • #1 5765123
    macur
    Poziom 2  
    jestem amatorem(poczatkujacym), prosze o wyrozumialosc
    musze zmodyfikowac program aby uzyskac
    -obsługę przycisków w ten sposób, aby w oknie terminala ukazywał się komunikat z numerem wciśniętego przycisku
    -efekty świetlne polegające na sekwencjach migania diod LED (disco ;-)), przy czym wybór sekwencji odbywałby się poprzez wysłanie z terminala numeru efektu


    
    // Sterownie diodą LED podłączoną do dowolnej linii mikrokontrolera 
    // za pomocą dowolnego znaku odebranego z portu szeregowego  
    // mikrokontrolera i wysyłanie jej stanu na port szeregowy 
     
    #include <avr/io.h>                              // dostęp do rejestrów 
    #include <avr\iom128.h> 
    #include <compat/deprecated.h> 
     
    // Zmieniając poniższe definicje można dostosować program do potrzeb 
     
    #define F_CPU                8000000ul          // częstotliwość zegara w Hz 12 
     
    #define UART_BAUD        19200ul                // prędkość transmisji bit/s 
     
    #define LED_PORT        PORTD                   // port diody LED 
    #define LED_BIT                4                // bit diody LED 
     
    #define DDR(x) _SFR_IO8(_SFR_IO_ADDR(x)-1)      // adr. rej. kier. PORTx 
    #define PIN(x) _SFR_IO8(_SFR_IO_ADDR(x)-2)      // adr. rej. wej. PORTx 
     
    #define LED_PORT_O        LED_PORT              // rejestr wyjściowy 
    #define LED_PORT_D        DDR(LED_PORT)         // rejestr kierunkowy 
    #define LED_PORT_I        PIN(LED_PORT)        // rejestr wejściowy 
     
    #define UART_CONST        (F_CPU/(16ul*UART_BAUD)-1) 
     
    // _UCR_ 
     
    #ifdef        UCR 
    #define _UCR_        UCR 
    #endif 
     
    #ifdef        UCSRB 
    #define _UCR_        UCSRB 
    #endif 
     
    #ifdef        UCSR0B 
    #define _UCR_        UCSR0B 
    #endif 
     
    // _USR_ 
     
    #ifdef        USR 
    #define _USR_        USR 
    #endif 
     
    #ifdef        UCSRA 
    #define _USR_        UCSRA 
    #endif 
     
    #ifdef        UCSR0A 
    #define _USR_        UCSR0A 
    #endif 
     
    // Definicje funkcji 
     
    // inicjalizacja portu szeregowego 
    void UART_init(void)  
    { 
      UBRR0H = (UART_CONST >> 8);          // ustaw prędkość transmisji 
      UBRR0L = (UART_CONST & 0xFF); 
      _UCR_ = _BV(RXEN)|_BV(TXEN);               // załącz tx, rx 
    } 
     
    // wysyła znak podany jako parametr na port szeregowy 
    void UART_putchar (char c) 
    { 
      UDR0 = c;                                  // wpisz c do rejestru UDR 
      loop_until_bit_is_set(_USR_,TXC);         // czekaj na zakończenie transmisji 
      sbi(_USR_,TXC);                           // ustaw bit TXC w rej. USR 
    } 
     
    // odbiera znak z portu szeregowego i zwraca go jako wartość funkcji 
    char UART_getchar (void) 
    { 
      loop_until_bit_is_set(_USR_,RXC);         // czekaj na zakończenie odbioru 
      cbi(_USR_,RXC);                           // skasuj bit RXC w rej. USR 
      return UDR0;                               // zwróć zawartość rejestru UDR 
    } 
     13 
     
    int main(void)                              // program główny 
    { 
      UART_init();                              // inicjalizacja portu szeregowego 
     
      sbi(LED_PORT_D,LED_BIT);                  // użyj linii jako wyjścia 
     
      while(1)                                  // pętla nieskończona 
      { 
        cbi(LED_PORT_O,LED_BIT);                // zapal diodę LED 
        UART_putchar('1');                      // wyślij '1' na port szeregowy 
        UART_getchar();                         // czekaj na znak z portu szeregowego 
        sbi(LED_PORT_O,LED_BIT);               // zgaś diodę LED 
        UART_putchar('0');                     // wyślij '0' na port szeregowy 
        UART_getchar();                        // czekaj na znak z portu szeregowego 
      } 
    }
    


    Dodałem znaczniki [code] i zmieniłem tytuł tematu
    Autora proszę, o zapoznanie się z regulaminem naszego forum, bo kolejny temat napisany w tym stylu, wyląduje w koszu.
    [zumek]
  • REKLAMA
  • #2 5765160
    skynet_2
    Poziom 26  
    używaj znaczników code,
    w czym dokładnie potrzebujesz pomocy ? jaki to µC ?
  • REKLAMA
  • #3 5767665
    macur
    Poziom 2  
    atmega128
    pracuje w avr studio, musze zmodyfikowac kod tak aby rozwiazac podane podpunkty
  • REKLAMA
  • #4 5767798
    Dr.Vee
    VIP Zasłużony dla elektroda
    Z czym konkretnie masz problem? Masz już jakiś pomysł na rozwiązanie problemu, nie wiesz, za co się zabrać, czy po prostu czekasz, aż ktoś napisze ten program za Ciebie?

    Chyba oczywiste jest, że musisz mieć jakie-takie pojęcie o programowaniu w C i mikrokontrolerach AVR żeby samemu napisać ten program. Jeśli nie masz, to czas najwyższy uzupełnić te braki...

    Pozdrawiam,
    Dr.Vee
  • REKLAMA
  • #5 5771034
    macur
    Poziom 2  
    pojęcie o programowaniu w c++ ma jakie- takie, ale z mikrokontrolerami jest to mój pierwszy kontakt. jeżeli nie konkretne wskazówki to prosze o podanie jakiejś zrozumiałej dla początkującego książeczki
  • #6 5771299
    Dr.Vee
    VIP Zasłużony dla elektroda
    Książki Ci nie polecę, bo żadnej z dostępnych na polskim rynku nie czytałem.

    Jeśli znasz się na programowaniu, to polecam dokumentację biblioteki avr-libc: http://www.nongnu.org/avr-libc/user-manual/
    Znajdziesz tam pełną dokumentację biblioteki standardowej, a na dodatek kilka przykładowych projektów.

    Ponieważ obsługę portu szeregowego masz już zaimplementowaną, mikrokontroler masz duży, to z w/w manuala dowiesz się jak uruchomić obsługę standardowego wejścia/wyjścia - czyli będzie to program prawie jak na PC ;)

    Docelowo będziesz musiał rozwiązać 3 podstawowe problemy:
    1) odczyt stanu przycisków (problem drgania styków: http://en.wikipedia.org/wiki/Switch#Contact_bounce)
    2) "miganie" diod led ;) czyli sterowanie wyjściami
    3) odmierzanie czasu (czyli zastosowanie układu timera + obsługa przerwań).

    Poczytaj dokumentację procesora, dużo możesz się też dowiedzieć z not aplikacyjnych na stronie atmel.com
    Co do w/w problemów, to możesz poszukać na forum dyskusji na ten temat, było ich już tutaj wiele ;)

    Jak będziesz miał konkretne pytania/problemy, to pytaj.

    Pozdrawiam,
    Dr.Vee
  • #7 5786713
    macur
    Poziom 2  
    dzieki bardzo, a jest moze cos po polsku bo nie wszystko rozumiem
REKLAMA