Fórum témák

» Több friss téma
Cikkek » Egyszerű soros kommunikáció AVR-rel (UART)
Egyszerű soros kommunikáció AVR-rel (UART)
Szerző: Fizikus, idő: Jún 12, 2010, Olvasva: 56955, Oldal olvasási idő: kb. 2 perc
Lapozás: OK   8 / 9

Mintaprogram3

Ez az UART program már a megszakításokat fogja használni arra, hogy a mikrovezérlőt tájékoztassa arról, hogy egy új karakter érkezett a PC-ről. A b billentyű lenyomásával tudjuk a PC0 lábra kötött LED-et bekapcsolni, a k  billentyű lenyomásával pedig kikapcsolni.

Az UART beállítását végző függvényt csak annyiban módosítjuk, hogy bekapcsoljuk az UDR regiszter bejövő pufferéhez tartozó megszakítást (RX).

  1. void KonfigUART()  // UART beallitasa
  2. {
  3.     // 9600 bps soros kommunikacio sebesseg beallitasa
  4.     UBRRL = UBRR_ERTEK;        // UBRR_ERTEK also 8 bitjenek betoltese az UBRRL regiszterbe
  5.     UBRRH = (UBRR_ERTEK>>8);   // UBRR_ERTEK felso 8 bitjenek betoltese az UBRRH regiszterbe
  6.    // Aszinkron mod, 8 Adat Bit, Nincs Paritas Bit, 1 Stop Bit
  7.     UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
  8.    //Ado es Vevo aramkorok bekapcsolasa + az RX interrupt engedelyezese
  9.     UCSRB |= (1 << RXEN) | (1 << RXCIE) | (1 << TXEN);   //
  10. }

 

A bejövő karakter beolvasása, a feltételvizsgálat és a LED ki- és bekapcsolása mind a megszakítás kiszolgáló rutinon belül történik. A főprogram végig egy folyamatosan futó üres ciklusból áll.

(A kód letöltéséhez kattints ide!)

  1. /*
  2. UART hasznalata megszakitasokkal
  3. Hardver:    ATmega8 @ 7.372800MHz
  4. PC Szoftver: Hyper terminal @ 9600 baud, Nincs Paritas Bit, 1 Stop Bit, Flow Control = NONE
  5. */
  6.  
  7. #define F_CPU 7372800UL  // rendszer orajel: 7.3728 MHz
  8. #define USART_BAUDRATE 9600  // soros kommunikacio sebessege: 9600 bps
  9. #define UBRR_ERTEK ((F_CPU / (USART_BAUDRATE * 16UL)) - 1)  // UBRR
  10.  
  11. #include <avr/io.h>
  12. #include <avr/interrupt.h>
  13. #include <inttypes.h>
  14. #include <util/delay.h>
  15.  
  16. #define LED_PIN 0  // LED a PC0-as labon
  17.  
  18. void KonfigUART()  // UART beallitasa
  19. {
  20.     // 9600 bps soros kommunikacio sebesseg beallitasa
  21.     UBRRL = UBRR_ERTEK;        // UBRR_ERTEK also 8 bitjenek betoltese az UBRRL regiszterbe
  22.     UBRRH = (UBRR_ERTEK>>8);   // UBRR_ERTEK felso 8 bitjenek betoltese az UBRRH regiszterbe
  23.    // Aszinkron mod, 8 Adat Bit, Nincs Paritas Bit, 1 Stop Bit
  24.     UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
  25.    //Ado es Vevo aramkorok bekapcsolasa + az RX interrupt engedelyezese
  26.     UCSRB |= (1 << RXEN) | (1 << RXCIE) | (1 << TXEN);   //
  27. }
  28.  
  29. char UARTAdatFogad() // Ez a fuggveny a beerkezo adatokat kiolvassa az UDR regiszter bejovo pufferebol
  30. {
  31.    while(!(UCSRA & (1<<RXC)))  // Varakozas amig nincs uj bejovo adat
  32.    {
  33.       //  Varakozas
  34.    }
  35.    //Most mar van beerkezett adat, amit kiolvasunk a pufferbol
  36.    return UDR;
  37. }
  38.  
  39. void UARTAdatKuld(char data)  // Ez a fuggveny a kuldendo adatot beirja az UDR regiszter kimeno pufferjebe
  40. {
  41.    while(!(UCSRA & (1<<UDRE))) // Varakozas amig az Ado kesz nem lesz az adatkuldesre
  42.    {
  43.       //   Varakozas
  44.    }
  45.    // Az Ado mar kesz az adatkuldesre, a kuldendo adatot a kimeno pufferjebe irjuk
  46.    UDR=data;
  47. }
  48.  
  49. int main(void) // Foprogram
  50. {
  51.     DDRC = _BV(LED_PIN); // PC0 kimenet (LED)
  52.     PORTC = 0x00;  
  53.  
  54.     KonfigUART(); // UART Konfiguralasa
  55.    
  56.     // A LED-et eloszor nehanyszor ki- es bekapcsoljuk, hogy ellenorizzuk minden rendben
  57.     PORTD &= ~(_BV(LED_PIN)); // LED be
  58.     _delay_ms(100); // Varakozas 100 ms-ig
  59.     PORTC |= _BV(LED_PIN); // LED ki
  60.     _delay_ms(100);
  61.     PORTC &= ~(_BV(LED_PIN));
  62.     _delay_ms(100);
  63.     PORTC |= _BV(LED_PIN);
  64.     _delay_ms(100);
  65.  
  66.     // Elkuldjuk a "Hello" uzenetet, hogy a soros kommunikaciot leellenorizzuk
  67.     UARTAdatKuld('H');
  68.     UARTAdatKuld('e');
  69.     UARTAdatKuld('l');
  70.     UARTAdatKuld('l');
  71.     UARTAdatKuld('o');
  72.     UARTAdatKuld('\n');
  73.  
  74.     sei();    // Altalanos megszakitasok engedelyezese
  75.    
  76.     while(1)
  77.     {
  78.         // Ures ciklus (mindent az ISR-en belul kezelunk)
  79.     }
  80.     return 0;
  81. }
  82.  
  83. ISR(USART_RXC_vect)  // RX interrupt, ezek az utasitasok futak le ha adat erkezik a TX vonalon
  84. {
  85.         char data;    
  86.  
  87.     data = UARTAdatFogad();     // A berekezo bajt fogadasa
  88.    
  89.     if(data == 'b') // Ha a fogadott bajt 'b'-vel egyezik meg, bekapcsoljuk a LED-et
  90.     {
  91.         PORTC &= ~(_BV(LED_PIN));
  92.         UARTAdatKuld('L');
  93.         UARTAdatKuld('E');
  94.         UARTAdatKuld('D');
  95.         UARTAdatKuld(' ');
  96.         UARTAdatKuld('B');
  97.         UARTAdatKuld('E');
  98.         UARTAdatKuld('\n');   // Kovetkezo sor
  99.         UARTAdatKuld('\r');   // Ugras a sor elejere
  100.     }
  101.     else if(data == 'k')
  102.     {
  103.         PORTC |= _BV(LED_PIN);  // Ha a fogadott bajt 'k'-val egyezik meg, kikapcsoljuk a LED-et
  104.         UARTAdatKuld('\t');
  105.         UARTAdatKuld('L');
  106.         UARTAdatKuld('E');
  107.         UARTAdatKuld('D');
  108.         UARTAdatKuld(' ');
  109.         UARTAdatKuld('K');
  110.         UARTAdatKuld('I');
  111.         UARTAdatKuld('\n');
  112.         UARTAdatKuld('\r');
  113.     }
  114. }


A cikk még nem ért véget, lapozz!
Következő: »»   8 / 9
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem