Hallo, ich habe einen atmega8 auf nem alten STK500 und wollte eine Art Passworteingabe machen. Die Knöpfe 0-2 können gedrückt werden und es wird jeweils ein Wert in einen Puffer geschrieben. Dieser wird mit einem anderen verglichen und wenn sie übereinstimmen geht eine LED an. Ich bin nicht sehr erfahren in der AVR-Programmierung und habe keine Ahnung wie ich eine Debug-Ausgabe realisieren soll. Ich glaube die Werte werden nicht richtig in den Puffer geschrieben. Die compare funktion ist auf jeden Fall richtig, denn wenn ich puffer und passwort gleichsetze leuchtet die LED. Auch wenn ich die Länge des Passworts auf 1 setze geht es. Ihr Profis erkennt sicher auf dem ersten Blick meinen Fehler:
1 | #include <avr/io.h> |
2 | #include <avr/delay.h> |
3 | |
4 | #define INPUT_MASK 0b00000111 //3 knöpfe
|
5 | #define LENGTH 2
|
6 | |
7 | uint8_t getInput(uint8_t pin, uint8_t mask) { |
8 | return ~(pin & mask); |
9 | }
|
10 | |
11 | uint8_t it = 0; |
12 | |
13 | void add(uint8_t* buf, uint8_t num) { |
14 | buf[it] = 1; |
15 | if (it < LENGTH - 1) |
16 | it++; |
17 | _delay_ms(500); |
18 | }
|
19 | |
20 | int compareArrays(uint8_t* buf1, uint8_t* buf2) { |
21 | for (uint8_t i; i < LENGTH; i++) { |
22 | if (buf1[i] != buf2[i]) |
23 | return 0; |
24 | }
|
25 | return 1; |
26 | }
|
27 | |
28 | int main(void) { |
29 | |
30 | DDRB = 0b11111111; //out |
31 | DDRD = 0; //in |
32 | PORTB = 0xff; |
33 | |
34 | uint8_t buffer[LENGTH] = { 0, 0 }; |
35 | uint8_t pass[LENGTH] = { 1, 1 }; |
36 | |
37 | while (1) { |
38 | uint8_t input = getInput(PIND, INPUT_MASK); |
39 | |
40 | if (input & 0b00000001) //wenn knopf 1 gedrückt |
41 | add(buffer, 1); |
42 | |
43 | if (compareArrays(buffer, pass)) |
44 | PORTB = ~0b00001000; |
45 | else
|
46 | PORTB = 0xff; |
47 | }
|
48 | return 0; |
49 | }
|