5cf99b79df963b21446283b69582ffb4465b5c6e
[matches/honours.git] / main.c
1 /*\r
2  * @file main.c\r
3  * @author Sam Moore - Adapted from ATMEL AVR Butterfly module code\r
4  * @purpose The main loop, etc\r
5  */\r
6 #include <stdint.h>\r
7 #include <avr/io.h>\r
8 #include <avr/interrupt.h>\r
9 #include <avr/pgmspace.h>\r
10 #include <avr/sleep.h>\r
11 #include <avr/wdt.h>\r
12 #include <avr/version.h>\r
13 \r
14 \r
15 #if __AVR_LIBC_VERSION__ < 10405UL\r
16 #warning "avr-libc >= version 1.4.5 recommended"\r
17 #warning "This code has not been tested with older versions."\r
18 #endif\r
19 //mtE\r
20 \r
21 #include "main.h"\r
22 #include "LCD_functions.h"\r
23 #include "LCD_Driver.h"\r
24 \r
25 #include "timer.h"\r
26 #include "usart.h"\r
27 #include "adc.h"\r
28 #include "printf.h"\r
29 #include "parser.h"\r
30 #include "setup.h"\r
31 #include "dac.h"\r
32 \r
33 #define pLCDREG_test (*(char *)(0xEC))\r
34 \r
35 SETUP setup;\r
36 \r
37 /*****************************************************************************\r
38 *\r
39 *   Function name : main\r
40 *\r
41 *   Returns :       None\r
42 *\r
43 *   Parameters :    None\r
44 *\r
45 *   Purpose :       Contains the main loop of the program\r
46 *\r
47 *****************************************************************************/\r
48 // mt __C_task void main(void)\r
49 __attribute__ ((OS_main)) int main(void)\r
50 {    \r
51 \r
52 \r
53 \r
54     // Program initalization\r
55         Initialization();  \r
56         sei(); // mt __enable_interrupt();\r
57 \r
58 \r
59         LCD_puts("hello"); \r
60 \r
61         USART_printf("\r\n# hello\r\n");\r
62         Delay(1000);\r
63 \r
64 \r
65         for (;;)\r
66         {\r
67                 \r
68                 ParseCommand();\r
69 \r
70         }\r
71         return 0;\r
72 }\r
73 \r
74 \r
75 /*****************************************************************************\r
76 *\r
77 *   Function name : Initialization\r
78 *\r
79 *   Returns :       None\r
80 *\r
81 *   Parameters :    None\r
82 *\r
83 *   Purpose :       Initializate the different modules\r
84 *\r
85 *****************************************************************************/\r
86 void Initialization(void)\r
87 {\r
88     OSCCAL_calibration();       // calibrate the OSCCAL byte\r
89         \r
90     CLKPR = (1<<CLKPCE);        // set Clock Prescaler Change Enable\r
91 \r
92     // set prescaler = 8, Inter RC 8Mhz / 8 = 1Mhz\r
93     CLKPR = (1<<CLKPS1) | (1<<CLKPS0);\r
94 \r
95     Timer0_Init();              // Used when playing music etc.\r
96 \r
97     USART_Init(UART_4800);      // Baud rate = 4800bps\r
98         \r
99     LCD_Init();                 // initialize the LCD\r
100 \r
101 \r
102         //Disable JTAG to use ADC4-7\r
103         MCUCR |= ( 1 <<JTD );\r
104         MCUCR |= ( 1 <<JTD );\r
105 \r
106 \r
107 \r
108 \r
109 \r
110         setup.adc_averages = 1;\r
111         setup.poll_delay = 1;\r
112         setup.poll_timeout = (uint32)(-1);\r
113         setup.elapsed_time = 0;\r
114         setup.dac_value = 0;\r
115 }\r
116 \r
117 /*****************************************************************************\r
118 *\r
119 *   Function name : Delay\r
120 *\r
121 *   Returns :       None\r
122 *\r
123 *   Parameters :    unsigned int millisec\r
124 *\r
125 *   Purpose :       Delay-loop\r
126 *\r
127 *****************************************************************************/\r
128 void Delay(unsigned int millisec)\r
129 {\r
130         // mt, int i did not work in the simulator:  int i; \r
131         uint8_t i;\r
132 \r
133         while (millisec--) {\r
134                 for (i=0; i<125; i++) {\r
135                         asm volatile ("nop"::);\r
136                 }\r
137         }\r
138 }\r
139 \r
140 \r
141 \r
142 \r
143 \r
144 /*****************************************************************************\r
145 *\r
146 *   Function name : OSCCAL_calibration\r
147 *\r
148 *   Returns :       None\r
149 *\r
150 *   Parameters :    None\r
151 *\r
152 *   Purpose :       Calibrate the internal OSCCAL byte, using the external \r
153 *                   32,768 kHz crystal as reference\r
154 *\r
155 *****************************************************************************/\r
156 void OSCCAL_calibration(void)\r
157 {\r
158     unsigned char calibrate = FALSE;\r
159     int temp;\r
160     unsigned char tempL;\r
161 \r
162     CLKPR = (1<<CLKPCE);        // set Clock Prescaler Change Enable\r
163     // set prescaler = 8, Inter RC 8Mhz / 8 = 1Mhz\r
164     CLKPR = (1<<CLKPS1) | (1<<CLKPS0);\r
165     \r
166     TIMSK2 = 0;             //disable OCIE2A and TOIE2\r
167 \r
168     ASSR = (1<<AS2);        //select asynchronous operation of timer2 (32,768kHz)\r
169     \r
170     OCR2A = 200;            // set timer2 compare value \r
171 \r
172     TIMSK0 = 0;             // delete any interrupt sources\r
173         \r
174     TCCR1B = (1<<CS10);     // start timer1 with no prescaling\r
175     TCCR2A = (1<<CS20);     // start timer2 with no prescaling\r
176 \r
177     while((ASSR & 0x01) | (ASSR & 0x04));       //wait for TCN2UB and TCR2UB to be cleared\r
178 \r
179     Delay(1000);    // wait for external crystal to stabilise\r
180     \r
181     while(!calibrate)\r
182     {\r
183         cli(); // mt __disable_interrupt();  // disable global interrupt\r
184         \r
185         TIFR1 = 0xFF;   // delete TIFR1 flags\r
186         TIFR2 = 0xFF;   // delete TIFR2 flags\r
187         \r
188         TCNT1H = 0;     // clear timer1 counter\r
189         TCNT1L = 0;\r
190         TCNT2 = 0;      // clear timer2 counter\r
191            \r
192         // shc/mt while ( !(TIFR2 && (1<<OCF2A)) );   // wait for timer2 compareflag    \r
193         while ( !(TIFR2 & (1<<OCF2A)) );   // wait for timer2 compareflag\r
194 \r
195         TCCR1B = 0; // stop timer1\r
196 \r
197         sei(); // __enable_interrupt();  // enable global interrupt\r
198     \r
199         // shc/mt if ( (TIFR1 && (1<<TOV1)) )\r
200         if ( (TIFR1 & (1<<TOV1)) )\r
201         {\r
202             temp = 0xFFFF;      // if timer1 overflows, set the temp to 0xFFFF\r
203         }\r
204         else\r
205         {   // read out the timer1 counter value\r
206             tempL = TCNT1L;\r
207             temp = TCNT1H;\r
208             temp = (temp << 8);\r
209             temp += tempL;\r
210         }\r
211     \r
212         if (temp > 6250)\r
213         {\r
214             OSCCAL--;   // the internRC oscillator runs to fast, decrease the OSCCAL\r
215         }\r
216         else if (temp < 6120)\r
217         {\r
218             OSCCAL++;   // the internRC oscillator runs to slow, increase the OSCCAL\r
219         }\r
220         else\r
221             calibrate = TRUE;   // the interRC is correct\r
222 \r
223         TCCR1B = (1<<CS10); // start timer1\r
224     }\r
225 }\r

UCC git Repository :: git.ucc.asn.au