Hi an alle,
ich habe einen ATmega168 und eine 7 Segment Anzeige. Ich habe den Code
so geschrieben, dass die 7 Segment Anzeige sich immer im Kreis dreht.
(Hauptprogramm). Sobald ich einen Button drücke(Interrupt), soll die 7
Segment Anzeige an jener Stelle stehen bleiben, an welcher Sie beim
Drücken des Tasters war. Ich gebe einfach jedem Segment eine Zahl und
speichere es zwischen um es danach wieder korrekt ausgeben zu können.
Soweit funktioniert es auch. Nur stört mich an der Sache, dass nach dem
der Interrupt passiert ist, wieder an die Stelle in der Main Funktion
zurückgekehrt wird an welcher abgebrochen wurde. Dies ist völlig normal
und auch so gedacht. Das ist mir klar. Aber wie kann ich in meinem
Codebeispiel dies entweder unterbinden, bzw. den Code umschreiben, damit
man es nicht sieht, oder es einem nicht auffällt.
Beispiel:
Ich drücke den Button an der Stelle des Segments V. Dann merke ich mir
mit der Variable den Wert des Segments um es später anzuzeigen. Nun wird
wieder in die Main Funktion gesprungen an die Stelle an welcher
unterbrochen wurde. Nun wird das Spinning der 7 Segment Anzeige
fortgesetzt und somit die restlichen Segmente W,X,Y,Z angezeigt bzw.
fertig gespinnt. Erst jetzt wird das zuvor gespeicherte Segment welches
per Tastendruck ermittelt wurde angezeigt.
Also lange Rede kurzer Sinn. Die 7 Segment Anzeige soll nach dem Drücken
des Tasters sich nicht bis zum Ende weiterdrehen, sondern sofort das
Element anzeigen bei welchem gedrückt wurde.
Ich weiß der Code ist quick and dirty. :-) Aber funktionell.
Danke für Eure Unterstützung.
1 | int main() {
|
2 |
|
3 | DDRC &= ~(1<<PC5); // PC5 to input
|
4 | PORTC |= (1<<PC5); // pull up resistor
|
5 |
|
6 | PCICR |= (1<<PCIE1);
|
7 | PCMSK1 |= (1<<PCINT13);
|
8 |
|
9 | sei();
|
10 |
|
11 | init_seg();
|
12 |
|
13 | while(1) {
|
14 |
|
15 | if (button_count == 0)
|
16 | {
|
17 | spinning_left(40);
|
18 | }
|
19 |
|
20 | else if (button_count == 1)
|
21 | {
|
22 | display_stopped_line(level_left, 400);
|
23 | }
|
24 | }
|
25 |
|
26 | }
|
27 | ISR(PCINT1_vect) {
|
28 |
|
29 | if (debounce(&PINC, PC5))
|
30 | {
|
31 | level_left = spinning_count;
|
32 | button_count++;
|
33 | }
|
34 | }
|
35 |
|
36 | void spinning_left(int speed) {
|
37 | spinning_count=0;
|
38 | segment('U',speed);
|
39 | spinning_count=1;
|
40 | segment('V',speed);
|
41 | spinning_count=2;
|
42 | segment('W',speed);
|
43 | spinning_count=3;
|
44 | segment('X',speed);
|
45 | spinning_count=4;
|
46 | segment('Y',speed);
|
47 | spinning_count=5;
|
48 | segment('Z',speed);
|
49 | spinning_count=6;
|
50 | }
|