AVR-n00b will Passworteingabe machen

Gast #3521933
Lesenswert?

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
}
Gast #3522091
Lesenswert?

Paul schrieb:
> Hm... da ist ja ein recht großes Delay drin.
>
> Walternativ schrieb:
>> return ~(pin & mask);
>
> Warum eigentlich hier das nicht?

Weil das STK500 ganz komisch ist.

Max B. schrieb:
> Wenn du eine PIN Eingabe realisieren möchtest, ist das doch ganz
> entscheidend!
>
> Beispiel
> PIN lautet 012 (Taster)
>
> Also d®ückst du die Taster 0, 1 und 2. Ergebnisse:
>
> Ohne entprellen z.B.: 0000011111222
>
> Mit entprellen: 012
>
> Gruß Max

Das ist schon richtig, aber es erklärt nicht, warum die LED überhaupt 
nicht angeht. Theoretisch müsste ja dann schon beim ersten Tastendruck 
der Puffer auf {1,1} stehen und damit dem Passwort entsprechen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren