Fórum témák

» Több friss téma
Cikkek » Soros LCD vezérlőpanel használata AVR-rel
Soros LCD vezérlőpanel használata AVR-rel
Szerző: Fizikus, idő: Jún 20, 2010, Olvasva: 35266, Oldal olvasási idő: kb. 2 perc
Lapozás: OK   5 / 6

Szoftveres UART mintaprogram

Nem marad más hátra, mint az egyes elemeket összerakva megírni a mintaprogramunkat.

Az alábbi ábrákon látható, hogy a kapcsolásunk nagyon egyszerű. A tápfeszültségen kívül, csak egy fotoellenállás van a PC5-ös lábra kötve, a soros LCD vezérlőpanel pedig a PC0-ás lábra. Jól látható a 7,3728MHz-es külső kristály oszcillátor is.


Programunk 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 LCD-n megjelenítjük az eredményt a PC0-ás lábra kötött soros LCDvezérlőpanel segítségével.

A végleges program:

  1. /*
  2. Szoftveres UART + ADC
  3. Hardware:     ATmega8 @ 7.372800MHz
  4.      LDR: PC5-os labon
  5.      Soros LCD: PC0-as labon
  6. */
  7.  
  8. #define F_CPU 7372800UL // rendszer orajel: 7.3728 MHz
  9. #define offset 18
  10.  
  11. #include <avr/io.h>
  12. #include <inttypes.h>
  13. #include <util/delay.h> //Idozito, keslelteto rutinokat tartalmazo fajl
  14.  
  15. volatile int LDR = 0;
  16. unsigned int idoalap;
  17.  
  18. void Konfig8bitADC()        // ADC konfiguralas (beallitas)
  19. {
  20.     ADMUX |= (1<<REFS0)|(1<<ADLAR);    // Vcc mint referencia, balra rendezett ADC eredmeny
  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 ki_b(char _bit,char _dat) /* ki_b(x,y) fuggveny definialasa PORTB-re. PORTB x. labara 0V-ot vagy 5V-ot adunk, attol fuggoen hogy y erteke 0 vagy 1 */
  35. {
  36.     DDRB |= _BV(_bit); // PORTB x. lab kimenet
  37.     if(_dat)
  38.         PORTB |= _BV(_bit); // ha y=1, az x. labra 5V-ot ad
  39.     else
  40.         PORTB &= ~_BV(_bit); // ha y=0, az x. labra 5V-ot ad
  41. }
  42.  
  43. void ki_c(char _bit,char _dat) /* ki_c(x,y) fuggveny definialasa PORTC-re */
  44. {
  45.     DDRC |= _BV(_bit);
  46.     if(_dat)
  47.         PORTC |= _BV(_bit);
  48.     else
  49.         PORTC &= ~_BV(_bit);
  50. }
  51.  
  52. void ki_d(char _bit,char _dat) /* ki_d(x,y) fuggveny definialasa PORTD-re */
  53. {
  54.     DDRD |= _BV(_bit);
  55.     if(_dat)
  56.         PORTD |= _BV(_bit);
  57.     else
  58.         PORTD &= ~_BV(_bit);
  59. }
  60.  
  61.  
  62. void KonfigSzoftUART(char tx) // Szoftveres UART beallitasa
  63. {
  64.     ki_c(tx,1);
  65.     TCCR0 = 0;  // Stop Timer0
  66.     TIFR |= (1<<TOV0);  // Tulcsordulas jelzobit torlese
  67.     idoalap = 255-(96 - offset);
  68. }
  69.  
  70. void kesleltetes(unsigned int _tick) // Szoftveres UART beallitasa
  71. {
  72.    TCNT0 = _tick;  //
  73.    TCCR0 = (1<<CS01);  // Start Timer0, CLK/8
  74.    while (!(TIFR & (1<<TOV0)));  // varakozas amig a szamlalo eleri a kivant erteket
  75.    TIFR |= (1<<TOV0);  // Tulcsordulas jelzobit torlese
  76.    TCCR0 = 0;  // Stop Timer0
  77. }
  78.  
  79. void SzoftUARTKuld(char tx, unsigned char adat) //
  80. {
  81.    int i;
  82.    ki_c(tx,0);  // Start bit
  83.    kesleltetes(idoalap);  // kesleltetes a megadott idoalap-ig (104us)
  84.    for (i=0;i<8;i++)
  85.    {
  86.       ki_c(tx,adat & 0x01);  // adatbit kuldese
  87.       kesleltetes(idoalap);  // kesleltetes a megadott idoalap-ig (104us)
  88.       adat = adat>>1;  // eltolas a kovetkezo bitre
  89.    }
  90.    ki_c(tx,1);  // Stop bit
  91.    kesleltetes(idoalap);  // // kesleltetes a megadott idoalap-ig (104us)
  92. }
  93.  
  94. void SzoftUARTKuldSzoveg(unsigned char tx, char *p)    // Szovegkuldo fuggveny definialasa
  95. {
  96.     while(*p)
  97.     {
  98.       SzoftUARTKuld(tx, *p++);
  99.     }
  100. }
  101.  
  102. int main(void)  // Foprogram
  103. {
  104.     DDRC &= ~(1<<PC5);    // PC5-os lab bemenet (LDR)
  105.     PORTC = 0x00;    // PORTC osszes laban a felhuzoellenallasok kikapcsolva
  106.     KonfigSzoftUART(0);   // Szoftveres UART Konfiguralasa a PC0 labra
  107.     Konfig8bitADC();    // ADC beallitas lefuttatasa
  108.  
  109.    while(1)
  110.    {
  111.             LDR = Beolvas8bitADC(5);
  112.             SzoftUARTKuldSzoveg(0,"?f");  // ?f soros LCD parancs: LCD torlese
  113.             SzoftUARTKuldSzoveg(0,"Szoftveres UART");   // Szoveg kiirasa
  114.             SzoftUARTKuldSzoveg(0,"?m");     // ?m soros LCD parancs: ugras a sor elejere
  115.             SzoftUARTKuldSzoveg(0,"?k");     // ?k soros LCD parancs: kurzor lefele
  116.             SzoftUARTKuldSzoveg(0,"Adc: ");  // Szoveg kiirasa
  117.             SzoftUARTKuld(0,'0'+(LDR/100) % 10);  // Szazasok ertekenek kiirasa
  118.             SzoftUARTKuld(0,'0'+(LDR/10) % 10);   // Tizesek ertekenek kiirasa
  119.             SzoftUARTKuld(0,'0'+LDR % 10);    // Egyesek ertekenek kiirasa
  120.             SzoftUARTKuldSzoveg(0,"?m");     // ?m soros LCD parancs: ugras a sor elejere
  121.             SzoftUARTKuldSzoveg(0,"?j");   //// ?j soros LCD parancs: kurzor felfele
  122.             _delay_ms(1000);         // várakozás 1 másodpercig
  123.    }
  124. }

Íme a végeredmény:


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