Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * miernik.c
- *
- * Created: 2013-12-07 21:13:13
- * Author: zielo
- */
- #include <avr/io.h>
- #include <util/delay.h>
- #include <avr/interrupt.h>
- //PRZYDATNE TYPY
- typedef unsigned char u8;
- //DEFINICJA TABLICY PINOW LCD - STALA GLOBALNA
- const u8 liczba [] = {(char)~0x5f,(char)~0x41,(char)~0x9d,(char)~0xd5,(char)~0xc3,(char)~0xd6,(char)~0xde,(char)~0x45,(char)~0xdf,(char)~0xd7,(char)~0x20};
- //DEKLARACJE FUNKCJI
- void led (u8, u8);
- void init_timer2(void);
- void init_timer0(void);
- void init_adc(void);
- //DEFINICJE ZMIENNYCH GLOBALNYCH
- volatile u8 hg,mg,sg,g,d,pl;
- volatile uint16_t pomiar;
- int main(void)
- {
- DDRD = 0xff; //d - wyjscie
- DDRC |= 0x0f; //c (0-3) - wyjscie 4,5,6,7 - wejscie
- DDRB &=~(0x2); //b 1 - wejscie
- DDRB |=(1<<2); //b 2 - wyjscie
- PORTC &= ~(0xf); //c (0-3) - stan niski
- // PORTC |=0x30; //c podciagam 1 pod 4 i 5.
- PORTD = 0xff; //d - stan wysoki (wylaczamy wyswietlacz)
- PORTB |= 0x2; //b - podciagam 1 pod 1
- PORTB &=~(1<<2); //pb2 stan niski
- init_timer2();
- init_timer0();
- init_adc();
- sei(); //wlaczenie przerwan;
- //uint16_t p_sr;
- u8 test=100,t1=0;
- unsigned long licz;
- while(1)
- {
- // p_sr = (pomiar[0]+pomiar[1]+pomiar[2]+pomiar[3]+pomiar[4])/5;
- licz=(pomiar*10)/336; // 1 V (30,5V przez dzielnik na 5V) to 33,57
- // g=pomiar/100;
- // d=pomiar%100;
- g=(char)licz;
- licz=((pomiar*10)%336)*100/336;
- d=(char)((licz/5)*5); //zaokraglenie w dol do 0,5.
- if (g<23 && g > 14)
- {
- if (test!=sg)
- {
- test=sg;
- t1++;
- if (t1>10) PORTB^=(1<<2);
- }
- }
- else
- {
- PORTB &=~(1<<2);
- t1 = 0;
- }
- // led(g,d);
- //ADCSRA |= (1<<ADSC);
- /* if (!(PINC & (1<<4)))
- {
- if (++mg > 59) mg = 0;
- // while (!(PINC & (1<<4)));
- _delay_ms(300);
- sg=0;
- }
- if (!(PINC & (1<<5)))
- {
- if (++hg>23) hg=0;
- _delay_ms(300);
- // while (!(PINC & (1<<5)));
- }
- if (!(PINB & (1<<1)))
- {
- if (OCR1A < 2000) OCR1A += 200;
- else OCR1A = 1;
- _delay_ms(100);
- }
- */
- }
- }
- // DEFINICJE FUNKCJI
- void led (u8 h, u8 m)
- {
- for (u8 i=0;i<4;i++)
- {
- switch (i)
- {
- case 0:
- if (h/10)
- {
- PORTC |= (1<<0);
- PORTD = liczba[h/10];
- }
- break;
- case 1:
- PORTC |= (1<<1);
- PORTD = sg%2 ? liczba[h % 10] : liczba[10] & liczba[h % 10];
- break;
- case 2:
- PORTC |= (1<<2);
- PORTD = liczba[m/10];
- break;
- default:
- PORTC |= (1<<3);
- PORTD = liczba[m % 10];
- asm volatile ("nop");
- asm volatile ("nop");
- }
- /* asm volatile ("nop");
- asm volatile ("nop");
- asm volatile ("nop");
- asm volatile ("nop");
- asm volatile ("nop");
- asm volatile ("nop");*/
- PORTC &= ~(0xf);
- PORTD = 0xff;
- }
- }
- void init_timer2(void)
- {
- TCCR2B = 0;
- TCCR2A = 0; //wylaczam timer
- TCNT2 = 0; //licznik zeruje
- TIMSK2 &= ~((1<<OCIE2B)|(1<<OCIE2A)|(1<<TOIE2)); //wy��czenie przerwa� od timera
- ASSR |= (1<<AS2); //timer2 z zewnetrzego kwarca
- TCCR2A |= (1<<WGM21); //tryb CTC
- TCCR2B |= ((1<<CS22) | (1<<CS21)); //prescaler = 256
- OCR2A = 126; //32768/256-1
- TIMSK2 |= (1<<OCIE2A); //przerwanie od osiagniecia OCR2
- while ((ASSR & 1)|(ASSR & 2)|(ASSR & 4)|(ASSR & 8)|(ASSR & 16)); //czekamy na synchronizacje
- TIFR2 = 0; //kasujemy flagi przerwan
- }
- void init_timer0(void)
- {
- TCCR0A |= (1<<WGM01); //CTC
- TCCR0B |= ((1<<CS20) | (1<<CS21)); //prescaler - 32
- OCR0A = 1; //licznik do..
- TIMSK0 |= (1<<OCIE0A); //przerwanie po osiagnieciu ocr0a
- }
- void init_adc(void)
- {
- ADMUX = (1<<REFS0) //Vref = Avcc
- |(1<<MUX0) | (1<<MUX2) //ADC5 jako wejscie sygna�u
- |(1<<ADLAR); //lewostronnie
- // ADCSRB &= ~(0b111); //free running
- ADCSRA = (1<<ADPS0) | (1<<ADPS1) //presaler = 8 (1MHz / 8 = 125kHz) miesci sie 50-200kHz
- |(1<<ADEN); //| (1<<ADIE) //wlaczamy ADC, //przerwania
- //|(1<<ADATE) //free running mode
- // |(1<<ADSC); //pierwszy pomiar
- //while(ADCSRA & (1<<ADSC));
- }
- // DEFINICJE PRZERWAN
- /*
- ISR (ADC_vect)
- {
- pomiar=ADCH;
- ADCSRA |= (1<<ADSC);
- }
- */
- ISR (TIMER0_COMPA_vect)
- {
- led (g,d);
- }
- ISR (TIMER2_COMPA_vect)
- {
- // if (++ssg == 3995)
- // {
- // ssg=0;
- ADCSRA |= (1<<ADSC);
- pl = ADCL; // pierw czytamy ADCL
- pomiar=(ADCH<<2)|(pl>>6); // cala 10 bitowa rozdzielczoc
- // pomiar+=17; //spadek napiecia na diodzie (0,5v)
- if (++sg == 60)
- {
- sg = mg%8 ? 0 : 1; //koreta 1s na 8 min
- if (++mg == 60)
- {
- mg = 0;
- if (++hg==24) hg=0;
- }
- }
- // }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement