Advertisement
zielo

Untitled

Nov 14th, 2018
493
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.52 KB | None | 0 0
  1. /*
  2.  * miernik.c
  3.  *
  4.  * Created: 2013-12-07 21:13:13
  5.  *  Author: zielo
  6.  */
  7.  
  8.  
  9. #include <avr/io.h>
  10. #include <util/delay.h>
  11. #include <avr/interrupt.h>
  12.  
  13. //PRZYDATNE TYPY
  14. typedef unsigned char u8;
  15.  
  16. //DEFINICJA TABLICY PINOW LCD - STALA GLOBALNA
  17. 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};
  18.  
  19. //DEKLARACJE FUNKCJI
  20. void led (u8, u8);
  21. void init_timer2(void);
  22. void init_timer0(void);
  23. void init_adc(void);
  24.  
  25. //DEFINICJE ZMIENNYCH GLOBALNYCH
  26. volatile u8 hg,mg,sg,g,d,pl;
  27. volatile uint16_t pomiar;
  28.  
  29. int main(void)
  30. {
  31.    
  32.     DDRD = 0xff;            //d - wyjscie
  33.     DDRC |= 0x0f;           //c (0-3) - wyjscie 4,5,6,7 - wejscie
  34.     DDRB &=~(0x2);          //b 1 - wejscie
  35.     DDRB |=(1<<2);          //b 2 - wyjscie
  36.     PORTC &= ~(0xf);        //c (0-3) - stan niski
  37. //  PORTC |=0x30;           //c podciagam 1 pod 4 i 5.
  38.     PORTD = 0xff;           //d - stan wysoki (wylaczamy wyswietlacz)
  39.     PORTB |= 0x2;           //b - podciagam 1 pod 1
  40.     PORTB &=~(1<<2);        //pb2 stan niski
  41.     init_timer2();
  42.     init_timer0();
  43.     init_adc();
  44.     sei();                  //wlaczenie przerwan;
  45.     //uint16_t p_sr;
  46.     u8 test=100,t1=0;
  47.     unsigned long licz;
  48.     while(1)
  49.     {
  50.     //  p_sr = (pomiar[0]+pomiar[1]+pomiar[2]+pomiar[3]+pomiar[4])/5;
  51.         licz=(pomiar*10)/336; // 1 V (30,5V przez dzielnik na 5V) to 33,57
  52.     //  g=pomiar/100;
  53.     //  d=pomiar%100;
  54.         g=(char)licz;
  55.         licz=((pomiar*10)%336)*100/336;
  56.         d=(char)((licz/5)*5); //zaokraglenie w dol do 0,5.
  57.         if (g<23 && g > 14)
  58.         {
  59.             if (test!=sg)
  60.             {
  61.                 test=sg;
  62.                 t1++;
  63.                 if (t1>10) PORTB^=(1<<2);
  64.             }
  65.         }
  66.         else
  67.         {
  68.             PORTB &=~(1<<2);
  69.             t1 = 0;
  70.         }
  71.     //  led(g,d);
  72.         //ADCSRA |= (1<<ADSC);
  73.        
  74. /*      if (!(PINC & (1<<4)))
  75.         {
  76.             if (++mg > 59) mg = 0;
  77.         //  while (!(PINC & (1<<4)));
  78.             _delay_ms(300);
  79.             sg=0;
  80.         }
  81.         if (!(PINC & (1<<5)))
  82.         {
  83.             if (++hg>23) hg=0;
  84.             _delay_ms(300);
  85.     //      while (!(PINC & (1<<5)));
  86.         }
  87.         if (!(PINB & (1<<1)))
  88.         {
  89.             if (OCR1A < 2000) OCR1A += 200;
  90.             else OCR1A = 1;
  91.             _delay_ms(100);
  92.         }
  93.  
  94. */
  95.     }
  96.        
  97. }
  98.  
  99.  
  100. // DEFINICJE FUNKCJI
  101.  
  102.  
  103. void led (u8 h, u8 m)
  104. {
  105.     for (u8 i=0;i<4;i++)
  106.     {
  107.         switch (i)
  108.         {
  109.             case 0:
  110.             if (h/10)
  111.             {
  112.                 PORTC |= (1<<0);
  113.                 PORTD = liczba[h/10];
  114.             }
  115.             break;
  116.            
  117.             case 1:
  118.                 PORTC |= (1<<1);
  119.                 PORTD = sg%2 ? liczba[h % 10] : liczba[10] & liczba[h % 10];
  120.             break;
  121.            
  122.             case 2:
  123.                 PORTC |= (1<<2);
  124.                 PORTD = liczba[m/10];
  125.             break;
  126.            
  127.             default:
  128.             PORTC |= (1<<3);
  129.             PORTD = liczba[m % 10];
  130.             asm volatile ("nop");
  131.             asm volatile ("nop");
  132.         }
  133. /*      asm volatile ("nop");
  134.         asm volatile ("nop");
  135.         asm volatile ("nop");
  136.         asm volatile ("nop");
  137.         asm volatile ("nop");
  138.         asm volatile ("nop");*/
  139.         PORTC &= ~(0xf);
  140.         PORTD = 0xff;
  141.     }
  142.    
  143. }
  144.  
  145. void init_timer2(void)
  146. {
  147.         TCCR2B = 0;
  148.         TCCR2A = 0;                             //wylaczam timer
  149.         TCNT2 = 0;                              //licznik zeruje
  150.         TIMSK2 &= ~((1<<OCIE2B)|(1<<OCIE2A)|(1<<TOIE2));    //wy��czenie przerwa� od timera
  151.         ASSR |= (1<<AS2);                       //timer2 z zewnetrzego kwarca
  152.         TCCR2A |= (1<<WGM21);                   //tryb CTC
  153.         TCCR2B |= ((1<<CS22) | (1<<CS21));      //prescaler = 256
  154.         OCR2A = 126;                                //32768/256-1
  155.         TIMSK2 |= (1<<OCIE2A);                  //przerwanie od osiagniecia OCR2
  156.         while ((ASSR & 1)|(ASSR & 2)|(ASSR & 4)|(ASSR & 8)|(ASSR & 16));                //czekamy na synchronizacje
  157.         TIFR2 = 0;                              //kasujemy flagi przerwan
  158. }
  159.  
  160. void init_timer0(void)
  161. {
  162.     TCCR0A |= (1<<WGM01);       //CTC
  163.     TCCR0B |= ((1<<CS20) | (1<<CS21));          //prescaler - 32
  164.     OCR0A = 1;                  //licznik do..
  165.     TIMSK0 |= (1<<OCIE0A);          //przerwanie po osiagnieciu ocr0a
  166.    
  167. }
  168.  
  169. void init_adc(void)
  170. {
  171.     ADMUX =     (1<<REFS0)                  //Vref = Avcc
  172.                 |(1<<MUX0) | (1<<MUX2)      //ADC5 jako wejscie sygna�u
  173.                 |(1<<ADLAR);                //lewostronnie 
  174. //  ADCSRB &=   ~(0b111);                   //free running
  175.     ADCSRA =    (1<<ADPS0)  | (1<<ADPS1)    //presaler = 8 (1MHz / 8 = 125kHz) miesci sie 50-200kHz
  176.                 |(1<<ADEN); //| (1<<ADIE)   //wlaczamy ADC, //przerwania
  177.                 //|(1<<ADATE)               //free running mode
  178.             //  |(1<<ADSC);                 //pierwszy pomiar
  179.     //while(ADCSRA & (1<<ADSC));
  180. }
  181.  
  182. // DEFINICJE PRZERWAN
  183.  
  184. /*
  185. ISR (ADC_vect)
  186. {
  187.     pomiar=ADCH;
  188.     ADCSRA |= (1<<ADSC);   
  189. }
  190. */
  191.  
  192. ISR (TIMER0_COMPA_vect)
  193. {
  194.     led (g,d);
  195. }
  196.  
  197. ISR (TIMER2_COMPA_vect)
  198. {
  199. //  if (++ssg == 3995)
  200. //  {
  201. //      ssg=0;
  202.         ADCSRA |= (1<<ADSC);
  203.         pl = ADCL;                  // pierw czytamy ADCL
  204.         pomiar=(ADCH<<2)|(pl>>6);   // cala 10 bitowa rozdzielczoc
  205. //      pomiar+=17;     //spadek napiecia na diodzie (0,5v)
  206.         if (++sg == 60)
  207.         {
  208.             sg = mg%8 ? 0 : 1;  //koreta 1s na 8 min
  209.             if (++mg == 60)
  210.             {
  211.                 mg = 0;
  212.                 if (++hg==24) hg=0;
  213.             }
  214.         }      
  215. //  }
  216.  
  217.  
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement