View difference between Paste ID: TdH8gpT9 and mtZchfyg
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
8
Author:     Dustin Westaby
9
Date Created:   September 8, 2012
10-
Date Modified:   September 23, 2012
10+
Date Modified:   September 24, 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           |
46
//--------------------------------------
47
// 8 MHz Internal Oscillator DIV8 (used for delay subroutines)
48
// One CPU Cycle = 1us
49
#define F_CPU 8000000UL/8
50-
 
50+
51
#define R_LED1_PA1  (1)
52
#define L_LED2_PA0  (0)
53
#define R_LED3_PD0  (0)
54
#define R_LED4_PD1  (1)
55
#define R_LED5_PD2  (2)
56
#define R_LED6_PD3  (3)
57
#define L_LED7_PB2  (2)
58
#define L_LED8_PB5  (5)
59
#define L_LED9_PB6  (6)
60
#define L_LED10_PB7 (7)
61
62
63
#define CONST_DIM_DELAY_ON  (200)
64
#define CONST_DIM_DELAY_OFF (4000)
65
66
/* This value is used to count us of delay and convert to ms
67
   Due to other cpu processing: "1ms of delay" < "1000us of delay" */
68
//#define TIME_CONVERSION_VAL (50) //actual number should be 150 (am running faster)
69
#define TIME_CONVERSION_VAL (150)
70-
 
70+
71
int program_ms_counter;
72
int program_counter_us; //used for tracking time elapsed
73-
 
73+
74
//--------------------------------------
75
//              Includes               |
76
//--------------------------------------
77
#include <avr/io.h>
78
#include <util/delay.h>
79-
 
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
void delay_us(uint16_t us) {
94
  program_counter_us+=us;
95
  while ( us )
96
  {
97
    _delay_us(1);
98
    us--;
99
  }
100-
 
100+
101
  while(program_counter_us>=TIME_CONVERSION_VAL)
102
  {
103
          program_ms_counter++;
104
          program_counter_us-=TIME_CONVERSION_VAL;
105
  }
106
}
107-
 
107+
108
//--------------------------------------
109
//          Misc Subroutines          |
110
//--------------------------------------
111-
 
111+
112
void reset_ms_us_counters(void) {
113
        program_ms_counter=0;
114
        program_counter_us=0;
115
}
116-
 
116+
117
void all_LEDs_ON(void) {
118
        PORTA = 0xFF;
119
        PORTB = 0xFF;
120
        PORTD = 0xFF;
121
}
122-
 
122+
123
void all_LEDs_OFF(void) {
124
        PORTA = ~(0x03);
125
        PORTB = ~(0xFF);
126
        PORTD = ~(0xFF);
127
}
128-
 
128+
129
void program_left_turn_mode(void) {
130
        PORTA &= ~((1<<R_LED1_PA1)+(1<<L_LED2_PA0));
131
        PORTB &= ~((1<<L_LED10_PB7)+(1<<L_LED8_PB5));
132
        PORTD &= ~((1<<R_LED6_PD3)+(1<<R_LED5_PD2)+(1<<R_LED4_PD1)+(1<<R_LED3_PD0));
133
}
134
135
void program_brake_mode(void) {
136
        PORTA &= ~((1<<R_LED1_PA1)+(1<<L_LED2_PA0));
137
}
138
139
void program_right_turn_mode (void) {
140
        PORTA &= ~((1<<R_LED1_PA1)+(1<<L_LED2_PA0));
141
        PORTB &= ~((1<<L_LED10_PB7)+(1<<L_LED9_PB6)+(1<<L_LED8_PB5)+(1<<L_LED7_PB2));
142
        PORTD &= ~((1<<R_LED6_PD3)+(1<<R_LED4_PD1));
143
}
144
145
void program_all_dim_loop (int timer_val) {
146-
	
146+
147-
	while(program_ms_counter < timer_val)
147+
   while(program_ms_counter < timer_val)
148-
	{
148+
   {
149-
		all_LEDs_ON();
149+
      all_LEDs_ON();
150-
		delay_us(CONST_DIM_DELAY_ON);
150+
      delay_us(CONST_DIM_DELAY_ON);
151-
		all_LEDs_OFF();
151+
      all_LEDs_OFF();
152-
		delay_us(CONST_DIM_DELAY_OFF);
152+
      delay_us(CONST_DIM_DELAY_OFF);
153-
	}
153+
   }
154-
	
154+
155
}
156
157
void program_break_loop (int timer_val) {
158-
	
158+
159-
	while(program_ms_counter < timer_val)
159+
   while(program_ms_counter < timer_val)
160-
	{
160+
   {
161-
		all_LEDs_ON();
161+
      all_LEDs_ON();
162-
		delay_us(CONST_DIM_DELAY_ON);
162+
      delay_us(CONST_DIM_DELAY_ON);
163-
		program_brake_mode();
163+
      program_brake_mode();
164-
		delay_us(CONST_DIM_DELAY_OFF);
164+
      delay_us(CONST_DIM_DELAY_OFF);
165-
	}
165+
   }
166-
	
166+
167
}
168
169
void program_left_turn_loop (int timer_val) {
170-
	
170+
171-
	while(program_ms_counter < timer_val)
171+
   while(program_ms_counter < timer_val)
172-
	{
172+
   {
173-
		all_LEDs_ON();
173+
      all_LEDs_ON();
174-
		delay_us(CONST_DIM_DELAY_ON);
174+
      delay_us(CONST_DIM_DELAY_ON);
175-
		program_left_turn_mode();
175+
      program_left_turn_mode();
176-
		delay_us(CONST_DIM_DELAY_OFF);
176+
      delay_us(CONST_DIM_DELAY_OFF);
177-
	}
177+
   }
178-
	
178+
179
}
180
181
void program_right_turn_loop (int timer_val) {
182-
	
182+
183-
	while(program_ms_counter < timer_val)
183+
   while(program_ms_counter < timer_val)
184-
	{
184+
   {
185-
		all_LEDs_ON();
185+
      all_LEDs_ON();
186-
		delay_us(CONST_DIM_DELAY_ON);
186+
      delay_us(CONST_DIM_DELAY_ON);
187-
		program_right_turn_mode();
187+
      program_right_turn_mode();
188-
		delay_us(CONST_DIM_DELAY_OFF);
188+
      delay_us(CONST_DIM_DELAY_OFF);
189-
	}
189+
   }
190-
	
190+
191
}
192
193
194
//--------------------------------------
195
//               Main                  |
196
//--------------------------------------
197
int main (void)
198
{
199-
 
199+
200
  /* ---------------------------------------------------------------- */
201
  /*                            Initialization                        */
202
  /* ---------------------------------------------------------------- */
203-
  
203+
204
  //Initialize all ports as outputs
205
  DDRA =  0b00000011; //A0, A1
206
  DDRB =  0b11111111;
207
  DDRD =  0b11111111;
208-
 
208+
209
  all_LEDs_OFF();
210-
 
210+
211
/* ---------------------------------------------------------------- */
212
/*                              Main Loop                           */
213
/* ---------------------------------------------------------------- */
214-
 
214+
215
  while(1)
216
  {
217-
 
217+
218-
		//1 - All dim nothing happens (resting natural state)
218+
//1)    Dim
219-
		reset_ms_us_counters();
219+
      //1 - All dim nothing happens (resting natural state)
220-
		program_all_dim_loop(6000);
220+
      reset_ms_us_counters();
221-
        
221+
      program_all_dim_loop(6000);
222-
		//2 - left turn, all dim, 2 will blink at ½ sec for 5 sec. 
222+
223-
		reset_ms_us_counters();
223+
//2)    Left Turn
224-
		while(program_ms_counter < 5000) 
224+
      //2 - left turn, all dim, 2 will blink at ½ sec for 10 sec.
225-
		{
225+
      reset_ms_us_counters();
226-
			program_left_turn_loop(program_ms_counter+500);
226+
      while(program_ms_counter < 10000)
227-
			program_all_dim_loop  (program_ms_counter+500);
227+
      {
228-
		}
228+
         program_left_turn_loop(program_ms_counter+500);
229-
		//then dim for 1 sec
229+
         program_all_dim_loop  (program_ms_counter+500);
230-
		program_all_dim_loop(6000);     
230+
      }
231
      //then dim for 1 sec
232-
		//3 – brakes get bright (8 LED’s) for 2 sec then dim for 1 for 6 seconds
232+
      program_all_dim_loop(11000);
233-
		reset_ms_us_counters();
233+
234-
		while(program_ms_counter < 6000)
234+
//3)    Dim (4 sec)
235-
		{
235+
      //4 - All dim nothing happens (resting natural state)
236-
			program_break_loop  (program_ms_counter+2000);
236+
      reset_ms_us_counters();
237-
			program_all_dim_loop(program_ms_counter+1000);
237+
      program_all_dim_loop(4000);
238-
		}
238+
239
//4)    Brakes
240-
		//4 - All dim nothing happens (resting natural state)
240+
      //3 – brakes get bright (8 LED’s) for 4 sec then dim for 1sec for 12 seconds
241-
		reset_ms_us_counters();
241+
      reset_ms_us_counters();
242-
		program_all_dim_loop(6000);
242+
      while(program_ms_counter < 12000)
243
      {
244-
		//5 – right turn, all dim, 2 will blink at ½ sec for 5 sec.  
244+
         program_break_loop  (program_ms_counter+4000);
245-
		reset_ms_us_counters();
245+
         program_all_dim_loop(program_ms_counter+1000);
246-
		while(program_ms_counter < 5000)
246+
      }
247-
		{
247+
248-
			program_right_turn_loop(program_ms_counter+500);
248+
//5)    Dim (4 Sec)
249-
			program_all_dim_loop   (program_ms_counter+500);
249+
      //4 - All dim nothing happens (resting natural state)
250-
		}
250+
      reset_ms_us_counters();
251-
		//then dim for 1 sec.
251+
      program_all_dim_loop(4000);
252-
		program_all_dim_loop(6000);
252+
253
//6)    Right Turn
254-
		//6 – brakes get bright (8 LED’s) for 2 sec then dim for 1 for 6 seconds
254+
      //5 – right turn, all dim, 2 will blink at ½ sec for 10 sec. 
255-
		reset_ms_us_counters();
255+
      reset_ms_us_counters();
256-
		while(program_ms_counter < 6000)
256+
      while(program_ms_counter < 10000)
257-
		{
257+
      {
258-
			program_break_loop  (program_ms_counter+2000);
258+
         program_right_turn_loop(program_ms_counter+500);
259-
			program_all_dim_loop(program_ms_counter+1000);
259+
         program_all_dim_loop   (program_ms_counter+500);
260-
		}
260+
      }
261
      //then dim for 1 sec.
262
      program_all_dim_loop(11000);
263-
 
263+
264
//7)    Dim (4 sec)
265-
 
265+
      //4 - All dim nothing happens (resting natural state)
266
      reset_ms_us_counters();
267
      program_all_dim_loop(4000);
268
269
//8)    Brakes
270
      //6 – brakes get bright (8 LED’s) for 4 sec then dim for 1sec for 12 seconds
271
      reset_ms_us_counters();
272
      while(program_ms_counter < 12000)
273
      {
274
         program_break_loop  (program_ms_counter+4000);
275
         program_all_dim_loop(program_ms_counter+1000);
276
      }
277
278
//9)    Loop
279
280
}
281
282
  while(1);                 // Ending infinite loop (just in case)
283
284
}