peterzig

[AVR][C] Atmega32 kodzik

Nov 30th, 2020
369
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <avr/io.h>
  2. #include <util/delay.h>
  3. #include <avr/sfr_defs.h>
  4. #include <stdbool.h>
  5. #include "lcd.h"
  6.  
  7. void port_init()
  8. {
  9.     DDRD = (1 << PD7)|(0 << PD2); // operacja bitowa, na porcie D bit 7 ustawiony na HIGH,
  10.     // oraz bit 2 na LOW
  11.     PORTD = 1 << PD7 | 1 << PD2; // operacja bitowa, na porcie D bit 7 oraz 2 ustawiony na HIGH
  12.     DDRC = 1 << PC6 | 0 << PC7; // operacja bitowa, na porcie C bit 6 ustawiony na HIGH,
  13.     // oraz bit 7 na LOW
  14.     PORTC = 1 << PC6 | 1 << PC7;// operacja bitowa, na porcie C bit 6 oraz 7 ustawiony na HIGH
  15.     DDRA = 0xE0; //przypisanie do DDRA wartosci hexadecymalnej 0xE0 (224d)
  16.     PORTA = 0x18; //przypisanie do PORTA wartosci hexadecymalnej 0x18 (24d)
  17.     DDRB = 0xBF; //przypisanie do DDRB wartosci hexadecymalnej 0xBF (191)
  18.     PORTB = 0x00; // przypisanie do PORTB (portu wejscia/wyjscia) wartości 0x00 (0d)
  19. }
  20.  
  21. void LED1_blink(){
  22.     PORTD &= ~(1<<PD7); //stan niski na  7 bicie portu D, do którego jest podlaczona dioda LED
  23.     _delay_ms(1000); //1000ms opoznienia
  24.     PORTD |= (1<<PD7); //stan wysoki na 7 bicie portu D, do którego jest podlaczona dioda LED
  25.     _delay_ms(1000); //1000ms opoznienia
  26. }
  27.  
  28. void pomiar_temp(){
  29.     ADMUX=(1<<REFS0)|1; //bit wyboru wejscia (MUXn) ustawiony w stan wysoki oraz przypisany numer wejscia 1
  30. };
  31.  
  32. void pomiar_napiecia(){
  33.     ADMUX=(1<<REFS0)|2; //bit wyboru wejscia (MUXn) ustawiony w stan wysoki oraz przypisany numer wejscia 2
  34. };
  35.  
  36. void pomiar_jasnosci(){
  37.     ADMUX=(1<<REFS0)|3; //bit wyboru wejscia (MUXn) ustawiony w stan wysoki oraz przypisany numer wejscia 1
  38. };
  39.  
  40. int main(void)
  41. {
  42.     port_init(); //wywolanie funkcji port_init(), realizującej inicjalizacje portow w AVR
  43.     PORTC=PORTC|(1<<6); //wylaczenie diody
  44.     LCD_init(); //inicjalizacja wyswietlacza
  45.     LCD_clean(); //wyczyszczenie wyswietlacza
  46.     fdevopen(LCD_putch, NULL); // funkcja, dzięki której działa printf
  47.    
  48.     while(1){
  49.    
  50.     pomiar_temp();
  51.     while(!(ADCSRA&(1<<ADIF))==1); //pętla, dzięki której flaga ADIF (ADC Interrupt Flag)
  52.     //po każdorazowym odczycie rejestru wyniku jest zerowana
  53.     // w przeciwnym wypadku rejestr wyjściowy ADC jest zablokowany
  54.     int x = ADCL|(ADCH<<8); //odczyt wartosci z ADC
  55.     _delay_ms(250);
  56.     LCD_clean();
  57.     int celsius = 5*x*100/25; //wartosc temperatury to pomnozone 5-cio krotnie wartosc napiecia odczytana z ADC
  58.     //pomnożona razy 100 i podzielona przez 25 * Celsjusza dla czujnika LM35
  59.     LCD_printf_1("TEMP = %i", celsius); // wyswietlenie temperatury
  60.    
  61.     pomiar_napiecia();
  62.     while(!(ADCSRA&(1<<ADIF))==1); //pętla, dzięki której flaga ADIF (ADC Interrupt Flag)
  63.     //po każdorazowym odczycie rejestru wyniku jest zerowana
  64.     // w przeciwnym wypadku rejestr wyjściowy ADC jest zablokowany
  65.     int x = ADCL|(ADCH<<8); //odczyt wartosci z ADC
  66.     _delay_ms(250);
  67.     LCD_clean();
  68.     int volts = 5*x/1024; // wartosc napiecia to pomnozone 5-cio krotnie wartosc odczytana z ADC
  69.     //podzielona przez preskaler czestotliwosci 1024 co dla oscylatora 8Mhz daje 30.517Hz częstotliwości
  70.     //a w przypadku uzycia oscylatora 16Mhz 61.034Hz
  71.     LCD_printf_2("VOLTS = %i", volts); // wyswietlenie napiecia w voltach
  72. }
  73.  
  74. int main2(void)
  75. {
  76.     port_init(); //wywolanie funkcji port_init(), realizującej inicjalizacje portow w AVR
  77.     PORTC=PORTC|(1<<6); //wylaczenie diody
  78.     LCD_init(); //inicjalizacja wyswietlacza
  79.     LCD_clean(); //wyczyszczenie wyswietlacza
  80.     fdevopen(LCD_putch, NULL); // funkcja, dzięki której działa printf
  81.    
  82.     DDRD = (1<<1); // inicjalizacja UART
  83.     PORTD = (1<<1); //  na porcie D ustawienie 1 logicznej (stan HIGH)
  84.     UART_init(BAUD); // ustawienie baud rate dla UART (domyślnie 9600)
  85.    
  86.     ADCSRA =(1<<ADEN)|(1<<ADSC); // ustawienie na rejestrze ADCSRA bitu 7 (ADEN) jako HIGH oraz bitu 6 (ADSC) jako HIGH
  87.    
  88.     TCCR2=(1<<WGM21)|(1<<COM21)|(1<<WGM20)|(1<<CS20)|(1<<COM20)
  89.     //konfiguracja rejestru TCCR2, licznika, w którym bity
  90.     //0, 1 ,3, 4, 5, 6 są ustawione w tryb HIGH. Wszystkie te bity poza bitem 7 (FOC2) są read/write
  91. }
  92.  
  93. int main(void)
  94. {
  95.     TCCR0=(1<<CS01)|(1<<CS00); //ustawienie bitów 0 oraz 1 rejestru TCCR0 (odpowiedzialnego za prescaler) w stan HIGH
  96.     // CS00 oraz CS01 mają możliwosc odczytu i zapisu bitu (Read/Write)
  97.     TIMSK=(1<<TOIE0); // ustawienie bitu 0 TOEI0 odblokowujace przerwanie od przepelnienia sie timera licznika
  98.     sei(); //globalna aktywacja przerwań
  99.    
  100.     while(1) //nieskończona petla
  101.     {
  102.         if(dioda)
  103.         {
  104.             PORTC^=(1<<PC7); //ustawienie portu PC7 w stan HIGH
  105.             dioda=false; //ustawienie diody w stan LOW
  106.         }
  107.     }
  108. }
  109. ISR(TIMER0_OVF_vect)
  110. {
  111.     count++; //inkrementacja zmiennej
  112.     if(count >= 450) // jezeli wartosc zmiennej count jest rowna badz wieksza od 450
  113.     {
  114.         count = 0; //zerowanie zmiennej count
  115.         dioda = true; //ustawienie diody w stan HIGH
  116.     }
  117. }
  118.    
RAW Paste Data