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: 56953, Oldal olvasási idő: kb. 1 perc
Lapozás: OK   6 / 9

Mintaprogram2

Az első UART programunk után csináljunk valami hasznosat is! Az alábbi program, ha lenyomjuk az m billentyűt, akkor a PC5-ös analóg lábra kötött fotoellenállással megméri a fényerősséget (8 bites ADC, tehát 0-255 közötti érték lehet a mérés eredménye), majd az eredményt elküldi a PC-re. (A fotoellenállásról bővebben: LINK)

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

  1. /*
  2. ADC + UART
  3. Hardware: ATmega8 @ 7.372800MHz
  4. PC Software: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 <inttypes.h>
  13.  
  14. volatile int LDR = 0;
  15.  
  16. void Konfig8bitADC()        // ADC konfiguralas (beallitas)
  17. {
  18. //    ADMUX = 0b01100000;        // Vcc mint referencia, balra rendezett ADC eredmeny
  19.     ADMUX |= (1<<REFS0)|(1<<ADLAR);    // Vcc mint referencia, balra rendezett ADC eredmeny
  20. //    ADCSRA = 0b10000011;    // ADC engedelyezese, ADC eloosztas = 8 (125 KHz)
  21.     ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // ADC engedelyezese, ADC eloosztas = 8 (125 KHz)
  22. }
  23.  
  24. unsigned char Beolvas8bitADC(unsigned char csatorna)
  25. {
  26. ADMUX = (ADMUX & 0b11110000) | csatorna;
  27. ADCSRA |= (1<<ADSC);    // ADC konverzio elinditasa
  28. while (ADCSRA & (1<<ADSC));        // varas az atalakitasra
  29. ADCSRA |= (1<<ADSC);          // konverzió elindítás
  30. while (ADCSRA & (1<<ADSC));        // varas az atalakitasra
  31. return (ADCH);        // ADC ertek visszaadasa (csak a felso 8 bit (ADCH), az also 2 zajos bit elhagyasa)
  32. }
  33.  
  34. void KonfigUART() // UART beallitasa
  35. {
  36.    // 9600 bps soros kommunikacio sebesseg beallitasa
  37.    UBRRL = UBRR_ERTEK;    // UBRR_ERTEK also 8 bitjenek betoltese az UBRRL regiszterbe
  38.    UBRRH = (UBRR_ERTEK>>8);   // UBRR_ERTEK felso 8 bitjenek betoltese az UBRRH regiszterbe
  39.    // Aszinkron mod, 8 Adat Bit, Nincs Paritas Bit, 1 Stop Bit
  40.    UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1);
  41.    //Ado es Vevo aramkorok bekapcsolasa + az RX interrupt engedelyezese
  42.    UCSRB |= (1 << RXEN) | (1 << TXEN);   //
  43. }
  44.  
  45. char UARTAdatFogad() // Ez a fuggveny a beerkezo adatokat kiolvassa az UDR regiszter bejovo pufferebol
  46. {
  47.    while(!(UCSRA & (1<<RXC)))  // Varakozas amig nincs uj bejovo adat
  48.    {
  49.       //Varakozas
  50.    }
  51.    //Most mar van beerkezett adat, amit kiolvasunk a pufferbol
  52.    return UDR;
  53. }
  54.  
  55. void UARTAdatKuld(char data) // Ez a fuggveny a kuldendo adatot beirja az UDR regiszter kimeno pufferjebe
  56.  
  57. {
  58.    while(!(UCSRA & (1<<UDRE)))  // Varakozas amig az Ado kesz nem lesz az adatkuldesre
  59.    {
  60.       //Varakozas
  61.    }
  62.    // Az Ado mar kesz az adatkuldesre, a kuldendo adatot a kimeno pufferjebe irjuk
  63.    UDR=data;
  64. }
  65.  
  66. int main(void)  // Foprogram
  67. {
  68.    char data;
  69.  
  70.    KonfigUART();   // UART Konfiguralasa
  71.  
  72.     DDRC &= ~(1<<PC5);    // PC5-os lab bemenet (jobb LDR)
  73.     PORTC = 0x00;    // PORTC osszes laban a felhuzoellenallasok kikapcsolva
  74.  
  75.     Konfig8bitADC();    // ADC beallitas lefuttatasa
  76.  
  77.    while(1)
  78.    {
  79.         data = UARTAdatFogad();  // A berekezo bajt fogadasa
  80.    
  81.         if(data == 'm') // Ha a fogadott bajt a 'm'-mel egyezik meg, megmerjuk a fenyerosseget
  82.         {
  83.             LDR = Beolvas8bitADC(5);
  84.             UARTAdatKuld('L');
  85.             UARTAdatKuld('D');
  86.             UARTAdatKuld('R');
  87.             UARTAdatKuld(' ');
  88.             UARTAdatKuld('A');
  89.             UARTAdatKuld('D');
  90.             UARTAdatKuld('C');
  91.             UARTAdatKuld(':');
  92.             UARTAdatKuld('0'+(LDR/100) % 10);  // Szazasok ertekenek kiirasa
  93.             UARTAdatKuld('0'+(LDR/10) % 10);   // Tizesek ertekenek kiirasa
  94.             UARTAdatKuld('0'+LDR % 10);    // Egyesek ertekenek kiirasa
  95.             UARTAdatKuld('\n');     // Kovetkezo sor
  96.             UARTAdatKuld('\r');     // Ugras a sor elejere
  97.         }
  98.    }
  99. }


A cikk még nem ért véget, lapozz!
Következő: »»   6 / 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