1 | /* Eckdaten:
|
2 | Maximaler Stromverbrauch (Augenzahl = 6): 45mA - max 1 min
|
3 | Stromverbrauch Sleep: nicht messbar
|
4 | Stromverbrauch ohne Sleep, keine LED: 0,5mA
|
5 | Software verfügt über Sleep nach 1 min kein EXT0 INT.
|
6 | Wake up: LOW LEVEL INT0 = EXT INT0 für Zufallszahl
|
7 | */
|
8 |
|
9 | //----------------------------------------------------------------------
|
10 | #include <avr/io.h> // AVR Register und Konstantendefinitionen
|
11 | #include <util/delay.h>
|
12 | #include <avr/interrupt.h>
|
13 | #include <stdio.h>
|
14 | #include <stdlib.h>
|
15 | #include <math.h>
|
16 | #include <avr/sleep.h>
|
17 | unsigned char anzahl = 0; // Anzahl der Timer0 Überläufe für Zeitverzögreung
|
18 | void zufallszahl();
|
19 |
|
20 | //-----------------H A U P T P R O G R A M M-------START----------------
|
21 | //-----------------R E G I S T E R I N I T-------START----------------
|
22 |
|
23 | main () // Hauptprogramm, startet bei Power ON und Reset
|
24 | { DDRB = 0xFF; // PORT B = AUSGANG (für die LEDS)
|
25 | PORTB = 0x00; // AUSGANGSPINS resetten
|
26 | DDRD = 0x00;
|
27 | GIMSK = 0b01000000; // Ext0 Int enable
|
28 | SREG = 0b10000000; // Golbal interrupt enable
|
29 | MCUCR = 0b01110000; // LOW LEVEL INT0 = interrupt UND POWER DOWN funktion
|
30 | TIMSK = 0b00000010; // Timer0 Overflow Interrupt enable
|
31 |
|
32 | //-----------------R E G I S T E R I N I T-------END-------------------
|
33 | while(1)
|
34 | {
|
35 | if(TCCR0B == 0x00) // wenn Timer0 angehalten ist, PORTB löschen und in den
|
36 | {
|
37 | PORTB = 0x00; // POWER DOWN mode gehen. wird durch LOW LEVEL INT0 reaktiviert
|
38 | sleep_mode(); // siehe MCUCR setup
|
39 | }
|
40 | }
|
41 | }
|
42 |
|
43 | //----------------H A U P T P R O G R A M M-------END--------------------
|
44 | //----------------E X T I N T 0 I S R---------START-----------------
|
45 |
|
46 | ISR(INT0_vect) // EXT INT0 LOW LEVEL INTERRUPT ISR
|
47 | { GIMSK = 0x00; // EXT INT0 verbieten - gewürfelt ist gewürfelt ;)
|
48 | anzahl = 0; // Verzögerungszähler aus NULL setzen
|
49 | zufallszahl(); // Zufallszahl Funktion starten
|
50 | }
|
51 |
|
52 | //----------------E X T I N T 0 I S R---------END-----------------
|
53 | //----------------T I M E R 0 O V E R V L O W I S R--------START--
|
54 |
|
55 |
|
56 | ISR(TIMER0_OVF_vect)
|
57 | { anzahl++; // Verzögerungszähler um 1 erhöhen
|
58 | if(anzahl < 14) TCCR0B = 0b00000100; // TIMER0 RUN mit F_CPU / 256 für eine gut einstellbare Zeitverzögerung der
|
59 | if(anzahl == 14) TCCR0B = 0b00000101; // TIMER0 RUN mit F_CPU / 1024 für längere Verzögerung bis zum Anzeigen der Zahl
|
60 | switch(anzahl) // einstellbare Zeitverzögerung der
|
61 | { /* // animation des Würfelns
|
62 | case 1: PORTB = 0b00000001; break;
|
63 | case 2: PORTB = 0b00000010; break;
|
64 | case 3: PORTB = 0b00000100; break;
|
65 | case 4: PORTB = 0b01000000; break;
|
66 | case 5: PORTB = 0b00100000; break;
|
67 | case 6: PORTB = 0b00010000; break;
|
68 | case 7: PORTB = 0b00001000; break;
|
69 |
|
70 | case 1: PORTB = 0b00000001; break;
|
71 | case 2: PORTB = 0b00000011; break;
|
72 | case 3: PORTB = 0b00000111; break;
|
73 | case 4: PORTB = 0b01000111; break;
|
74 | case 5: PORTB = 0b01100111; break;
|
75 | case 6: PORTB = 0b01110111; break;
|
76 | case 7: PORTB = 0b01111111; break;
|
77 |
|
78 | case 1: PORTB = 0b00000001; break;
|
79 | case 2: PORTB = 0b00000011; break;
|
80 | case 3: PORTB = 0b00000110; break;
|
81 | case 4: PORTB = 0b00001100; break;
|
82 | case 5: PORTB = 0b00011000; break;
|
83 | case 6: PORTB = 0b00110000; break;
|
84 | case 7: PORTB = 0b00100001; break;
|
85 | case 8: PORTB = 0b00000011; break;
|
86 | case 9: PORTB = 0b00000110; break;
|
87 | case 10: PORTB = 0b00001100; break;
|
88 | case 11: PORTB = 0b00011000; break;
|
89 | case 12: PORTB = 0b00110000; break;
|
90 | case 13: PORTB = 0b00100000; break;
|
91 | */
|
92 | case 1: PORTB = 0b00000001; break;
|
93 | case 2: PORTB = 0b00000011; break;
|
94 | case 3: PORTB = 0b00000111; break;
|
95 | case 4: PORTB = 0b00001111; break;
|
96 | case 5: PORTB = 0b00011111; break;
|
97 | case 6: PORTB = 0b00111111; break;
|
98 | case 7: PORTB = 0b00111111; break;
|
99 | case 8: PORTB = 0b00111111; break;
|
100 | case 9: PORTB = 0b00111110; break;
|
101 | case 10: PORTB = 0b00111100; break;
|
102 | case 11: PORTB = 0b00111000; break;
|
103 | case 12: PORTB = 0b00110000; break;
|
104 | case 13: PORTB = 0b00100000; break;
|
105 |
|
106 | case 14: PORTB = 0x00;
|
107 | TCNT0 = 0x00; break; // TIMER0 zurücksetzen damit definierte Verzögerung bis zum Anzeigen der Zahl gewährleistet ist
|
108 | case 15: PORTB = GPIOR0; // Display Zufallszahl
|
109 | GIMSK = 0b01000000; // Ext0 Int wieder erlauben!!!
|
110 | TCNT0 = 0x00; break;
|
111 | case 247: TCCR0B = 0x00; // TIMER0 STOP
|
112 | TCNT0 = 0x00; break; // TIMER0 rücksetzen
|
113 | }
|
114 | }
|
115 |
|
116 | //----------------T I M E R 0 O V E R V L O W I S R--------END-----
|
117 | //----------------Z U F A L L S Z A H L G E N E R A T O R------START---
|
118 |
|
119 | void zufallszahl()
|
120 | { unsigned char min = 1;
|
121 | unsigned char max = 6;
|
122 | unsigned char erg = 0;
|
123 |
|
124 | erg = (rand() % (max-min+1) +min); // Zufallszahl erzeugen
|
125 | switch(erg) // Umcodierung der Zufallszahl
|
126 | { case 1: GPIOR0 = 0b11000000; break; // zu den entsprechenden Bit-
|
127 | case 2: GPIOR0 = 0b10100100; break; // kombinationen für den Würfel
|
128 | case 3: GPIOR0 = 0b11100100; break;
|
129 | case 4: GPIOR0 = 0b10101101; break;
|
130 | case 5: GPIOR0 = 0b11101101; break;
|
131 | case 6: GPIOR0 = 0b10111111; break;
|
132 |
|
133 | }
|
134 | SREG = 0b10000000; //Golbal interrupt enable
|
135 | TCCR0B = 0b00000101; //Timer0 RUN mit f = F_CPU / 1024
|
136 | }
|
137 | //----------------Z U F A L L S Z A H L G E N E R A T O R-----END------
|