Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * main.c
- *
- * Created on: 24 kwi 2018
- * Author: Kamil Goś
- */
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #include "lcd44780.h"
- #define LEDs PORTD
- uint16_t pomiar(uint8_t kanal);
- volatile unsigned short int adc_data; //Zmienna przechowujaca pomiar z ADC
- //Tablica stanów
- volatile const unsigned short int level[9] = {0b00000000,0b00000001,0b00000011,0b00000111,0b00001111,0b00011111,0b00111111,0b01111111,0b11111111};
- //funkcja glowna
- int main (void) {
- DDRD = 0b11111111; //inicjalizacja portu D jako wyjście
- lcd_init();
- ///////////////INICJALIZACJA MODULU ADC/////////////////////
- ADMUX |= (1<<REFS0)|(1<<ADLAR); //wybor napiecia odniesienia VCC
- ADCSRA |= (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); //aktywacja ADC (ADEN=1) i ustawienie preskalera na 128
- ////////////////////////////////////////////////////////////
- ////////////////INICJALIZACJA TIMERA0 /////////////
- TCCR0A |=(1<<WGM01); //wlaczenie trybu CTC timera 0
- TCCR0B |=(1<<CS02) | (1<<CS00); //preskaler 1024
- OCR0A=38; //(8000000/1024(preskaler)/200Hz)-1=38,06
- TIMSK0 |=(1<<OCIE0A); //zezwolenie na przerwanie
- ////////////////////////////////////////////////////////
- sei(); //globalne pozwolenie na przerwania
- while(1){
- }
- }
- //funkcja realizująca pomiar napięcia na danym kanale ADC
- //wejscie: kanal-wybrany kanał ADC
- //wyjscie: zmierzone napiecie
- uint16_t pomiar(uint8_t kanal) {
- ADMUX |= ((ADMUX & 0xF8) | kanal); //ustawienie wybranego kanału ADC
- ADCSRA |= (1<<ADSC); //START pomiaru
- while(ADCSRA & (1<<ADSC)); //oczekiwanie na koniec pomiary (dopoki bit ADC=1)
- return (ADCH); //ADCW to para rejestrow ADCH i ADCL
- }
- //OBSŁUGA PRZERWANIA TIMERA0
- ISR(TIMER0_COMPA_vect) {
- adc_data=pomiar(1); //adc_data=(0-1024)
- adc_data = adc_data;
- lcd_cls();
- lcd_int(adc_data);
- LEDs=level[adc_data];
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement