Hallo,
folgender Code läuft nicht wie erwartet. Es ist ein Fragment für eine
kleine Menusteuerung. Hier soll einfach ein Index in einem Bereich über
einen Drehgeber verstellt werden und ein Über/Unterlauf erfolgen.
1 | int8_t read_encooder(void);
|
2 |
|
3 | int8_t letter, encoder;
|
4 |
|
5 | ...
|
6 |
|
7 | encoder = read_encoder();
|
8 |
|
9 | ...
|
10 | letter += encoder;
|
11 | if (letter > (sizeof(file_letters)-1) ) {
|
12 | letter =0;
|
13 | } else if (letter < 0 ) {
|
14 | letter = sizeof(file_letters)-1;
|
15 | }
|
16 | menu_dir[menu_letter_pos] = pgm_read_byte(&file_letters[letter]);
|
Wenn man es so macht, funktioniert der Unterlauf über 0 nicht. Der
Vergleich brcs ist falsch!
1 | letter += encoder;
|
2 | 7166: 80 91 4b 04 lds r24, 0x044B
|
3 | 716a: 8e 0d add r24, r14
|
4 | 716c: 80 93 4b 04 sts 0x044B, r24
|
5 | if (letter > (sizeof(file_letters)-1) ) {
|
6 | 7170: 88 32 cpi r24, 0x28 ; 40
|
7 | 7172: 18 f0 brcs .+6 ; 0x717a <menu_fsm+0x86>
|
8 | letter =0;
|
9 | 7174: 10 92 4b 04 sts 0x044B, r1
|
10 | 7178: 05 c0 rjmp .+10 ; 0x7184 <menu_fsm+0x90>
|
11 | } else if (letter < 0 ) {
|
12 | 717a: 87 ff sbrs r24, 7
|
13 | 717c: 03 c0 rjmp .+6 ; 0x7184 <menu_fsm+0x90>
|
14 | letter = sizeof(file_letters)-1;
|
15 | 717e: 87 e2 ldi r24, 0x27 ; 39
|
16 | 7180: 80 93 4b 04 sts 0x044B, r24
|
17 | }
|
Macht man aber einen Cast, funktioniert es! Der Vergleich brlt ist hier
korrekt!
1 | int8_t read_encooder(void);
|
2 |
|
3 | int8_t letter, encoder;
|
4 | ...
|
5 |
|
6 | encoder = read_encoder();
|
7 |
|
8 | ...
|
9 | letter += encoder;
|
10 | if (letter > (int8_t)(sizeof(file_letters)-1) ) {
|
11 | letter =0;
|
12 | } else if (letter < 0 ) {
|
13 | letter = sizeof(file_letters)-1;
|
14 | }
|
15 | menu_dir[menu_letter_pos] = pgm_read_byte(&file_letters[letter]);
|
1 | letter += encoder;
|
2 | 7166: 80 91 4b 04 lds r24, 0x044B
|
3 | 716a: 8e 0d add r24, r14
|
4 | 716c: 80 93 4b 04 sts 0x044B, r24
|
5 | if (letter > (int8_t)(sizeof(file_letters)-1) ) {
|
6 | 7170: 88 32 cpi r24, 0x28 ; 40
|
7 | 7172: 1c f0 brlt .+6 ; 0x717a <menu_fsm+0x86>
|
8 | letter =0;
|
9 | 7174: 10 92 4b 04 sts 0x044B, r1
|
10 | 7178: 05 c0 rjmp .+10 ; 0x7184 <menu_fsm+0x90>
|
11 | } else if (letter < 0 ) {
|
12 | 717a: 87 ff sbrs r24, 7
|
13 | 717c: 03 c0 rjmp .+6 ; 0x7184 <menu_fsm+0x90>
|
14 | letter = sizeof(file_letters)-1;
|
15 | 717e: 87 e2 ldi r24, 0x27 ; 39
|
16 | 7180: 80 93 4b 04 sts 0x044B, r24
|
17 | }
|
Alle beteiligten Datentypen sind int8_t. Sizeof liefert int?
Was ist hier faul?
MfG
Falk