Advertisement
Guest User

proj2

a guest
Jan 20th, 2020
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.76 KB | None | 0 0
  1. #include <ioavr.h>
  2. #include <inavr.h>
  3. #include <stdio.h>
  4. #include <pgmspace.h>
  5. #include "rtc_simple.h"
  6. #include "hd44780.h"
  7. #include "queue.h"
  8. #include "keyb_drv.h"
  9. #define CLOCK_INC   0x03
  10.  
  11.  
  12. //LED
  13. #include <iom128.h>
  14.  
  15. //Program configuration
  16. //#define ISR_PROCESSING
  17. #define PTR_ACCESS
  18.  
  19. #define LED_SEG PORTC
  20. #define LED_SEG_DIR DDRC
  21. #define LED_DG PORTB
  22. #define LED_DG_DIR DDRB
  23.  
  24. #define DV_480Hz 15
  25. #define DV_DEMO  40
  26. #define DV_NEXT  13
  27.  
  28. #define DEC_OFF 0x3F
  29. #define DISP_MAX 6
  30. #define LED_BLANK 15
  31.  
  32. //LED
  33. typedef union TRQ {
  34.     //Access to entire byte
  35.     unsigned char c;
  36.     struct {
  37.         unsigned char f_tck : 1;
  38.         //other flags can be defined
  39.         unsigned char not_used : 7;
  40.     }; 
  41. } TRQ;
  42.  
  43.  
  44. //LCD
  45. typedef union TSysRq {
  46.     unsigned char msg;
  47.     struct {
  48.         unsigned char rq_data   : 4;
  49.         unsigned char rq_id     : 4;
  50.     };
  51. } TSysRq;
  52.  
  53.  
  54.  
  55. static const char __flash LCDUserChar[] = {
  56.     0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F,
  57.     0x1F, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x1F,
  58.     0x1F, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x1F,
  59.     0x1F, 0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x00, 0x1F,
  60.     0x1F, 0x00, 0x1E, 0x1E, 0x1E, 0x1E, 0x00, 0x1F,
  61.     0x1F, 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x00, 0x1F,
  62.     0x03, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03,
  63.     0x18, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x18 };
  64.  
  65. __flash unsigned char BCD_2_LED[] = {
  66.     0xDE, 0x82, 0xEC, 0xE6,
  67.     0xB2, 0x76, 0x7E, 0xC2,
  68.     0xFE, 0xF6, 0x1C, 0xBA,
  69.     0xF8, 0xFA, 0x20, 0x00 };
  70.  
  71.  
  72. __flash unsigned char DEC_1_OF_6[] =
  73.     {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF};
  74.  
  75.  
  76. static const char __flash sSun[] = " ";
  77. static char const __flash sMon[] = " ";
  78. static char const __flash sTue[] = " ";
  79. static char const __flash sWed[] = " ";
  80. static char const __flash sThu[] = " ";
  81. static char const __flash sFri[] = " ";
  82. static char const __flash sSat[] = " ";
  83. static const char __flash sCl[] = "%2d:%02d:%02d %s";
  84.  
  85. __flash const char __flash* sWDay[] = {
  86.     sSun, sMon, sTue, sWed, sThu, sFri, sSat
  87.  };
  88.  
  89. //LCD
  90. TClock rtc;
  91. TClock myTime;
  92. TQueue event_queue;
  93. unsigned char ev_q_buf[16];
  94.  
  95. char tmp_buf[4];
  96. TSysRq rq2;
  97. char timer[3]={0, 1, 30};
  98.  
  99.  const char endingMes[] =
  100.     "END END END END";
  101.  
  102.  //LED
  103.  
  104.  unsigned char disp[6] = {0,0,0,0,0,0};
  105.  unsigned char cur_disp;
  106. unsigned char dv_demo = DV_DEMO;
  107. unsigned char dv_next = DV_NEXT;
  108. __no_init unsigned char idx;
  109. #define UPDATE_DISP_RQ 0x01
  110.   volatile TRQ rq;
  111.  
  112.  
  113.  //LCD
  114.  
  115. //This function is used by printf function to transfer data to STDIO device
  116. int putchar(int ch){
  117.     LCDPutChar(ch);
  118.     return ch;
  119. }
  120.  
  121. void onClockInc(){
  122.          
  123. static unsigned char i;
  124.   ++i;
  125.   disp[0]=  BCD_2_LED[i%10];
  126.  // disp[1] = BCD_2_LED[rtc.min];
  127.  // disp[2] = BCD_2_LED[rtc.hr];
  128.        
  129.     LCDGoTo(LINE_0 + 1);
  130.     printf_P(
  131.         sCl,
  132.         rtc.hr,
  133.         rtc.min,
  134.         rtc.sec,
  135.         memcpy_P(tmp_buf, sWDay[rtc.wday], sizeof(sSun)));
  136.  
  137.        
  138. }
  139.  
  140. void onClockInc2(){
  141.  
  142.  
  143.   LCDGoTo(LINE_0 + 21);
  144.     printf_P(
  145.         sCl,
  146.         myTime.hr,
  147.         myTime.min,
  148.         myTime.sec,
  149.         memcpy_P(tmp_buf, sWDay[rtc.wday], sizeof(sSun)));
  150. }
  151.  
  152.  
  153.  
  154.  
  155.  
  156.  
  157.  
  158.   void InitDevices()
  159. {
  160.     LED_DG = 0xFE;
  161.     LED_DG_DIR = 0xFF;
  162.     LED_SEG_DIR = 0xFF;
  163.     //Prescaler fclk / 1024 = 7200Hz
  164.     //Prescaler for T0 is different than for T1,T2,T3
  165.     OCR0 = DV_480Hz - 1;
  166.     TCCR0 = (1 << WGM01) | (1 << CS02) | (1 << CS01) | (1 << CS00);
  167.     TIMSK = (1 << OCIE0);
  168.     __enable_interrupt();
  169. }
  170.  
  171.   void DispDemo2(){
  172. static unsigned char i;
  173.   ++i;
  174.   disp[0]=  BCD_2_LED[i%10];
  175.   disp[1] = BCD_2_LED[i%100 - (i%10) ];
  176.   disp[2] = BCD_2_LED[i%1000 ];
  177.  
  178.    /*
  179.               disp[0]=  BCD_2_LED[0];
  180.               disp[1] = BCD_2_LED[1];
  181.               disp[2] = BCD_2_LED[2];
  182.     disp[0]=  BCD_2_LED[rtc.sec];
  183.   disp[1] = BCD_2_LED[rtc.min];
  184.   disp[2] = BCD_2_LED[rtc.hr];
  185.     */
  186.       }
  187.  
  188.  
  189.  
  190. static void InitDevicesLCD()
  191. {
  192.   //LCD
  193.     LCDInit();
  194.     LCDLoadUserCharP(LCDUserChar, 0, sizeof(LCDUserChar));
  195.     LCDClear();
  196.    
  197.     //LCD TIMER
  198.     //T0 start
  199.     ////TCNT0 = 0;
  200.     ////OCR0 = 71;
  201.      
  202.     rtcInit(&myTime, timer[0], timer[1], timer[2]);
  203.      
  204.     TCCR0 = (1 << WGM01) | (1 << CS02) | (1 << CS01) | (1 << CS00);
  205.     //dvt = 50;
  206.     //Timers interrupt mask
  207.     TIMSK = (1 << OCIE0);
  208.     __enable_interrupt();
  209.    
  210. }
  211.  
  212.  
  213. //LCD
  214.  
  215. #pragma vector = TIMER0_COMP_vect
  216. __interrupt void ISR_OCR0()
  217. {
  218. static unsigned char pre_dv = 100;
  219.     kbService(&event_queue);
  220.     if(--pre_dv) return;
  221.     pre_dv = 100;
  222.         if(!rtcZero(myTime)){
  223.     rtcInc(&rtc);  
  224.         rtcDec(&myTime);   
  225.         }
  226.         if(rtcZero(myTime)){
  227.          //finish();
  228.          }
  229.          
  230.     LED_DG |= DEC_OFF;
  231.     LED_SEG = disp[cur_disp];
  232.     LED_DG = DEC_1_OF_6[cur_disp];
  233.    
  234.        
  235.     qAdd(&event_queue, MSG(CLOCK_INC, 0));
  236. }
  237.  
  238.  
  239. //LED
  240. //#pragma vector = TIMER0_COMP_vect
  241. __interrupt void T0_COMP_ISR()
  242. {
  243.  static unsigned char cur_disp=0;
  244.     LED_DG |= DEC_OFF;
  245.     LED_SEG = disp[cur_disp];
  246.     LED_DG = DEC_1_OF_6[cur_disp];
  247.     if((++cur_disp) == DISP_MAX) cur_disp = 0;
  248.     if(--dv_demo) return;
  249.     dv_demo = DV_DEMO;
  250.     #ifdef ISR_PROCESSING
  251.     DispDemo();
  252.     #else
  253.     rq.f_tck = 1;
  254.     #endif
  255.  
  256.         /*
  257.         static unsigned char pre_dv = 100;
  258.     kbService(&event_queue);
  259.     if(--pre_dv) return;
  260.     pre_dv = 100;
  261.         if(!rtcZero(myTime)){
  262.     rtcInc(&rtc);  
  263.         rtcDec(&myTime);   
  264.         }
  265.        
  266.          
  267.     qAdd(&event_queue, MSG(CLOCK_INC, 0));
  268.         */
  269. }
  270.  
  271. /*
  272. //LCD & LED
  273. #pragma vector = TIMER0_COMP_vect
  274. __interrupt void ISR_OCR0()
  275. {
  276. static unsigned char pre_dv = 100;
  277.     kbService(&event_queue);
  278.     if(--pre_dv) return;
  279.     pre_dv = 100;
  280.         if(!rtcZero(myTime)){
  281.     rtcInc(&rtc);  
  282.         rtcDec(&myTime);
  283.         }
  284.       //  if(rtcZero(myTime))
  285.       //   finish();
  286.  
  287.        
  288.     qAdd(&event_queue, MSG(CLOCK_INC, 0));
  289.        
  290.         //
  291.     static unsigned char cur_disp=0;
  292.     LED_DG |= DEC_OFF;
  293.     LED_SEG = disp[cur_disp];
  294.     LED_DG = DEC_1_OF_6[cur_disp];
  295.     if((++cur_disp) == DISP_MAX) cur_disp = 0;
  296.     if(--dv_demo) return;
  297.     dv_demo = DV_DEMO;
  298.    
  299.    
  300.     #ifdef ISR_PROCESSING
  301.     DispDemo2();
  302.     #else
  303.     rq.f_tck = 1;
  304.     #endif
  305.      
  306.        
  307. }
  308.  
  309. */
  310. /*
  311. void main()
  312. {
  313.     idx = 0;
  314.     cur_disp = 0;  
  315.     //dv_next = DV_NEXT;
  316.     //dv_demo = DV_DEMO;
  317.     InitDevices();
  318.     while(1)
  319.     {
  320.         #ifndef ISR_PROCESSING
  321.         if(rq.f_tck)
  322.         {
  323.             rq.f_tck = 0;
  324.             DispDemo2();
  325.                  }
  326.         #endif
  327.     }
  328. }
  329.  
  330. */
  331.  
  332.  
  333. void main()
  334. {  
  335.         idx = 0;
  336.         cur_disp = 0;  
  337.        
  338.     InitDevices();
  339.     qInit(&event_queue, ev_q_buf, sizeof(ev_q_buf));
  340.     qAdd(&event_queue, MSG(CLOCK_INC, 0));
  341.     for(;;)
  342.     {
  343.         while(!qGet(&event_queue, &rq2.msg));
  344.         switch(rq2.rq_id) {
  345.         case CLOCK_INC:
  346.             onClockInc();
  347.                         onClockInc2();
  348.             break;
  349.         }
  350.     }
  351. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement