Hi Leute,
hier geht es im Grunde um eine Taster-Erkennung und Entprellung. Die
Tasten werden einzeln auf eine fallende Flanke getestet, damit eine
Fehlfunktion bei der Betätigung beider Taster vermieden wird.
Im debugger hat das Programm funktioniert, Praktisch auf dem Steckbrett
allerdings nicht. Ich konnte herausfiltern, dass sich der Fehler beim
Aufruf der Funktion "Taster-entprellen" ereignet. Ich kann aber leider
nicht nachvollziehen, warum. Habe es mit allen Optimierungen probiert ->
ohne Erfolg. Ganz unten habe ich die "Optimierte" und funktionierden
Datei "IO.c" angehängt.
Vielleicht sieht ja jemand auf den ersten Blick das Problem, bzw. den
Fehler.
Vielen Dank.
Main.c
1 | // *************INCLUDE ***************
|
2 | #include "Include.h"
|
3 | #include "globals.h"
|
4 | #include <avr/io.h>
|
5 | #include <avr/interrupt.h>
|
6 | #include <util/delay.h>
|
7 | #include <stdint.h>
|
8 | #include <avr/eeprom.h>
|
9 |
|
10 | // Prototypen
|
11 | uint8_t Taster_einlesen(void);
|
12 | void Taster_entprellen(void);
|
13 |
|
14 | int main(void)
|
15 | {
|
16 | StatusObergrenze = 0;
|
17 | StatusUntergrenze = 0;
|
18 | GlobalWertTaster = 0;
|
19 |
|
20 | // IO-Einstellen
|
21 | IO_DDR |= (1<<LED_Obergrenze) | (1<<LED_Untergrenze);
|
22 | IO_PORT |= (1<<TASTER_Obergrenze) | (1<<TASTER_Untergrenze);
|
23 |
|
24 | //endlos
|
25 | while(1)
|
26 | {
|
27 | uint8_t Taster_Status = Taster_einlesen();
|
28 | if(Taster_Status == 1)
|
29 | IO_PORT ^= (1<<LED_Untergrenze);
|
30 | if(Taster_Status == 2)
|
31 | IO_PORT ^= (1<<LED_Obergrenze);
|
32 | if(Taster_Status == 3)
|
33 | IO_PORT |= (1<<LED_Untergrenze)| (1<<LED_Obergrenze);
|
34 | }
|
IO.c
1 | uint_8t Taster_entprellen(void)
|
2 | {
|
3 | uint8_t temp, Zustand;
|
4 | Zustand = ~IO_PIN;
|
5 | Zustand &= ((1<<TASTER_Obergrenze) | (1<<TASTER_Untergrenze));
|
6 | _delay_ms(10);
|
7 | temp = ~IO_PIN;
|
8 | temp &= ((1<<TASTER_Obergrenze) | (1<<TASTER_Untergrenze));
|
9 | if (temp == Zustand)
|
10 | return temp;
|
11 | else
|
12 | return 0;
|
13 | }
|
14 |
|
15 | uint8_t Taster_einlesen(void)
|
16 | {
|
17 | uint8_t Taster_Variable = Taster_entprellen;
|
18 |
|
19 | //beide Taster
|
20 | if ((Taster_Variable == ((1<<TASTER_Untergrenze)|(1<<TASTER_Obergrenze))) && !(GlobalWertTaster & 1))
|
21 | {
|
22 | _delay_ms(500); // Wartezeit
|
23 | Taster_Variable = Taster_entprellen;
|
24 | if (Taster_Variable == ((1<<TASTER_Untergrenze)|(1<<TASTER_Obergrenze)))
|
25 | {
|
26 | GlobalWertTaster = Taster_Variable | 1;
|
27 | return 3;
|
28 | }
|
29 | return 0;
|
30 | }
|
31 |
|
32 | if (!(GlobalWertTaster & 1))
|
33 | {
|
34 | // Linker Taster
|
35 | if((!(Taster_Variable & (1<<TASTER_Untergrenze))) && (GlobalWertTaster & (1<<TASTER_Untergrenze)) && !(GlobalWertTaster & 1))
|
36 | {
|
37 | GlobalWertTaster = 0;
|
38 | return 1;
|
39 | }
|
40 | // Rechter Taster
|
41 | if((!(Taster_Variable & (1<<TASTER_Obergrenze))) && (GlobalWertTaster & (1<<TASTER_Obergrenze)) && !(GlobalWertTaster & 1))
|
42 | {
|
43 | GlobalWertTaster = 0;
|
44 | return 2;
|
45 | }
|
46 | GlobalWertTaster = Taster_Variable;
|
47 | }
|
48 |
|
49 | if ((GlobalWertTaster & 1) && Taster_Variable == 0)
|
50 | GlobalWertTaster = 0;
|
51 |
|
52 | return 0;
|
53 | }
|
Funktionierde IO.c
1 | uint8_t Taster_einlesen(void)
|
2 | {
|
3 | uint8_t temp, Taster_Variable; //geändert
|
4 | Taster_Variable = ~IO_PIN; //geändert
|
5 | _delay_ms(10); //geändert
|
6 | temp = ~IO_PIN; //geändert
|
7 | if (temp == Taster_Variable) //geändert
|
8 | Taster_Variable &= ((1<<TASTER_Obergrenze) | (1<<TASTER_Untergrenze)); //geändert
|
9 | else //geändert
|
10 | return 0; //geändert
|
11 |
|
12 | //beide Taster
|
13 | if ((Taster_Variable == ((1<<TASTER_Untergrenze)|(1<<TASTER_Obergrenze))) && !(GlobalWertTaster & 1))
|
14 | {
|
15 | _delay_ms(500); // Wartezeit
|
16 | Taster_Variable = Taster_entprellen;
|
17 | if (Taster_Variable == ((1<<TASTER_Untergrenze)|(1<<TASTER_Obergrenze)))
|
18 | {
|
19 | GlobalWertTaster = Taster_Variable | 1;
|
20 | return 3;
|
21 | }
|
22 | return 0;
|
23 | }
|
24 |
|
25 | if (!(GlobalWertTaster & 1))
|
26 | {
|
27 | // Linker Taster
|
28 | if((!(Taster_Variable & (1<<TASTER_Untergrenze))) && (GlobalWertTaster & (1<<TASTER_Untergrenze)) && !(GlobalWertTaster & 1))
|
29 | {
|
30 | GlobalWertTaster = 0;
|
31 | return 1;
|
32 | }
|
33 | // Rechter Taster
|
34 | if((!(Taster_Variable & (1<<TASTER_Obergrenze))) && (GlobalWertTaster & (1<<TASTER_Obergrenze)) && !(GlobalWertTaster & 1))
|
35 | {
|
36 | GlobalWertTaster = 0;
|
37 | return 2;
|
38 | }
|
39 | GlobalWertTaster = Taster_Variable;
|
40 | }
|
41 |
|
42 | if ((GlobalWertTaster & 1) && Taster_Variable == 0)
|
43 | GlobalWertTaster = 0;
|
44 |
|
45 | return 0;
|
46 | }
|