Advertisement
dlwestab

Tiny Lights 1.1

Mar 22nd, 2013
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2. Copyright 2012 D Westaby
  3.  
  4. ----------------------------------------------------------------------
  5.    Generic Pattern for Attiny2313
  6. ----------------------------------------------------------------------
  7. Title:      Generic_Lighting.c
  8. Author:     Dustin Westaby
  9. Date Created:   September 8, 2012
  10. Date Modified:   March 21, 2013
  11.  
  12. Compiled with AVR-GCC WinAVR
  13.  
  14. Connection reference by Alex Weber:
  15. http://tinkerlog.com/2009/06/18/microcontroller-cheat-sheet/
  16.  
  17. ----------------------------------------------------------------------
  18.     Fuses:
  19. ----------------------------------------------------------------------
  20.  BrownOut Disabled
  21.  CKDIV8
  22.  Int RC Osc 8Mhz + 64ms
  23.  
  24. ----------------------------------------------------------------------
  25.     Inputs:
  26. ----------------------------------------------------------------------
  27.  pin  i/o  port    circuit trace       notes
  28. ----------------------------------------------------------------------
  29.   1    0   PA2 =   RESET               Momentary Switch to ground
  30.  10        GND =   Ground
  31.  20        VCC =   +V Battery
  32.  12    0   PB0 =   B0                  Momentary Switch to ground
  33.  
  34. Note: Momentary switches need pullup 10k resisters
  35.  
  36. ----------------------------------------------------------------------
  37.     Ouputs:
  38. ----------------------------------------------------------------------
  39.  pin  i/o  port    circuit trace       notes
  40. ----------------------------------------------------------------------
  41.   2    1   PD0 =   LED1                *1
  42.   3    1   PD1 =   LED2                *1
  43.   4    1   PA1 =   LED3                *1
  44.   5    1   PA0 =   LED4                *1
  45.   6    1   PD2 =   LED5
  46.   7    1   PD3 =   LED6
  47.   8    1   PD4 =   LED7
  48.   9    1   PD5 =   LED8
  49.  11    1   PD6 =   LED9
  50.  13    1   PB1 =   LED10
  51.  14    1   PB2 =   LED11
  52.  17    1   PB5 =   LED12               *1
  53.  18    1   PB6 =   LED13               *1
  54.  19    1   PB7 =   LED14               *1
  55.  
  56. Note *1 - LED connected will disable pin's alternate functions
  57.           = external osc
  58.           = serial
  59.           = programming
  60.           Use a resister to isolate these.
  61.  
  62. */
  63.  
  64. //--------------------------------------
  65. //          Global Variables           |
  66. //--------------------------------------
  67. // 8 MHz Internal Oscillator DIV8 (used for delay subroutines)
  68. // One CPU Cycle = 1us
  69. #define F_CPU 8000000UL/8
  70.  
  71. #define LED1_PD0  (0)
  72. #define LED2_PD1  (1)
  73. #define LED3_PA1  (1)
  74. #define LED4_PA0  (0)
  75. #define LED5_PD2  (2)
  76. #define LED6_PD3  (3)
  77.  
  78. #define LED7_PD4  (4) //These 4 are new to the program
  79. #define LED8_PD5  (5)
  80. #define LED9_PD6  (6)
  81. #define LED10_PB1 (1)
  82.  
  83. #define LED11_PB2  (2)
  84. #define LED12_PB5  (5)
  85. #define LED13_PB6  (6)
  86. #define LED14_PB7  (7)
  87.  
  88. #define INPUT_PB0 (0)
  89.  
  90. #define CONST_DIM_DELAY_ON  (200)
  91. #define CONST_DIM_DELAY_OFF (4000)
  92.  
  93. /* This value is used to count us of delay and convert to ms
  94.    Due to other cpu processing: "1ms of delay" < "1000us of delay" */
  95. //#define TIME_CONVERSION_VAL (50) //actual number should be 150 (am running faster)
  96. #define TIME_CONVERSION_VAL (150)
  97.  
  98. #define OFF (0)
  99. #define ON  (1)
  100.  
  101. #define LED_ON(led_position)  (ON<<led_position)
  102. #define LED_OFF(led_position) (OFF<<led_position)
  103.  
  104. #define INPUT_SW   (0)
  105. #define OUTPUT_LED (1)
  106.  
  107. int program_ms_counter;
  108. int program_counter_us; //used for tracking time elapsed
  109.  
  110. //--------------------------------------
  111. //              Includes               |
  112. //--------------------------------------
  113. #include <avr/io.h>
  114. #include <util/delay.h>
  115.  
  116. //--------------------------------------
  117. //          Delay Subroutines          |
  118. //--------------------------------------
  119. //These functions are from the delay.h include, the calls to delay functions
  120. //are re-written here to allow for longer waits.
  121. void delay_ms(uint16_t ms) {
  122.         program_ms_counter+=ms;
  123.         while ( ms )
  124.         {
  125.                 _delay_ms(1);
  126.                 ms--;
  127.         }
  128. }
  129. void delay_us(uint16_t us) {
  130.   program_counter_us+=us;
  131.   while ( us )
  132.   {
  133.     _delay_us(1);
  134.     us--;
  135.   }
  136.  
  137.   while(program_counter_us>=TIME_CONVERSION_VAL)
  138.   {
  139.           program_ms_counter++;
  140.           program_counter_us-=TIME_CONVERSION_VAL;
  141.   }
  142. }
  143.  
  144. //--------------------------------------
  145. //         Common Subroutines          |
  146. //--------------------------------------
  147.  
  148. void reset_ms_us_counters(void) {
  149.    program_ms_counter=0;
  150.    program_counter_us=0;
  151. }
  152.  
  153. void all_LEDs_ON(void) {
  154.    PORTA = 0xFF;
  155.    PORTB = 0xFF;
  156.    PORTD = 0xFF;
  157. }
  158.  
  159. void all_LEDs_OFF(void) {
  160.    PORTA = ~(0x03);
  161.    PORTB = ~(0xFF);
  162.    PORTD = ~(0xFF);
  163. }
  164.  
  165. //--------------------------------------
  166. //          Switch Debounce            |
  167. //--------------------------------------
  168. int button_is_pressed()
  169. {
  170.   // the button is pressed when bit is clear
  171.   if (bit_is_clear(PINB, PB0))
  172.   {
  173.     delay_ms(25);
  174.     if (bit_is_clear(PINB, PB0)) return 1;
  175.   }
  176.  
  177.   return 0;
  178. }
  179.  
  180. //--------------------------------------
  181. //        Specific Subroutines         |
  182. //--------------------------------------
  183.  
  184. void program_left_turn_mode(void) {
  185.    /* Opposite '~', actually turns the following LEDs OFF */
  186.    PORTA &= ~(LED_ON(LED3_PA1) | LED_ON(LED4_PA0));
  187.  
  188.    PORTA &= 0xFF & (LED_OFF(LED3_PA1) | LED_OFF(LED4_PA0));
  189.  
  190.    PORTB &= ~(LED_ON(LED14_PB7) | LED_ON(LED12_PB5));
  191.    PORTD &= ~(LED_ON(LED6_PD3) | LED_ON(LED5_PD2) | LED_ON(LED2_PD1) | LED_ON(LED1_PD0));
  192. }
  193.  
  194. void program_brake_mode(void) {
  195.    /* Opposite '~', actually turns the following LEDs OFF */
  196.    PORTA &= ~(LED_ON(LED3_PA1) | LED_ON(LED4_PA0));
  197. }
  198.  
  199. void program_right_turn_mode (void) {
  200.    /* Opposite '~', actually turns the following LEDs OFF */
  201.    PORTA &= ~(LED_ON(LED3_PA1) | LED_ON(LED4_PA0));
  202.    PORTB &= ~(LED_ON(LED14_PB7) | LED_ON(LED13_PB6) | LED_ON(LED12_PB5) | LED_ON(LED11_PB2));
  203.    PORTD &= ~(LED_ON(LED6_PD3) | LED_ON(LED2_PD1));
  204. }
  205.  
  206. void program_all_dim_loop (int timer_val) {
  207.  
  208.    while(program_ms_counter < timer_val)
  209.    {
  210.       all_LEDs_ON();
  211.       delay_us(CONST_DIM_DELAY_ON);
  212.       all_LEDs_OFF();
  213.       delay_us(CONST_DIM_DELAY_OFF);
  214.    }
  215.  
  216. }
  217.  
  218. void program_break_loop (int timer_val) {
  219.  
  220.    while(program_ms_counter < timer_val)
  221.    {
  222.       all_LEDs_ON();
  223.       delay_us(CONST_DIM_DELAY_ON);
  224.       program_brake_mode();
  225.       delay_us(CONST_DIM_DELAY_OFF);
  226.    }
  227.  
  228. }
  229.  
  230. void program_left_turn_loop (int timer_val) {
  231.  
  232.    while(program_ms_counter < timer_val)
  233.    {
  234.       all_LEDs_ON();
  235.       delay_us(CONST_DIM_DELAY_ON);
  236.       program_left_turn_mode();
  237.       delay_us(CONST_DIM_DELAY_OFF);
  238.    }
  239.  
  240. }
  241.  
  242. void program_right_turn_loop (int timer_val) {
  243.  
  244.    while(program_ms_counter < timer_val)
  245.    {
  246.       all_LEDs_ON();
  247.       delay_us(CONST_DIM_DELAY_ON);
  248.       program_right_turn_mode();
  249.       delay_us(CONST_DIM_DELAY_OFF);
  250.    }
  251.  
  252. }
  253.  
  254.  
  255. //--------------------------------------
  256. //               Main                  |
  257. //--------------------------------------
  258. int main (void)
  259. {
  260.  
  261.   /* ---------------------------------------------------------------- */
  262.   /*                            Initialization                        */
  263.   /* ---------------------------------------------------------------- */
  264.  
  265.   //Initialize all ports
  266. //  DDRA =  0b00000011; //A0, A1
  267. //  DDRB =  0b11111111;
  268. //  DDRD =  0b11111111;
  269.   DDRA =  (OUTPUT_LED<<LED4_PA0) | (OUTPUT_LED<<LED3_PA1);
  270.   DDRB =  (INPUT_SW<<INPUT_PB0) | (OUTPUT_LED<<LED10_PB1) | (OUTPUT_LED<<LED11_PB2) | (OUTPUT_LED<<LED12_PB5) | (OUTPUT_LED<<LED13_PB6) | (OUTPUT_LED<<LED14_PB7);
  271.   DDRD =  (OUTPUT_LED<<LED1_PD0) | (OUTPUT_LED<<LED2_PD1) | (OUTPUT_LED<<LED5_PD2) | (OUTPUT_LED<<LED6_PD3) | (OUTPUT_LED<<LED7_PD4) | (OUTPUT_LED<<LED8_PD5) | (OUTPUT_LED<<LED9_PD6);
  272.  
  273.   all_LEDs_OFF();
  274.  
  275. /* ---------------------------------------------------------------- */
  276. /*                              Main Loop                           */
  277. /* ---------------------------------------------------------------- */
  278.  
  279.   while(1)
  280.   {
  281.  
  282. //1)    Dim
  283.       //1 - All dim nothing happens (resting natural state)
  284.       reset_ms_us_counters();
  285.       program_all_dim_loop(6000);
  286.  
  287. //2)    Left Turn
  288.       //2 - left turn, all dim, 2 will blink at ½ sec for 10 sec.
  289.       reset_ms_us_counters();
  290.       while(program_ms_counter < 10000)
  291.       {
  292.          program_left_turn_loop(program_ms_counter+500);
  293.          program_all_dim_loop  (program_ms_counter+500);
  294.       }
  295.       //then dim for 1 sec
  296.       program_all_dim_loop(11000);
  297.  
  298. //3)    Dim (4 sec)
  299.       //4 - All dim nothing happens (resting natural state)
  300.       reset_ms_us_counters();
  301.       program_all_dim_loop(4000);
  302.  
  303. //4)    Brakes
  304.       //3 – brakes get bright (8 LED’s) for 4 sec then dim for 1sec for 12 seconds
  305.       reset_ms_us_counters();
  306.       while(program_ms_counter < 12000)
  307.       {
  308.          program_break_loop  (program_ms_counter+4000);
  309.          program_all_dim_loop(program_ms_counter+1000);
  310.       }
  311.  
  312. //5)    Dim (4 Sec)
  313.       //4 - All dim nothing happens (resting natural state)
  314.       reset_ms_us_counters();
  315.       program_all_dim_loop(4000);
  316.  
  317. //6)    Right Turn
  318.       //5 – right turn, all dim, 2 will blink at ½ sec for 10 sec. 
  319.       reset_ms_us_counters();
  320.       while(program_ms_counter < 10000)
  321.       {
  322.          program_right_turn_loop(program_ms_counter+500);
  323.          program_all_dim_loop   (program_ms_counter+500);
  324.       }
  325.       //then dim for 1 sec.
  326.       program_all_dim_loop(11000);
  327.  
  328. //7)    Dim (4 sec)
  329.       //4 - All dim nothing happens (resting natural state)
  330.       reset_ms_us_counters();
  331.       program_all_dim_loop(4000);
  332.  
  333. //8)    Brakes
  334.       //6 – brakes get bright (8 LED’s) for 4 sec then dim for 1sec for 12 seconds
  335.       reset_ms_us_counters();
  336.       while(program_ms_counter < 12000)
  337.       {
  338.          program_break_loop  (program_ms_counter+4000);
  339.          program_all_dim_loop(program_ms_counter+1000);
  340.       }
  341.  
  342. //9)    Loop
  343.  
  344. }
  345.  
  346.   while(1);                 // Ending infinite loop (just in case)
  347.  
  348. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement