Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <avr/io.h>
- #include <util/delay.h>
- #include <avr/sfr_defs.h>
- #include <stdbool.h>
- #include "lcd.h"
- void port_init()
- {
- DDRD = (1 << PD7)|(0 << PD2); // operacja bitowa, na porcie D bit 7 ustawiony na HIGH,
- // oraz bit 2 na LOW
- PORTD = 1 << PD7 | 1 << PD2; // operacja bitowa, na porcie D bit 7 oraz 2 ustawiony na HIGH
- DDRC = 1 << PC6 | 0 << PC7; // operacja bitowa, na porcie C bit 6 ustawiony na HIGH,
- // oraz bit 7 na LOW
- PORTC = 1 << PC6 | 1 << PC7;// operacja bitowa, na porcie C bit 6 oraz 7 ustawiony na HIGH
- DDRA = 0xE0; //przypisanie do DDRA wartosci hexadecymalnej 0xE0 (224d)
- PORTA = 0x18; //przypisanie do PORTA wartosci hexadecymalnej 0x18 (24d)
- DDRB = 0xBF; //przypisanie do DDRB wartosci hexadecymalnej 0xBF (191)
- PORTB = 0x00; // przypisanie do PORTB (portu wejscia/wyjscia) wartości 0x00 (0d)
- }
- void LED1_blink(){
- PORTD &= ~(1<<PD7); //stan niski na 7 bicie portu D, do którego jest podlaczona dioda LED
- _delay_ms(1000); //1000ms opoznienia
- PORTD |= (1<<PD7); //stan wysoki na 7 bicie portu D, do którego jest podlaczona dioda LED
- _delay_ms(1000); //1000ms opoznienia
- }
- void pomiar_temp(){
- ADMUX=(1<<REFS0)|1; //bit wyboru wejscia (MUXn) ustawiony w stan wysoki oraz przypisany numer wejscia 1
- };
- void pomiar_napiecia(){
- ADMUX=(1<<REFS0)|2; //bit wyboru wejscia (MUXn) ustawiony w stan wysoki oraz przypisany numer wejscia 2
- };
- void pomiar_jasnosci(){
- ADMUX=(1<<REFS0)|3; //bit wyboru wejscia (MUXn) ustawiony w stan wysoki oraz przypisany numer wejscia 1
- };
- int main(void)
- {
- port_init(); //wywolanie funkcji port_init(), realizującej inicjalizacje portow w AVR
- PORTC=PORTC|(1<<6); //wylaczenie diody
- LCD_init(); //inicjalizacja wyswietlacza
- LCD_clean(); //wyczyszczenie wyswietlacza
- fdevopen(LCD_putch, NULL); // funkcja, dzięki której działa printf
- while(1){
- pomiar_temp();
- while(!(ADCSRA&(1<<ADIF))==1); //pętla, dzięki której flaga ADIF (ADC Interrupt Flag)
- //po każdorazowym odczycie rejestru wyniku jest zerowana
- // w przeciwnym wypadku rejestr wyjściowy ADC jest zablokowany
- int x = ADCL|(ADCH<<8); //odczyt wartosci z ADC
- _delay_ms(250);
- LCD_clean();
- int celsius = 5*x*100/25; //wartosc temperatury to pomnozone 5-cio krotnie wartosc napiecia odczytana z ADC
- //pomnożona razy 100 i podzielona przez 25 * Celsjusza dla czujnika LM35
- LCD_printf_1("TEMP = %i", celsius); // wyswietlenie temperatury
- pomiar_napiecia();
- while(!(ADCSRA&(1<<ADIF))==1); //pętla, dzięki której flaga ADIF (ADC Interrupt Flag)
- //po każdorazowym odczycie rejestru wyniku jest zerowana
- // w przeciwnym wypadku rejestr wyjściowy ADC jest zablokowany
- int x = ADCL|(ADCH<<8); //odczyt wartosci z ADC
- _delay_ms(250);
- LCD_clean();
- int volts = 5*x/1024; // wartosc napiecia to pomnozone 5-cio krotnie wartosc odczytana z ADC
- //podzielona przez preskaler czestotliwosci 1024 co dla oscylatora 8Mhz daje 30.517Hz częstotliwości
- //a w przypadku uzycia oscylatora 16Mhz 61.034Hz
- LCD_printf_2("VOLTS = %i", volts); // wyswietlenie napiecia w voltach
- }
- int main2(void)
- {
- port_init(); //wywolanie funkcji port_init(), realizującej inicjalizacje portow w AVR
- PORTC=PORTC|(1<<6); //wylaczenie diody
- LCD_init(); //inicjalizacja wyswietlacza
- LCD_clean(); //wyczyszczenie wyswietlacza
- fdevopen(LCD_putch, NULL); // funkcja, dzięki której działa printf
- DDRD = (1<<1); // inicjalizacja UART
- PORTD = (1<<1); // na porcie D ustawienie 1 logicznej (stan HIGH)
- UART_init(BAUD); // ustawienie baud rate dla UART (domyślnie 9600)
- ADCSRA =(1<<ADEN)|(1<<ADSC); // ustawienie na rejestrze ADCSRA bitu 7 (ADEN) jako HIGH oraz bitu 6 (ADSC) jako HIGH
- TCCR2=(1<<WGM21)|(1<<COM21)|(1<<WGM20)|(1<<CS20)|(1<<COM20)
- //konfiguracja rejestru TCCR2, licznika, w którym bity
- //0, 1 ,3, 4, 5, 6 są ustawione w tryb HIGH. Wszystkie te bity poza bitem 7 (FOC2) są read/write
- }
- int main(void)
- {
- TCCR0=(1<<CS01)|(1<<CS00); //ustawienie bitów 0 oraz 1 rejestru TCCR0 (odpowiedzialnego za prescaler) w stan HIGH
- // CS00 oraz CS01 mają możliwosc odczytu i zapisu bitu (Read/Write)
- TIMSK=(1<<TOIE0); // ustawienie bitu 0 TOEI0 odblokowujace przerwanie od przepelnienia sie timera licznika
- sei(); //globalna aktywacja przerwań
- while(1) //nieskończona petla
- {
- if(dioda)
- {
- PORTC^=(1<<PC7); //ustawienie portu PC7 w stan HIGH
- dioda=false; //ustawienie diody w stan LOW
- }
- }
- }
- ISR(TIMER0_OVF_vect)
- {
- count++; //inkrementacja zmiennej
- if(count >= 450) // jezeli wartosc zmiennej count jest rowna badz wieksza od 450
- {
- count = 0; //zerowanie zmiennej count
- dioda = true; //ustawienie diody w stan HIGH
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement