View difference between Paste ID: 8awzYzYC and TGryAHPt
SHOW: | | - or go back to the newest paste.
1
/*
2
Copyright 2012 D Westaby
3-
 
3+
4
----------------------------------------------------------------------
5
   Car Lights for Attiny2313
6
----------------------------------------------------------------------
7-
Title:      Car_Lighting.D
7+
Title:      Car_Lighting.c
8
Author:     Dustin Westaby
9
Date Created:   September 8, 2012
10
Date Modified:   September 21, 2012
11-
 
11+
12
Compiled with AVR-GCC WinAVR
13-
 
13+
14
----------------------------------------------------------------------
15
    Fuses:
16
----------------------------------------------------------------------
17
 BrownOut Disabled
18
 CKDIV8
19
 Int RC Osc 8Mhz + 64ms
20-
 
20+
21
----------------------------------------------------------------------
22
    Inputs:
23
----------------------------------------------------------------------
24
 None
25-
 
25+
26
----------------------------------------------------------------------
27
    Ouputs:
28
----------------------------------------------------------------------
29
 pin  i/o  port    circuit trace       connection
30
----------------------------------------------------------------------
31
  4    1   PA1 =   R_LED1
32
  5    1   PA0 =   L_LED2
33
  2    1   PD0 =   R_LED3
34
  3    1   PD1 =   R_LED4
35
  6    1   PD2 =   R_LED5
36
  7    1   PD3 =   R_LED6
37
 14    1   PB2 =   L_LED7
38
 17    1   PB5 =   L_LED8
39
 18    1   PB6 =   L_LED9
40
 19    1   PB7 =   L_LED10
41-
 
41+
42
*/
43-
 
43+
44
/*--------------------------------------
45-
//          Global Variables           |
45+
            Global Variables           |
46
---------------------------------------- */
47-
// 8 MHz Internal Oscillator DIV8 (used for delay subroutines)
47+
48-
// One CPU Cycle = 1us
48+
/* 8 MHz Internal Oscillator DIV8 (used for delay subroutines)
49
   One CPU Cycle = 1us */
50-
 
50+
51
52
#define R_LED1_PA1  (1<<1)
53
#define L_LED2_PA0  (1<<0)
54
#define R_LED3_PD0  (1<<0)
55
#define R_LED4_PD1  (1<<1)
56
#define R_LED5_PD2  (1<<2)
57
#define R_LED6_PD3  (1<<3)
58
#define L_LED7_PB2  (1<<2)
59
#define L_LED8_PB5  (1<<5)
60
#define L_LED9_PB6  (1<<6)
61
#define L_LED10_PB7 (1<<7)
62-
//This value is used to count us of delay and convert to ms
62+
63-
//Due to other cpu processing: "1ms of delay" < "1000us of delay"
63+
  //delay wait values, measured in us
64
#define DIM_DELAY_ON  (200)
65
#define DIM_DELAY_OFF (200)
66
67
/* This value is used to count us of delay and convert to ms
68-
 
68+
   Due to other cpu processing: "1ms of delay" < "1000us of delay" */
69
#define TIME_CONVERSION_VAL (50)
70
71
int program_ms_counter;
72
int program_counter_us; //used for tracking time elapsed
73
74-
 
74+
75
//              Includes               |
76
//--------------------------------------
77
#include <avr/io.h>
78
#include <util/delay.h>
79
80
//--------------------------------------
81
//          Delay Subroutines          |
82
//--------------------------------------
83
//These functions are from the delay.h include, the calls to delay functions
84
//are re-written here to allow for longer waits.
85
void delay_ms(uint16_t ms) {
86
        program_ms_counter+=ms;
87
        while ( ms )
88
        {
89
                _delay_ms(1);
90
                ms--;
91
        }
92
}
93
94
void delay_us(uint16_t us) {
95-
 
95+
96
  while ( us )
97
  {
98-
          program_ms_counter++;
98+
99-
          program_counter_us-=TIME_CONVERSION_VAL;
99+
100
  }
101
102-
 
102+
  //This loop will continue to convert us into ms until the "us counter" is
103
  //   below the conversion val
104-
//          Misc Subroutines          |
104+
105
  {
106-
 
106+
          program_ms_counter++;                      //increment "ms counter"
107
          program_counter_us-=TIME_CONVERSION_VAL;   //subtract "us counter"
108-
        program_ms_counter=0;
108+
109-
        program_counter_us=0;
109+
110
111-
 
111+
112-
void all_LEDs_ON(void) {
112+
//         Program Subroutines         |
113-
        PORTA = 0xFF;
113+
114-
        PORTB = 0xFF;
114+
115-
        PORTD = 0xFF;
115+
116
   //set "ms counter" and "us counter" to 0
117-
 
117+
   program_ms_counter=0;
118
   program_counter_us=0;
119-
        PORTA &= ~(R_LED1_PA1 + L_LED2_PA0);
119+
120-
        PORTB &= ~(L_LED10_PB7 + L_LED9_PB6 + L_LED8_PB5 + L_LED7_PB2);
120+
121-
        PORTD &= ~(R_LED6_PD3 + R_LED5_PD2 + R_LED4_PD1 + R_LED3_PD0);
121+
void all_LEDs_BRT(void) {
122
   //Sets all PORT outputs to 1, which is a high (+5V) on the pin
123
   PORTA = 0xFF; // = 0b11111111
124-
void program1_off(void) {
124+
   PORTB = 0xFF;
125-
        PORTA &= ~(R_LED1_PA1 + L_LED2_PA0);
125+
   PORTD = 0xFF;
126-
        PORTB &= ~(L_LED10_PB7 + L_LED9_PB6 + L_LED8_PB5 + L_LED7_PB2);
126+
127-
        PORTD &= ~(R_LED6_PD3 + R_LED5_PD2 + R_LED4_PD1 + R_LED3_PD0);
127+
128
void all_LEDs_OFF(void) {
129-
 
129+
   //Sets all PORT outputs to 0, which is a low (GND) on the pin
130-
void program2_off(void) {
130+
   Porta &= ~(  R_Led1_Pa1   //Turn Off Port A, Pin 1
131-
        PORTA &= ~(R_LED1_PA1 + L_LED2_PA0);
131+
              + L_Led2_Pa0); //Turn Off Port A, Pin 0
132-
        PORTB &= ~(L_LED10_PB7 + L_LED8_PB5);
132+
   Portb &= ~(  L_Led10_Pb7  //Turn Off Port B, Pin 7
133-
        PORTD &= ~(R_LED6_PD3 + R_LED5_PD2 + R_LED4_PD1 + R_LED3_PD0);
133+
              + L_Led9_Pb6   //Turn Off Port B, Pin 6
134
              + L_Led8_Pb5   //Turn Off Port B, Pin 5
135
              + L_Led7_Pb2); //Turn Off Port B, Pin 2
136-
void program3_off(void) {
136+
   Portd &= ~(  R_Led6_Pd3   //Turn Off Port D, Pin 3
137-
        PORTA &= ~(R_LED1_PA1 + L_LED2_PA0);
137+
              + R_Led5_Pd2   //Turn Off Port D, Pin 2
138
              + R_Led4_Pd1   //Turn Off Port D, Pin 1
139
              + R_Led3_Pd0); //Turn Off Port D, Pin 0
140-
void program4_off (void) {
140+
141-
        PORTA &= ~(R_LED1_PA1 + L_LED2_PA0);
141+
142-
        PORTB &= ~(L_LED10_PB7 + L_LED9_PB6 + L_LED8_PB5 + L_LED7_PB2);
142+
void program2_LEDs_to_DIM(void) {
143-
        PORTD &= ~(R_LED6_PD3 + R_LED5_PD2 + R_LED4_PD1 + R_LED3_PD0);
143+
   PORTA &= ~(  R_LED1_PA1   //Turn Off PORT A, pin 1
144
              + L_LED2_PA0); //Turn Off PORT A, pin 0
145
   PORTB &= ~(  L_LED10_PB7  //Turn Off PORT B, pin 7
146-
void program5_off (void) {
146+
              + L_LED8_PB5); //Turn Off PORT B, pin 5
147-
        PORTA &= ~(R_LED1_PA1 + L_LED2_PA0);
147+
   PORTD &= ~(  R_LED6_PD3   //Turn Off PORT D, pin 3
148-
        PORTB &= ~(L_LED10_PB7 + L_LED9_PB6 + L_LED8_PB5 + L_LED7_PB2);
148+
              + R_LED5_PD2   //Turn Off PORT D, pin 2
149-
        PORTD &= ~(R_LED6_PD3 +  R_LED4_PD1);
149+
              + R_LED4_PD1   //Turn Off PORT D, pin 1
150
              + R_LED3_PD0); //Turn Off PORT D, pin 0
151
}
152-
void program6_off (void) {
152+
153-
        PORTA &= ~(R_LED1_PA1 + L_LED2_PA0);
153+
void program3_6_LEDs_to_DIM(void) {
154
   PORTA &= ~(  R_LED1_PA1   //Turn Off PORT A, pin 1
155-
 
155+
              + L_LED2_PA0); //Turn Off PORT A, pin 0
156
}
157
158
void program5_LEDs_to_DIM (void) {
159
   PORTA &= ~(  R_LED1_PA1   //Turn Off PORT A, pin 1
160
              + L_LED2_PA0); //Turn Off PORT A, pin 0
161
   PORTB &= ~(  L_LED10_PB7  //Turn Off PORT B, pin 7
162-
 
162+
              + L_LED9_PB6   //Turn Off PORT B, pin 6
163
              + L_LED8_PB5   //Turn Off PORT B, pin 5
164
              + L_LED7_PB2); //Turn Off PORT B, pin 2
165
   PORTD &= ~(  R_LED6_PD3   //Turn Off PORT D, pin 3
166-
 
166+
              + R_LED4_PD1); //Turn Off PORT D, pin 1
167-
  int dim_delay_on = 200; //us
167+
168-
  int dim_delay_off = 4000; //us
168+
169-
 
169+
/* Software PWM explaination:
170
171
   The dim LED effect is performed by a software PWM.  Each of the loops in the
172
   main() function turn on all LEDs, then turn off only the LEDs we want as DIM.
173
   The LEDs that remain on will appear BRIGHT.  The LEDs that are rapid turned
174-
 
174+
   on and off will appear DIM.
175
176-
 
176+
                      DIM_DELAY_ON                 DIM_DELAY_ON
177
                +5V  ______________               _______________
178
                     |            |               |             |
179
 GND  _______________|            |_______________|             |______________
180-
 
180+
       DIM_DELAY_OFF                DIM_DELAY_OFF                DIM_DELAY_OFF
181
*/
182
183-
 
183+
void program_NORMAL_MODE(void) {
184-
        //program 1
184+
   all_LEDs_BRT();           //Turn on all LEDs
185
   delay_us(DIM_DELAY_ON);   //Time to keep all LEDs on
186
   all_LEDs_OFF();           //Turn off all LEDs
187
   delay_us(DIM_DELAY_OFF);  //Time to keep all LEDs off
188-
                all_LEDs_ON();
188+
189-
                delay_us(dim_delay_on);
189+
190-
                all_LEDs_OFF();
190+
void program_LEFT_TURN(void) {
191-
                delay_us(dim_delay_off);
191+
   all_LEDs_BRT();           //Turn on all LEDs
192
   delay_us(DIM_DELAY_ON);   //Time to keep all LEDs on
193
   program2_LEDs_to_DIM();   //Turn off program 2 LEDs
194-
//program 2
194+
   delay_us(DIM_DELAY_OFF);  //Time to keep program 2 LEDs off
195
}
196
197
void program_BRAKE_MODE(void) {
198-
                all_LEDs_ON();
198+
   all_LEDs_BRT();           //Turn on all LEDs
199-
                delay_us(dim_delay_on);
199+
   delay_us(DIM_DELAY_ON);   //Time to keep all LEDs on
200-
                program3_off();
200+
   program3_6_LEDs_to_DIM();   //Turn off program 3 LEDs
201-
                delay_us(dim_delay_off);
201+
   delay_us(DIM_DELAY_OFF);  //Time to keep program 3 LEDs off
202
}
203
204
void program_RIGHT_TURN (void) {
205-
                all_LEDs_ON();
205+
   all_LEDs_BRT();           //Turn on all LEDs
206-
                delay_us(dim_delay_on);
206+
   delay_us(DIM_DELAY_ON);   //Time to keep all LEDs on
207-
                all_LEDs_OFF();
207+
   program5_LEDs_to_DIM();   //Turn off program 5 LEDs
208-
                delay_us(dim_delay_off);
208+
   delay_us(DIM_DELAY_OFF);  //Time to keep program 5 LEDs off
209
}
210
211
212-
                all_LEDs_ON();
212+
213-
                delay_us(dim_delay_on);
213+
214-
                program3_off();
214+
215-
                delay_us(dim_delay_off);
215+
216
{
217
218
  /* ---------------------------------------------------------------- */
219-
                all_LEDs_ON();
219+
220-
                delay_us(dim_delay_on);
220+
221-
                all_LEDs_OFF();
221+
222-
                delay_us(dim_delay_off);
222+
223
  DDRA =  0b00000011; //A0, A1
224
  DDRB =  0b11111111;
225
  DDRD =  0b11111111;
226-
                all_LEDs_ON();
226+
227-
                delay_us(dim_delay_on);
227+
  //Begin with all LEDs off
228-
                program3_off();
228+
229-
                delay_us(dim_delay_off);
229+
230
/* ---------------------------------------------------------------- */
231
/*                              Main Loop                           */
232
/* ---------------------------------------------------------------- */
233-
                all_LEDs_ON();
233+
234-
                delay_us(dim_delay_on);
234+
235-
                all_LEDs_OFF();
235+
236-
                delay_us(dim_delay_off);
236+
237
        /* ---------------------------- */
238
        /*      Program 1 - NORMAL      */
239
        /* ---------------------------- */
240-
                all_LEDs_ON();
240+
241-
                delay_us(dim_delay_on);
241+
242-
                program3_off();
242+
243-
                delay_us(dim_delay_off);
243+
244
           program_NORMAL_MODE();
245
        }
246
247-
                all_LEDs_ON();
247+
        /* ---------------------------- */
248-
                delay_us(dim_delay_on);
248+
        /*      Program 3 - BRAKES      */
249-
                all_LEDs_OFF();
249+
        /* ---------------------------- */
250-
                delay_us(dim_delay_off);
250+
251
252
        while(program_ms_counter < 500)
253
        {
254-
                all_LEDs_ON();
254+
           program_BRAKE_MODE();
255-
                delay_us(dim_delay_on);
255+
256-
                program3_off();
256+
257-
                delay_us(dim_delay_off);
257+
258
           program_NORMAL_MODE();
259
        }
260
        while(program_ms_counter < 1500)
261-
                all_LEDs_ON();
261+
262-
                delay_us(dim_delay_on);
262+
           program_BRAKE_MODE();
263-
                all_LEDs_OFF();
263+
264-
                delay_us(dim_delay_off);
264+
265
        {
266
           program_NORMAL_MODE();
267
        }
268-
                all_LEDs_ON();
268+
269-
                delay_us(dim_delay_on);
269+
270-
                program3_off();
270+
           program_BRAKE_MODE();
271-
                delay_us(dim_delay_off);
271+
272
        while(program_ms_counter < 3000)
273
        {
274
           program_NORMAL_MODE();
275-
                all_LEDs_ON();
275+
276-
                delay_us(dim_delay_on);
276+
277-
                all_LEDs_OFF();
277+
278-
                delay_us(dim_delay_off);
278+
           program_BRAKE_MODE();
279
        }
280
        while(program_ms_counter < 4000)
281
        {
282-
                all_LEDs_ON();
282+
           program_NORMAL_MODE();
283-
                delay_us(dim_delay_on);
283+
284-
                program3_off();
284+
285-
                delay_us(dim_delay_off);
285+
286
           program_BRAKE_MODE();
287
        }
288
        while(program_ms_counter < 5000)
289-
                all_LEDs_ON();
289+
290-
                delay_us(dim_delay_on);
290+
           program_NORMAL_MODE();
291-
                all_LEDs_OFF();
291+
292-
                delay_us(dim_delay_off);
292+
293-
        } 
293+
294-
 
294+
           program_BRAKE_MODE();
295-
        //program 3
295+
296
        while(program_ms_counter < 6000)
297
        {
298
           program_NORMAL_MODE();
299-
                all_LEDs_ON();
299+
300-
                delay_us(dim_delay_on);
300+
301-
                program2_off();
301+
302-
                delay_us(dim_delay_off);
302+
           program_BRAKE_MODE();
303
        }
304
        while(program_ms_counter < 7000)
305
        {
306-
                all_LEDs_ON();
306+
           program_NORMAL_MODE();
307-
                delay_us(dim_delay_on);
307+
308-
                all_LEDs_OFF();
308+
309-
                delay_us(dim_delay_off);
309+
        /* ------------------------------- */
310
        /*      Program 2 - LEFT TURN      */
311
        /* ------------------------------- */
312
        reset_ms_us_counters();
313-
                all_LEDs_ON();
313+
314-
                delay_us(dim_delay_on);
314+
315-
                program2_off();
315+
316-
                delay_us(dim_delay_off);
316+
           program_LEFT_TURN();
317
        }
318
        while(program_ms_counter < 4000)
319
        {
320-
                all_LEDs_ON();
320+
           program_NORMAL_MODE();
321-
                delay_us(dim_delay_on);
321+
322-
                all_LEDs_OFF();
322+
323-
                delay_us(dim_delay_off);
323+
324
           program_LEFT_TURN();
325
        }
326-
//program 4
326+
327
        {
328
           program_NORMAL_MODE();
329
        }
330-
                all_LEDs_ON();
330+
331-
                delay_us(dim_delay_on);
331+
        /* ---------------------------- */
332-
                all_LEDs_OFF();
332+
        /*      Program 1 - NORMAL      */
333-
                delay_us(dim_delay_off);
333+
        /* ---------------------------- */
334
        reset_ms_us_counters();
335-
  
335+
336-
 //program 5
336+
337
        {
338
           program_NORMAL_MODE();
339
        }
340-
                all_LEDs_ON();
340+
341-
                delay_us(dim_delay_on);
341+
        /* ------------------------------------ */
342-
                program4_off();
342+
        /*      Program 4 - NORMAL FLASHING     */
343-
                delay_us(dim_delay_off);
343+
        /* ------------------------------------ */
344
        reset_ms_us_counters();
345
346
        while(program_ms_counter < 500)
347-
                all_LEDs_ON();
347+
348-
                delay_us(dim_delay_on);
348+
           all_LEDs_OFF();
349-
                all_LEDs_OFF();
349+
350-
                delay_us(dim_delay_off);
350+
351
        {
352
           program_NORMAL_MODE();
353
        }
354-
                all_LEDs_ON();
354+
355-
                delay_us(dim_delay_on);
355+
356-
                program4_off();
356+
           all_LEDs_OFF();
357-
                delay_us(dim_delay_off);
357+
358
        while(program_ms_counter < 2000)
359
        {
360
           program_NORMAL_MODE();
361-
                all_LEDs_ON();
361+
362-
                delay_us(dim_delay_on);
362+
363-
                all_LEDs_OFF();
363+
364-
                delay_us(dim_delay_off);
364+
           all_LEDs_OFF();
365
        }
366
        while(program_ms_counter < 3000)
367
        {
368-
                all_LEDs_ON();
368+
           program_NORMAL_MODE();
369-
                delay_us(dim_delay_on);
369+
370-
                program4_off();
370+
371-
                delay_us(dim_delay_off);
371+
372
           all_LEDs_OFF();
373
        }
374
        while(program_ms_counter < 4000)
375-
                all_LEDs_ON();
375+
376-
                delay_us(dim_delay_on);
376+
           program_NORMAL_MODE();
377-
                all_LEDs_OFF();
377+
378-
                delay_us(dim_delay_off);
378+
379
        {
380
           all_LEDs_OFF();
381
        }
382-
                all_LEDs_ON();
382+
383-
                delay_us(dim_delay_on);
383+
384-
                program4_off();
384+
           program_NORMAL_MODE();
385-
                delay_us(dim_delay_off);
385+
386
        while(program_ms_counter < 5500)
387
        {
388
           all_LEDs_OFF();
389-
                all_LEDs_ON();
389+
390-
                delay_us(dim_delay_on);
390+
391-
                all_LEDs_OFF();
391+
392-
                delay_us(dim_delay_off);
392+
           program_NORMAL_MODE();
393
        }
394
        while(program_ms_counter < 6500)
395
        {
396-
                all_LEDs_ON();
396+
           all_LEDs_OFF();
397-
                delay_us(dim_delay_on);
397+
398-
                program4_off();
398+
399-
                delay_us(dim_delay_off);
399+
400
           program_NORMAL_MODE();
401
        }
402
403-
                all_LEDs_ON();
403+
        /* ------------------------------- */
404-
                delay_us(dim_delay_on);
404+
        /*      Program 2 - LEFT TURN      */
405-
                all_LEDs_OFF();
405+
        /* ------------------------------- */
406-
                delay_us(dim_delay_off);
406+
407
408
        while(program_ms_counter < 3000)
409
        {
410-
                all_LEDs_ON();
410+
           program_LEFT_TURN();
411-
                delay_us(dim_delay_on);
411+
412-
                program4_off();
412+
413-
                delay_us(dim_delay_off);
413+
414
           program_NORMAL_MODE();
415
        }
416
        while(program_ms_counter < 6500)
417-
                all_LEDs_ON();
417+
418-
                delay_us(dim_delay_on);
418+
           program_LEFT_TURN();
419-
                all_LEDs_OFF();
419+
420-
                delay_us(dim_delay_off);
420+
421
        {
422
           program_NORMAL_MODE();
423
        }
424-
                all_LEDs_ON();
424+
425-
                delay_us(dim_delay_on);
425+
426-
                program4_off();
426+
427-
                delay_us(dim_delay_off);
427+
428
}