Programowanie mikroprocesorów ( mikrokontrolerów )

Uruchomienie ADC

Obsługa ADC jednokanałowego

Uruchomienie przetwornika ADC
  1. int main(void)
  2. {
  3.  
  4. DDRD=0xff;                              // ustalenie kierunku portu (wyjście)
  5. PORTD=0xff;                     // wystawienie wartości AAh na port czyli 10101010b
  6.  
  7. // konfiguracja timera0 8-bitowego
  8. TIMSK0=0x01;
  9. TCCR0A=0x00;
  10. TCCR0B=0x05;
  11.  
  12. sei();
  13.  
  14. // Uruchomienie LCD
  15. LCD_init();
  16.  
  17. // ADC konfiguracja
  18. ADMUX=0b11000000;              
  19. ADCSRA=0b11111100;
  20. ADCSRB=0b00000000;
  21.  
  22.         while(1)
  23.     {
  24.                         uint8_t ADC_LO = ADCL;
  25.                         uint16_t ADC_wynik = ADCH<<8 | ADC_LO;
  26.                         if (ADC_wynik<50) {flaga_alarm=0x01;} else {flaga_alarm=0x00;};
  27.                         LCD_xy(0,0);
  28.                         LCD_czysc;
  29.                         sprintf(buffer, "%u" , ADC_wynik);
  30.                         LCD_tekst(buffer);
  31.                         _delay_ms(200);
  32.     }
  33. }
  34.  

Obsługa ADC wielokanałowego

cdn

Uruchomienie przetwornika ADC
  1. //  Załączniki
  2. #include <avr/io.h>
  3. #include <util/delay.h>
  4. #include <avr/interrupt.h>
  5. #include <stdio.h>
  6.  
  7. //  Definicje
  8. #define cbi(sfr,bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
  9. #define sbi(sfr,bit) ((_SFR_BYTE(sfr) |= _BV(bit)))
  10. #define lcd_ster PORTD
  11. #define lcd_data PORTD
  12. #define ddr_lcd_ster DDRD
  13. #define ddr_lcd_data DDRD
  14. #define pin_lcd PIND
  15. #define e 4
  16. #define rs 6
  17. #define rw 7
  18. #define rs_0 cbi(lcd_ster,rs)
  19. #define rs_1 sbi(lcd_ster,rs)
  20. #define rw_0 cbi(lcd_ster,rw)
  21. #define rw_1 sbi(lcd_ster,rw)
  22. #define e_0 cbi(lcd_ster,e)
  23. #define e_1 sbi(lcd_ster,e)
  24. #define LCD_czysc LCD_wyslij(0x01,0)
  25.  
  26. // Zmienne globalne
  27. char ADC_LO,ADC_HI,flaga_alarm,buffer[5];
  28. // Podprogramy
  29.  
  30. // Wyświetlacz LCD ***********************************************************
  31. unsigned char LCD_busy(void)
  32. {
  33.         unsigned char flaga;    //zmienna pomocnicza
  34.         rs_0 ;
  35.         rw_1 ;
  36.         ddr_lcd_ster=ddr_lcd_ster&0b11110111;
  37.         e_1;
  38.         _delay_us(1); // aaaa
  39.         flaga=pin_lcd&0x08;
  40.         e_0;
  41.         e_1;
  42.         _delay_us(1); // aaaa
  43.         e_0;
  44.         ddr_lcd_ster=ddr_lcd_ster|0b00001000;
  45.         _delay_us(1); // aaaa
  46.         return flaga;
  47. }
  48.  
  49. // wyslanie znaku lub komendy do LCD
  50. void LCD_wyslij(unsigned char dana,char litera)
  51. {
  52.         while(LCD_busy());      // oczekiwanie na zwolienie wyswietlacza
  53.         rw_0;
  54.         e_1;
  55.         if (litera==0)
  56.         {
  57.                 rs_0;
  58.         }
  59.         else
  60.         {
  61.                 rs_1;
  62.         }
  63.         e_1;
  64.         lcd_data=(lcd_data&0xF0)|((dana&0xf0)>>4);      // przygotuj starszy bajt do LCD
  65.         _delay_us(2); // aaaa   _delay_ms(5);
  66.         e_0;
  67.         _delay_us(2); // aaaa   _delay_ms(5);
  68.         e_1;
  69.         lcd_data=(lcd_data&0xF0)|(dana&0x0f);   // przygotuj młodszy bajt do LCD
  70.         _delay_us(2); // aaaa   _delay_ms(5);
  71.         e_0;
  72.         _delay_us(2); // aaaa   _delay_ms(10);
  73. }
  74.  
  75.  
  76. // wgranie polskich znaków do LCD
  77. void LCD_polskie_znaki(unsigned char dana)
  78. {
  79.         while(LCD_busy());      // oczekiwanie na zwolienie wyswietlacza
  80.         rs_1;
  81.         rw_0;
  82.         e_1;
  83.         lcd_data=(lcd_data&0xF0)|((dana&0xf0)>>4);      // przygotuj starszy bajt do LCD
  84.         _delay_us(1); // aaaa
  85.         e_0;
  86.         _delay_us(1); // aaaa
  87.         e_1;
  88.         lcd_data=(lcd_data&0xF0)|(dana&0x0f);   // przygotuj młodszy bajt do LCD
  89.         _delay_us(2);
  90.         e_0;
  91.         _delay_us(1); // aaaa
  92. }
  93.  
  94. void LCD_znakipl_load(void)
  95. {
  96.         LCD_wyslij(0x40,0);
  97.         unsigned char znaki[]={ 0,0,14,1,15,17,15,2,            // ą
  98.                                                 2,4,14,16,16,17,14,0,           // ć
  99.                                                 0,0,14,17,31,16,14,2,           // ę
  100.                                                 12,4,6,4,12,4,14,0,             // ł
  101.                                                 2,4,22,25,17,17,17,0,           // ń
  102.                                                 2,4,14,17,17,17,14,0,           // ó
  103.                                                 2,4,14,16,14,1,30,0,            // ś
  104.                                                 2,4,31,2,4,8,31,0};                     // ż
  105.  
  106. /*                                              14,17,17,31,17,17,19,0, // Ą
  107.                                                 2,14,21,16,16,17,14,0,          // Ć
  108.                                                 31,16,30,16,16,31,2,0,          // Ę
  109.                                                 16,16,20,24,16,16,31,0, // Ł
  110.                                                 2,21,25,21,19,17,17,0,          // Ń
  111.                                                 2,14,21,17,17,17,14,0,          // Ó
  112.                                                 2,14,16,14,1,1,30,0,            // Ś
  113.                                                 31,1,2,14,8,16,31,0};           // ż
  114. */
  115.  
  116.         unsigned char znak;
  117.         for (unsigned char i=0;i<64;i++)
  118.         {
  119.                 znak=znaki[i];
  120.                 LCD_polskie_znaki(znak);
  121.         }
  122.         _delay_us(1); // aaaa
  123. }
  124.  
  125. // inicjowanie LCD w trybie 4 bitowym
  126. void LCD_init(void)
  127. {
  128.         _delay_ms(50);
  129.         unsigned char i;
  130.         ddr_lcd_ster=0xff;
  131.         ddr_lcd_data=0xff;
  132.         rw_0;
  133.         _delay_ms(10);
  134.         for (i=1;i<3;i++)       // trzykrotne wysłanie 3-
  135.         {
  136.                 e_1;
  137.                 lcd_data=(lcd_data&0xf0)|0x03;  //wysłanie 3- do LCD
  138.                 _delay_ms(1);
  139.                 e_0;
  140.                 _delay_ms(1);
  141.         }
  142.         e_1;
  143.         lcd_data=(lcd_data&0xf0)|0x02;  // wysłanie 2- do LCD
  144.         _delay_ms(1);                   // od tego momentu sprawdzamy gotowosc LCD
  145.         LCD_wyslij(0x28,0);             // interfejs 4 bitowy, 2 linie
  146.         LCD_wyslij(0x08,0);             //wyłącz LCD, wyłącz kursor, wyłącz mruganie 00001000
  147.         LCD_wyslij(0x01,0);             //czysc LCD
  148.         LCD_wyslij(0x06,0);             //zwiekszanie pozycji kursora po każdy  znaku
  149.         LCD_wyslij(0x0c,0);             //wlacz wyswietlacz bez kursora
  150.         LCD_wyslij(0x28,0);             // interfejs 4 bitowy, 2 linie
  151.         e_0;
  152.         _delay_ms(1);
  153. }
  154.  
  155. //pisze tekst na LCD
  156. void LCD_tekst(char *tekst)
  157. {
  158.         unsigned char i=0;
  159.         while (tekst[i]) LCD_wyslij(tekst[i++],1);
  160.         _delay_us(10);
  161. }
  162.  
  163. void LCD_xy(unsigned char w, unsigned char h)
  164. {
  165.         LCD_wyslij((w*0x40+h)|0x80,0);
  166.         _delay_us(10);
  167. }
  168.  
  169. // napis poczatkowy
  170. void intro(void)
  171. {
  172.         LCD_czysc;
  173.         LCD_xy(0,0);
  174.         LCD_tekst("HALLO MI");LCD_wyslij(0x06,1);
  175.         LCD_xy(1,0);
  176.         LCD_tekst("Herbatka Gotowa");
  177. }
  178. //^ Wyświetlacz LCD ***********************************************************
  179.  
  180.  
  181. // Przerwania
  182. ISR(TIMER0_OVF_vect)
  183. {
  184.         PORTD = PORTD ^ 0b0100000;              //przerwanie timera0
  185. }
  186.  
  187. ISR(ADC_vect)
  188. {
  189. }
  190.  
  191. int main(void)
  192. {
  193.  
  194. DDRD=0xff;                              // ustalenie kierunku portu (wyjście)
  195. PORTD=0xff;                     // wystawienie wartości AAh na port czyli 10101010b
  196.  
  197. // konfiguracja timera0 8-bitowego
  198. TIMSK0=0x01;
  199. TCCR0A=0x00;
  200. TCCR0B=0x05;
  201.  
  202. sei();
  203.  
  204. // Uruchomienie LCD
  205. LCD_init();
  206.  
  207. // ADC konfiguracja
  208. ADMUX=0b11000000;              
  209. ADCSRA=0b11111100;
  210. ADCSRB=0b00000000;
  211.  
  212.         while(1)
  213.     {
  214.                         uint8_t ADC_LO = ADCL;
  215.                         uint16_t ADC_wynik = ADCH<<8 | ADC_LO;
  216.                         if (ADC_wynik<50) {flaga_alarm=0x01;} else {flaga_alarm=0x00;};
  217.                         LCD_xy(0,0);
  218.                         LCD_czysc;
  219.                         sprintf(buffer, "%u" , ADC_wynik);
  220.                         LCD_tekst(buffer);
  221.                         _delay_ms(200);
  222.     }
  223. }
  224.  
  225.  





 
Wszelkie prawa zastrzeżone! Kopiowanie, powielanie i wykorzystywanie zdjęć, treści oraz jej fragmentów bez zgody autora zabronione.
© mikroprocesory.info.pl@gmail.com 2013.