main.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. #include "main.h"
  2. __C_task void main(void)
  3. {
  4. uint8_t i;
  5. //uint8_t tmp8;
  6. /* Disable comaparator */
  7. ACSR = 1<<ACD;
  8. /* Init LED */
  9. LED_DDR = LED_1 | LED_2;
  10. LED_OFF(LED_1);
  11. LED_OFF(LED_2);
  12. /* Init 7 segment LED indicators */
  13. INDCTR_SEGMENT_DDR = 0xFF; // segment pins to output
  14. INDCTR_SEGMENT_PORT = 0x00; // off all segment
  15. INDCTR_COMMON_DDR = INDCTR_COMMON_ALL; // common pins to output
  16. INDCTR_COMMON_PORT = ~INDCTR_COMMON_ALL; // off all indikators
  17. for(i=0; i<INDCTR_NUMS; i++) {
  18. Display[i] = IndctrNums[i];
  19. }
  20. Flag.needDot = 0;
  21. /* Timer0 every 4 ms switch showing LED */
  22. TCCR0 = TIM0_PRESCALER;
  23. TCNT0 = TIM0_CNT; // load timer
  24. TIMSK |= 1<<TOIE0; // enable TIM0_OVF interrupt
  25. /* Timer0 every 4 ms switch showing LED */
  26. TCCR0 = TIM0_PRESCALER;
  27. TCNT0 = TIM0_CNT; // load timer
  28. TIMSK |= 1<<TOIE0; // enable TIM0_OVF interrupt
  29. /* ADC init */
  30. resultADC = 0;
  31. ADMUX = (1<<REFS0) | (1<<ADLAR); // Vref = AVcc, channel ADC0, Left adjusted result
  32. ADCSR = 1<<ADEN | 1<<ADPS2 | 1<<ADPS1; // enable ADC, prescaler = 64
  33. /* I2C init */
  34. TWI_MasterInit(100);
  35. __enable_interrupt();
  36. /* Init Scheduler and TDelay */
  37. RTOS_Init();
  38. // Tasks for sheduler
  39. RTOS_SetTask(startADC,0,50);
  40. RTOS_SetTask(getTime,0,500);
  41. /* Get time */
  42. while(1) {
  43. if (1 == Flag.newTime) {
  44. Flag.newTime = 0;
  45. Display[0] = IndctrNums[(0x0F & (Clock.hours>>4))];
  46. Display[1] = IndctrNums[(0x0F & Clock.hours)];
  47. Display[2] = IndctrNums[(0x0F & (Clock.minutes>>4))];
  48. Display[3] = IndctrNums[(0x0F & Clock.minutes)];
  49. }
  50. if (1 == Flag.newBTN) {
  51. Flag.newBTN = 0;
  52. btn_t btn = getBTN();
  53. if (btn == btn_1) {
  54. LED_ON(LED_1);
  55. } else if (btn == btn_2) {
  56. LED_ON(LED_2);
  57. } else if (btn == btn_3) {
  58. LED_OFF(LED_1);
  59. } else if (btn == btn_4) {
  60. LED_OFF(LED_2);
  61. } else if (btn == btn_5) {
  62. LED_ON(LED_1);
  63. LED_ON(LED_2);
  64. } else if (btn == btn_6) {
  65. LED_OFF(LED_1);
  66. LED_OFF(LED_2);
  67. }
  68. }
  69. tdelay_ms(10); // sleep and rotate dispatcher
  70. } // end of while(1)
  71. } // end of main()
  72. /**
  73. * S u b r o u t i n e s
  74. */
  75. static void startADC(void) {
  76. // enable interrupt and start conversion
  77. ADCSR |= ((1<<ADSC) | (1<<ADIE));
  78. }
  79. static btn_t getBTN(void) {
  80. uint8_t btn_code = resultADC;
  81. if (btn_code > 0xED) {
  82. return btn_no;
  83. } else if (btn_code > 0xD8) {
  84. return btn_1;
  85. } else if (btn_code > 0xD0) {
  86. return btn_2;
  87. } else if (btn_code > 0xC5) {
  88. return btn_3;
  89. } else if (btn_code > 0xB4) {
  90. return btn_4;
  91. } else if (btn_code > 0x94) {
  92. return btn_5;
  93. } else if (btn_code > 0x3F) {
  94. return btn_6;
  95. } else {
  96. return btn_7;
  97. }
  98. }
  99. static void getTime(void) {
  100. static uint8_t old_sec;
  101. /*устанавливаем указатель DS1307 на нулевой адрес*/
  102. twi_buf[0] = (DS1307_ADR<<1)|0; //адресный пакет
  103. twi_buf[1] = 0; //адрес регистра
  104. TWI_SendData(twi_buf, 2);
  105. /*считываем время с DS1307*/
  106. twi_buf[0] = (DS1307_ADR<<1)|1;
  107. TWI_SendData(twi_buf, 5);
  108. /*переписываем данные буфера драйвера в свой буфер*/
  109. TWI_GetData(twi_buf, 5);
  110. Clock.seconds = twi_buf[1];
  111. Clock.minutes = twi_buf[2];
  112. Clock.hours = twi_buf[3];
  113. if (old_sec != Clock.seconds) {
  114. Flag.needDot = 1;
  115. old_sec = Clock.seconds;
  116. } else {
  117. Flag.needDot = 0;
  118. }
  119. Flag.newTime = 1;
  120. }
  121. static void setTime(void) {
  122. /*подготавливаем сообщение*/
  123. twi_buf[0] = (DS1307_ADR<<1)|0; //адресный пакет
  124. twi_buf[1] = 0; //адрес регистра
  125. twi_buf[2] = Clock.seconds; //значение секунд
  126. twi_buf[3] = Clock.minutes; //значение минут
  127. twi_buf[4] = Clock.hours; //значение часов
  128. /*отправляем его*/
  129. TWI_SendData(twi_buf, 5);
  130. }
  131. /**
  132. * I n t e r r u p t h a n d l e r s
  133. */
  134. #pragma vector=TIMER0_OVF_vect
  135. __interrupt void TIMER0_OVF_ISR(void) {
  136. static uint8_t indicator = 0;
  137. TCNT0 = TIM0_CNT; // reload timer
  138. INDCTR_COMMON_PORT &= ~INDCTR_COMMON_ALL; // off all indikators
  139. switch (indicator) {
  140. case 0:
  141. INDCTR_SEGMENT_PORT = Display[0];
  142. INDCTR_COMMON_PORT |= 0x01;
  143. indicator = 1;
  144. break;
  145. case 1:
  146. if (1 == Flag.needDot) {
  147. INDCTR_SEGMENT_PORT = Display[1] | Sym_dot;
  148. } else {
  149. INDCTR_SEGMENT_PORT = Display[1];
  150. }
  151. INDCTR_COMMON_PORT |= 0x02;
  152. indicator = 2;
  153. break;
  154. case 2:
  155. INDCTR_SEGMENT_PORT = Display[2];
  156. INDCTR_COMMON_PORT |= 0x04;
  157. indicator = 3;
  158. break;
  159. case 3:
  160. INDCTR_SEGMENT_PORT = Display[3];
  161. INDCTR_COMMON_PORT |= 0x08;
  162. default:
  163. indicator = 0;
  164. break;
  165. }
  166. }
  167. #pragma vector=ADC_vect
  168. __interrupt void ADC_ISR(void) {
  169. resultADC = ADCH;
  170. ADCSR &= ~(1<<ADIE); // disable interrupt
  171. Flag.newBTN = 1;
  172. }