1 | //----------------------------------------------------------------------
|
2 | // Titel : Auswertung Waehlscheibe
|
3 | //----------------------------------------------------------------------
|
4 | // Funktion : Erfassung wenn Wahlvorgang beendet mit Interrupt an PORTD2 (INT0)
|
5 | //----------------------------------------------------------------------
|
6 |
|
7 | //----------------------------------------------------------------------
|
8 | #define F_CPU 1000000
|
9 | #include <inttypes.h>
|
10 | #include <avr/io.h>
|
11 | #include <avr/interrupt.h>
|
12 | #include <avr/wdt.h>
|
13 | #include <avr/sleep.h>
|
14 |
|
15 | //------------------------------------------------------------------------------------------------------
|
16 | //--------------------globale Variablen-----------------------------------------------------------------
|
17 | volatile int Timerzaehler_neu = 0;
|
18 | volatile int Timerzaehler_alt = 0;
|
19 | volatile int Timerzaehler_neu_2 = 0;
|
20 | volatile int Timerzaehler_alt_2 = 0;
|
21 | volatile int Sleepzaehler = 0;
|
22 | volatile char Scheibe_in_Bewegung = 0;
|
23 | volatile char Drehung_beendet = 0;
|
24 | volatile char Ziffer; // im aktuellen Wahlvorgang gewählte Ziffer
|
25 | char aktuelle_Stelle; // Stelle der Ziffer, die gerade gewählt wird
|
26 | char richtige_Nummer[6]={2, 5, 3, 6, 9, 7 }; // vorgegebene Nummer
|
27 | char Stellen = 6; // Stellen der vorgegebenen Nummer
|
28 | char richtig_gewaehlt; // richtig gewaehlt ?
|
29 |
|
30 | //----------------------------------------------------------------------
|
31 | void initialisieren(void)
|
32 | {
|
33 | DDRB = 0b00011000; // PORTB.3 und 4 = Ausgang
|
34 | PORTB = 0b11100111; // PULL-UP für Eingänge
|
35 |
|
36 | MCUCR = 0b00000000;
|
37 | ACSR = 0b10000000; // Comperator deaktivieren
|
38 |
|
39 | TCCR0B = 0b00000011; // Timer mit Teiler 64 aktivieren
|
40 | TIMSK0 |= (1<<TOIE0); // Overflowinterrupt erlauben
|
41 | sei(); // globale Interrupts aktivieren
|
42 |
|
43 | PORTB &= ~( (1<<PB3) | (1<<PB4) ); //PIN3 und PIN4 auf low setzen
|
44 |
|
45 | Scheibe_in_Bewegung = 0;
|
46 | Drehung_beendet = 0;
|
47 | Ziffer = 0;
|
48 | aktuelle_Stelle = 0;
|
49 | richtig_gewaehlt = 0;
|
50 | Sleepzaehler = 0;
|
51 |
|
52 | }
|
53 |
|
54 | //-----------------------------------------------------------------------------------------------------
|
55 | //---------------------------Interruptroutine für Int0 zum Aufwecken-----------------------------------
|
56 | ISR (INT0_vect)
|
57 | {
|
58 |
|
59 | }
|
60 |
|
61 | //--------------------------------------------------------------------------------------------------------
|
62 | //-----------------Interruptroutine für Timer0------------------------------------------------------------
|
63 | ISR (TIM0_OVF_vect)
|
64 | {
|
65 |
|
66 | ++Sleepzaehler;
|
67 | //----------------Taster für Ziffern entprellen und gewählte Ziffer erfassen--------------------------
|
68 | ++Timerzaehler_neu;
|
69 | if (PINB&0b00000010)
|
70 | {
|
71 | if (Timerzaehler_neu - Timerzaehler_alt > 2)
|
72 | ++Ziffer;
|
73 | Timerzaehler_neu = 0;
|
74 | Timerzaehler_alt = 0;
|
75 | }
|
76 |
|
77 | //-----Taster für Betätigung der Wählscheibe entprellen, und Rücklauf in Ausgangsstellung erfassen----
|
78 | ++Timerzaehler_neu_2;
|
79 | if (!(PINB&0b000000001))
|
80 | {
|
81 | if (Timerzaehler_neu_2 - Timerzaehler_alt_2 > 2)
|
82 | if (Scheibe_in_Bewegung == 0)
|
83 | {
|
84 | Scheibe_in_Bewegung = 1;
|
85 | }
|
86 | Timerzaehler_neu_2 = 0;
|
87 | Timerzaehler_alt_2 = 0;
|
88 | }
|
89 | else
|
90 | {
|
91 | if (Scheibe_in_Bewegung == 1)
|
92 | {
|
93 | Scheibe_in_Bewegung = 0;
|
94 | Drehung_beendet = 1;
|
95 | }
|
96 | }
|
97 |
|
98 | }
|
99 |
|
100 | //------------------------------------------------------------------------------------------------------
|
101 | //-----------------Hauptprogramm------------------------------------------------------------------------
|
102 | main()
|
103 | {
|
104 | waitMs(500);
|
105 | initialisieren();
|
106 | do
|
107 | {
|
108 |
|
109 | if (Sleepzaehler == 10000)//-----------------------------------------nach ca. 3 Minuten abschalten
|
110 | {
|
111 |
|
112 | //PORTB = 0b11110111;
|
113 | Sleepzaehler = 0;
|
114 | GIMSK |= (1 << INT0);
|
115 | set_sleep_mode(SLEEP_MODE_PWR_DOWN);
|
116 | sleep_enable();
|
117 | sei();
|
118 | sleep_cpu();
|
119 | sleep_disable();
|
120 | GIMSK &= ~(1 << INT0);
|
121 | }
|
122 |
|
123 | if (Drehung_beendet == 1)//-----------------------------------wenn Drehung der Wählscheibe beendet
|
124 | {
|
125 | ++aktuelle_Stelle;//-----------------------------------zählen zum wie vielten mal das passiert
|
126 | if (Ziffer == richtige_Nummer[aktuelle_Stelle - 1])//--gewählte Ziffer mit Vorgabe vergleichen
|
127 | {
|
128 | ++richtig_gewaehlt;//----------------------------------wenn richtige Ziffer gewählt zählen
|
129 | }
|
130 |
|
131 | if (aktuelle_Stelle == Stellen)//--------------------wenn vorgegebene Stellenzahl erreicht ist
|
132 | {
|
133 |
|
134 | if (richtig_gewaehlt == Stellen)//-------------------prüfen, ob alle Ziffern richtig waren
|
135 | {
|
136 |
|
137 | PORTB |= (1<<PB3) | (1<<PB4);//------------------------------------wenn ja, PIN3 und PIN4 auf HIGH
|
138 | }
|
139 |
|
140 | else
|
141 | {
|
142 | //PORTB = 0b11110111;//-------------------------------------wenn nein, andere Reaktion
|
143 | }
|
144 |
|
145 | waitMs(1000);//----------------------------------kurz warten und Ausgangszustand herstellen
|
146 | initialisieren();
|
147 | }
|
148 |
|
149 | Drehung_beendet = 0;
|
150 | Ziffer = 0;
|
151 | }
|
152 |
|
153 | }
|
154 | while (true); // Mainloop
|
155 | }
|
156 | //------------------------------------------------------------------------
|