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 | } |